diff --git a/.cspell.json b/.cspell.json new file mode 100644 index 00000000000..b276dfd55ad --- /dev/null +++ b/.cspell.json @@ -0,0 +1,57 @@ +{ + "version": "0.2", + "gitignoreRoot": ".", + "useGitignore": true, + "dictionaries": [ + "css", + "html", + "fonts", + "typescript", + "softwareTerms", + "companies", + "lorem-ipsum", + "project-words" + ], + "dictionaryDefinitions": [ + { + "name": "project-words", + "path": "./project-words.txt", + "noSuggest": true + } + ], + "ignorePaths": [ + "CHANGELOG.md", + "LICENSE", + "package.json", + "yarn.lock", + "project-words.txt", + "__snapshots__", + "*.min.*", + "jest/vendor", + "docusaurus.config.js", + "src/css/", + "babel.config.js", + "api/", + "sidebars.js", + "tsconfig.*.json", + ".github/**", + "__pycache__/**/*", + "docs/Reference/**", + "docs/public-networks/reference/cli/options.md", + "MAINTAINERS.md", + "CODE_OF_CONDUCT.md", + "CHANGELOG.md" + ], + "ignoreRegExpList": [ + "Email", + "Urls", + "#[\\w-]*", + "/^\\s*```[\\s\\S]*?^\\s*```/gm", + "/^\\s*`[\\s\\S]*?^\\s*`/gm", + "`[^`]*`", + "\\|[^\\n]+\\|", + "\\|[^\n]+", + "[^\n]+\\|", + "\\|[^\n]+\\|[^\n]+\\|" + ] +} diff --git a/.editorconfig b/.editorconfig index c31bfa44f27..e6cbcd07e0e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,8 +1,21 @@ +# http://editorconfig.org + +root = true + [*] -charset=utf-8 -end_of_line=lf -trim_trailing_whitespace=true -insert_final_newline=true +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +max_line_length = 80 +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false + +[{*.yml,*.yaml}] indent_style=space indent_size=2 @@ -10,7 +23,3 @@ indent_size=2 indent_style=space indent_size=4 -[{*.yml,*.yaml}] -indent_style=space -indent_size=2 - diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000000..d94fd681fb2 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,7 @@ +build/ +.eslintrc.js +docs/test-api +./node_modules/* +*.md +*.mdx +LICENSE diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000000..d3bbdea62e1 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,88 @@ +module.exports = { + env: { + browser: true, + es2021: true, + }, + extends: [ + "plugin:react/recommended", + "airbnb-typescript", + "plugin:import/typescript", + // @NOTE: Make sure this is always the last element in the array. + "plugin:prettier/recommended", + ], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: 2020, + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + project: ["./tsconfig.json"], + }, + plugins: [ + "react", + "react-hooks", + "jsx-a11y", + "import", + "prettier", + "@typescript-eslint", + ], + settings: { + react: { + pragma: "React", // Pragma to use, default to "React" + fragment: "Fragment", // Fragment to use (may be a property of ), default to "Fragment" + version: "detect", // React version. "detect" automatically picks the version you have installed. + // You can also use `16.0`, `16.3`, etc, if you want to override the detected value. + // default to latest and warns if missing + // It will default to "detect" in the future + }, + "import/parsers": { + "@typescript-eslint/parser": [".ts", ".tsx"], + }, + "import/resolver": { + typescript: {}, + }, + }, + rules: { + "import/prefer-default-export": 0, + "react/prop-types": 0, + "import/no-unresolved": [ + "error", + { ignore: ["^@theme", "^@docusaurus", "^@site"] }, + ], + "no-nested-ternary": 0, + "no-console": 0, + "no-unused-vars": 0, + "no-use-before-define": 0, + "arrow-body-style": 0, + "jsx-a11y/anchor-is-valid": 0, + "jsx-a11y/no-static-element-interactions": 0, + "jsx-a11y/click-events-have-key-events": 0, + "@typescript-eslint/no-unused-expressions": 0, + "@typescript-eslint/no-unused-vars": ["warn", { args: "none" }], + "@typescript-eslint/no-use-before-define": "warn", + "react/require-default-props": 0, + "react/jsx-props-no-spreading": 0, + "react/button-has-type": 0, + "jsx-a11y/label-has-associated-control": [ + "error", + { + labelComponents: [], + labelAttributes: [], + controlComponents: [], + assert: "either", + depth: 2, + }, + ], + "@typescript-eslint/naming-convention": [ + "error", + { + selector: "variableLike", + leadingUnderscore: "forbid", + trailingUnderscore: "forbid", + format: ["camelCase", "PascalCase", "UPPER_CASE"], + }, + ], + "import/extensions": 0, + }, +}; diff --git a/.github/ISSUE_TEMPLATE/content_issue.yml b/.github/ISSUE_TEMPLATE/content_issue.yml deleted file mode 100644 index 275b004a0a1..00000000000 --- a/.github/ISSUE_TEMPLATE/content_issue.yml +++ /dev/null @@ -1,75 +0,0 @@ ---- -name: Doc content issue report -description: Create a report to help us improve our content. -title: "[Content] " -labels: ["triage"] -body: - - type: markdown - attributes: - value: | - IMPORTANT: This is only for reporting documentation content issues. - - Report Besu software issues at https://github.com/hyperledger/besu/issues. - Report documentation tool issues using the "Documentation tool bug report" template. - - Before creating an issue, make sure you've tried using the search field in the documentation to find what you're looking for. - - - type: textarea - id: description - attributes: - label: Describe the issue - description: Add a clear and concise description of what the documentation issue is and what you expected the content to be. - placeholder: Tell us what you see! - validations: - required: true - - - type: input - id: page-url - attributes: - label: What page has the issue? - description: Provide the URL of the page where you found this issue. - placeholder: https://besu.hyperledger.org/en/stable/... - validations: - required: true - - - type: dropdown - id: issue-type - attributes: - label: Issue type - description: Select the issue type. - multiple: false - options: - - Missing content - - Outdated content - - Wrong content - - Confusing or misleading content - - Other - validations: - required: true - - - type: textarea - id: change-suggestion - attributes: - label: Change suggestion - description: If you know how to fix the content, provide a suggestion. - validations: - required: false - - - type: textarea - attributes: - label: More context - description: | - Add any other context about the problem here, for example, screenshots or a small demo video. - - Tip: You can attach image and video files by copy and pasting or by selecting this area to highlight it and then dragging files in. - validations: - required: false - - - type: checkboxes - id: recommendations - attributes: - label: Besu documentation issue guidelines - description: By checking this box, you confirm that you read and followed the [Besu documentation issue guidelines](https://wiki.hyperledger.org/display/BESU/Raise+issues). - options: - - label: I read and followed this project's documentation guidelines. - required: true diff --git a/.github/ISSUE_TEMPLATE/tool_issue.yml b/.github/ISSUE_TEMPLATE/tool_issue.yml deleted file mode 100644 index 99329faa6c3..00000000000 --- a/.github/ISSUE_TEMPLATE/tool_issue.yml +++ /dev/null @@ -1,115 +0,0 @@ ---- -name: Doc tool issue report -description: Create a report to help us improve our doc tools. -title: "[Doc tooling] " -labels: ["triage"] -assignees: 'NicolasMassart' - -body: - - type: markdown - attributes: - value: | - IMPORTANT: This is only for reporting documentation tool issues. - - Report Besu software issues at https://github.com/hyperledger/besu/issues. - Report documentation content issues using the "Documentation content issue report" template. - - Before creating an issue, make sure you've refreshed your browser cache for the site. - - - type: textarea - id: description - attributes: - label: Describe the issue - description: | - Add a clear and concise description of what the documentation tool issue is. - Include steps to reproduce the bug. - placeholder: | - - Step 1: Open the page - - Step 2: Select the button - - Step 3: Notice that feature X is not showing data Y - validations: - required: true - - - type: textarea - id: expected - attributes: - label: Describe the expected behavior - description: | - Add a clear and concise description of what you expected to happen. - placeholder: | - I expected feature X to show data Y when selecting the button. - validations: - required: true - - - type: input - id: page-url - attributes: - label: What page has this issue? - description: | - Provide the URL of the page where you experienced this issue. - If this issue is present on all the pages, simply point to the home page. - placeholder: https://besu.hyperledger.org/en/stable/... - validations: - required: true - - - type: input - id: version - attributes: - label: What version of the doc has this issue? - description: Provide the version of doc with the issue. - placeholder: latest, stable, 1.2.3, ... - validations: - required: true - - - type: dropdown - id: os - attributes: - label: Operating System - description: Select the operating system where you experienced the issue. - multiple: false - options: - - Windows - - macOS - - Linux - - Android - - iOS - - Other - - All of them - validations: - required: true - - - type: dropdown - id: browser - attributes: - label: Browser - description: Select the browser where you experienced the issue. - multiple: false - options: - - Chrome - - Edge - - Firefox - - Safari - - Brave - - Other - - All of them - validations: - required: true - - - type: textarea - attributes: - label: More context - description: | - Add any other context about the problem here, for example, screenshots or a small demo video. - - Tip: You can attach image and video files by copy and pasting or by selecting this area to highlight it and then dragging files in. - validations: - required: false - - - type: checkboxes - id: recommendations - attributes: - label: Besu documentation issue guidelines - description: By checking this box, you confirm that you read and followed the [Besu documentation issue guidelines](https://wiki.hyperledger.org/display/BESU/Raise+issues). - options: - - label: I read and followed this project's documentation guidelines. - required: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index fd0c93492c3..00000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,13 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "pip" # See documentation for possible values - directory: "/CI" # Location of package manifests - schedule: - interval: "weekly" - labels: - - "DocOps" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 98eb343e8a5..00000000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,60 +0,0 @@ -## Pull request checklist - -Use the following list to make sure your PR fits the Besu documentation quality standard. - -### Before creating the pull request - -Make sure that: - -- [ ] [All commits in this PR are signed off for the DCO](https://wiki.hyperledger.org/display/BESU/DCO). -- [ ] You've read the [contribution guidelines](https://wiki.hyperledger.org/display/BESU/Documentation). -- [ ] You've [previewed your changes locally](https://wiki.hyperledger.org/display/BESU/Preview+the+documentation). - -## Describe the change - - - -## Issue fixed - - - -## Impacted parts - - - -For content changes: - -- [ ] Documentation content -- [ ] Documentation page organization - -For tool changes: - -- [ ] Github Actions workflow -- [ ] Build and QA tools configuration (for example, lint rules or Vale style) -- [ ] MkDocs templates -- [ ] MkDocs configuration -- [ ] Python dependencies -- [ ] Node dependencies and JavaScript -- [ ] Read the Docs configuration -- [ ] GitHub integration - -## After creating your PR and tests have finished - -Make sure that: - -- [ ] You've fixed any issues raised by the tests. -- [ ] You've [previewed your changes on Read the Docs](https://wiki.hyperledger.org/display/BESU/Preview+the+documentation) - and added a [preview link](#preview). - -## Preview - - diff --git a/.github/workflows/build-lint.yml b/.github/workflows/build-lint.yml new file mode 100644 index 00000000000..f01758d2528 --- /dev/null +++ b/.github/workflows/build-lint.yml @@ -0,0 +1,62 @@ +name: Build and lint + +on: + workflow_call: + +jobs: + prepare: + name: Prepare + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + - name: Install Yarn dependencies + run: yarn --immutable + + build: + name: Build + runs-on: ubuntu-latest + needs: + - prepare + steps: + - uses: actions/checkout@v3 + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + - run: yarn --immutable --immutable-cache + - run: yarn build + - name: Require clean working directory + shell: bash + run: | + if ! git diff --exit-code; then + echo "Working tree dirty at end of job" + exit 1 + fi + + lint: + name: Lint + runs-on: ubuntu-latest + needs: + - prepare + steps: + - uses: actions/checkout@v3 + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + - run: yarn --immutable --immutable-cache + - run: yarn lint + - name: Require clean working directory + shell: bash + run: | + if ! git diff --exit-code; then + echo "Working tree dirty at end of job" + exit 1 + fi diff --git a/.github/workflows/build-no-insider.yml b/.github/workflows/build-no-insider.yml deleted file mode 100644 index fccc83debad..00000000000 --- a/.github/workflows/build-no-insider.yml +++ /dev/null @@ -1,41 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 ---- -name: Build without insider - -on: [pull_request] - -concurrency: - group: build-${{ github.ref }} - cancel-in-progress: true - -jobs: - check: - name: Run build - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - uses: actions/checkout@v3 - with: - # Full git history is needed to get a proper list of changed files within `super-linter` - fetch-depth: 0 - - - name: Install Python - uses: actions/setup-python@v4 - with: - python-version: '3.9' - cache: 'pip' # caching pip dependencies - - - name: Install dependencies - shell: sh - run: pip install -q -r CI/requirements-mkdocs-material.txt -r CI/requirements.txt - - - name: MkDocs Material non insider build - shell: sh - run: mkdocs build -s - - - name: Site artifacts - uses: actions/upload-artifact@v3 - with: - name: site-no-insider - path: site diff --git a/.github/workflows/case.yml b/.github/workflows/case.yml deleted file mode 100644 index cac15212cb7..00000000000 --- a/.github/workflows/case.yml +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: Check file name case - -on: [pull_request] - -concurrency: - group: case-${{ github.ref }} - cancel-in-progress: true - -jobs: - lint: - name: Check file name case - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - uses: actions/checkout@v3 - - name: Check pages file name case - shell: sh - run: | - echo "Testing file case in docs." - passed=true - for filename in $(find docs -name "*.md" | ( ! grep -P -v "^[[:lower:][:digit:]\/\-_]+\.md$" )) - do - echo "$filename" - echo "::error file=$filename ::File path must be only lowercase letters, digits, - (dash) and _ (underscore)" - passed=false - done; - if [ "$passed" = false ] ; then - echo "::error ::Some files path are incorrect. Check error annotations in the pull request." - echo "Correct example: my-folder/my-file-name_new2.md" - echo "Wrong example: My-Folder/MyFile-NAME.old.md" - exit 1 - fi diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 671e09c765d..00000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,67 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 ---- -name: "CodeQL" - -on: - push: - branches: [ main, release-* ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ main ] - schedule: - - cron: '19 15 * * 6' - -concurrency: - group: codeql-${{ github.ref }} - cancel-in-progress: true - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'javascript' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] - # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - # If the Autobuild fails above, remove it and uncomment the following three lines. - # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. - - # - run: | - # echo "Run, Build Application using script" - # ./location_of_script_within_repo/buildscript.sh - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/delete-preview.yml b/.github/workflows/delete-preview.yml new file mode 100644 index 00000000000..5c1db6ad57c --- /dev/null +++ b/.github/workflows/delete-preview.yml @@ -0,0 +1,42 @@ +name: Delete Branch Folders on gh-pages + +on: + pull_request: + types: [closed] + +jobs: + is-fork-pull-request: + name: Determine whether this pull request is from a fork + runs-on: ubuntu-latest + outputs: + IS_FORK: ${{ steps.is-fork.outputs.IS_FORK }} + steps: + - uses: actions/checkout@v3 + - name: Determine whether this PR is from a fork + id: is-fork + run: echo "IS_FORK=$(gh pr view --json isCrossRepository --jq '.isCrossRepository' "${PR_NUMBER}" )" >> "$GITHUB_OUTPUT" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + + delete_branch_folder_job: + runs-on: ubuntu-latest + needs: is-fork-pull-request + permissions: + contents: write + if: ${{ needs.is-fork-pull-request.outputs.IS_FORK == 'false' && github.event.pull_request.head.ref != 'wallet' && github.event.pull_request.head.ref != 'snaps' && github.event.pull_request.head.ref != 'guide' && github.event.pull_request.head.ref != 'assets' && github.event.pull_request.head.ref != 'img' && github.event.pull_request.head.ref != 'search' }} + steps: + - name: Checkout Repository + uses: actions/checkout@v3 + with: + ref: gh-pages + - name: Delete preview build + env: + BRANCH_NAME: ${{ github.event.pull_request.head.ref }} + run: rm -rf "${BRANCH_NAME}" + - name: Deploy + uses: peaceiris/actions-gh-pages@068dc23d9710f1ba62e86896f84735d869951305 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./ + keep_files: false diff --git a/.github/workflows/linkcheck.yml b/.github/workflows/linkcheck.yml deleted file mode 100644 index 8043830e14d..00000000000 --- a/.github/workflows/linkcheck.yml +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 ---- -name: Verify links - -on: [pull_request] - -concurrency: - group: links-${{ github.ref }} - cancel-in-progress: true - -jobs: - check: - name: Run check - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout tools repo - uses: actions/checkout@v3 - - - name: Test changed files links - uses: gaurav-nelson/github-action-markdown-link-check@v1 - with: - use-quiet-mode: yes - use-verbose-mode: yes - check-modified-files-only: yes - base-branch: main - config-file: ./CI/linkchecker/link_check_conf.json diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index d862591ed83..00000000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,37 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 ---- -name: Lint Code Base - -on: [pull_request] - -concurrency: - group: lint-${{ github.ref }} - cancel-in-progress: true - -jobs: - check: - name: Run check - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - uses: actions/checkout@v3 - with: - # Full git history is needed to get a proper list of changed files within `super-linter` - fetch-depth: 0 - - - name: Lint Code Base - uses: github/super-linter/slim@v4 - env: - VALIDATE_ALL_CODEBASE: false - DEFAULT_BRANCH: main - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - LINTER_RULES_PATH: ./CI/lint - MARKDOWN_CONFIG_FILE: .markdown.yml - LOG_LEVEL: ERROR - CSS_FILE_NAME: .stylelintrc.yaml - FILTER_REGEX_EXCLUDE: (/CI/vale/vale_styles/*|LICENSE) - VALIDATE_JAVASCRIPT_STANDARD: false - VALIDATE_PYTHON: false - IGNORE_GITIGNORED_FILES: true - VALIDATE_GITLEAKS: false diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000000..ae752615bbc --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,50 @@ +name: Main + +on: + push: + branches: [main] + pull_request: + +jobs: + check-workflows: + name: Check workflows + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Download actionlint + id: download-actionlint + run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/7fdc9630cc360ea1a469eed64ac6d78caeda1234/scripts/download-actionlint.bash) 1.6.22 + shell: bash + - name: Check workflow files + run: ${{ steps.download-actionlint.outputs.executable }} -color + shell: bash + + build-lint: + name: Build and lint + uses: ./.github/workflows/build-lint.yml + + all-jobs-completed: + name: All jobs completed + runs-on: ubuntu-latest + needs: + - check-workflows + - build-lint + outputs: + PASSED: ${{ steps.set-output.outputs.PASSED }} + steps: + - name: Set PASSED output + id: set-output + run: echo "PASSED=true" >> "$GITHUB_OUTPUT" + + all-jobs-pass: + name: All jobs pass + if: ${{ always() }} + runs-on: ubuntu-latest + needs: all-jobs-completed + steps: + - name: Check that all jobs have passed + run: | + passed="${{ needs.all-jobs-completed.outputs.PASSED }}" + if [[ $passed != "true" ]]; then + exit 1 + fi diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml deleted file mode 100644 index 8d72d990e7e..00000000000 --- a/.github/workflows/nightly.yml +++ /dev/null @@ -1,32 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 ---- -name: Nightly check - -on: - schedule: - # * is a special character in YAML so you have to quote this string - - cron: "0 0 * * *" - workflow_dispatch: {} - -concurrency: - group: nightly-${{ github.ref }} - cancel-in-progress: true - -jobs: - check: - name: Run check - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout tools repo - uses: actions/checkout@v3 - - - name: Test all the links - uses: gaurav-nelson/github-action-markdown-link-check@v1 - with: - use-quiet-mode: yes - use-verbose-mode: yes - check-modified-files-only: no - base-branch: main - config-file: ./CI/linkchecker/link_check_conf.json diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 00000000000..86fed01b580 --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,39 @@ +name: Publish docs to GitHub Pages + +on: + workflow_call: + inputs: + destination_dir: + type: string + ref: + required: false + type: string + +jobs: + publish-docs-to-gh-pages: + name: Publish docs to GitHub Pages + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout the repository + uses: actions/checkout@v3 + with: + ref: ${{ inputs.ref }} + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + - name: Install npm dependencies + run: yarn --immutable + - name: Run build script + run: DEST="/${{ inputs.destination_dir }}" yarn build + - name: Deploy to `${{ inputs.destination_dir }}` directory of `gh-pages` branch + uses: peaceiris/actions-gh-pages@068dc23d9710f1ba62e86896f84735d869951305 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./build + destination_dir: ${{ inputs.destination_dir }} + keep_files: true + diff --git a/.github/workflows/publish-main-docs.yml b/.github/workflows/publish-main-docs.yml new file mode 100644 index 00000000000..7aaccc1fe00 --- /dev/null +++ b/.github/workflows/publish-main-docs.yml @@ -0,0 +1,12 @@ +name: Publish main branch docs to GitHub Pages + +on: + push: + branches: main + +jobs: + publish-to-gh-pages: + name: Publish docs to `./` directory of `gh-pages` branch + permissions: + contents: write + uses: ./.github/workflows/publish-docs.yml \ No newline at end of file diff --git a/.github/workflows/publish-preview.yml b/.github/workflows/publish-preview.yml new file mode 100644 index 00000000000..2343997089e --- /dev/null +++ b/.github/workflows/publish-preview.yml @@ -0,0 +1,70 @@ +name: Publish a preview build + +on: + pull_request: + types: [opened, synchronize] + +jobs: + is-fork-pull-request: + name: Determine whether this pull request is from a fork + runs-on: ubuntu-latest + outputs: + IS_FORK: ${{ steps.is-fork.outputs.IS_FORK }} + steps: + - uses: actions/checkout@v3 + - name: Determine whether this PR is from a fork + id: is-fork + run: echo "IS_FORK=$(gh pr view --json isCrossRepository --jq '.isCrossRepository' "${PR_NUMBER}" )" >> "$GITHUB_OUTPUT" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + + get-commit-hash: + name: Get the commit hash for the commit being previewed + needs: is-fork-pull-request + # This ensures we don't publish on forks. We can't trust forks to publish on our domain. + # also ensures we dont publish previews to folders that are already used + if: ${{ needs.is-fork-pull-request.outputs.IS_FORK == 'false' && github.event.pull_request.head.ref != 'wallet' && github.event.pull_request.head.ref != 'snaps' && github.event.pull_request.head.ref != 'guide' && github.event.pull_request.head.ref != 'assets' && github.event.pull_request.head.ref != 'img' && github.event.pull_request.head.ref != 'search' }} + runs-on: ubuntu-latest + outputs: + COMMIT_SHA: ${{ steps.commit-sha.outputs.COMMIT_SHA }} + steps: + - uses: actions/checkout@v3 + - name: Checkout pull request + run: gh pr checkout "${PR_NUMBER}" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + - name: Get commit SHA + id: commit-sha + run: echo "COMMIT_SHA=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" + - name: Ensure commit hash is not empty + if: ${{ steps.commit-sha.outputs.COMMIT_SHA == '' }} + run: exit 1 + + publish-to-gh-pages: + name: Publish docs to commit hash directory of `gh-pages` branch + needs: get-commit-hash + permissions: + contents: write + uses: ./.github/workflows/publish-docs.yml + with: + destination_dir: ${{ github.head_ref }} + ref: ${{ needs.get-commit-hash.outputs.COMMIT_SHA }} + + post-preview-comment: + name: Post preview in comment + needs: + - get-commit-hash + - publish-to-gh-pages + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - uses: actions/checkout@v3 + - name: Post preview in comment + run: gh pr comment "${PR_NUMBER}" --body "${COMMENT_BODY}" + env: + COMMENT_BODY: "Preview published: [${{ github.head_ref }}](https://besu.hyperledger.org/${{ github.head_ref }}/)" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml deleted file mode 100644 index c701763bc60..00000000000 --- a/.github/workflows/spelling.yml +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: Verify spelling and guidelines - -on: [pull_request] - -concurrency: - group: spelling-${{ github.ref }} - cancel-in-progress: true - -env: - CONFIG: ./CI/vale/.vale.ini - -jobs: - check: - name: Run check - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - uses: actions/checkout@v3 - - - name: Sync Vale styles - run: | - docker run --rm \ - -v "$(pwd)":"/docs" \ - -w "/docs" \ - jdkato/vale --config "$CONFIG" sync - - - name: Run Vale check - run: | - docker run --rm \ - -v "$(pwd)":"/docs" \ - -w "/docs" \ - jdkato/vale --config "$CONFIG" --glob='!docs/assets/*' ./docs/ diff --git a/.github/workflows/weekly.yml b/.github/workflows/weekly.yml deleted file mode 100644 index 3a3f18d9ca4..00000000000 --- a/.github/workflows/weekly.yml +++ /dev/null @@ -1,29 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 ---- -name: Weekly check - -on: - schedule: - # * is a special character in YAML so you have to quote this string - - cron: "0 0 * * 0" - workflow_dispatch: {} - -concurrency: - group: weekly-${{ github.ref }} - cancel-in-progress: true - -jobs: - check: - name: Run check - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout tools repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Lint repository - uses: philips-labs/github-action-repolinter@2d7dc7e43a8d8d52db80b010434df2b8388b5817 - env: - CUSTOM_REPOLINT_FILE: https://github.com/hyperledger-labs/hyperledger-community-management-tools/raw/main/repo_structure/repolint.json diff --git a/.gitignore b/.gitignore index 2ace22eb2cc..b0524e457e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,33 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader .idea -site/ -env/ -*.out -node_modules/ -.circleci/process.yml + +# yarn v3 (w/o zero-install) +# See: https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Misc .DS_Store -*.log -.lh -.run +.idea +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.vercel \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000000..abeea9ccedb --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v19.4.0 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000000..d867b27bfe5 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "arrowParens": "always", + "bracketSameLine": true, + "bracketSpacing": true, + "printWidth": 80, + "proseWrap": "never", + "singleQuote": false, + "trailingComma": "all", + "tabWidth": 2, + "semi": true +} diff --git a/.readthedocs.yaml b/.readthedocs.yaml deleted file mode 100644 index 74dd0e118e2..00000000000 --- a/.readthedocs.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# .readthedocs.yaml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -build: - os: ubuntu-22.04 - tools: - python: "3.11" - -python: - install: - - requirements: CI/requirements-mkdocs-material-insider.txt - - requirements: CI/requirements.txt - -mkdocs: - configuration: mkdocs-insider.yml - fail_on_warning: true diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 00000000000..07f993f530d --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,9 @@ +# Stylelint runs on everything by default; we only lint CSS files. +* +!*/ +!*.css +__tests__/ +build +api/ +docs/ +blog/ diff --git a/.stylelintrc.js b/.stylelintrc.js new file mode 100644 index 00000000000..c163bf3e782 --- /dev/null +++ b/.stylelintrc.js @@ -0,0 +1,18 @@ +module.exports = { + extends: ["stylelint-config-standard", "stylelint-config-prettier"], + rules: { + "selector-pseudo-class-no-unknown": [ + true, + { + // :global is a CSS modules feature to escape from class name hashing + ignorePseudoClasses: ["global"], + }, + ], + "selector-class-pattern": null, + "custom-property-empty-line-before": null, + "selector-id-pattern": null, + "declaration-empty-line-before": null, + "comment-empty-line-before": null, + "value-keyword-case": ["lower", { camelCaseSvgKeywords: true }], + }, +}; diff --git a/CI/linkchecker/link_check_conf.json b/CI/linkchecker/link_check_conf.json deleted file mode 100644 index d37ce7d8b68..00000000000 --- a/CI/linkchecker/link_check_conf.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "ignorePatterns": [ - { - "pattern": "^http(s)?://localhost" - }, - { - "pattern": "^http(s)?://127.0.0.1" - }, - { - "pattern": "^http(s)?://.+.etherscan.io" - }, - { - "pattern": "^http(s)?://.+.tokenview.com" - }, - { - "pattern": "/postman/.+.json" - }, - { - "pattern": "^http(s)?://.+.zendesk.com" - }, - { - "pattern": "^http(s)?://consensys.net" - } - ], - "timeout": "20s", - "aliveStatusCodes":[200, 206], - "retryOn429":true -} diff --git a/CI/lint/.htmlhintrc b/CI/lint/.htmlhintrc deleted file mode 100644 index c209df9b8f0..00000000000 --- a/CI/lint/.htmlhintrc +++ /dev/null @@ -1,25 +0,0 @@ -{ - "tagname-lowercase": true, - "attr-lowercase": true, - "attr-value-double-quotes": true, - "attr-value-not-empty": false, - "attr-no-duplication": false, - "doctype-first": false, - "tag-pair": true, - "tag-self-close": false, - "spec-char-escape": true, - "id-unique": true, - "src-not-empty": true, - "title-require": true, - "alt-require": true, - "doctype-html5": true, - "id-class-value": "false", - "style-disabled": false, - "inline-style-disabled": false, - "inline-script-disabled": false, - "space-tab-mixed-disabled": "space", - "id-class-ad-disabled": false, - "href-abs-or-rel": false, - "attr-unsafe-chars": true, - "head-script-disabled": true -} diff --git a/CI/lint/.jscpd.json b/CI/lint/.jscpd.json deleted file mode 100644 index d76d62951f1..00000000000 --- a/CI/lint/.jscpd.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "threshold": 20 -} diff --git a/CI/lint/.markdown.yml b/CI/lint/.markdown.yml deleted file mode 100644 index 392f946585f..00000000000 --- a/CI/lint/.markdown.yml +++ /dev/null @@ -1,41 +0,0 @@ ---- -########################### -########################### -## Markdown Linter rules ## -########################### -########################### - -# Linter rules doc: -# - https://github.com/DavidAnson/markdownlint -# -# Note: -# To comment out a single error: -# -# any violations you want -# -# -default: true -no-trailing-punctuation: - punctuation: '.,;:!' -ul-indent: - indent: 4 - -no-bare-urls: false -code-block-style: false -line-length: false - -# excluded rule for as kramdown has a bug. -# see https://github.com/markdownlint/markdownlint/issues/294#issuecomment-600600407 -# these are now in info style. -# to be put back in error style once bug fixed. -single-h1: false -no-space-in-code: false -no-duplicate-header: false -first-line-h1: false - -# Because I hate HTML but sometimes a table is hard to format in MD -# now in info style. -no-inline-html: false - -# MD053 code bloc are wrongly recognised as indented making links ignored in admonitions -link-image-reference-definitions: false diff --git a/CI/lint/.openapirc.yml b/CI/lint/.openapirc.yml deleted file mode 100644 index ac2d2e34f28..00000000000 --- a/CI/lint/.openapirc.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -########################## -## OpenAPI Linter rules ## -########################## - -extends: - - spectral:oas - -#rules: -# operation-tag-defined: off -# operation-operationId: off -# operation-description: off -# operation-tags: off -# oas2-valid-schema-example: off -# oas2-api-host: off -# oas2-operation-security-defined: off -# oas2-api-schemes: off -# info-contact : off - - diff --git a/CI/lint/.stylelintrc.yaml b/CI/lint/.stylelintrc.yaml deleted file mode 100644 index e3977a6304c..00000000000 --- a/CI/lint/.stylelintrc.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -rules: - # disable selector-class-pattern as we mostly use class names from MkDOcs Material and they don't - # match the default linter pattern (kebab case) and can be overrides of generated selectors. - selector-class-pattern: null diff --git a/CI/lint/.textlintrc b/CI/lint/.textlintrc deleted file mode 100644 index af2c3a035b8..00000000000 --- a/CI/lint/.textlintrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "rules": { - "terminology": { - "severity" : "warning" - } - } -} diff --git a/CI/requirements-mkdocs-material-insider.txt b/CI/requirements-mkdocs-material-insider.txt deleted file mode 100644 index fdd3f48e1b6..00000000000 --- a/CI/requirements-mkdocs-material-insider.txt +++ /dev/null @@ -1 +0,0 @@ -git+https://${MKDOCS_GITHUB_USER}:${MKDOCS_GITHUB_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git@8.5.6-insiders-4.25.4 diff --git a/CI/requirements-mkdocs-material.txt b/CI/requirements-mkdocs-material.txt deleted file mode 100644 index fec234f28d4..00000000000 --- a/CI/requirements-mkdocs-material.txt +++ /dev/null @@ -1,2 +0,0 @@ -mkdocs-material==9.1.16 - diff --git a/CI/requirements.txt b/CI/requirements.txt deleted file mode 100644 index e206d099a76..00000000000 --- a/CI/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -markdown-fenced-code-tabs==1.0.5 -markdown-include==0.8.1 -mkdocs-markdownextradata-plugin==0.2.5 -mkdocs-exclude==1.0.2 -mkdocs-redirects==1.2.0 -mkdocs-git-revision-date-localized-plugin==1.2.0 -mkdocs-minify-plugin==0.6.4 -plantuml-markdown==3.9.1 diff --git a/CI/vale/.vale.ini b/CI/vale/.vale.ini deleted file mode 100644 index 44ea7a99920..00000000000 --- a/CI/vale/.vale.ini +++ /dev/null @@ -1,38 +0,0 @@ -# Vale configuration - -# Styles directory -# See vale_styles/README.md file for details and licencing information -StylesPath = styles - -Packages = proselint, Microsoft, write-good - -Vocab = Besu - -# The minimum alert level to display (suggestion, warning, or error). -# CI builds will only fail on error-level alerts. -MinAlertLevel = warning - -[formats] -mdx = md - -# Global settings (applied to every syntax) -[*.md] - -# ignore includes and latex math code -TokenIgnores = (--8<-- "[^"]+"),(\$[^\n$`]+\$),(\$\$[^$`]+\$\$) -# List of styles to load -BasedOnStyles = Vale, proselint, write-good, Microsoft, Besu - -# Style.Rule = {YES, NO} to enable or disable a specific rule -Microsoft.Contractions = warning -Microsoft.GeneralURL = NO -# Microsoft.Acronyms is replaced by Besu list -Microsoft.Acronyms = NO -Microsoft.Headings = NO - -write-good.Weasel = NO - -proselint.Hyperbole = warning - -[*.yml] -BasedOnStyles = diff --git a/CI/vale/styles/Besu/Acronyms.yml b/CI/vale/styles/Besu/Acronyms.yml deleted file mode 100644 index 055faa16056..00000000000 --- a/CI/vale/styles/Besu/Acronyms.yml +++ /dev/null @@ -1,62 +0,0 @@ -extends: conditional -message: "'%s' has no definition." -level: suggestion -ignorecase: true -# Ensures that the existence of 'first' implies the existence of 'second'. -first: '\b([A-Z]{3,5})\b' -second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)' -# ... with the exception of these: -exceptions: - - API - - AWS - - CLA - - CLI - - CPU - - CSV - - DEBUG - - ECDSA - - ETH - - EVM - - GET - - GPU - - GUI - - HTML - - HTTP - - HTTPS - - IBFT - - IBFT2 - - IDE - - IPC - - JAR - - JDK - - JRE - - JSON - - JVM - - P2P - - PATH - - PIP - - PBFT - - POA - - POS - - POST - - POW - - RAM - - RPC - - RSA - - SDK - - SQL - - SSH - - SSL - - SVG - - TCP - - TLS - - TOC - - TOML - - URI - - URL - - VM - - WAR - - WEI - - XML - - YAML - - ZIP diff --git a/CI/vale/styles/Besu/Headings.yml b/CI/vale/styles/Besu/Headings.yml deleted file mode 100644 index 440724921e6..00000000000 --- a/CI/vale/styles/Besu/Headings.yml +++ /dev/null @@ -1,45 +0,0 @@ -extends: capitalization -message: "'%s' should use sentence-style capitalization." -link: 'https://docs.microsoft.com/en-us/style-guide/capitalization' -level: suggestion -scope: heading -match: $sentence -indicators: - - ':' -exceptions: - - Besu - - EthSigner - - GoQuorum - - Quorum - - Orion - - Hyperledger - - PegaSys - - Consensys - - Ethereum - - ETH - - TOML - - YAML - - YML - - JSON - - RPC - - Hashicorp - - Vault - - Azure - - CLI - - Code - - Cosmos - - Docker - - Emmet - - I - - Kubernetes - - Linux - - macOS - - Marketplace - - MongoDB - - REPL - - Studio - - TypeScript - - URLs - - Visual - - VS - - Windows diff --git a/CI/vale/styles/Besu/Latin.yml b/CI/vale/styles/Besu/Latin.yml deleted file mode 100644 index 2815844385a..00000000000 --- a/CI/vale/styles/Besu/Latin.yml +++ /dev/null @@ -1,8 +0,0 @@ -extends: substitution -message: "Prefer English '%s' over Latin '%s' term." -level: error -ignorecase: true -action: - name: replace -swap: - de facto: default diff --git a/CI/vale/styles/README.md b/CI/vale/styles/README.md deleted file mode 100644 index 4bf232bfd1d..00000000000 --- a/CI/vale/styles/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Vale Styles - -Styles in this directory are all from external sources except the Besu one. - -Each external style folder are licensed under the terms specified in the directory LICENCE or README.md file. - -## Versions - -External style are imported form the following releases: - -- Write-Good style: -- Proseling style: -- Microsoft style: diff --git a/CI/vale/styles/Vocab/Besu/accept.txt b/CI/vale/styles/Vocab/Besu/accept.txt deleted file mode 100644 index a5d1731b80f..00000000000 --- a/CI/vale/styles/Vocab/Besu/accept.txt +++ /dev/null @@ -1,195 +0,0 @@ -[aA]lertmanager -Alethio -[aA]llowlist(s)? -Ansible -API(s)? -[aA]utogenerated -[aA]ttester(s)? -AZ(s)? -Azure -[bB]ackend -[bB]ackoff -BerkeleyDB -Besu -Bintray -[bB]lockchain(s)? -BlockScout -[bB]oolean(s)? -[bB]ootnode(s)? -[bB]roadcast(ing|ed) -Cakeshop -[cC]lasspath(s)? -Cloudwatch -Codefi -[cC]olocate -[cC]oinbase -[cC]onfig -[cC]onfigurability -containerd -ConsenSys -[cC]ounterpart(y|ies) -CPU(s)? -[cC]rafter -[cC]ryptocurrenc(y|ies) -ctrl -Dapp(s)? -[dD]enylist(s)? -Dev -[dD]atatype(s)? -[dD]eauthoriz(e|ing) -EIP(s)? -[eE]ncryptor(s)? -[eE]node(s)? -etcd -Ethash -Ethereum -Etherscan -Ethminer -EthSigner -[eE]thstats -Filebeat -Filecoin -Filestore(s)? -[fF]rontend -[gG]eth -GitHub -Gitter -glibc -Goerli -GoQuorum -[gG]olang -Gradle -Grafana -gRPC -[gG]?[wW]ei -HAProxy -HashiCorp -[hH]ashrate(s)? -Helmfile(s)? -Homebrew -[hH]ostname(s)? -Hyperledger -[iI]ncentiviz(?:e|es|ed|ing) -InfluxDB -Infura -Italiane -Jasypt -Javadoc -jemalloc -JMeter -JSON -jnacl -JWT(s)? -Kafka -kalium -Keycloak -[kK]eystore(s)? -[kK]eytool(s)? -Kibana -Kotti -[kK]ube -[kK]ubenet -[kK]ubectl -[kK]ubernetes -libsodium -[lL]iveness -Logback -Logstash -Logrus -[mM]ainnet(s)? -(([uU]nm)|[mM])arshal(ling)? -Medalla -Merkle -MetaMask -Metricbeat -[mM]inikube -MkDocs -[mM]ultiaddresse(s)? -[mM]ultikey(s)? -[nN]amespace(s)? -[nN]erdctl -Nginx -Nodejs -[nN]once(s)? -NVMe -[oO]ffchain -[oO]nboard(ing)? -[oO]nchain -Optane -Orion -[oO]wnable -[pP]arallelization -PegaSys -[pP]ermission(ing|ed)? -[pP]luggable -PMT(s)? -P[oO]A -Poste -Postgres -P[oO]W -[pP]re -[pP]recompile(d)? -[pP]reidentif(y|ied) -Prometheus -Promtail -Protobuf -Prysm -Prysmatic -Pushgateway -Pyrmont -[qQ]uorum -Raft -RBAC -rbac -ReadTheDocs -Redis -[rR]edistributable(s)? -[rR]eentrancy -[rR]epurposing -Retesteth -Rinkeby -Ropsten -Mordor -[sS]andbox(ed|ing) -[sS]epolia -Sirato -Slack -[sS]lashable -Splunk -SSD(s)? -statefully -[sS]tatefulset -[sS]ubcommand(s)? -[sS]ubnet(s)? -[sS]uborganization(s)? -[sS]ynchronizer(s)? -Teku -Telegraf -[tT]estnet(s)? -tmux -[tT]oolset(s)? -[tT]rie(s)? -[tT]ruststore(s)? -[uU]ncache(d)? -underflow(s)? -[uU]nencode(d)? -[uU]nencrypt(ed)? -Unix -[uU]ntrust(ed)? -[uU]pcheck -[uU]pstream(s)? -[vV]alidator(s)? -Vertx -[vV]eto(s|es)? -VNet(s)? -VPC(s)? -VPN(s)? -VSCode -VTx -Web -Web3Signer -[wW]ebservice(s)? -Websocket(s)? -withdrawable -wscat -Zinken diff --git a/CI/vale/styles/Vocab/Besu/reject.txt b/CI/vale/styles/Vocab/Besu/reject.txt deleted file mode 100644 index 208c9367c23..00000000000 --- a/CI/vale/styles/Vocab/Besu/reject.txt +++ /dev/null @@ -1 +0,0 @@ -automagically diff --git a/README.md b/README.md index 40c64c09a0b..a14c84846a4 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,30 @@ # Hyperledger Besu documentation -[Hyperledger Besu](https://github.com/hyperledger/besu/) is a Hyperledger enterprise-grade, -Java-based, Apache 2.0 licensed Ethereum client. +[Hyperledger Besu](https://github.com/hyperledger/besu/) is a Hyperledger enterprise-grade, Java-based, Apache 2.0 licensed Ethereum client. -Welcome to the **Besu Documentation** repository. If you're looking for the software sources, go to -[Besu GitHub source code repository](https://github.com/hyperledger/besu). +Welcome to the **Besu Documentation** repository. If you're looking for the software sources, go to [Besu GitHub source code repository](https://github.com/hyperledger/besu). -This repository only contains the sources for -[Besu documentation website hosted by ReadTheDocs][Besu User Documentation]. +This repository only contains the sources for [Besu documentation website hosted by ReadTheDocs][Besu User Documentation]. ## Useful links -* [Besu user documentation][Besu User Documentation] -* [Besu issues](https://github.com/hyperledger/besu/issues) -* [Besu docs issues](https://github.com/hyperledger/besu-docs/issues) -* [Besu wiki](https://wiki.hyperledger.org/display/BESU/Hyperledger+Besu) -* [How to contribute to the documentation](CONTRIBUTING.md) -* How to contribute to the - [Besu codebase](https://github.com/hyperledger/besu/blob/master/CONTRIBUTING.md). +- [Besu user documentation][Besu User Documentation] +- [Besu issues](https://github.com/hyperledger/besu/issues) +- [Besu docs issues](https://github.com/hyperledger/besu-docs/issues) +- [Besu wiki](https://wiki.hyperledger.org/display/BESU/Hyperledger+Besu) +- [How to contribute to the documentation](CONTRIBUTING.md) +- How to contribute to the [Besu codebase](https://github.com/hyperledger/besu/blob/master/CONTRIBUTING.md). ## GitHub/Discord/Linux Foundation accounts Having the following accounts is necessary for contributing code/issues to Besu: -* If you want to contribute code, create a [Linux Foundation (LF) account] and a [GitHub account]. -* If you want to raise an issue, login to your [GitHub account]. -* [Hyperledger Discord] also requires a Discord account. +- If you want to contribute code, create a [Linux Foundation (LF) account] and a [GitHub account]. +- If you want to raise an issue, login to your [GitHub account]. +- [Hyperledger Discord] also requires a Discord account. + [Besu User Documentation]: https://besu.hyperledger.org [Linux Foundation (LF) account]: https://wiki.hyperledger.org/display/CA/Setting+up+an+LFID [GitHub account]: https://www.github.com/ diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000000..bfd75dbdfc7 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve("@docusaurus/core/lib/babel/preset")], +}; diff --git a/custom_theme/404.html b/custom_theme/404.html deleted file mode 100644 index b941a89ec90..00000000000 --- a/custom_theme/404.html +++ /dev/null @@ -1,24 +0,0 @@ -{% extends "main.html" %} - - -{% block content %} - -

- {% if config.theme.logo.icon %} - {{ config.theme.logo.icon }} - {% else %} - {{ config.site_name }} logo - {% endif %} -

- -

404

-

Sorry but we can't find the page you asked for.

-

- Try the homepage, or use the search field on the top of this page. -

-

- If you think we made a mistake and deleted a page that should be here, then please tell us on - {{config.site_name}} chat channel or create an issue on the doc repository. -

- -{% endblock %} diff --git a/custom_theme/assets/javascripts/custom_theme.js b/custom_theme/assets/javascripts/custom_theme.js deleted file mode 100644 index 2503f074ada..00000000000 --- a/custom_theme/assets/javascripts/custom_theme.js +++ /dev/null @@ -1,13 +0,0 @@ -/* global $ */ -$(document).ready(function () { - displayLatestWarning() -}) - -$(window).on('hashchange', function () { - displayLatestWarning() -}) - -function displayLatestWarning() { - $(".latest-warning").css("display", - $(location).attr('href').includes(latestWarningTrigger) ? "block" : "none") -} diff --git a/custom_theme/assets/stylesheets/custom_theme.css b/custom_theme/assets/stylesheets/custom_theme.css deleted file mode 100644 index 61d4989e417..00000000000 --- a/custom_theme/assets/stylesheets/custom_theme.css +++ /dev/null @@ -1,131 +0,0 @@ -/*Light and dark scheme dependent colour variables*/ - -:root, [data-md-color-scheme=default] { - --mdx-version-notice-bg-color: #ff8721; - --mdx-custom-footer-bg-color: #00bda4; - --mdx-custom-footer-fg-color: #000; - --mdx-admonition-critical-border-color: rgb(220, 0, 0); - --mdx-admonition-critical-bg-color: rgb(250, 150, 150); - --mdx-admonition-critical-title-color: #FFF; -} -:root, [data-md-color-scheme=slate] { - --mdx-version-notice-bg-color: #d26000; - --mdx-custom-footer-bg-color: #008c7b; - --mdx-custom-footer-fg-color: #fff; - --mdx-admonition-critical-border-color: rgb(220, 0, 0); - --mdx-admonition-critical-bg-color: rgb(160, 0, 0); - --mdx-admonition-critical-title-color: #FFF; -} - -/*Footer feedback banner*/ -.custom-footer{ - padding: 1em; - text-align: center; - color: var(--mdx-custom-footer-fg-color); - background-color: var(--mdx-custom-footer-bg-color); -} -.custom-footer a { - color: var(--mdx-custom-footer-fg-color) !important; -} - -/*Navigation customisation*/ -.md-nav--secondary .md-nav__item .md-nav__item a.md-nav__link { - font-weight: normal; - font-size: inherit; -} -.md-nav--secondary a.md-nav__link { - font-weight: bolder; -} - -/*Readthedocs version box customisation*/ -.rst-versions { - border-color: var(--md-accent-fg-color) !important; - border-style: solid !important; - font-size: large; -} - -.rst-versions .rst-current-version { - background-color: var(--md-default-bg-color) !important; -} - -/*Custom font for header permalinks*/ -.headerlink { - font-family: "Font Awesome 5 Free", sans-serif; - font-weight: 900; - font-size: small; -} - - -/*Latest doc version warning banner*/ -.latest-warning { - display: none; - padding: 1em; - background-color: var(--mdx-version-notice-bg-color); - color: var(--md-typeset-color); - font-size: 1.5em; - text-align: center; - width: inherit; -} - -/*Page footer*/ -.md-footer-copyright { - max-width: 100% !important; -} - -/*External links arrow symbol*/ -.md-footer a[href^="http"]:not(.md-social__link):after, -.feedback a[href^="http"]:after, -.md-content a[href^="http"]:not(.md-content__icon):not(.md-content__button):after { - font-family: "Font Awesome 5 Free", sans-serif; - font-weight: 900; - font-size: small; - content: " \f360"; -} - -/*Logo auto sizing*/ -#header-logo{ - width: auto; -} - -/*Page last change date in italic*/ -.md-source-date { - font-style: italic; -} - -/*Critical admonition design*/ -:root { - --md-admonition-icon--critical: url("data:image/svg+xml;charset=utf-8,") -} - -.md-typeset .admonition.critical, -.md-typeset details.critical { - border-color: var(--mdx-admonition-critical-border-color); - background-color: var(--mdx-admonition-critical-bg-color); -} - -.md-typeset .admonition.critical strong{ - font-size: large; -} - -.md-typeset .critical > .admonition-title, -.md-typeset .critical > summary { - color: var(--mdx-admonition-critical-title-color); - background-color: var(--mdx-admonition-critical-border-color); - border-color: var(--mdx-admonition-critical-border-color); -} -.md-typeset .critical > .admonition-title::before, -.md-typeset .critical > summary::before { - background-color: var(--mdx-admonition-critical-title-color); - -webkit-mask-image: var(--md-admonition-icon--critical); - mask-image: var(--md-admonition-icon--critical); -} - -/*Cookie consent*/ -.md-consent__overlay { - display: none; -} - -.md-consent__inner { - background-color: var(--md-default-fg-color); - color: var(--md-default-bg-color); -} diff --git a/custom_theme/main.html b/custom_theme/main.html deleted file mode 100644 index f4d94c20000..00000000000 --- a/custom_theme/main.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends "base.html" %} - -{% block libs %} - - - - -{% endblock %} - -{% block hero %} - {# hero is not used, so use it for warning banner #} -
{{config.extra.latest_version_warning.text}}
-{% endblock %} - -{% block config %} - {{ super() }} - {% if config.plugins.search %} - - {% endif %} -{% endblock %} - -{% block extrahead %} - -{% endblock %} diff --git a/custom_theme/partials/content.html b/custom_theme/partials/content.html deleted file mode 100644 index c0ff3bc6ca7..00000000000 --- a/custom_theme/partials/content.html +++ /dev/null @@ -1,22 +0,0 @@ -{% if page.edit_url and config.extra.page_edit_button %} - - {% include ".icons/material/pencil.svg" %} - -{% endif %} -{% if page.meta and ( - page.meta.git_revision_date_localized or - page.meta.revision_date -) %} - {% include "partials/source-file.html" %} -{% endif %} -{% if "tags" in config.plugins %} - {% include "partials/tags.html" %} -{% endif %} -{% if not "\x3ch1" in page.content %} -

{{ page.title | d(config.site_name, true)}}

-{% endif %} -{{ page.content }} - -{% if config.extra.is_insider %} - {% include "partials/feedback.html" %} -{% endif %} diff --git a/custom_theme/partials/footer.html b/custom_theme/partials/footer.html deleted file mode 100644 index 04f7d02ebca..00000000000 --- a/custom_theme/partials/footer.html +++ /dev/null @@ -1,56 +0,0 @@ - diff --git a/custom_theme/partials/header.html b/custom_theme/partials/header.html deleted file mode 100644 index f4cad92c36d..00000000000 --- a/custom_theme/partials/header.html +++ /dev/null @@ -1,85 +0,0 @@ -{% set class = "md-header" %} -{% if "navigation.tabs.sticky" in features %} - {% set class = class ~ " md-header--lifted" %} -{% endif %} -
- - {% if "navigation.tabs.sticky" in features %} - {% if "navigation.tabs" in features %} - {% include "partials/tabs.html" %} - {% endif %} - {% endif %} -
diff --git a/custom_theme/partials/integrations/analytics/tag_manager.html b/custom_theme/partials/integrations/analytics/tag_manager.html deleted file mode 100644 index b98b48c8d37..00000000000 --- a/custom_theme/partials/integrations/analytics/tag_manager.html +++ /dev/null @@ -1,14 +0,0 @@ -{% if config.extra.analytics.site_verification %} - - -{% endif %} - -{% if config.extra.analytics.tag_manager %} - - - -{% endif %} diff --git a/custom_theme/partials/logo.html b/custom_theme/partials/logo.html deleted file mode 100644 index 2040ddaa742..00000000000 --- a/custom_theme/partials/logo.html +++ /dev/null @@ -1,6 +0,0 @@ -{% if config.theme.logo %} - -{% else %} - {% set icon = config.theme.icon.logo or "material/library" %} - {% include ".icons/" ~ icon ~ ".svg" %} -{% endif %} diff --git a/custom_theme/partials/source-file.html b/custom_theme/partials/source-file.html deleted file mode 100644 index 46dc09e32d5..00000000000 --- a/custom_theme/partials/source-file.html +++ /dev/null @@ -1,16 +0,0 @@ -
- - {% if page.meta.git_revision_date_localized %} - {{ lang.t("source.file.date.updated") }}: - {{ page.meta.git_revision_date_localized }} - {% if page.meta.git_creation_date_localized %} -
- {{ lang.t("source.file.date.created") }}: - {{ page.meta.git_creation_date_localized }} - {% endif %} - {% elif page.meta.revision_date %} - {{ lang.t("source.file.date.updated") }}: - {{ page.meta.revision_date }} - {% endif %} -
-
diff --git a/custom_theme/partials/source.html b/custom_theme/partials/source.html deleted file mode 100644 index ae31f388e30..00000000000 --- a/custom_theme/partials/source.html +++ /dev/null @@ -1,12 +0,0 @@ -{#- - This file was automatically generated - do not edit --#} - -
- {% set icon = config.theme.icon.repo or "fontawesome/brands/git-alt" %} - {% include ".icons/" ~ icon ~ ".svg" %} -
-
- {{ config.extra.code_repo_name }} -
-
diff --git a/custom_theme/partials/toc.html b/custom_theme/partials/toc.html deleted file mode 100644 index 6c5a5b2a99a..00000000000 --- a/custom_theme/partials/toc.html +++ /dev/null @@ -1,18 +0,0 @@ -{% set title = lang.t("toc.title") %} -{% if config.mdx_configs.toc and config.mdx_configs.toc.title %} - {% set title = config.mdx_configs.toc.title %} -{% endif %} - diff --git a/docs/assets/postman/postman_collection.json b/docs/assets/postman/postman_collection.json index 831619b731d..55bfdfcf814 100644 --- a/docs/assets/postman/postman_collection.json +++ b/docs/assets/postman/postman_collection.json @@ -2,7 +2,7 @@ "info": { "_postman_id": "f334929f-c8c3-43ed-bb73-69a6f0d728d8", "name": "Hyperledger Besu JSON-RPC API", - "description": "Hyperledger Besu JSON-RPC API enables interaction with a Besu Ethereum node.\n\nRefer to [Besu documentation howto page](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API/) to learn how to use this API.\n", + "description": "Hyperledger Besu JSON-RPC API enables interaction with a Besu Ethereum node.\n\nRefer to [Besu documentation how to page](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API/) to learn how to use this API.\n", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ @@ -48,9 +48,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Adds a static node\n\n> **Caution**\n>\n> If connections are timing out, ensure the node ID in the enode URL is correct.\n\n#### Parameters\n\n`string` : Enode URL of peer to add\n\n#### Returns\n\n`result` : `boolean` - `true` if peer added or `false` if peer already a static node." @@ -73,9 +71,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -104,9 +100,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Changes the log level without restarting Besu. You can change the log level for all logs, or you\ncan change the log level for specific packages or classes.\n\nYou can specify only one log level per RPC call.\n\n#### Parameters\n\n`level` - [Log level](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#logging)\n\n`log_filter`: `Array` - Packages or classes to change the log level for. Optional.\n\n#### Returns\n\n`result` : `Success` if the log level has changed, otherwise `error`." @@ -129,9 +123,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -160,9 +152,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Generates cached log bloom indexes for blocks. APIs such as [`eth_getLogs`](#eth_getlogs) and\n[`eth_getFilterLogs`](#eth_getfilterlogs) use the cache for improved performance.\n\n> **note**\n>\n> Each index file contains 100000 blocks. The last fragment of blocks less than 100000 are not indexed.\n\n> **tip**\n>\n> Manually executing `admin_generateLogBloomCache` is not required unless the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#auto-log-bloom-caching-enabled) command line option was set to false.\n\n#### Parameters\n\n`integer` - Block to start generating indexes.\n\n`integer` - Block to stop generating indexes.\n\n#### Returns\n\n`result` : *object* - Log bloom index details:\n\n* `quantity` : `startBlock` - Starting block for the last requested cache generation.\n* `quantity` : `endBlock` - Ending block for the last requested cache generation.\n* `quantity` : `currentBlock` - The most recent block added to the cache.\n* `boolean` : `indexing` - `true` if indexing is in progress.\n* `boolean` : `true` indicates acceptance of the request from this call to generate the cache." @@ -185,9 +175,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -216,9 +204,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Repairs cached logs by fixing all segments starting with the specified block number.\n\n#### Parameters\n\n`quantity` - Decimal index of the starting block to fix. If left empty, the head block\nis used as the starting point.\n\n#### Returns\n\n`result` - Status of the repair request. Either `Started`, or `Already running`." @@ -241,9 +227,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -272,9 +256,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns networking information about the node. The information includes general information about\nthe node and specific information from each running Ethereum sub-protocol (for example, `eth`).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : Node object\n\nProperties of the node object are:\n\n* `enode` - [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of the node.\n* `listenAddr` - Host and port for the node.\n* `name` - Client name.\n* `id` - [Node public key](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#node-public-key).\n* `ports` - Peer discovery and listening\n [ports](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Managing-Peers#port-configuration).\n* `protocols` - List of objects containing information for each Ethereum sub-protocol.\n\n> **note**\n>\n> If the node is running locally, the host of the `enode` and `listenAddr` display as `[::]` in the result. When advertising externally, the external address displayed for the `enode` and `listenAddr` is defined by [`--nat-method`](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Specifying-NAT).\n" @@ -297,9 +279,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -328,9 +308,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns networking information about connected remote nodes.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *array* of *objects* - Object returned for each remote node.\n\nProperties of the remote node object are:\n\n* `version` - P2P protocol version.\n* `name` - Client name.\n* `caps` - List of Ethereum sub-protocol capabilities.\n* `network` - Local and remote addresses established at time of bonding with the peer. The remote\n address might not match the hex value for `port`. The remote address depends on which node\n initiated the connection.\n* `port` - Port on the remote node on which P2P discovery is listening.\n* `id` - Node public key. Excluding the `0x` prefix, the node public key is the ID in the enode\n URL `enode://@:`.\n* `protocols` - [Current state of peer](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Managing-Peers#monitoring-peer-connections)\n including `difficulty` and `head`. `head` is the hash of the highest known block for the peer." @@ -353,9 +331,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -384,9 +360,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Removes a [static node](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Static-Nodes).\n\n#### Parameters\n\n`string` : [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of peer to remove.\n\n#### Returns\n\n`result` : `boolean` - `true` if peer removed or `false` if peer not a\n[static node](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Static-Nodes))." @@ -409,9 +383,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -430,18 +402,14 @@ "listen": "prerequest", "script": { "type": "text/javascript", - "exec": [ - "" - ] + "exec": [""] } }, { "listen": "test", "script": { "type": "text/javascript", - "exec": [ - "" - ] + "exec": [""] } } ] @@ -466,9 +434,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Discards a proposal to [add or remove a signer with the specified address].\n\n#### Parameters\n\n`data` - 20-byte address of proposed signer.\n\n#### Returns\n\n`result: boolean` - `true`" @@ -491,9 +457,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -522,9 +486,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Provides validator metrics for the specified range:\n\n* Number of blocks from each validator.\n* Block number of the last block proposed by each validator (if any proposed in the specified\n range).\n* All validators present in the last block.\n\n#### Parameters\n\n`fromBlockNumber` - Integer representing a block number or the string tag `earliest`, as described\nin [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`toBlockNumber` - Integer representing a block number or one of the string tags `latest` or\n`pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter)\n\nIf you specify:\n\n* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less\n than 100 blocks.\n* Only the first parameter, the call provides metrics for all blocks from the block specified to\n the latest block.\n\n#### Returns\n\n`result`: _object_ - List of validator objects.\n\n> **Note**\n>\n> The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`." @@ -547,9 +509,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -578,9 +538,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists [signers for the specified block].\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result: array of data` - List of 20-byte addresses of signers." @@ -603,9 +561,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -634,9 +590,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists signers for the specified block.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result: array of data` - List of 20-byte addresses of signers." @@ -659,9 +613,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -690,9 +642,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns\n[current proposals](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/Clique#adding-and-removing-signers).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`:_object_ - Map of account addresses to corresponding boolean values indicating the\nproposal for each account.\n\nIf the boolean value is `true`, the proposal is to add a signer. If `false`, the proposal is to\nremove a signer." @@ -715,9 +665,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -746,9 +694,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Propose to [add or remove a signer with the specified address].\n\n#### Parameters\n\n`data` - 20-byte address.\n\n`boolean` - `true` to propose adding signer or `false` to propose removing signer.\n\n#### Returns\n\n`result: boolean` - `true`" @@ -771,9 +717,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -808,9 +752,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "[Retesteth](https://github.com/ethereum/retesteth/wiki/Retesteth-Overview) uses\n`debug_accountRange` to implement debugging.\n\nReturns the accounts for a specified block.\n\n#### Parameters\n\n`blockHashOrNumber` : `data` - Block hash or number.\n\n`txIndex` : `integer` - Transaction index from which to start.\n\n`address` : `data` - Address hash from which to start.\n\n`limit` : `integer` - Maximum number of account entries to return.\n\n#### Returns\n\n`result`:`object` - Account details:\n\n* `addressMap`:`object` - List of address hashes and account addresses.\n* `nextKey`:`data` - Hash of the next address if any addresses remain in the state, otherwise\n zero.\n" @@ -833,9 +775,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -864,9 +804,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns metrics providing information on the internal operation of Besu.\n\nThe available metrics might change over time. The JVM metrics might vary based on the JVM\nimplementation used.\n\nThe metric types are:\n\n* Timer\n* Counter\n* Gauge.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`:`object`" @@ -889,9 +827,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -920,9 +856,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "[Remix](https://remix.ethereum.org/) uses `debug_storageRangeAt` to implement debugging. Use the\n_Debugger_ tab in Remix instead of calling `debug_storageRangeAt` directly.\n\nReturns the contract storage for the specified range.\n\n#### Parameters\n\n`blockHash` : `data` - Block hash.\n\n`txIndex` : `integer` - Transaction index from which to start.\n\n`address` : `data` - Contract address.\n\n`startKey` : `hash` - Start key.\n\n`limit` : `integer` - Number of storage entries to return.\n\n#### Returns\n\n`result`:`object` - [Range object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#range-object).\n" @@ -945,9 +879,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -976,9 +908,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`Block` : `data` - RLP of the block.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`object` - [Trace object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object).\n" @@ -1001,9 +931,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1032,9 +960,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`block hash` : `data` - Block hash.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`array of objects` - [Trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object)." @@ -1057,9 +983,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1088,9 +1012,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`array of objects` - [Trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object)." @@ -1113,9 +1035,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1144,9 +1064,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "[Remix](https://remix.ethereum.org/) uses `debug_traceTransaction` to implement debugging. Use the\n_Debugger_ tab in Remix instead of calling `debug_traceTransaction` directly.\n\nReruns the transaction with the same state as when the transaction executed.\n\n#### Parameters\n\n`transactionHash` : `data` - Transaction hash.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`object` - [Trace object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object).\n" @@ -1169,9 +1087,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1206,9 +1122,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Distributes the\n[private transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions),\ngenerates the [privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing)\nand submits it to the transaction pool, and returns the transaction hash of the\n[privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing).\n\nThe signed transaction passed as an input parameter includes the `privateFrom`,\n[`privateFor` or `privacyGroupId`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions#eea-compliant-or-besu-extended-privacy),\nand `restriction` fields.\n\nThe `gas` and `gasPrice` are used by the [privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing)\nnot the private transaction itself.\n\nTo avoid exposing your private key, create signed transactions offline and send the signed\ntransaction data using `eea_sendRawTransaction`.\n\n> **Important**\n>\n> For production systems requiring private transactions, use a network with a consensus mechanism\n> supporting transaction finality to make sure the private state does not become inconsistent\n> with the chain. For example, [IBFT 2.0](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT)\n> provides the required finality.\n>\n> Using private transactions with [pruning](https://besu.hyperledger.org/en/stable/Concepts/Pruning) or\n> [fast sync](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#sync-mode) is not supported.\n> \n> Besu does not implement\n> [`eea_sendTransaction`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management).\n> \n> [EthSigner](https://docs.ethsigner.consensys.net/en/latest/) provides transaction signing and\n>implements [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction).\n\n#### Parameters\n\n`data` - Signed RLP-encoded private transaction. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n#### Returns\n\n`result` : `data` - 32-byte transaction hash of the\n[Privacy Marker Transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing).\n\n> **Tip**\n>\n> If creating a contract, use [priv_getTransactionReceipt](#priv_gettransactionreceipt) to\n> retrieve the contract address after the transaction is finalized." @@ -1231,9 +1145,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1268,9 +1180,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns a list of account addresses a client owns.\n\n> **note**\n> \n> This method returns an empty object because Besu [doesn't support key management](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management) inside the client.\n> \n> To provide access to your key store and and then sign transactions, use [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`Array of data` : List of 20-byte account addresses owned by the client.\n" @@ -1293,9 +1203,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1324,9 +1232,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the index corresponding to the block number of the current chain head.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *QUANTITY* - Hexadecimal integer representing the index corresponding to the block\nnumber of the current chain head.\n" @@ -1349,9 +1255,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1380,9 +1284,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Invokes a contract function locally and does not change the state of the blockchain.\n\nYou can interact with contracts using `eth_sendRawTransaction` or `eth_call`.\n\n#### Parameters\n\n*OBJECT* - [Transaction call object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object).\n\n*QUANTITY|TAG* - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` - `data` - Return value of the executed contract.\n" @@ -1405,9 +1307,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1436,9 +1336,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the [chain ID](https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *quantity* - Chain ID, in hexadecimal." @@ -1461,9 +1359,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1492,9 +1388,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the client coinbase address. The coinbase address is the account to pay mining rewards to.\n\nTo set a coinbase address, start Besu with the `--miner-coinbase` option set to a valid Ethereum\naccount address. You can get the Ethereum account address from a client such as MetaMask or\nEtherscan. For example:\n\n**Example**\n\n```bash\nbesu --miner-coinbase=\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\" --rpc-http-enabled\n```\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *data* - Coinbase address." @@ -1517,9 +1411,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1548,9 +1440,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns an estimate of the gas required for a transaction to complete. The estimation process\ndoes not use gas and the transaction is not added to the blockchain. The resulting estimate can be\ngreater than the amount of gas the transaction ends up using, for reasons including EVM mechanics\nand node performance.\n\nThe `eth_estimateGas` call does not send a transaction. You must call\n[`eth_sendRawTransaction`](#eth_sendrawtransaction) to execute the transaction.\n\n#### Parameters\n\nThe transaction call object parameters are the same as those for [`eth_call`](#eth_call) except for the\n[`strict` parameter](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object). If `strict` is set to `true`, the sender\naccount balance is checked for value transfer and transaction fees. The default for `strict` is `false`.\n\nFor `eth_estimateGas`, all fields are optional because setting a gas limit\nis irrelevant to the estimation process (unlike transactions, in which gas limits apply).\n\n`object` - [Transaction call object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object).\n\n#### Returns\n\n`result` : `quantity` - Amount of gas used." @@ -1573,9 +1463,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1604,9 +1492,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns a percentile gas unit price for the most recent blocks, in Wei. By default,\nthe last 100 blocks are examined and the 50th percentile gas unit price (that is, the median value)\nis returned.\n\nIf there are no blocks, the value for [`--min-gas-price`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#min-gas-price) is returned.\nThe value returned is restricted to values between [`--min-gas-price`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#min-gas-price)\nand [`--api-gas-price-max`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-max). By default, 1000 Wei and\n500GWei.\n\nUse the [`--api-gas-price-blocks`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-blocks), [`--api-gas-price-percentile`](CLI/CLI-Syntax#api-gas-price-percentile)\n, and [`--api-gas-price-max`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-max) command line\noptions to configure the `eth_gasPrice` default values.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `quantity` - Percentile gas unit price for the most recent blocks, in Wei, as a hexadecimal value." @@ -1629,9 +1515,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1660,9 +1544,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the account balance of the specified address.\n\n#### Parameters\n\n`DATA` - 20-byte account address from which to retrieve the balance.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Current balance, in wei, as a hexadecimal value." @@ -1685,9 +1567,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1716,9 +1596,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns information about the block by hash.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a block.\n\n`Boolean` - If `true`, returns the full [transaction objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object);\nif `false`, returns the transaction hashes.\n\n#### Returns\n\n`result` : *OBJECT* - [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object) , or `null` when there is no block." @@ -1741,9 +1619,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1772,9 +1648,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns information about a block by block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`Boolean` - If `true`, returns the full [transaction objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object);\nif `false`, returns only the hashes of the transactions.\n\n#### Returns\n\n`result` : *OBJECT* - [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object) , or `null` when there is no\nblock." @@ -1797,9 +1671,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1828,9 +1700,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the number of transactions in the block matching the given block hash.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result` : `quantity` - Integer representing the number of transactions in the specified block." @@ -1853,9 +1723,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1884,9 +1752,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the number of transactions in a block matching the specified block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of transactions in the specified block." @@ -1909,9 +1775,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1940,9 +1804,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the code of the smart contract at the specified address. Besu stores compiled smart\ncontract code as a hexadecimal value.\n\n#### Parameters\n\n`DATA` - 20-byte contract address.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *DATA* - Code stored at the specified address." @@ -1965,9 +1827,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -1996,9 +1856,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Polls the specified filter and returns an array of changes that have occurred since the last poll.\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`result` : `Array of Object` - If nothing changed since the last poll, an empty list. Otherwise:\n\n* For filters created with `eth_newBlockFilter`, returns block hashes.\n* For filters created with `eth_newPendingTransactionFilter`, returns transaction hashes.\n* For filters created with `eth_newFilter`, returns [log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." @@ -2021,9 +1879,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2050,9 +1906,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2079,9 +1933,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2110,9 +1962,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for the specified filter.\n\nLeave the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\ncommand line option at the default value of `true` to improve log retrieval performance.\n\n> **note**\n\n `eth_getFilterLogs` is only used for filters created with `eth_newFilter`. To specify a filter\n object and get logs without creating a filter, use `eth_getLogs` .\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." @@ -2135,9 +1985,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2166,9 +2014,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) matching a specified filter object.\n\nLeave the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\ncommand line option at the default value of `true` to improve log retrieval performance.\n\n> **Attention**\n>\n> Using `eth_getLogs` to get the logs from a large range of blocks, especially an entire chain from its genesis block, can cause Besu to hang and never return a response. We recommend splitting one large query into multiple ones for better performance.\n\n#### Parameters\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." @@ -2191,9 +2037,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2222,9 +2066,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns miner data for the specified block.\n\n#### Parameters\n\n`data` - 32 byte block hash.\n\n#### Returns\n\n`result`: `object` - [Miner data](https://besu.hyperledger.org/en/stable/Reference/API-Objects#miner-data-object)." @@ -2247,9 +2089,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2278,9 +2118,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns miner data for the specified block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result`: `object` - [Miner data](https://besu.hyperledger.org/en/stable/Reference/API-Objects#miner-data-object)." @@ -2303,9 +2141,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2334,9 +2170,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the account and storage values of the specified account, including the Merkle proof.\n\nThe API allows IoT devices or mobile apps which are unable to run light clients to verify responses\nfrom untrusted sources, by using a trusted block hash.\n\n#### Parameters\n\n`DATA` - 20-byte address of the account or contract.\n\n`ARRAY` - Array of 32-byte storage keys to generate proofs for.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result`: *Object* - Account details:\n\n* `balance`:`Quantity` - Account balance.\n* `codeHash`:`Data, 32-byte` - Hash of the account code.\n* `nonce`:`Quantity` - Number of transactions sent from the account.\n* `storageHash`:`Data, 32-byte` - SHA3 of the `storageRoot`.\n* `accountProof`:`Array` - RLP-encoded Merkle tree nodes, starting with the `stateRoot`.\n* `storageProof`:`Array`- Storage entries. Each entry is an object that displays:\n * `key`:`Quantity` - Storage key.\n * `value`:`Quantity` - Storage value.\n * `proof`:`Array` - RLP-encoded Merkle tree nodes, starting with the `storageHash`." @@ -2359,9 +2193,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2390,9 +2222,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the value of a storage position at a specified address.\n\n#### Parameters\n\n`DATA` - A 20-byte storage address.\n\n`QUANTITY` - Integer index of the storage position.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *DATA* - The value at the specified storage position." @@ -2415,9 +2245,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2446,9 +2274,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns transaction information for the specified block hash and transaction index position.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a block.\n\n`QUANTITY` - Integer representing the transaction index position.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." @@ -2471,9 +2297,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2502,9 +2326,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns transaction information for the specified block number and transaction index position.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`QUANTITY` - The transaction index position.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." @@ -2527,9 +2349,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2558,9 +2378,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns transaction information for the specified transaction hash.\n\n#### Parameters\n\n`DATA` - 32-byte transaction hash.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." @@ -2583,9 +2401,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2614,9 +2430,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the number of transactions sent from a specified address. Use the `pending` tag to get the\nnext account nonce not used by any pending transactions.\n\n#### Parameters\n\n`data` - 20-byte account address.\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *quantity* - Integer representing the number of transactions sent from the specified\naddress." @@ -2639,9 +2453,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2670,9 +2482,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the receipt of a transaction by transaction hash. Receipts for pending transactions are not\navailable.\n\nIf you enabled [revert reason](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Revert-Reason), the receipt includes\navailable revert reasons in the response.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a transaction.\n\n#### Returns\n\n`Object` - [Transaction receipt object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-receipt-object), or `null` when\nthere is no receipt." @@ -2695,9 +2505,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2726,9 +2534,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns uncle specified by block hash and index.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n`quantity` - Index of the uncle.\n\n#### Returns\n\n`result` : [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object)\n\n> **note**\n>\n> Uncles do not contain individual transactions." @@ -2751,9 +2557,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2782,9 +2586,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns uncle specified by block number and index.\n\n#### Parameters\n\n`quantity|tag` - Index of the block, or one of the string tags `latest`, `earliest`, or `pending`,\nas described in [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`quantity` - Index of the uncle.\n\n#### Returns\n\n`result` : [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object)\n\n> **note**\n>\n> Uncles do not contain individual transactions." @@ -2807,9 +2609,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2838,9 +2638,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the number of uncles in a block from a block matching the given block hash.\n\n#### Parameters\n\n`DATA` - 32-byte block hash.\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of uncles in the specified block." @@ -2863,9 +2661,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2894,9 +2690,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the number of uncles in a block matching the specified block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing either the index of the block within the blockchain, or one\nof the string tags `latest`, `earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of uncles in the specified block." @@ -2919,9 +2713,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -2950,9 +2742,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the hash of the current block, the seed hash, and the required target boundary condition.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : Array with the following fields:\n\n* `DATA`, 32 Bytes - Hash of the current block header (pow-hash).\n* `DATA`, 32 Bytes - The seed hash used for the DAG.\n* `DATA`, 32 Bytes - The required target boundary condition: 2^256 / difficulty.\n* `QUANTITY` - Hexadecimal integer representing the current block number." @@ -2975,9 +2765,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3006,9 +2794,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the number of hashes per second with which the node is mining.\n\nWhen the stratum server is enabled, this method returns the cumulative hashrate of all sealers\nreporting their hashrate.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `quantity` - Number of hashes per second.\n" @@ -3031,9 +2817,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3062,9 +2846,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Whether the client is actively mining new blocks. Besu pauses mining while the client synchronizes\nwith the network regardless of command settings or methods called.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` (*BOOLEAN*) - `true` if the client is actively mining new blocks, otherwise `false`." @@ -3087,9 +2869,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3118,9 +2898,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Creates a filter to retrieve new block hashes. To poll for new blocks, use\n[`eth_getFilterChanges`](#eth_getfilterchanges).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`data` - Filter ID." @@ -3143,9 +2921,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3174,9 +2950,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Creates a [log filter](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs). To poll for logs associated with the\ncreated filter, use [`eth_getFilterChanges`](#eth_getfilterchanges). To get all logs associated with\nthe filter, use [`eth_getFilterLogs`](#eth_getfilterlogs).\n\n#### Parameters\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n> **note**\n>\n> `fromBlock` and `toBlock` in the filter options object default to `latest`.\n\n#### Returns\n\n`data` - Filter ID." @@ -3199,9 +2973,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3230,9 +3002,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Creates a filter to retrieve new pending transactions hashes. To poll for new pending transactions,\nuse [`eth_getFilterChanges`](#eth_getfilterchanges).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`data` - Filter ID." @@ -3255,9 +3025,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3286,9 +3054,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns current Ethereum protocol version.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *quantity* - Ethereum protocol version." @@ -3311,9 +3077,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3342,9 +3106,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Sends a [signed transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Transactions).\nA transaction can send ether, deploy a contract, or interact with a contract.\nSet the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-tx-feecap) CLI option.\n\nYou can interact with contracts using [`eth_sendRawTransaction` or `eth_call`].\n\nTo avoid exposing your private key, create signed transactions offline and send the signed\ntransaction data using `eth_sendRawTransaction`.\n\n> **important**\n>\n> Besu does not implement [`eth_sendTransaction`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management).\n>\n> [EthSigner](https://docs.ethsigner.consensys.net/) provides transaction signing and implements\n> [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction).\n\n#### Parameters\n\n`data` - Signed transaction serialized to hexadecimal format. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n> **note**\n>\n> [Creating and Sending Transactions](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Transactions) includes examples of creating signed transactions using the [web3.js](https://github.com/ethereum/web3.js/) library.\n\n#### Returns\n\n`result` : `data` - 32-byte transaction hash." @@ -3362,9 +3124,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3406,9 +3166,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Submits the mining hashrate.\n\nUsed by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer).\n\n#### Parameters\n\n* DATA, 32 Bytes - Hexadecimal string representation of the hash rate.\n* DATA, 32 Bytes - Random hexadecimal ID identifying the client.\n\n#### Returns\n\n`result: Boolean`, `true` if submission is successful, otherwise `false`." @@ -3431,9 +3189,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3462,9 +3218,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Submits a Proof of Work (Ethash) solution.\n\nUsed by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer).\n\n#### Parameters\n\n* DATA, 8 Bytes - Retrieved nonce.\n* DATA, 32 Bytes - Hash of the block header (PoW-hash).\n* DATA, 32 Bytes - Mix digest.\n\n#### Returns\n\n`result: Boolean`, `true` if the provided solution is valid, otherwise `false`." @@ -3487,9 +3241,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3518,9 +3270,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns an object with data about the synchronization status, or `false` if not synchronizing.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *Object|Boolean* - Object with synchronization status data or `false` if not\nsynchronizing:\n\n* `startingBlock` : *quantity* - Index of the highest block on the blockchain when the network\n synchronization starts.\n* `currentBlock` : *quantity* - Index of the latest block (also known as the best block) for the\n current node. This is the same index that [`eth_blockNumber`](#eth_blocknumber) returns.\n* `highestBlock`: *quantity* - Index of the highest known block in the peer network (that is, the\n highest block so far discovered among peer nodes). This is the same value as `currentBlock` if\n the current node has no peers.\n* `pulledStates`: *quantity* - If fast synchronizing, the number of state entries fetched so far,\n or `null` if this is not known or not relevant. If full synchronizing or fully synchronized, this\n field is not returned.\n* `knownStates`: *quantity* - If fast synchronizing, the number of states the node knows of so\n far, or `null` if this is not known or not relevant. If full synchronizing or fully synchronized,\n this field is not returned." @@ -3543,9 +3293,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3574,9 +3322,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Uninstalls a filter with the specified ID. When a filter is no longer required, call this method.\n\nFilters time out when not requested by [`eth_getFilterChanges`](#eth_getfilterchanges) or [`eth_getFilterLogs`](#eth_getfilterlogs) for 10\nminutes.\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`." @@ -3599,9 +3345,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3636,9 +3380,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Discards a proposal to [add or remove a validator] with the specified address.\n\n#### Parameters\n\n`data` - 20-byte address of proposed validator.\n\n#### Returns\n\n`result: boolean` - `true`" @@ -3661,9 +3403,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3692,9 +3432,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns [votes](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT#adding-and-removing-validators)\ncast in the current [epoch](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT#genesis-file).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`: `object` - Map of account addresses to corresponding boolean values indicating the vote\nfor each account.\n\nIf the boolean value is `true`, the vote is to add a validator. If `false`, the proposal is to\nremove a validator." @@ -3717,9 +3455,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3748,9 +3484,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Provides validator metrics for the specified range:\n\n* Number of blocks from each validator.\n* Block number of the last block proposed by each validator (if any proposed in the specified\n range).\n* All validators present in the last block of the range.\n\n#### Parameters\n\n`fromBlockNumber` - Integer representing a block number or the string tag `earliest` as described\nin [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`toBlockNumber` - Integer representing a block number or one of the string tags `latest` or\n`pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter)\n\nIf you specify:\n\n* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less\n than 100 blocks.\n* Only the first parameter, the call provides metrics for all blocks from the block specified to\n the latest block.\n\n#### Returns\n\n`result`: _object_ - List of validator objects\n\n> **Note**\n>\n> The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`." @@ -3773,9 +3507,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3804,9 +3536,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists the validators defined in the specified block.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result: array of data` - List of validator addresses." @@ -3829,9 +3559,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3860,9 +3588,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists the validators defined in the specified block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result: array of data` - List of validator addresses." @@ -3885,9 +3611,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3916,9 +3640,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Propose to [add or remove a validator] with the specified address.\n\n#### Parameters\n\n`data` - Account address\n\n`boolean` - `true` to propose adding validator or `false` to propose removing validator.\n\n#### Returns\n\n`result: boolean` - `true`" @@ -3941,9 +3663,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -3978,9 +3698,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Starts the mining process. To start mining, you must first specify a miner coinbase using the\n[`--miner-coinbase`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#miner-coinbase) command line option.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `boolean` - `true` if mining starts, or if the node was already mining." @@ -4003,9 +3721,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4034,9 +3750,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Stops the mining process on the client.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `boolean` - `true` if mining stops, or if the node was not mining.\n" @@ -4059,9 +3773,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4077,7 +3789,7 @@ "description": "> **Note**\n>\n> The `MINER` API methods are not enabled by default for JSON-RPC. To enable the `MINER` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." }, { - "name": "Miscelaneous", + "name": "Miscellaneous", "item": [ { "name": "rpc_modules", @@ -4096,9 +3808,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists [enabled APIs](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#api-methods-enabled-by-default)\nand the version of each.\n\n#### Parameters\n\nNone\n\n#### Returns\n\nEnabled APIs." @@ -4121,9 +3831,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4157,9 +3865,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the [network ID](https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - Current network ID.\n\n| Network ID | Chain | Network | Description\n|------------|-------|---------|-------------------------------|\n| `1` | ETH | Mainnet | Main Ethereum network |\n| `3` | ETH | Ropsten | PoW test network |\n| `4` | ETH | Rinkeby | PoA test network using Clique |\n| `5` | ETH | Goerli | PoA test network using Clique |\n| `2018` | ETH | Dev | PoW development network |\n| `1` | ETC | Classic | Main Ethereum Classic network |\n| `6` | ETC | Kotti | PoA test network using Clique |\n| `7` | ETC | Mordor | PoW test network |\n\n> **note**\n>\n> For almost all networks network ID and chain ID are the same.\nThe only networks in the table above with different network and chain IDs are\nClassic with a chain ID of `61` and Mordor with a chain ID of `63`." @@ -4182,9 +3888,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4212,9 +3916,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Whether the client is actively listening for network connections.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` (*BOOLEAN*) - `true` if the client is actively listening for network connections;\notherwise `false`." @@ -4237,9 +3939,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4267,9 +3967,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the number of peers currently connected to the client.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *integer* - Number of connected peers in hexadecimal." @@ -4292,12 +3990,7 @@ "url": { "raw": "http://127.0.0.1:8545", "protocol": "http", - "host": [ - "127", - "0", - "0", - "1" - ], + "host": ["127", "0", "0", "1"], "port": "8545" } }, @@ -4325,9 +4018,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the [enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of the node." @@ -4350,9 +4041,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4380,9 +4069,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns enabled services (for example, `jsonrpc`) and the host and port for each service.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *objects* - Enabled services." @@ -4405,9 +4092,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4440,9 +4125,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Adds accounts (participants) to the\n[accounts permission list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\n`list of strings` - List of account addresses.\n\n> **Note**\n>\n> The parameters list contains a list which is why the account addresses are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to add accounts already on the\nallowlist or including invalid account addresses.\n" @@ -4465,9 +4148,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4496,9 +4177,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Adds nodes to the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\n`list of strings` - List of [enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url).\n\n> **Note**\n>\n> The parameters list contains a list which is why the enode URLs are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to add nodes already on the allowlist or\nincluding invalid enode URLs." @@ -4521,9 +4200,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4552,9 +4229,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists accounts (participants) in the\n[accounts permissions list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result: list` - Accounts (participants) in the accounts allowlist." @@ -4577,9 +4252,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4608,9 +4281,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists nodes in the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result: list` - [Enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of nodes in the nodes allowlist." @@ -4633,9 +4304,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4664,9 +4333,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Reloads the accounts and nodes allowlists from the [permissions configuration file].\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - `Success`, or `error` if the permissions configuration file is not valid." @@ -4689,9 +4356,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4720,9 +4385,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Removes accounts (participants) from the\n[accounts permissions list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\n`list of strings` - List of account addresses.\n\n> **Note**\n>\n> The parameters list contains a list which is why the account addresses are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to remove accounts not on the allowlist\nor including invalid account addresses." @@ -4745,9 +4408,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4776,9 +4437,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Removes nodes from the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\n`list of strings` - List of [enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url)\n\n> **Note**\n>\n> The parameters list contains a list which is why the enode URLs are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to remove nodes not on the allowlist\nor including invalid enode URLs." @@ -4801,9 +4460,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4886,9 +4543,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4910,9 +4565,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4941,9 +4594,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Creates a group of nodes, specified by their [Tessera](https://docs.tessera.consensys.net/) public key.\n\n#### Parameters\n\n`Object` - Request options:\n\n* `addresses`: `array of data` - Array of nodes, specified by\n [Tessera](https://docs.tessera.consensys.net/) public keys.\n* `name`: `string` - Privacy group name. Optional.\n* `description`: `string` - Privacy group description. Optional.\n\n#### Returns\n\nPrivacy group ID" @@ -4966,9 +4617,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -4997,9 +4646,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Deletes the specified privacy group.\n\n#### Parameters\n\n`data` - Privacy group ID\n\n#### Returns\n\nPrivacy group ID that was deleted." @@ -5022,9 +4669,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5053,9 +4698,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Distributes a signed, RLP encoded\n[private transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions).\n\n> **tip**\n\n If you want to sign the Privacy Marker Transaction outside of Besu,\n use [`priv_distributeRawTransaction`](https://besu.hyperledger.org/en/stable//HowTo/Send-Transactions/Creating-Sending-Private-Transactions#priv_distributerawtransaction)\n instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction).\n\n#### Parameters\n\n`data` - Signed RLP-encoded private transaction. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n#### Returns\n\n`result` : `data` - 32-byte enclave key. The enclave key is a pointer to the private transaction in\n[Tessera](https://docs.tessera.consensys.net/)." @@ -5078,9 +4721,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5109,9 +4750,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns a list of privacy groups containing only the listed members. For example, if the listed\nmembers are A and B, a privacy group containing A, B, and C is not returned.\n\n#### Parameters\n\n`array of data` - Members specified by [Tessera](https://docs.tessera.consensys.net/) public keys.\n\n#### Returns\n\nPrivacy groups containing only the specified members. Privacy groups are\n[EEA-compliant](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups#enterprise-ethereum-alliance-privacy)\nor [Besu-extended](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups#besu-extended-privacy) with types:\n\n* `LEGACY` for EEA-compliant groups.\n* `PANTHEON` for Besu-extended groups." @@ -5134,9 +4773,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5165,9 +4802,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the code of the private smart contract at the specified address. Compiled smart contract code\nis stored as a hexadecimal value.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - 20-byte contract address.\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`, `earliest`,\nor `pending`, as described in [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : `data` - Code stored at the specified address." @@ -5190,9 +4825,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5221,9 +4854,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the private transaction count for the specified account and\n[group of sender and recipients].\n\n> **Important**\n\n> If sending more than one transaction to be mined in the same block (that is, you are not\n> waiting for the transaction receipt), you must calculate the private transaction nonce outside\n> Besu instead of using `priv_getEeaTransactionCount`.\n\n#### Parameters\n\n`data` - Account address.\n\n`data` - Base64 encoded Tessera address of the sender.\n\n`array of data` - Base64 encoded Tessera addresses of recipients.\n\n#### Returns\n\n`quantity` - Integer representing the number of private transactions sent from the address to the\nspecified group of sender and recipients.\n" @@ -5246,9 +4877,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5277,9 +4906,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Polls the specified filter for a private contract and returns an array of changes that have occurred\nsince the last poll.\n\nFilters for private contracts can only be created by [`priv_newFilter`](#priv_newfilter) so unlike\n[`eth_getFilterChanges`](#eth_getfilterchanges), `priv_getFilterChanges` always returns an array\nof log objects or an empty list.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object). If nothing has changed since the last poll, an\nempty list." @@ -5302,9 +4929,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5333,9 +4958,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for the specified filter for a private\ncontract.\n\nFor private contracts, `priv_getFilterLogs` is the same as [`eth_getFilterLogs`](#eth_getfilterlogs)\nfor public contracts except there is no [automatic log bloom caching](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\nfor private contracts.\n\n> **Note**\n>\n> `priv_getFilterLogs` is only used for filters created with [`priv_newFilter`](#priv_newfilter).\n> To specify a filter object and get logs without creating a filter, use [`priv_getLogs`](#priv_getlogs).\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." @@ -5358,9 +4981,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5389,9 +5010,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) matching a specified filter object.\n\nFor private contracts, `priv_getLogs` is the same as [`eth_getLogs`](#eth_getlogs) for public contracts\nexcept there is no [automatic log bloom caching](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\nfor private contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." @@ -5414,9 +5033,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5445,9 +5062,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the address of the\n[privacy precompiled contract](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing). The address\nis derived and based on the value of the [`privacy-onchain-groups-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#privacy-onchain-groups-enabled)\noption.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `data` - Address of the privacy precompile." @@ -5470,9 +5085,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5501,9 +5114,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the private transaction if you are a participant, otherwise, `null`.\n\n#### Parameters\n\n`data` - Transaction hash returned by [`eea_sendRawTransaction`](#eea_sendrawtransaction) or\n[`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction).\n\n#### Returns\n\nObject - [Private transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#private-transaction-object), or `null` if not\na participant in the private transaction." @@ -5526,9 +5137,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5557,9 +5166,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the private transaction count for specified account and privacy group.\n\n> **important**\n\n> If sending more than one transaction to be mined in the same block (that is, you are not waiting for the transaction receipt), you must calculate the private transaction nonce outside Besu instead of using `priv_getTransactionCount`.\n\n#### Parameters\n\n`data` - Account address.\n\n`data` - Privacy group ID.\n\n#### Returns\n\n`quantity` - Integer representing the number of private transactions sent from the address to the\nspecified privacy group." @@ -5582,9 +5189,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5613,9 +5218,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns information about the private transaction after mining the transaction. Receipts for\npending transactions are not available.\n\n#### Parameters\n\n`data` - 32-byte hash of a transaction.\n\n#### Returns\n\n`Object` - [Private Transaction receipt object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#private-transaction-receipt-object),\nor `null` if no receipt found." @@ -5638,9 +5241,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5669,9 +5270,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Creates a [log filter](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for a private contract. To poll for logs associated with the\ncreated filter, use [`priv_getFilterChanges`](#priv_getfilterchanges). To get all logs associated with\nthe filter, use [`priv_getFilterLogs`](#priv_getfilterlogs).\n\nFor private contracts, `priv_newFilter` is the same as [`eth_newFilter`](#eth_newfilter)\nfor public contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n> **Note**\n>\n> `fromBlock` and `toBlock` in the filter options object default to `latest`." @@ -5694,9 +5293,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5725,9 +5322,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Uninstalls a filter for a private contract with the specified ID. When a filter is no longer required,\ncall this method.\n\nFilters time out when not requested by [`priv_getFilterChanges`](#priv_getfilterchanges) or [`priv_getFilterLogs`](#priv_getfilterlogs) for 10\nminutes.\n\nFor private contracts, `priv_uninstallFilter` is the same as [`eth_uninstallFilter`](#eth_uninstallfilter)\nfor public contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`." @@ -5750,9 +5345,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5787,9 +5380,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Provides transaction processing tracing per block.\n\n> **important**\n\n Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n requested block must be within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained)\n (by default, 1024).\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`array of strings` - Tracing options are\n[`trace`, `vmTrace`, and `stateDiff`](Trace-Types). Specify any\ncombination of the three options including none of them.\n\n#### Returns\n\n`result` - Array of [transaction trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-trace-object) containing\none object per transaction, in transaction execution order." @@ -5806,7 +5397,7 @@ "_postman_previewlanguage": "json", "header": null, "cookie": [], - "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\":[\n {\n \"output\":\"0x\",\n \"vmTrace\":{\n \"code\":\"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851\",\n \"ops\":[\n {\n \"cost\":3,\n \"ex\":{\n \"mem\":null,\n \"push\":[\n \"0x8\"\n ],\n \"store\":null,\n \"used\":16756175\n },\n \"pc\":72,\n \"sub\":null\n },\n {\"other properies...\":\"values...\"}\n ]\n },\n \"trace\":[\n {\n \"action\":{\n \"callType\":\"call\",\n \"from\":\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\":\"0xffadea\",\n \"input\":\"0x\",\n \"to\":\"0x0100000000000000000000000000000000000000\",\n \"value\":\"0x0\"\n },\n \"result\":{\n \"gasUsed\":\"0x1e\",\n \"output\":\"0x\"\n },\n \"subtraces\":0,\n \"traceAddress\":[\n ],\n \"type\":\"call\"\n }\n ],\n \"stateDiff\":{\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\":{\n \"balance\":{\n \"*\":{\n \"from\":\"0xffffffffffffffffffffffffffffffffc3e12a20b\",\n \"to\":\"0xffffffffffffffffffffffffffffffffc3dc5f091\"\n }\n },\n \"code\":\"=\",\n \"nonce\":{\n \"*\":{\n \"from\":\"0x14\",\n \"to\":\"0x15\"\n }\n },\n \"storage\":{\n }\n }\n },\n \"transactionHash\":\"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd\",\n },\n {\"other properies...\":\"values...\"}\n ]\n}" + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\":[\n {\n \"output\":\"0x\",\n \"vmTrace\":{\n \"code\":\"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851\",\n \"ops\":[\n {\n \"cost\":3,\n \"ex\":{\n \"mem\":null,\n \"push\":[\n \"0x8\"\n ],\n \"store\":null,\n \"used\":16756175\n },\n \"pc\":72,\n \"sub\":null\n },\n {\"other properties...\":\"values...\"}\n ]\n },\n \"trace\":[\n {\n \"action\":{\n \"callType\":\"call\",\n \"from\":\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\":\"0xffadea\",\n \"input\":\"0x\",\n \"to\":\"0x0100000000000000000000000000000000000000\",\n \"value\":\"0x0\"\n },\n \"result\":{\n \"gasUsed\":\"0x1e\",\n \"output\":\"0x\"\n },\n \"subtraces\":0,\n \"traceAddress\":[\n ],\n \"type\":\"call\"\n }\n ],\n \"stateDiff\":{\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\":{\n \"balance\":{\n \"*\":{\n \"from\":\"0xffffffffffffffffffffffffffffffffc3e12a20b\",\n \"to\":\"0xffffffffffffffffffffffffffffffffc3dc5f091\"\n }\n },\n \"code\":\"=\",\n \"nonce\":{\n \"*\":{\n \"from\":\"0x14\",\n \"to\":\"0x15\"\n }\n },\n \"storage\":{\n }\n }\n },\n \"transactionHash\":\"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd\",\n },\n {\"other properties...\":\"values...\"}\n ]\n}" } ] }, @@ -5827,9 +5418,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Provides transaction processing of [type `trace`](Trace-Types#trace) for the specified block.\n\n> **Important**\n>\n> Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n> requested block must be within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained) (by default, 1024).\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` - Array of [calls to other contracts](Trace-Types#trace) containing\none object per call, in transaction execution order." @@ -5843,9 +5432,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5873,9 +5460,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Provides transaction processing of [type `trace`](Trace-Types#trace) for the specified transaction.\n\n> **Important**\n>\n> Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n> requested transaction must be contained in a block within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained) (by default, 1024).\n\n#### Parameters\n\n`data` : Transaction hash\n\n#### Returns\n\n`result` - Array of [calls to other contracts](Trace-Types#trace) containing\none object per call, in the order called by the transaction.\n" @@ -5889,9 +5474,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5926,9 +5509,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists pending transactions that match the supplied filter conditions.\n\n#### Parameters\n\n* `QUANTITY` - Integer representing the maximum number of results to return.\n* Object of fields used to create the filter condition.\n\nEach field in the object corresponds to a field name containing an operator, and a value for the\noperator. A field name can only be specified once, and can only contain one operator.\nFor example, you cannot query transactions with a gas price between 8 and 9 Gwei by using both the\n`gt` and `lt` operator in the same field name instance.\n\nAll filters must be satisfied for a transaction to be returned.\n\n| Field name | Value | Value type | Supported operators |\n|--------------|-------------------------------------------|:---------------------:|---------------------|\n| **from** | Address of the sender. | *Data*, 20 bytes | `eq` |\n| **to** | Address of the receiver, or `\"contract_creation\"`.| *Data*, 20 bytes |`eq`, `action`|\n| **gas** | Gas provided by the sender. | *Quantity* | `eq`, `gt`, `lt` |\n| **gasPrice** | Gas price, in wei, provided by the sender.| *Quantity* | `eq`, `gt`, `lt` |\n| **value** | Value transferred, in wei. | *Quantity* | `eq`, `gt`, `lt` |\n| **nonce** | Number of transactions made by the sender.| *Quantity* | `eq`, `gt`, `lt` |\n|\n\nSupported operators:\n\n* `eq` (Equal to)\n* `lt` (Less than)\n* `gt` (Greater than)\n* `action`\n\n> **Note**\n>\n> The only supported `action` is `\"contract_creation\"`.\n\n#### Returns\n\n`result` - Array of objects with [details of the pending transaction](https://besu.hyperledger.org/en/stable/Reference/API-Objects#pending-transaction-object)." @@ -5951,9 +5532,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -5982,9 +5561,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists statistics about the node transaction pool.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - Transaction pool statistics:\n\n* `maxSize` - Maximum number of transactions kept in the transaction pool. Use the\n [`--tx-pool-max-size`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#tx-pool-max-size) option to configure the maximum size.\n* `localCount` - Number of transactions submitted directly to this node.\n* `remoteCount` - Number of transactions received from remote nodes." @@ -6007,9 +5584,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -6038,9 +5613,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Lists transactions in the node transaction pool.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - List of transactions." @@ -6063,9 +5636,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -6100,9 +5671,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns the current client version.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - Current client version." @@ -6125,9 +5694,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -6156,9 +5723,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" }, "description": "Returns a [SHA3](https://en.wikipedia.org/wiki/SHA-3) hash of the specified data. The result value\nis a [Keccak-256](https://keccak.team/keccak.html) hash, not the standardized SHA3-256.\n\n#### Parameters\n\n`DATA` - Data to convert to a SHA3 hash.\n\n#### Returns\n\n`result` (*DATA*) - SHA3 result of the input data." @@ -6181,9 +5746,7 @@ "url": { "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", "protocol": "http", - "host": [ - "{{rpc-http-host}}" - ], + "host": ["{{rpc-http-host}}"], "port": "{{rpc-http-port}}" } }, @@ -6203,18 +5766,14 @@ "listen": "prerequest", "script": { "type": "text/javascript", - "exec": [ - "" - ] + "exec": [""] } }, { "listen": "test", "script": { "type": "text/javascript", - "exec": [ - "" - ] + "exec": [""] } } ] diff --git a/docs/global/postman.md b/docs/global/postman.md index a9b2048c098..a9afe58649b 100644 --- a/docs/global/postman.md +++ b/docs/global/postman.md @@ -1,14 +1,15 @@ -!!! tip "Besu JSON-RPC APIs documentation in Postman format" +:::info Besu JSON-RPC APIs documentation in Postman format - View the [Besu JSON-RPC APIs documentation](https://www.postman.com/hyperledger/workspace/hyperledger-besu/collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8) in the Postman format - and obtain example requests in multiple coding languages. +View the [Besu JSON-RPC APIs documentation](https://www.postman.com/hyperledger/workspace/hyperledger-besu/collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8) in the Postman format and obtain example requests in multiple coding languages. - #### Run in Postman +#### Run in Postman - Click the following button to fork the collection and run requests directly on your local network. +Click the following button to fork the collection and run requests directly on your local network. - [![Run in Postman](https://run.pstmn.io/button.svg)](https://god.gw.postman.com/run-collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8?action=collection%2Ffork&collection-url=entityId%3D11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8%26entityType%3Dcollection%26workspaceId%3Dc4b60b6f-9f15-42d0-8327-7ebabca6f0fd#?env%5BBesu%20node%20on%20local%20host%5D=W3sia2V5IjoicnBjLWh0dHAtaG9zdCIsInZhbHVlIjoibG9jYWxob3N0IiwiZW5hYmxlZCI6ZmFsc2V9LHsia2V5IjoicnBjLWh0dHAtcG9ydCIsInZhbHVlIjoiODU0NSIsImVuYWJsZWQiOmZhbHNlfV0=). +[![Run in Postman](https://run.pstmn.io/button.svg)](https://god.gw.postman.com/run-collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8?action=collection%2Ffork&collection-url=entityId%3D11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8%26entityType%3Dcollection%26workspaceId%3Dc4b60b6f-9f15-42d0-8327-7ebabca6f0fd#?env%5BBesu%20node%20on%20local%20host%5D=W3sia2V5IjoicnBjLWh0dHAtaG9zdCIsInZhbHVlIjoibG9jYWxob3N0IiwiZW5hYmxlZCI6ZmFsc2V9LHsia2V5IjoicnBjLWh0dHAtcG9ydCIsInZhbHVlIjoiODU0NSIsImVuYWJsZWQiOmZhbHNlfV0=). - #### Download collection +#### Download collection - Alternatively you can [download the JSON collection file](/assets/postman/postman_collection.json). +Alternatively you can [download the JSON collection file](../assets/postman/postman_collection.json). + +::: diff --git a/docs/global/test_accounts.md b/docs/global/test_accounts.md index bc15a6fb69e..ae819b23ed3 100644 --- a/docs/global/test_accounts.md +++ b/docs/global/test_accounts.md @@ -1,46 +1,51 @@ -!!! critical "Security warning" - **Do not use the test accounts on Ethereum Mainnet or any production network.** +:::danger **Do not use the test accounts on Ethereum Mainnet or any production network.** - The following accounts are test accounts and their private keys are publicly visible in this - documentation and in publicly available source code. +The following accounts are test accounts and their private keys are publicly visible in this documentation and in publicly available source code. - They are not secure and everyone can use them. +They are not secure and everyone can use them. - **Using test accounts on Ethereum Mainnet and production networks can lead to loss of funds and identity fraud.** +**Using test accounts on Ethereum Mainnet and production networks can lead to loss of funds and identity fraud.** - In this documentation, we only provide test accounts for ease of testing and learning purposes; - never use them for other purposes. +In this documentation, we only provide test accounts for ease of testing and learning purposes; never use them for other purposes. - **Always secure your Ethereum Mainnet and any production account properly.** +**Always secure your Ethereum Mainnet and any production account properly.** - See for instance [MyCrypto "Protecting Yourself and Your Funds" guide](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds). +See for instance [MyCrypto "Protecting Yourself and Your Funds" guide](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds). -!!! example "Test Account 1 (address `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`)" +::: - Private key to copy : +:::info "Test Account 1 (address `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`)" - ```text - 0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63 - ``` +Private key to copy : - Initial balance : 200 Eth _(200000000000000000000 Wei)_ +```text +0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63 +``` -!!! example "Test Account 2 (address `0x627306090abaB3A6e1400e9345bC60c78a8BEf57`)" +Initial balance : 200 Eth _(200000000000000000000 Wei)_ - Private key to copy : +::: - ```text - 0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 - ``` +:::info "Test Account 2 (address `0x627306090abaB3A6e1400e9345bC60c78a8BEf57`)" - Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ +Private key to copy : -!!! example "Test Account 3 (address `0xf17f52151EbEF6C7334FAD080c5704D77216b732`)" +```text +0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 +``` - Private key to copy : +Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ - ```text - 0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f - ``` +::: - Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ +:::info "Test Account 3 (address `0xf17f52151EbEF6C7334FAD080c5704D77216b732`)" + +Private key to copy : + +```text +0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f +``` + +Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ + +::: diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index c829351ab82..00000000000 --- a/docs/index.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Hyperledger Besu Ethereum client -description: Besu is an open-source Ethereum client developed under the Apache 2.0 - license and written in Java. It runs on the Ethereum public network, private networks, and test - networks. ---- - -# Hyperledger Besu Ethereum client - -Hyperledger Besu is an open source Ethereum client developed under the Apache 2.0 license and written in Java. -It runs on public and private networks: - -
- -* :material-book-open-variant: __Public networks__ - - --- - - Run Besu as an execution client on Ethereum Mainnet and Ethereum public testnets, such as Goerli and Sepolia. - - [:octicons-arrow-right-24: Get started](public-networks/index.md) - -* :material-book-lock-outline: __Private networks__ - - --- - - Create or join a private, permissioned network. Use private networks to develop enterprise applications requiring secure, high-performance transaction processing. - - [:octicons-arrow-right-24: Get started](private-networks/index.md) - -
- -## What does Besu support? - -Besu includes a [command line interface](public-networks/reference/cli/options.md) and -[JSON-RPC API](public-networks/how-to/use-besu-api/index.md) for running, maintaining, debugging, and monitoring -nodes in an Ethereum network. You can use the API via RPC over HTTP or via WebSocket. Besu also -supports Pub/Sub. - -Besu supports common smart contract and dapp development, deployment, and operational -use cases, using tools such as [Truffle](http://truffleframework.com/), -[Remix](https://github.com/ethereum/remix), and [web3j](https://web3j.io/). The client supports -common JSON-RPC API methods such as `eth`, `net`, `web3`, `debug`, and `miner`. - -Besu doesn't support [key management](public-networks/how-to/send-transactions.md) inside the -client. You can use [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu to access -your keystore and sign transactions. - -## Questions? - -If you have any questions about Besu, contact us on the -[Besu channel on Hyperledger Discord](https://discord.gg/hyperledger). - -Learn more about the [Hyperledger Foundation](https://www.hyperledger.org/about). -You can [contribute to the documentation](https://wiki.hyperledger.org/display/BESU/Documentation) -or to [Besu itself](https://wiki.hyperledger.org/display/BESU/Contributing). diff --git a/docs/private-networks/_category_.json b/docs/private-networks/_category_.json new file mode 100644 index 00000000000..865a111a8b4 --- /dev/null +++ b/docs/private-networks/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Private networks", + "position": 1 +} diff --git a/docs/private-networks/concepts/_category_.json b/docs/private-networks/concepts/_category_.json new file mode 100644 index 00000000000..d373a29254a --- /dev/null +++ b/docs/private-networks/concepts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Concepts", + "position": 4 +} diff --git a/docs/private-networks/concepts/index.md b/docs/private-networks/concepts/index.md index d026f5c2fa1..efffe0e3a05 100644 --- a/docs/private-networks/concepts/index.md +++ b/docs/private-networks/concepts/index.md @@ -1,18 +1,21 @@ --- +title: Concepts description: private networks concepts overview +sidebar_position: 3 +tags: + - private networks --- # Concepts This section provides background information and context about private network features. -The following features are shared with [public networks](../../public-networks/index.md) and the -content can be found in the public networks section: +The following features are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: - Transactions: - - [Transaction types](../../public-networks/concepts/transactions/types.md) - - [Transaction pool](../../public-networks/concepts/transactions/pool.md) - - [Transaction validation](../../public-networks/concepts/transactions/validation.md) + - [Transaction types](../../public-networks/concepts/transactions/types.md) + - [Transaction pool](../../public-networks/concepts/transactions/pool.md) + - [Transaction validation](../../public-networks/concepts/transactions/validation.md) - [Network ID and chain ID](../../public-networks/concepts/network-and-chain-id.md) - [Events and logs](../../public-networks/concepts/events-and-logs.md) - [Genesis file](../../public-networks/concepts/genesis-file.md) diff --git a/docs/private-networks/concepts/permissioning/_category_.json b/docs/private-networks/concepts/permissioning/_category_.json new file mode 100644 index 00000000000..7299170da97 --- /dev/null +++ b/docs/private-networks/concepts/permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Permissioning", + "position": 3 +} diff --git a/docs/private-networks/concepts/permissioning/index.md b/docs/private-networks/concepts/permissioning/index.md index 19962368d18..ad3678f68fd 100644 --- a/docs/private-networks/concepts/permissioning/index.md +++ b/docs/private-networks/concepts/permissioning/index.md @@ -1,22 +1,24 @@ --- +title: Permissioning +sidebar_position: 1 description: Besu permissioning feature +tags: + - private networks --- # Permissioning -A permissioned network enables node permissioning and account permissioning, allowing only -specified nodes and accounts to access the network. +A permissioned network enables node permissioning and account permissioning, allowing only specified nodes and accounts to access the network. -!!! important "Permissioning is not privacy" +:::caution Permissioning is not privacy - In peer-to-peer networks, node permissioning enforces rules on nodes you control. +In peer-to-peer networks, node permissioning enforces rules on nodes you control. - Permissioning requires a distributed network of trust across the network where participants - agree to follow the rules. One bad actor can decide not to follow the rules. Nodes can take - action to prevent the bad actor adding to the chain but they cannot prevent the bad actor from - allowing access to the chain. +Permissioning requires a distributed network of trust across the network where participants agree to follow the rules. One bad actor can decide not to follow the rules. Nodes can take action to prevent the bad actor adding to the chain but they cannot prevent the bad actor from allowing access to the chain. - Besu also implements [privacy](../privacy/index.md). +Besu also implements [privacy](../privacy/index.md). + +::: ## Node permissioning @@ -28,9 +30,9 @@ Use node permissioning to restrict access to known participants only. Use account permissioning to: -* Enforce onboarding or identity requirements. -* Suspend accounts. -* Restrict the actions an account can perform. +- Enforce onboarding or identity requirements. +- Suspend accounts. +- Restrict the actions an account can perform. ![Account Permissioning](../../../assets/images/enterprise-ethereum-account-permissioning.png) @@ -40,32 +42,24 @@ You can specify permissioning [locally](#local) or [onchain](#onchain). ### Local -[Local permissioning](../../how-to/use-permissioning/local.md) works at the node level. -Each node in the network has a [permissions configuration file]. +[Local permissioning](../../how-to/use-permissioning/local.md) works at the node level. Each node in the network has a [permissions configuration file]. -Local permissioning affects your node but not the rest of the network. Use local permissioning to -restrict use of your node (that is, the resources under your control). For example, customers able -to access your node. +Local permissioning affects your node but not the rest of the network. Use local permissioning to restrict use of your node (that is, the resources under your control). For example, customers able to access your node. -Local permissioning does not require coordination with the rest of the network and you can act -immediately to protect your node. Your rules are not enforced in blocks produced by other nodes. +Local permissioning does not require coordination with the rest of the network and you can act immediately to protect your node. Your rules are not enforced in blocks produced by other nodes. ### Onchain -[Onchain permissioning](onchain.md) works through a smart contract on the network. -Specifying permissioning onchain enables all nodes to read and update permissioning configuration -from one location. +[Onchain permissioning](onchain.md) works through a smart contract on the network. Specifying permissioning onchain enables all nodes to read and update permissioning configuration from one location. -Onchain permissioning requires coordination to update the rules. The network might not be able to -act immediately (for example, the smart contract might enforce a minimum of number of votes before -changing permissioning rules). +Onchain permissioning requires coordination to update the rules. The network might not be able to act immediately (for example, the smart contract might enforce a minimum of number of votes before changing permissioning rules). -When you update onchain permissioning, the update applies across the network and new blocks abide -by the updated rules. For example, blocked accounts can no longer add transactions to the chain. +When you update onchain permissioning, the update applies across the network and new blocks abide by the updated rules. For example, blocked accounts can no longer add transactions to the chain. The following diagram illustrates applying local and onchain permissioning rules. ![Permissioning Flow](../../../assets/images/PermissioningFlow.png) + [permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file diff --git a/docs/private-networks/concepts/permissioning/onchain.md b/docs/private-networks/concepts/permissioning/onchain.md index f8ca050832e..908a3418f9b 100644 --- a/docs/private-networks/concepts/permissioning/onchain.md +++ b/docs/private-networks/concepts/permissioning/onchain.md @@ -1,75 +1,73 @@ --- +title: Onchain permissioning description: Onchain permissioning +sidebar_position: 1 +tags: + - private networks --- # Onchain permissioning -Onchain [permissioning](index.md) uses smart contracts to store and administer the node, account, and admin -allowlists. Using onchain permissioning enables all nodes to read the allowlists from a single -source, the blockchain. +Onchain [permissioning](index.md) uses smart contracts to store and administer the node, account, and admin allowlists. Using onchain permissioning enables all nodes to read the allowlists from a single source, the blockchain. -!!! important +:::danger - When using onchain account permissioning, a node checks permissions when importing blocks. - Meaning, a node only imports blocks in which all transactions are from authorized senders. If - you disable onchain account permissioning and your node accepts blocks without enforcing this rule, - your node cannot re-synchronize with other nodes that enforce onchain account permissioning rules - (your node goes into forked state). +When using onchain account permissioning, a node checks permissions when importing blocks. Meaning, a node only imports blocks in which all transactions are from authorized senders. If you disable onchain account permissioning and your node accepts blocks without enforcing this rule, your node cannot re-synchronize with other nodes that enforce onchain account permissioning rules (your node goes into forked state). -!!! note +::: - Custom smart contracts and dapps can be implemented to work with onchain permissioning. +:::note + +Custom smart contracts and dapps can be implemented to work with onchain permissioning. + +::: ## Permissioning contracts -!!! important +:::caution - The permissioning contract has multiple interfaces, and each interface maps to a specific - version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). - Ensure that you [specify the permissioning contract interface] being used when starting Besu. +The permissioning contract has multiple interfaces, and each interface maps to a specific version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). Ensure that you [specify the permissioning contract interface] being used when starting Besu. + +::: ### Allowlists Permissioning implements three allowlists: -* Accounts, which can submit transactions to the network. -* Nodes, which can join the network. -* Admins, which are accounts able to update the accounts and nodes allowlists. +- Accounts, which can submit transactions to the network. +- Nodes, which can join the network. +- Admins, which are accounts able to update the accounts and nodes allowlists. + +:::caution Using account permissioning and privacy -!!! caution "Using account permissioning and privacy" +Account permissioning is incompatible with [random key signing](../../how-to/use-privacy/sign-pmts.md) for [privacy marker transactions](../privacy/private-transactions/processing.md). - Account permissioning is incompatible with - [random key signing](../../how-to/use-privacy/sign-pmts.md) for - [privacy marker transactions](../privacy/private-transactions/processing.md). +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. - If using account permissioning and privacy, a signing key must be specified using the - [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) - command line option and the corresponding public key - included in the accounts allowlist. +::: -!!! tip +:::tip - If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) - and search for messages containing `Node permissioning` to identify the issue. +If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) and search for messages containing `Node permissioning` to identify the issue. - Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been - correctly configured for all nodes with the - externally accessible address. +Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been correctly configured for all nodes with the externally accessible address. - If you change your network configuration, you may need to update the node allowlist. +If you change your network configuration, you may need to update the node allowlist. + +::: ## Bootnodes -When a node joins the network, the node connects to the [bootnodes](../../how-to/configure/bootnodes.md) until it -synchronizes to the chain head, regardless of node permissions. After synchronization, the Account Rules and Node -Rules smart contracts apply the permissioning rules. +When a node joins the network, the node connects to the [bootnodes](../../how-to/configure/bootnodes.md) until it synchronizes to the chain head, regardless of node permissions. After synchronization, the Account Rules and Node Rules smart contracts apply the permissioning rules. + +If a synchronized node loses all peer connections (that is, it has zero peers), it reconnects to the bootnodes to rediscover peers. -If a synchronized node loses all peer connections (that is, it has zero peers), it reconnects to the -bootnodes to rediscover peers. +:::info -!!! important +All bootnodes must be on the nodes allowlist. - All bootnodes must be on the nodes allowlist. +::: + [specify the permissioning contract interface]: ../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version diff --git a/docs/private-networks/concepts/permissioning/plugin.md b/docs/private-networks/concepts/permissioning/plugin.md index fc4935b352d..a4f62031d8b 100644 --- a/docs/private-networks/concepts/permissioning/plugin.md +++ b/docs/private-networks/concepts/permissioning/plugin.md @@ -1,14 +1,16 @@ --- +title: Permissioning plugin description: Plugin based permissioning +sidebar_position: 2 +tags: + - private networks --- # Permissioning plugin -You can define complex [permissioning](index.md) solutions by building a plugin that -extends Hyperledger Besu functionality. +You can define complex [permissioning](index.md) solutions by building a plugin that extends Hyperledger Besu functionality. -The plugin API provides a `PermissioningService` interface that currently supports connection permissioning and -message permissioning. +The plugin API provides a `PermissioningService` interface that currently supports connection permissioning and message permissioning. ## Connection permissioning @@ -16,8 +18,7 @@ Use connection permissioning when deciding whether to restrict node access to kn ## Message permissioning -Use message permissioning to propagate different types of devP2P messages to particular nodes. For example, -this can be used to prevent pending transactions from being forwarded to other nodes. +Use message permissioning to propagate different types of devP2P messages to particular nodes. For example, this can be used to prevent pending transactions from being forwarded to other nodes. ## Register your plugin diff --git a/docs/private-networks/concepts/pki.md b/docs/private-networks/concepts/pki.md index 039ed01002c..97cec02eab0 100644 --- a/docs/private-networks/concepts/pki.md +++ b/docs/private-networks/concepts/pki.md @@ -1,43 +1,43 @@ --- +title: Public key infrastructure +sidebar_position: 5 description: Public key infrastructure +tags: + - private networks --- # Public key infrastructure -!!! warning +:::warning - Public key infrastructure (PKI) support is an early access feature, and functionality and options may be updated - between releases. +Public key infrastructure (PKI) support is an early access feature, and functionality and options may be updated between releases. -Hyperledger Besu's public key infrastructure allows you to use certificates issued by a trusted authority to manage -node and account identities in the following ways: +::: -* Node permissioning - Only authorized nodes can connect to other nodes in the network using TLS for the P2P - communication. -* Block proposal permissioning - Only blocks proposed by authorized validators are accepted. +Hyperledger Besu's public key infrastructure allows you to use certificates issued by a trusted authority to manage node and account identities in the following ways: + +- Node permissioning - Only authorized nodes can connect to other nodes in the network using TLS for the P2P communication. +- Block proposal permissioning - Only blocks proposed by authorized validators are accepted. Supported keystore and truststore formats used to store the certificates include PKCS11, PKCS12, and JKS. ## Node permissioning -Allow TLS communication between nodes by using certificates issued by a trusted authority to connect to other -authorized nodes in the network. +Allow TLS communication between nodes by using certificates issued by a trusted authority to connect to other authorized nodes in the network. -When receiving connection requests, the incoming connection must be from another authorized node. Similarly, when -connecting to a node the initiator ensures that the remote node is authorized to participate in the network. +When receiving connection requests, the incoming connection must be from another authorized node. Similarly, when connecting to a node the initiator ensures that the remote node is authorized to participate in the network. [Configure TLS for the P2P communication using the Besu command line options](../how-to/configure/tls/p2p.md). ## Block proposal permissioning -!!! important +:::caution + +Only private networks using the [QBFT consensus protocol] support block proposal permissioning. - Only private networks using the [QBFT consensus protocol] support block proposal permissioning. +::: -Use certificates issued by a trusted authority to ensure only authorized validator nodes can propose new blocks in the -network. The block hash is signed by the validator private certificate and included in the header of the proposed block -as a [CMS (Cryptographic Message Syntax)]. This is used by other validators to verify that the proposer is authorized -to create a block in the network. +Use certificates issued by a trusted authority to ensure only authorized validator nodes can propose new blocks in the network. The block hash is signed by the validator private certificate and included in the header of the proposed block as a [CMS (Cryptographic Message Syntax)]. This is used by other validators to verify that the proposer is authorized to create a block in the network. [Configure block proposal permissioning using the Besu command line options](../how-to/configure/block-proposal-permissioning.md). diff --git a/docs/private-networks/concepts/plugins.md b/docs/private-networks/concepts/plugins.md index 37a99b227c8..70ee78f7ca4 100644 --- a/docs/private-networks/concepts/plugins.md +++ b/docs/private-networks/concepts/plugins.md @@ -1,53 +1,55 @@ --- +title: Plugins +sidebar_position: 6 description: Plugins overview +tags: + - private networks --- # Plugins -You can extend Hyperledger Besu functionality by building Java plugins or using existing open source -Besu plugins. -Use the Plugin API to take data from any Besu network, public or permissioned, and feed it into an -application or system. +You can extend Hyperledger Besu functionality by building Java plugins or using existing open source Besu plugins. Use the Plugin API to take data from any Besu network, public or permissioned, and feed it into an application or system. -For example, create a plugin to add more monitoring functionality or stream event data to a -third-party application. The API exposes data about the following components: +For example, create a plugin to add more monitoring functionality or stream event data to a third-party application. The API exposes data about the following components: -* Blocks -* Balances -* Transactions -* Smart contracts -* Execution results -* Logs -* Syncing state. +- Blocks +- Balances +- Transactions +- Smart contracts +- Execution results +- Logs +- Syncing state. ![Besu plugin API](../../assets/images/Hyperledger-Besu-Plugin-API.png) -The plugin API provides access to [interfaces](../reference/plugin-api-interfaces.md) allowing you -to build the plugin. +The plugin API provides access to [interfaces](../reference/plugin-api-interfaces.md) allowing you to build the plugin. -!!! tip +:::info - View the [plugin API webinar](https://youtu.be/78sa2WuA1rg) for an example of how to build a - plugin. +View the [plugin API webinar](https://youtu.be/78sa2WuA1rg) for an example of how to build a plugin. - For more information about the available interfaces, see the - [Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). +For more information about the available interfaces, see the [Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). + +::: ## Install plugins To allow Besu to access and use the plugin, copy the plugin (`.jar`) to the `plugins` directory. -!!! important +:::caution + +If not already present, you must create the `plugins` directory one directory level below (`../`) the `besu` executable. - If not already present, you must create the `plugins` directory one directory level below - (`../`) the `besu` executable. +::: Each plugin in the directory has the following lifecycle events: -* **Register** - Executed when Besu starts. Besu checks plugin compatibility and registers plugins. -* **Start** - Plugins start after being successfully registered. -* **Stop** - Besu stops plugins. +- **Register** - Executed when Besu starts. Besu checks plugin compatibility and registers plugins. +- **Start** - Plugins start after being successfully registered. +- **Stop** - Besu stops plugins. + +:::note -!!! note +The order in which Besu calls plugins during lifecycle events is not guaranteed. - The order in which Besu calls plugins during lifecycle events is not guaranteed. +::: diff --git a/docs/private-networks/concepts/poa.md b/docs/private-networks/concepts/poa.md index 3f41017de26..40d07a75c53 100644 --- a/docs/private-networks/concepts/poa.md +++ b/docs/private-networks/concepts/poa.md @@ -1,71 +1,69 @@ --- +title: Proof of authority consensus +sidebar_position: 1 description: Besu proof of authority consensus protocols comparison +tags: + - private networks --- # Proof of authority consensus -Besu implements the QBFT, IBFT 2.0, and Clique proof of authority (PoA) [consensus protocols](../how-to/configure/consensus/index.md). -PoA consensus protocols work when participants know each other and there is a level of trust -between them. For example, in a permissioned consortium network. +Besu implements the QBFT, IBFT 2.0, and Clique proof of authority (PoA) [consensus protocols](../how-to/configure/consensus/index.md). PoA consensus protocols work when participants know each other and there is a level of trust between them. For example, in a permissioned consortium network. -PoA consensus protocols have faster block times and a much greater transaction -throughput than the Ethash proof of work consensus protocol used on the Ethereum Mainnet. +PoA consensus protocols have faster block times and a much greater transaction throughput than the Ethash proof of work consensus protocol used on the Ethereum Mainnet. -In QBFT, IBFT 2.0, or Clique, a group of nodes in the network act as validators (QBFT and IBFT 2.0) or signers (Clique). -The existing nodes in the signer/validator pool vote to add nodes to or remove nodes from the pool. +In QBFT, IBFT 2.0, or Clique, a group of nodes in the network act as validators (QBFT and IBFT 2.0) or signers (Clique). The existing nodes in the signer/validator pool vote to add nodes to or remove nodes from the pool. -!!! note +:::note - For the rest of this page, the term validator is used to refer to signers and validators. +For the rest of this page, the term validator is used to refer to signers and validators. + +::: ## Properties Properties to consider when comparing QBFT, IBFT 2.0, and Clique are: -* Immediate finality. -* Minimum number of validators. -* Liveness. -* Speed. +- Immediate finality. +- Minimum number of validators. +- Liveness. +- Speed. ### Immediate finality -QBFT and IBFT 2.0 have immediate finality; there are no forks and all valid blocks get -included in the main chain. +QBFT and IBFT 2.0 have immediate finality; there are no forks and all valid blocks get included in the main chain. -Clique does not have immediate finality. Implementations using Clique must be aware of forks and -chain reorganizations occurring. +Clique does not have immediate finality. Implementations using Clique must be aware of forks and chain reorganizations occurring. ### Minimum number of validators To be Byzantine fault tolerant, QBFT and IBFT 2.0 require a minimum of four validators. -Clique can operate with a single validator but operating with a single validator offers no -redundancy if the validator fails. +Clique can operate with a single validator but operating with a single validator offers no redundancy if the validator fails. + +:::tip -!!! tip +Byzantine fault tolerant is the ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. - Byzantine fault tolerant is the ability to function correctly and reach consensus despite nodes - failing or propagating incorrect information to peers. +::: ### Liveness -Clique is more fault tolerant than QBFT and IBFT 2.0. Clique tolerates up to half of the validators -failing. QBFT and IBFT 2.0 networks require greater than or equal to two-thirds of validators to be -operating to create blocks. For example, an QBFT and IBFT 2.0 network of: +Clique is more fault tolerant than QBFT and IBFT 2.0. Clique tolerates up to half of the validators failing. QBFT and IBFT 2.0 networks require greater than or equal to two-thirds of validators to be operating to create blocks. For example, an QBFT and IBFT 2.0 network of: + +- Four to five validators tolerates one unresponsive validator. +- Six to eight validators tolerates two unresponsive validators. -* Four to five validators tolerates one unresponsive validator. -* Six to eight validators tolerates two unresponsive validators. +Networks with three or less validators can produce blocks but do not guarantee finality when operating in adversarial environments. -Networks with three or less validators can produce blocks but do not guarantee finality when -operating in adversarial environments. +:::caution -!!! important +We recommend using QBFT or IBFT 2.0 networks with at least four nodes in production environments. - We recommend using QBFT or IBFT 2.0 networks with at least four nodes in production environments. +::: ### Speed -Reaching consensus and adding blocks is faster in Clique networks. For Clique, the probability of a -fork increases as the number of validators increases. +Reaching consensus and adding blocks is faster in Clique networks. For Clique, the probability of a fork increases as the number of validators increases. For QBFT and IBFT 2.0, the time to add new blocks increases as the number of validators increases. diff --git a/docs/private-networks/concepts/privacy/_category_.json b/docs/private-networks/concepts/privacy/_category_.json new file mode 100644 index 00000000000..e1382c18fd5 --- /dev/null +++ b/docs/private-networks/concepts/privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Privacy", + "position": 2 +} diff --git a/docs/private-networks/concepts/privacy/flexible-privacy.md b/docs/private-networks/concepts/privacy/flexible-privacy.md index 86f2a2741c8..ea40eca8c52 100644 --- a/docs/private-networks/concepts/privacy/flexible-privacy.md +++ b/docs/private-networks/concepts/privacy/flexible-privacy.md @@ -1,96 +1,81 @@ --- +title: Flexible privacy groups +sidebar_position: 3 description: Flexible privacy groups --- # Flexible privacy groups -Flexible [privacy groups](privacy-groups.md) use smart contracts to store and maintain the group membership. -You can [add and remove members to and from flexible privacy groups](../../how-to/use-privacy/flexible.md). +Flexible [privacy groups](privacy-groups.md) use smart contracts to store and maintain the group membership. You can [add and remove members to and from flexible privacy groups](../../how-to/use-privacy/flexible.md). -!!! tip +:::tip - Because group membership for flexible privacy groups is stored in a smart contract, flexible - privacy groups are also known as onchain privacy groups. +Because group membership for flexible privacy groups is stored in a smart contract, flexible privacy groups are also known as onchain privacy groups. -!!! important +::: - Flexible privacy groups are an early access feature. Don't use in production networks. +:::danger - The flexible privacy group interfaces might change between releases. There might not be an - upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy - group functionality in future versions. +Flexible privacy groups are an early access feature. Don't use in production networks. - We don't recommended creating flexible privacy groups in a chain with existing - [offchain privacy groups](privacy-groups.md). +The flexible privacy group interfaces might change between releases. There might not be an upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy group functionality in future versions. + +We don't recommended creating flexible privacy groups in a chain with existing [offchain privacy groups](privacy-groups.md). + +::: ## Group management contracts -The privacy group management contract bytecode is hard-coded into Besu and when you -create a privacy group, the contract bytecode is part of the genesis state of the privacy group. +The privacy group management contract bytecode is hard-coded into Besu and when you create a privacy group, the contract bytecode is part of the genesis state of the privacy group. + +:::caution -!!! caution +All members of a flexible privacy group must be using the same version of Besu. If using different versions, the private state within the privacy group may become inconsistent. - All members of a flexible privacy group must be using the same version of Besu. If - using different versions, the private state within the privacy group may become inconsistent. +::: -In the default implementation of the group management contract, the signer of the private transaction -that creates the privacy group is also the owner of the group. Only the owner can add and remove participants, -and upgrade the management contract. +In the default implementation of the group management contract, the signer of the private transaction that creates the privacy group is also the owner of the group. Only the owner can add and remove participants, and upgrade the management contract. -The owner is identified by the signing key. Transactions to add and remove participants, or upgrade -the management contract, must be signed by the same key that signed the group creation transaction. +The owner is identified by the signing key. Transactions to add and remove participants, or upgrade the management contract, must be signed by the same key that signed the group creation transaction. ## Flexible privacy group IDs -When creating a flexible privacy group, generate the privacy group ID for the group outside of Besu -and pass the ID as a parameter. +When creating a flexible privacy group, generate the privacy group ID for the group outside of Besu and pass the ID as a parameter. -The [web3js-quorum library](../../how-to/use-privacy/flexible.md) generates a unique privacy -group ID and passes the ID to Besu when creating a privacy group. +The [web3js-quorum library](../../how-to/use-privacy/flexible.md) generates a unique privacy group ID and passes the ID to Besu when creating a privacy group. -!!! caution +:::caution - When generating a privacy group ID, you must ensure the ID is unique across all network - participants. If you create a privacy group with an existing privacy group ID, the existing - privacy group is overwritten. +When generating a privacy group ID, you must ensure the ID is unique across all network participants. If you create a privacy group with an existing privacy group ID, the existing privacy group is overwritten. - To ensure unique privacy group IDs, we recommend using 256-bit SecureRandom. +To ensure unique privacy group IDs, we recommend using 256-bit SecureRandom. + +::: ## Multi-tenancy -When using [multi-tenancy](multi-tenancy.md) with flexible privacy groups, each user provides a JSON Web Token (JWT) -which allows Besu to check that the user has access to functionality and data associated with a privacy group. +When using [multi-tenancy](multi-tenancy.md) with flexible privacy groups, each user provides a JSON Web Token (JWT) which allows Besu to check that the user has access to functionality and data associated with a privacy group. + +Using multi-tenancy with flexible privacy groups is more complex than with [offchain privacy groups](privacy-groups.md) because users may be added and removed from flexible privacy groups. When a user is added to a privacy group, they get access to all existing data in the privacy group. After being removed from a privacy group, a user retains access to already existing data in the privacy group, up to the block containing the [privacy marker transaction (PMT)](private-transactions/processing.md) that removed them (the removal block). A removed user doesn't have access to data in the privacy group that happens after they were removed. -Using multi-tenancy with flexible privacy groups is more complex than with [offchain privacy groups](privacy-groups.md) -because users may be added and removed from flexible privacy groups. -When a user is added to a privacy group, they get access to all existing data in the privacy group. -After being removed from a privacy group, a user retains access to already existing data in the privacy group, up to the -block containing the [privacy marker transaction (PMT)](private-transactions/processing.md) that removed them (the -removal block). -A removed user doesn't have access to data in the privacy group that happens after they were removed. +In particular, when multi-tenancy is enabled and a user requests access to a privacy group they were once a member of but later removed from, Besu allows the user access to the following functionality and data associated with the privacy group: -In particular, when multi-tenancy is enabled and a user requests access to a privacy group they were once a member of -but later removed from, Besu allows the user access to the following functionality and data associated with the privacy -group: +- Private transactions using `priv_getTransaction` and private transaction receipts using [`priv_getTransactionReceipt`](../../../public-networks/reference/api/index.md#priv_gettransactionreceipt) from blocks up to (and including) the removal block. -- Private transactions using `priv_getTransaction` and private transaction receipts using - [`priv_getTransactionReceipt`](../../../public-networks/reference/api/index.md#priv_gettransactionreceipt) from blocks up to (and - including) the removal block. + :::note - !!! note + A removed group member may have access to some private transactions after the removal PMT in the same block. - A removed group member may have access to some private transactions after the removal PMT in the same block. + ::: - Using [`priv_call`](../../../public-networks/reference/api/index.md#priv_call) on blocks up to (and including) the removal block. -- Private logs using [`priv_getLogs`](../../../public-networks/reference/api/index.md#priv_getlogs) for blocks up to (and including) the - removal block. - When the `toBlock` is greater than the removal block, `priv_getLogs` still returns logs up to the removal block. +- Private logs using [`priv_getLogs`](../../../public-networks/reference/api/index.md#priv_getlogs) for blocks up to (and including) the removal block. When the `toBlock` is greater than the removal block, `priv_getLogs` still returns logs up to the removal block. + + :::note - !!! note + When a user is removed from a privacy group, any log filters they've created are also removed and can't be accessed. A user can only create and access filters for a privacy group they are currently a member of. - When a user is removed from a privacy group, any [log filters](../../HowTo/Interact/Filters#filters-for-private-contracts) - they've created are also removed and can't be accessed. - A user can only create and access filters for a privacy group they are currently a member of. + ::: All other [`PRIV` API methods](../../../public-networks/reference/api/index.md#priv-methods) fail for the removed group member. diff --git a/docs/private-networks/concepts/privacy/index.md b/docs/private-networks/concepts/privacy/index.md index 3da59edf2eb..0888bbe40e3 100644 --- a/docs/private-networks/concepts/privacy/index.md +++ b/docs/private-networks/concepts/privacy/index.md @@ -1,77 +1,71 @@ --- +title: Privacy +sidebar_position: 1 description: Privacy --- # Privacy -In Besu, privacy refers to the ability to keep transactions private between the involved -participants. Other participants cannot access the transaction content or list of participants. +In Besu, privacy refers to the ability to keep transactions private between the involved participants. Other participants cannot access the transaction content or list of participants. -!!! important +:::danger - For production environments requiring private transactions: +For production environments requiring private transactions: - * We recommend using a network with a consensus mechanism supporting transaction finality. For - example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md). - * Tessera must be [highly available and run in a separate instance to Besu]. +- We recommend using a network with a consensus mechanism supporting transaction finality. For example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md). +- Tessera must be [highly available and run in a separate instance to Besu]. - Using private transactions with [pruning] or - [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. +Using private transactions with [pruning] or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. + +::: ## Private transaction manager -Besu uses a private transaction manager, [Tessera](https://docs.tessera.consensys.net/), to implement -privacy. -Each Besu node that sends or receives [private transactions](private-transactions/index.md) requires an -associated Tessera node. +Besu uses a private transaction manager, [Tessera](https://docs.tessera.consensys.net/), to implement privacy. Each Besu node that sends or receives [private transactions](private-transactions/index.md) requires an associated Tessera node. + +

![Tessera Nodes](../../../assets/images/TesseraNodes.png) -Private transactions pass from the Besu node to the associated Tessera node. The Tessera node -encrypts and directly distributes (that is, point-to-point) the private transaction to the Tessera -nodes participating in the transaction. +

+ +Private transactions pass from the Besu node to the associated Tessera node. The Tessera node encrypts and directly distributes (that is, point-to-point) the private transaction to the Tessera nodes participating in the transaction. -By default, each participant in a privacy-enabled network uses its own Besu and Tessera node. -[Multi-tenancy](multi-tenancy.md) allows more than one participant to use the same Besu and Tessera -node. +By default, each participant in a privacy-enabled network uses its own Besu and Tessera node. [Multi-tenancy](multi-tenancy.md) allows more than one participant to use the same Besu and Tessera node. -!!! tip +:::tip - Private Transaction Managers are also known as Enclaves. +Private Transaction Managers are also known as Enclaves. + +::: ## Privacy-enabled networks -When enabling privacy in a [private network](../../get-started/system-requirements.md), -there's an assumed level of trust among the node operators, since all are members of the private -network. +When enabling privacy in a [private network](../../get-started/system-requirements.md), there's an assumed level of trust among the node operators, since all are members of the private network. + +:::caution -!!! important +Inefficient contracts deployed accidentally or deliberately can cause performance issues in privacy-enabled networks because gas isn't required in private transactions. - Inefficient contracts deployed accidentally or deliberately can cause performance issues in - privacy-enabled networks because gas isn't required in private transactions. +::: -In contrast, gas is required in Ethereum Mainnet and public testnets because they are trustless -environments. +In contrast, gas is required in Ethereum Mainnet and public testnets because they are trustless environments. -Privacy-enabled networks should have a mechanism to establish trust offchain. -Node operators should be informed on: +Privacy-enabled networks should have a mechanism to establish trust offchain. Node operators should be informed on: - Guidelines for use, responsibilities, and good behavior. - Smart contract security, so contracts deployed on the network use resources efficiently. - Consequences for malicious activity. -Privacy-enabled networks should run development and test environments that closely resemble -production, so contracts can be tested, and potential issues can be found before they're deployed in -production. +Privacy-enabled networks should run development and test environments that closely resemble production, so contracts can be tested, and potential issues can be found before they're deployed in production. ## Reorg-compatible privacy -In v1.4, using private transactions in a network using a consensus mechanism where forks occur -(that is, PoW algorithms or Clique) is an early access feature. +In v1.4, using private transactions in a network using a consensus mechanism where forks occur (that is, PoW algorithms or Clique) is an early access feature. -Do not use private transactions in production environments using consensus mechanisms where forks -occur. +Do not use private transactions in production environments using consensus mechanisms where forks occur. + [highly available and run in a separate instance to Besu]: ../../how-to/use-privacy/tessera.md [pruning]: ../../../public-networks/concepts/data-storage-formats.md#pruning diff --git a/docs/private-networks/concepts/privacy/multi-tenancy.md b/docs/private-networks/concepts/privacy/multi-tenancy.md index 4e7f408e9ec..d04b9606eb8 100644 --- a/docs/private-networks/concepts/privacy/multi-tenancy.md +++ b/docs/private-networks/concepts/privacy/multi-tenancy.md @@ -1,4 +1,6 @@ --- +title: Multi-tenancy +sidebar_position: 4 description: Multi-tenancy --- @@ -6,32 +8,26 @@ description: Multi-tenancy By default, each participant in a privacy network uses its own Besu and Tessera node. -Multi-tenancy allows multiple participants to use the same Besu and Tessera node. Each participant -is a _tenant_, and the operator is the _owner_ of the Besu and Tessera node. +Multi-tenancy allows multiple participants to use the same Besu and Tessera node. Each participant is a _tenant_, and the operator is the _owner_ of the Besu and Tessera node. -!!! important +:::info - The operator is responsible for - [configuring multi-tenancy](../../tutorials/privacy/multi-tenancy.md), and has - access to all tenant data. +The operator is responsible for [configuring multi-tenancy](../../tutorials/privacy/multi-tenancy.md), and has access to all tenant data. + +::: ![Multi-tenancy](../../../assets/images/Multi-tenancy.png) -!!! important +:::tip + +Ensure the multi-tenant Tessera node client API is configured to allow access only by the multi-tenant Besu node. Access to your data is secured through Besu using multi-tenancy mode. - Ensure the multi-tenant Tessera node client API is configured to allow access only by the - multi-tenant Besu node. Access to your data is secured through Besu using multi-tenancy mode. +If not configured to allow access only by the multi-tenant Besu node, other Tessera clients, including other Besu nodes, might be able to access tenant data. - If not configured to allow access only by the multi-tenant Besu node, other Tessera clients, - including other Besu nodes, might be able to access tenant data. +To secure access, you can [configure TLS between Besu and Tessera](../../how-to/configure/tls/client-and-server.md) with the [`WHITELIST`](https://docs.tessera.consensys.net/en/stable/HowTo/Configure/TLS/#whitelist) trust mode. - To secure access, you can [configure TLS between Besu and Tessera](../../how-to/configure/tls/client-and-server.md) - with the [`WHITELIST`](https://docs.tessera.consensys.net/en/stable/HowTo/Configure/TLS/#whitelist) - trust mode. +::: -Multi-tenancy validates that tenants have permission to use the specified HTTP or WebSocket -JSON-RPC requests, and the tenant has access to the requested privacy data. -Private data is isolated and each tenant uses a JSON Web Token (JWT) for authentication. +Multi-tenancy validates that tenants have permission to use the specified HTTP or WebSocket JSON-RPC requests, and the tenant has access to the requested privacy data. Private data is isolated and each tenant uses a JSON Web Token (JWT) for authentication. -You can -[create the JWT either externally or internally](../../../public-networks/how-to/use-besu-api/authenticate.md). +You can [create the JWT either externally or internally](../../../public-networks/how-to/use-besu-api/authenticate.md). diff --git a/docs/private-networks/concepts/privacy/plugin.md b/docs/private-networks/concepts/privacy/plugin.md index 846a2f166b8..fbc34fb440f 100644 --- a/docs/private-networks/concepts/privacy/plugin.md +++ b/docs/private-networks/concepts/privacy/plugin.md @@ -1,76 +1,66 @@ --- +title: Privacy plugin description: Privacy plugin +sidebar_position: 5 --- # Privacy plugin -You can define your own strategy for private transactions by building a plugin that extends -Hyperledger Besu functionality. +You can define your own strategy for private transactions by building a plugin that extends Hyperledger Besu functionality. The plugin can take many forms, but it must provide Besu with a private transaction when required. -!!! important +:::danger - The privacy plugin is an early access feature and plugin interfaces are subject to change between releases. +The privacy plugin is an early access feature and plugin interfaces are subject to change between releases. + +::: ## Configuration -Enable the privacy plugin by starting Besu and including the `--Xprivacy-plugin-enabled` command line option. -The registered plugin must implement the `PrivacyPluginPayloadProvider` interface. +Enable the privacy plugin by starting Besu and including the `--Xprivacy-plugin-enabled` command line option. The registered plugin must implement the `PrivacyPluginPayloadProvider` interface. ## Use the payload provider interface -The privacy plugin must define the [privacy marker transaction (PMT)] payload. -Use the payload to retrieve the contents of the private transaction which could be a link to a location in -an enclave, or an encrypted form of the private payload itself. +The privacy plugin must define the [privacy marker transaction (PMT)] payload. Use the payload to retrieve the contents of the private transaction which could be a link to a location in an enclave, or an encrypted form of the private payload itself. -Besu doesn't need to know how the private transaction is distributed, it just needs to know what the private transaction -for the PMT is. +Besu doesn't need to know how the private transaction is distributed, it just needs to know what the private transaction for the PMT is. ### Send transactions -When submitting a private transaction using [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction), -the signed transaction must be sent to `0x000000000000000000000000000000000000007a` to indicate which -[privacy precompiled contract](private-transactions/processing.md) is being used. +When submitting a private transaction using [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction), the signed transaction must be sent to `0x000000000000000000000000000000000000007a` to indicate which [privacy precompiled contract](private-transactions/processing.md) is being used. The transaction flow is as follows: 1. The JSON-RPC endpoint passes the private transaction to the private transaction manager (for example Tessera). 2. The private transaction manager sends the private transaction to the privacy plugin. -3. The plugin decides what data to store onchain in the payload, for example the encrypted and serialized private - transaction. +3. The plugin decides what data to store onchain in the payload, for example the encrypted and serialized private transaction. 4. The plugin returns what needs to be stored in the payload for the PMT. -5. The private transaction handler creates a PMT for the private transaction, and propagates the PMT using devP2P in - the same way as a public Ethereum transaction. +5. The private transaction handler creates a PMT for the private transaction, and propagates the PMT using devP2P in the same way as a public Ethereum transaction. ### Mine transactions The process of mining transactions happens in reverse to sending transactions. -1. The Mainnet transaction processor processes the PMT in the same way as - any other public transaction. On nodes containing the [privacy precompile contract](../../../public-networks/reference/api/index.md#priv_getprivacyprecompileaddress) - specified in the `to` attribute of the PMT, the Mainnet transaction processor passes the PMT to the privacy precompile contract. +1. The Mainnet transaction processor processes the PMT in the same way as any other public transaction. On nodes containing the [privacy precompile contract](../../../public-networks/reference/api/index.md#priv_getprivacyprecompileaddress) specified in the `to` attribute of the PMT, the Mainnet transaction processor passes the PMT to the privacy precompile contract. + + :::note - !!! note + Nodes receiving the PMT that do not contain the specified privacy precompile contract will ignore the PMT. - Nodes receiving the PMT that do not contain the specified privacy precompile - contract will ignore the PMT. + ::: -1. The privacy precompile contract queries the plugin for the private transaction using the PMT. -1. The privacy precompile contract passes the private transaction to the private transaction - manager. The privacy group ID specifies the private world state to use. -1. The private transaction manager executes the transaction. The private transaction manager - can read and write to the private world state, and read from the public world state. +1. The privacy precompile contract queries the plugin for the private transaction using the PMT. +1. The privacy precompile contract passes the private transaction to the private transaction manager. The privacy group ID specifies the private world state to use. +1. The private transaction manager executes the transaction. The private transaction manager can read and write to the private world state, and read from the public world state. ## Transaction factory -An additional extension is available to help you define how PMTs are signed. Currently, Besu supports fixed or random -key signing for PMTs. +An additional extension is available to help you define how PMTs are signed. Currently, Besu supports fixed or random key signing for PMTs. The extension allows you to use a more dynamic approach, for example different keys for different groups. -Your plugin needs to register the `PrivateMarkerTransactionFactory` interface which is called before submitting a PMT -to the transaction pool. The responsibility then lies with the plugin to sign and serialize the PMT. +Your plugin needs to register the `PrivateMarkerTransactionFactory` interface which is called before submitting a PMT to the transaction pool. The responsibility then lies with the plugin to sign and serialize the PMT. [privacy marker transaction (PMT)]: ../../how-to/use-privacy/access-private-transactions.md diff --git a/docs/private-networks/concepts/privacy/privacy-groups.md b/docs/private-networks/concepts/privacy/privacy-groups.md index 33061b258f3..8521efe7810 100644 --- a/docs/private-networks/concepts/privacy/privacy-groups.md +++ b/docs/private-networks/concepts/privacy/privacy-groups.md @@ -1,99 +1,77 @@ --- +title: Privacy groups +sidebar_position: 2 description: Privacy groups --- # Privacy groups -A privacy group is a group of nodes identified by a unique privacy group ID by Tessera. Tessera -stores each private transaction with the privacy group ID. +A privacy group is a group of nodes identified by a unique privacy group ID by Tessera. Tessera stores each private transaction with the privacy group ID. -The Besu nodes maintain the public world state for the blockchain and a private state for each -privacy group. The private states contain data that is not shared in the globally replicated world -state. +The Besu nodes maintain the public world state for the blockchain and a private state for each privacy group. The private states contain data that is not shared in the globally replicated world state. -!!! important +:::caution - The privacy group implementations described below are offchain privacy groups and cannot have - their group membership updated. +The privacy group implementations described below are offchain privacy groups and cannot have their group membership updated. - [Flexible privacy groups are an early access feature](flexible-privacy.md). +[Flexible privacy groups are an early access feature](flexible-privacy.md). + +::: ## Privacy types Besu implements two types of privacy: -* Enterprise Ethereum Alliance (EEA) privacy, where private transactions include `privateFor` as - the recipient. -* Besu-extended privacy, where private transactions include `privacyGroupId` as the recipient. +- Enterprise Ethereum Alliance (EEA) privacy, where private transactions include `privateFor` as the recipient. +- Besu-extended privacy, where private transactions include `privacyGroupId` as the recipient. + +Both privacy types create privacy groups and store private transactions with their privacy group in Tessera. -Both privacy types create privacy groups and store private transactions with their privacy group in -Tessera. +

![Privacy Groups](../../../assets/images/PrivacyGroups.png) -!!! note +

+ +:::note - For clarity, the Tessera nodes are not shown in the previous diagram. To send private - transactions, each Besu node must have an associated Tessera node. +For clarity, the Tessera nodes are not shown in the previous diagram. To send private transactions, each Besu node must have an associated Tessera node. + +::: ### Access between states A contract in a privacy group: -* Can read or write to a contract in the same privacy group. -* Can read from the public state including public contracts. -* Cannot access contracts from a different privacy group. +- Can read or write to a contract in the same privacy group. +- Can read from the public state including public contracts. +- Cannot access contracts from a different privacy group. A public contract cannot access a private contract. ### Enterprise Ethereum Alliance privacy -In the privacy implementation complying with the -[EEA Client Specification](https://entethalliance.org/technical-documents/) the group of nodes -specified by `privateFrom` and `privateFor` form a privacy group with a unique privacy group ID -provided by Tessera. - -!!! example +In the privacy implementation complying with the [EEA Client Specification](https://entethalliance.org/technical-documents/) the group of nodes specified by `privateFrom` and `privateFor` form a privacy group with a unique privacy group ID provided by Tessera. - The previous diagram illustrates two privacy groups enabling: +The previous diagram illustrates two privacy groups enabling: - * A, B, and C to send transactions that are private from D. - * A, C, and D to send transactions that are private from B. +- A, B, and C to send transactions that are private from D. +- A, C, and D to send transactions that are private from B. - Using EEA-compliant privacy, to send private transactions between A, B, and C, A initializes a - contract in a private transaction with B and C specified as the `privateFor` and A specified as - the `privateFrom`. Initializing the contract creates a privacy group consisting of A, B, and C. - For the ABC private state to remain consistent, A, B, and C must be included on transactions - (as either `privateFrom` or `privateFor`) even if they are between only two of the three - parties. +Using EEA-compliant privacy, to send private transactions between A, B, and C, A initializes a contract in a private transaction with B and C specified as the `privateFor` and A specified as the `privateFrom`. Initializing the contract creates a privacy group consisting of A, B, and C. For the ABC private state to remain consistent, A, B, and C must be included on transactions (as either `privateFrom` or `privateFor`) even if they are between only two of the three parties. - To send private transactions between A, C, and D, C initializes a different contract in a - private transaction with A and D specified as the `privateFor` and C specified as the - `privateFrom`. Initializing the contract creates a privacy group consisting of A, C, and D. - For the ACD private state to remain consistent, A, C, and D must be included on transactions - (as either `privateFrom` or `privateFor`) even if they are between only two of the three - parties. +To send private transactions between A, C, and D, C initializes a different contract in a private transaction with A and D specified as the `privateFor` and C specified as the `privateFrom`. Initializing the contract creates a privacy group consisting of A, C, and D. For the ACD private state to remain consistent, A, C, and D must be included on transactions (as either `privateFrom` or `privateFor`) even if they are between only two of the three parties. ### Besu-extended privacy -The Besu-extended privacy implementation creates a privacy group using -[`priv_createPrivacyGroup`](../../../public-networks/reference/api/index.md#priv_createprivacygroup) with private -transactions sent to the privacy group ID. - -!!! example +The Besu-extended privacy implementation creates a privacy group using [`priv_createPrivacyGroup`](../../../public-networks/reference/api/index.md#priv_createprivacygroup) with private transactions sent to the privacy group ID. - Using the same privacy groups as in the previous example. +Using the same privacy groups as in the previous example. - Using Besu-extended privacy, to send private transactions between A, B, and C, A creates a - privacy group consisting of A, B, and C. The privacy group ID is specified when sending private - transactions and A, B, and C are recipients of all private transactions sent to the privacy - group. +Using Besu-extended privacy, to send private transactions between A, B, and C, A creates a privacy group consisting of A, B, and C. The privacy group ID is specified when sending private transactions and A, B, and C are recipients of all private transactions sent to the privacy group. - To send private transactions between A, C, and D, A creates a privacy group consisting of A, C, - and D. The privacy group ID of this group is specified when sending private transactions with A, - C, and D as recipients. +To send private transactions between A, C, and D, A creates a privacy group consisting of A, C, and D. The privacy group ID of this group is specified when sending private transactions with A, C, and D as recipients. ## Multi-tenancy -When using [multi-tenancy](multi-tenancy.md) with privacy groups, each user provides a JSON Web Token (JWT) which -allows Besu to check that the user has access to functionality and data associated with a privacy group. +When using [multi-tenancy](multi-tenancy.md) with privacy groups, each user provides a JSON Web Token (JWT) which allows Besu to check that the user has access to functionality and data associated with a privacy group. diff --git a/docs/private-networks/concepts/privacy/private-transactions/_category_.json b/docs/private-networks/concepts/privacy/private-transactions/_category_.json new file mode 100644 index 00000000000..465b0be5572 --- /dev/null +++ b/docs/private-networks/concepts/privacy/private-transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Private transactions", + "position": 1 +} diff --git a/docs/private-networks/concepts/privacy/private-transactions/index.md b/docs/private-networks/concepts/privacy/private-transactions/index.md index 7843e5a7b27..c149089080d 100644 --- a/docs/private-networks/concepts/privacy/private-transactions/index.md +++ b/docs/private-networks/concepts/privacy/private-transactions/index.md @@ -6,121 +6,93 @@ description: Private transaction overview Private transactions have the same parameters as public Ethereum transactions, with the following additions: -* `privateFrom` - The Tessera public key of the transaction sender. -* One of the following: - * `privateFor` - The Tessera public keys of the transaction recipients. - * `privacyGroupId` - [The privacy group to receive the transaction](../privacy-groups.md). -* `restriction` - Whether the private transaction is `restricted` or `unrestricted`: - * `restricted` - Only the nodes participating in the transaction receive - and store the payload of the private transaction. - * `unrestricted` - All nodes in the network receive the payload of the private transaction, but only the nodes - participating in the transaction can read the transaction. +- `privateFrom` - The Tessera public key of the transaction sender. +- One of the following: + - `privateFor` - The Tessera public keys of the transaction recipients. + - `privacyGroupId` - [The privacy group to receive the transaction](../privacy-groups.md). +- `restriction` - Whether the private transaction is `restricted` or `unrestricted`: - !!! important + - `restricted` - Only the nodes participating in the transaction receive and store the payload of the private transaction. + - `unrestricted` - All nodes in the network receive the payload of the private transaction, but only the nodes participating in the transaction can read the transaction. - Besu implements `restricted` private transactions only. + :::info -The `gas` and `gasPrice` are used by the [privacy marker transaction (PMT)](processing.md), -not the private transaction itself. + Besu implements `restricted` private transactions only. -!!! warning + ::: - Because gas isn't required in private transactions, inefficient contracts deployed accidentally - or deliberately can cause performance issues in privacy-enabled networks. - Ensure your network has a mechanism to [establish trust offchain](../index.md#privacy-enabled-networks). +The `gas` and `gasPrice` are used by the [privacy marker transaction (PMT)](processing.md), not the private transaction itself. + +:::info + +Because gas isn't required in private transactions, inefficient contracts deployed accidentally or deliberately can cause performance issues in privacy-enabled networks. Ensure your network has a mechanism to [establish trust offchain](../index.md#privacy-enabled-networks). + +::: You can [create and send private transactions](../../../how-to/send-transactions/private-transactions.md). ## Besu and Tessera keys -Besu and Tessera nodes both have public/private key pairs identifying them. -A Besu node sending a private transaction to a Tessera node signs the transaction with the Besu node private key. -The `privateFrom` and `privateFor` parameters specified in the RLP-encoded transaction string for -[`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) are the public keys of the Tessera -nodes sending and receiving the transaction. +Besu and Tessera nodes both have public/private key pairs identifying them. A Besu node sending a private transaction to a Tessera node signs the transaction with the Besu node private key. The `privateFrom` and `privateFor` parameters specified in the RLP-encoded transaction string for [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) are the public keys of the Tessera nodes sending and receiving the transaction. -!!! important +:::info - The mapping of Besu node addresses to Tessera node public keys is offchain. - That is, the sender of a private transaction must know the Tessera node public key of the recipient. +The mapping of Besu node addresses to Tessera node public keys is offchain. That is, the sender of a private transaction must know the Tessera node public key of the recipient. + +::: ## Nonces A nonce is the number of previous transactions made by the sender. -[Private transaction processing](processing.md) involves two transactions: -the private transaction distributed to involved participants, and the privacy marker transaction (PMT) included on the -public blockchain. -Each of these transactions has its own nonce. -Since the PMT is a public transaction, the PMT nonce is the public nonce for the account. +[Private transaction processing](processing.md) involves two transactions: the private transaction distributed to involved participants, and the privacy marker transaction (PMT) included on the public blockchain. Each of these transactions has its own nonce. Since the PMT is a public transaction, the PMT nonce is the public nonce for the account. ### Private transaction nonce -Besu maintains separate private states for each [privacy group](../privacy-groups.md). -The private transaction nonce for an account is specific to the privacy group. -That is, the nonce for account A for privacy group ABC is different to the nonce for account A for privacy group AB. +Besu maintains separate private states for each [privacy group](../privacy-groups.md). The private transaction nonce for an account is specific to the privacy group. That is, the nonce for account A for privacy group ABC is different to the nonce for account A for privacy group AB. ### Private nonce validation -Unlike public transactions, private transactions are not submitted to the [transaction pool](../../../../public-networks/concepts/transactions/pool.md). -The private transaction is distributed directly to the participants in the transaction, and the PMT is submitted to the -transaction pool. +Unlike public transactions, private transactions are not submitted to the [transaction pool](../../../../public-networks/concepts/transactions/pool.md). The private transaction is distributed directly to the participants in the transaction, and the PMT is submitted to the transaction pool. -Unlike [public transaction nonces](../../../../public-networks/concepts/transactions/validation.md), private transaction nonces aren't -validated when the private transaction is submitted. -If a private transaction has an incorrect nonce, the PMT is still valid and is added to a block. -However, in this scenario, the private transaction execution fails when [processing the PMT](processing.md) -for the private transaction with the incorrect nonce. +Unlike [public transaction nonces](../../../../public-networks/concepts/transactions/validation.md), private transaction nonces aren't validated when the private transaction is submitted. If a private transaction has an incorrect nonce, the PMT is still valid and is added to a block. However, in this scenario, the private transaction execution fails when [processing the PMT](processing.md) for the private transaction with the incorrect nonce. The following private transaction flow illustrates when nonce validation occurs: 1. Submit a private transaction with a [nonce value](#private-transaction-nonce). 1. The private transaction is distributed to all participants in the privacy group. -1. The PMT is created and submitted to the transaction pool with a nonce of `0` if using one-time accounts. - If using a specific account with [`--privacy-marker-transaction-signing-key-file`](../../../reference/cli/options.md#privacy-marker-transaction-signing-key-file), - the public nonce for that account is obtained and used for the PMT. +1. The PMT is created and submitted to the transaction pool with a nonce of `0` if using one-time accounts. If using a specific account with [`--privacy-marker-transaction-signing-key-file`](../../../reference/cli/options.md#privacy-marker-transaction-signing-key-file), the public nonce for that account is obtained and used for the PMT. 1. The PMT is mined and included in the block. -1. After the block containing the PMT is imported, and the PMT is processed, the private transaction is retrieved from - the private transaction manager and executed. +1. After the block containing the PMT is imported, and the PMT is processed, the private transaction is retrieved from the private transaction manager and executed. - If the private transaction was submitted with a correct nonce in step 1, the nonce is validated as correct. - If an incorrect nonce was submitted, the private transaction execution fails. + If the private transaction was submitted with a correct nonce in step 1, the nonce is validated as correct. If an incorrect nonce was submitted, the private transaction execution fails. ### Private nonce management -In Besu, you call [`eth_getTransactionCount`](../../../../public-networks/reference/api/index.md#eth_gettransactioncount) to get a nonce, -then use that nonce with [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) to send a -private transaction. +In Besu, you call [`eth_getTransactionCount`](../../../../public-networks/reference/api/index.md#eth_gettransactioncount) to get a nonce, then use that nonce with [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) to send a private transaction. -However, when you send multiple transactions in row, if a subsequent call to `getTransactionCount` happens before a -previous transaction is processed, you can get the same nonce again. +However, when you send multiple transactions in row, if a subsequent call to `getTransactionCount` happens before a previous transaction is processed, you can get the same nonce again. You can manage private nonces in multiple ways: -* Let Besu handle it. - You just need to wait long enough between calls to `sendRawTransaction` for the transactions to process. - The current window is around 1.5 seconds, depending on block time. +- Let Besu handle it. You just need to wait long enough between calls to `sendRawTransaction` for the transactions to process. The current window is around 1.5 seconds, depending on block time. + + Public transactions deal with this issue, but the window is shorter, since you can use the transaction pool to take into account pending transactions (by using `eth_getTransactionCount("pending")`). + + For private transactions, the window is longer because private transactions aren't submitted to the transaction pool. You must wait until the private transaction's corresponding PMT is included in a block. - Public transactions deal with this issue, but the window is shorter, since you can use the transaction pool to take - into account pending transactions (by using `eth_getTransactionCount("pending")`). +- Manage the nonce yourself, by keeping track of and providing the nonce at each call. We recommend this if you're [sending many transactions that are independent of each other](../../../how-to/send-transactions/concurrent-private-transactions.md). - For private transactions, the window is longer because private transactions aren't submitted to the transaction pool. - You must wait until the private transaction's corresponding PMT is included in a block. + :::note -* Manage the nonce yourself, by keeping track of and providing the nonce at each call. - We recommend this if you're [sending many transactions that are independent of each other](../../../how-to/send-transactions/concurrent-private-transactions.md). + You can use [`priv_getTransactionCount`](../../../reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for an account for the specified privacy group or participants. - !!! note + ::: - You can use [`priv_getTransactionCount`](../../../reference/api/index.md#priv_gettransactioncount) or - [`priv_getEeaTransactionCount`](../../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for - an account for the specified privacy group or participants. +- Use [Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) for nonce management. We recommend this for enterprise use. -* Use [Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) for nonce management. - We recommend this for enterprise use. +:::tip -!!! tip +The [web3js-quorum library includes an example](https://github.com/ConsenSys/web3js-quorum/blob/9a0f9eb1b91a4a0d93801f77782b509ae2e7314c/example/concurrentPrivateTransactions/concurrentPrivateTransactions.js) of nonce management when [sending concurrent private transactions](../../../how-to/send-transactions/concurrent-private-transactions.md). The example calculates the correct nonces for the private transactions and PMTs outside of Besu. - The [web3js-quorum library includes an example](https://github.com/ConsenSys/web3js-quorum/blob/9a0f9eb1b91a4a0d93801f77782b509ae2e7314c/example/concurrentPrivateTransactions/concurrentPrivateTransactions.js) - of nonce management when [sending concurrent private transactions](../../../how-to/send-transactions/concurrent-private-transactions.md). - The example calculates the correct nonces for the private transactions and PMTs outside of Besu. +::: diff --git a/docs/private-networks/concepts/privacy/private-transactions/processing.md b/docs/private-networks/concepts/privacy/private-transactions/processing.md index ec3a8a0c83d..196f2b9e7e0 100644 --- a/docs/private-networks/concepts/privacy/private-transactions/processing.md +++ b/docs/private-networks/concepts/privacy/private-transactions/processing.md @@ -1,4 +1,6 @@ --- +title: Private transaction processing +sidebar_position: 1 description: Private transaction processing --- @@ -6,76 +8,65 @@ description: Private transaction processing Processing [private transactions](index.md) involves the following: -* **Precompiled contract**: A smart contract compiled from the source language to EVM bytecode and - stored by an Ethereum node for later execution. +- **Precompiled contract**: A smart contract compiled from the source language to EVM bytecode and stored by an Ethereum node for later execution. -* **Privacy marker transaction (PMT)**: A public Ethereum transaction with a payload of the enclave key. - The enclave key is a pointer to the private transaction in Tessera. - The `to` attribute of the PMT is the [address of the privacy precompiled contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress). +- **Privacy marker transaction (PMT)**: A public Ethereum transaction with a payload of the enclave key. The enclave key is a pointer to the private transaction in Tessera. The `to` attribute of the PMT is the [address of the privacy precompiled contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress). - The PMT is [signed with a random key or the key specified on the command line]. + The PMT is [signed with a random key or the key specified on the command line]. Private transaction processing is illustrated and described in the following diagram. ![Processing Private Transactions](../../../../assets/images/PrivateTransactionProcessing.png) -1. Submit a private transaction using [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). - The signed transaction includes transaction parameters specific to private transactions, including: +1. Submit a private transaction using [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). The signed transaction includes transaction parameters specific to private transactions, including: - * `privateFor` or `privacyGroupId`, which specifies the list of recipients. - * `privateFrom`, which specifies the sender. - * `restriction`, which specifies the transaction is restricted to the transaction participants. + - `privateFor` or `privacyGroupId`, which specifies the list of recipients. + - `privateFrom`, which specifies the sender. + - `restriction`, which specifies the transaction is restricted to the transaction participants. -1. The JSON-RPC endpoint passes the private transaction to the Private Transaction Handler. +1. The JSON-RPC endpoint passes the private transaction to the Private Transaction Handler. -1. The Private Transaction Handler sends the private transaction to Tessera. +1. The Private Transaction Handler sends the private transaction to Tessera. -1. Tessera distributes the private transaction directly (that is, point-to-point) to the Tessera nodes specified in - `privateFor` or belonging to the privacy group identified by `privacyGroupId`. - All recipient Tessera nodes store the transaction. - Tessera associates the stored transaction with the transaction hash and privacy group ID. +1. Tessera distributes the private transaction directly (that is, point-to-point) to the Tessera nodes specified in `privateFor` or belonging to the privacy group identified by `privacyGroupId`. All recipient Tessera nodes store the transaction. Tessera associates the stored transaction with the transaction hash and privacy group ID. -1. Tessera returns the transaction hash to the Private Transaction Handler. +1. Tessera returns the transaction hash to the Private Transaction Handler. -1. The Private Transaction Handler creates a PMT for the private transaction. - The Private Transaction Handler propagates the PMT using devP2P in the same way as any other public Ethereum transaction. +1. The Private Transaction Handler creates a PMT for the private transaction. The Private Transaction Handler propagates the PMT using devP2P in the same way as any other public Ethereum transaction. - !!! tip + :::tip - If you want to sign the PMT outside of Besu, use - [`priv_distributeRawTransaction`](../../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) - instead of [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). + If you want to sign the PMT outside of Besu, use [`priv_distributeRawTransaction`](../../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). -1. Besu mines the PMT into a block and the PMT is distributed to all Ethereum nodes in the network. + ::: -1. The Mainnet Transaction Processor processes the PMT in the same way as any other public transaction. - On nodes containing the [privacy precompile contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress) - specified in the `to` attribute of the PMT, the Mainnet Transaction Processor passes the PMT to the privacy - precompile contract. +1. Besu mines the PMT into a block and the PMT is distributed to all Ethereum nodes in the network. - !!! note +1. The Mainnet Transaction Processor processes the PMT in the same way as any other public transaction. On nodes containing the [privacy precompile contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress) specified in the `to` attribute of the PMT, the Mainnet Transaction Processor passes the PMT to the privacy precompile contract. - Nodes receiving the PMT that don't contain the privacy precompile contract ignore the PMT. + :::note -1. The privacy precompile contract queries Tessera for the private transaction and privacy group ID using the - transaction hash. + Nodes receiving the PMT that don't contain the privacy precompile contract ignore the PMT. -1. The privacy precompile contract passes the private transaction to the Private Transaction Processor. - The privacy group ID specifies the private world state to use. + ::: -1. The Private Transaction Processor executes the transaction. - The Private Transaction Processor can read and write to the private world state, and read from the public world state. +1. The privacy precompile contract queries Tessera for the private transaction and privacy group ID using the transaction hash. -!!! important +1. The privacy precompile contract passes the private transaction to the Private Transaction Processor. The privacy group ID specifies the private world state to use. - * We recommend using a network with a consensus mechanism supporting transaction finality. For example, - [IBFT 2.0](../../../how-to/configure/consensus/ibft.md). - * Tessera must be [highly available and run in a separate instance to Besu](../../../how-to/use-privacy/tessera.md). +1. The Private Transaction Processor executes the transaction. The Private Transaction Processor can read and write to the private world state, and read from the public world state. - Using private transactions with [pruning] or [fast sync](../../../../public-networks/reference/cli/options.md#sync-mode) - is not supported. +:::danger Recommendations + +- We recommend using a network with a consensus mechanism supporting transaction finality. For example, [IBFT 2.0](../../../how-to/configure/consensus/ibft.md). +- Tessera must be [highly available and run in a separate instance to Besu](../../../how-to/use-privacy/tessera.md). + +Using private transactions with [pruning] or [fast sync](../../../../public-networks/reference/cli/options.md#sync-mode) is not supported. + +::: + [signed with a random key or the key specified on the command line]: ../../../how-to/use-privacy/sign-pmts.md [highly available and run in a separate instance to Besu]: ../../../how-to/use-privacy/tessera.md [pruning]: ../../../../public-networks/concepts/data-storage-formats.md#pruning diff --git a/docs/private-networks/get-started/_category_.json b/docs/private-networks/get-started/_category_.json new file mode 100644 index 00000000000..3b3ed44eda6 --- /dev/null +++ b/docs/private-networks/get-started/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Get started", + "position": 2, + "collapsed": false, + "link": { + "type": "generated-index", + "slug": "/private-networks/get-started" + } +} diff --git a/docs/private-networks/get-started/install/_category_.json b/docs/private-networks/get-started/install/_category_.json new file mode 100644 index 00000000000..043580c1474 --- /dev/null +++ b/docs/private-networks/get-started/install/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Install Besu", + "position": 2 +} diff --git a/docs/private-networks/get-started/install/binary-distribution.md b/docs/private-networks/get-started/install/binary-distribution.md index 8e72cc26e05..74dcba7e6f4 100644 --- a/docs/private-networks/get-started/install/binary-distribution.md +++ b/docs/private-networks/get-started/install/binary-distribution.md @@ -1,5 +1,9 @@ --- +title: Install binary distribution description: Install or upgrade Hyperledger Besu from binary distribution +sidebar_position: 3 +tags: + - private networks --- # Install binary distribution @@ -8,17 +12,17 @@ description: Install or upgrade Hyperledger Besu from binary distribution ### Prerequisites -* [Homebrew](https://brew.sh/) -* Java JDK +- [Homebrew](https://brew.sh/) +- Java JDK -!!!important +:::caution - Hyperledger Besu supports: +Hyperledger Besu supports: - * MacOS High Sierra 10.13 or later versions. - * Java 17+. - You can install Java using `brew install openjdk`. Alternatively, you can manually install the - [Java JDK](https://www.oracle.com/java/technologies/downloads). +- MacOS High Sierra 10.13 or later versions. +- Java 17+. You can install Java using `brew install openjdk`. Alternatively, you can manually install the [Java JDK](https://www.oracle.com/java/technologies/downloads). + +::: ### Install (or upgrade) using Homebrew @@ -35,15 +39,17 @@ To upgrade an existing Besu installation using Homebrew: brew upgrade hyperledger/besu/besu ``` -!!! note +:::note + +If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. + +::: - If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade - hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. +:::note -!!! note +When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command `brew tap --repair`. - When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command - `brew tap --repair`. +::: To display the Besu version and confirm installation: @@ -61,18 +67,19 @@ besu --help ### Prerequisites -* [Java JDK 17+](https://www.oracle.com/java/technologies/downloads/) +- [Java JDK 17+](https://www.oracle.com/java/technologies/downloads/) + +:::note Linux open file limit + +If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the maximum number of open files allowed using `ulimit`. If the open files limit is not high enough, a `Too many open files` RocksDB exception occurs. -!!! note "Linux open file limit" +::: - If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the - maximum number of open files allowed using `ulimit`. If the open files limit is not high - enough, a `Too many open files` RocksDB exception occurs. +:::tip -!!! tip +We recommend installing [jemalloc](https://jemalloc.net/) to reduce memory usage. If using Ubuntu, you can install it with the command: `apt install libjemalloc-dev`. - We recommend installing [jemalloc](https://jemalloc.net/) to reduce memory usage. - If using Ubuntu, you can install it with the command: `apt install libjemalloc-dev`. +::: ### Install from packaged binaries diff --git a/docs/private-networks/get-started/install/index.md b/docs/private-networks/get-started/install/index.md index bd820d9892e..5c6fb933f52 100644 --- a/docs/private-networks/get-started/install/index.md +++ b/docs/private-networks/get-started/install/index.md @@ -1,27 +1,28 @@ --- title: Installation options description: Options for getting started with Hyperledger Besu +sidebar_position: 1 +tags: + - private networks --- # Installation options -Get started with the [Developer Quickstart](../../../private-networks/tutorials/quickstart.md). -Use the quickstart to rapidly generate local blockchain networks. +Get started with the [Developer Quickstart](../../../private-networks/tutorials/quickstart.md). Use the quickstart to rapidly generate local blockchain networks. You can also install the following: -* [Docker image](run-docker-image.md) -* [Binaries](binary-distribution.md) +- [Docker image](run-docker-image.md) +- [Binaries](binary-distribution.md) ## Build from source -If you want to use the latest development version of Hyperledger Besu or a specific commit, -build from source. Otherwise, use the [binary] or [Docker image] for more stable -versions. +If you want to use the latest development version of Hyperledger Besu or a specific commit, build from source. Otherwise, use the [binary] or [Docker image] for more stable versions. View the [Hyperledger Wiki] for instructions to install Hyperledger Besu from source. + [Hyperledger Wiki]: https://wiki.hyperledger.org/display/BESU/Building+from+source [binary]: binary-distribution.md [Docker image]: run-docker-image.md diff --git a/docs/private-networks/get-started/install/run-docker-image.md b/docs/private-networks/get-started/install/run-docker-image.md index a5b10daff05..bc84eefbb97 100644 --- a/docs/private-networks/get-started/install/run-docker-image.md +++ b/docs/private-networks/get-started/install/run-docker-image.md @@ -1,5 +1,9 @@ --- +title: Run Besu from Docker image description: Run Hyperledger Besu using the official docker image +sidebar_position: 2 +tags: + - private networks --- # Run Besu from a Docker image @@ -10,24 +14,19 @@ Use this Docker image to run a single Besu node without installing Besu. ## Prerequisites -* [Docker](https://docs.docker.com/install/) +- [Docker](https://docs.docker.com/install/) -* MacOS or Linux +- MacOS or Linux - !!! important + :::caution - The Docker image doesn't run on Windows. + The Docker image does not run on Windows. + + ::: ## Expose ports -Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need -to expose the ports to use the default ports or the ports specified using -[`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port), -[`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port), -[`--rpc-ws-port`](../../../public-networks/reference/cli/options.md#rpc-ws-port), -[`--metrics-port`](../../../public-networks/reference/cli/options.md#metrics-port), -[`--graphql-http-port`](../../../public-networks/reference/cli/options.md#graphql-http-port), and -[`--metrics-push-port`](../../../public-networks/reference/cli/options.md#metrics-push-port) options. +Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need to expose the ports to use the default ports or the ports specified using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port), [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port), [`--rpc-ws-port`](../../../public-networks/reference/cli/options.md#rpc-ws-port), [`--metrics-port`](../../../public-networks/reference/cli/options.md#metrics-port), [`--graphql-http-port`](../../../public-networks/reference/cli/options.md#graphql-http-port), and [`--metrics-push-port`](../../../public-networks/reference/cli/options.md#metrics-push-port) options. To run Besu exposing local ports for access: @@ -35,64 +34,55 @@ To run Besu exposing local ports for access: docker run -p :8545 -p :8546 -p :30303 hyperledger/besu:latest --rpc-http-enabled --rpc-ws-enabled ``` -!!! note +:::note - The examples on this page expose TCP ports only. - To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: +The examples on this page expose TCP ports only. To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: - ```bash - docker run -p :/udp - ``` +```bash +docker run -p :/udp +``` - See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). +See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). -!!! example +::: - To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: +To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: - ```bash - docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled - ``` +```bash +docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled +``` ## Start Besu -!!! important +:::danger - Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default - data path interferes with the operation of Besu and prevents Besu from safely launching. +Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default data path interferes with the operation of Besu and prevents Besu from safely launching. - To run a node that maintains the node state (key and database), - [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) must be set to a location other - than `/opt/besu` and a storage volume mounted at that location. +To run a node that maintains the node state (key and database), [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) must be set to a location other than `/opt/besu` and a storage volume mounted at that location. - When running in a Docker container, [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) - must be set to `DOCKER` or `AUTO` (default). Don't set - [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) to `NONE` or `UPNP`. +When running in a Docker container, [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) must be set to `DOCKER` or `AUTO` (default). Don't set [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) to `NONE` or `UPNP`. -You can specify -[Besu environment variables](../../../public-networks/reference/cli/options.md#specify-options) with the -Docker image instead of the command line options. +::: -!!! example +You can specify [Besu environment variables](../../../public-networks/reference/cli/options.md#specify-options) with the Docker image instead of the command line options. - ```bash - docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest - ``` +```bash +docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest +``` + +:::caution "Unsupported address type exception" -??? caution "Unsupported address type exception" +When running Besu from a Docker image, you might get the following exception: - When running Besu from a Docker image, you might get the following exception: +```bash +Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. +``` - ```bash - Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. - ``` +This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, preventing outbound communication. IPv6 is disabled by default in Docker. - This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, - preventing outbound communication. - IPv6 is disabled by default in Docker. +[Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound IPv6 traffic and allow connection with IPv6 peers. - [Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound - IPv6 traffic and allow connection with IPv6 peers. +::: ### Run a node for testing @@ -104,9 +94,7 @@ docker run -p 8546:8546 --mount type=bind,source=/,targe ## Stop Besu and clean up resources -When done running nodes, you can shut down the node container without deleting resources or you can -delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the -container and volume names. +When done running nodes, you can shut down the node container without deleting resources or you can delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the container and volume names. To stop a container: diff --git a/docs/private-networks/get-started/start-node.md b/docs/private-networks/get-started/start-node.md index c7193e0b4d0..4d7162a5927 100644 --- a/docs/private-networks/get-started/start-node.md +++ b/docs/private-networks/get-started/start-node.md @@ -1,11 +1,14 @@ --- -description: Starting Hyperledger Besu +title: Start Besu +description: Start Besu on a private Ethereum network. +sidebar_position: 3 +tags: + - private networks --- # Start Besu -Use the [`besu`](../reference/cli/options.md) command with the required command line options -to start a node. +Use the [`besu`](../reference/cli/options.md) command with the required command line options to start a node. ## Prerequisites @@ -13,61 +16,47 @@ to start a node. ## Local block data -When connecting to a network other than the network previously connected to, you must either delete -the local block data or use the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option -to specify a different data directory. +When connecting to a network other than the network previously connected to, you must either delete the local block data or use the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option to specify a different data directory. -To delete the local block data, delete the `database` directory in the -`besu/build/distribution/besu-` directory. +To delete the local block data, delete the `database` directory in the `besu/build/distribution/besu-` directory. ## Genesis configuration -To define a genesis configuration, create a [genesis file](../../public-networks/concepts/genesis-file.md) -(for example, `genesis.json`) and specify the file using the -[`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) option. +To define a genesis configuration, create a [genesis file](../../public-networks/concepts/genesis-file.md) (for example, `genesis.json`) and specify the file using the [`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) option. -When you specify [`--network=dev`](../../public-networks/reference/cli/options.md#network), Besu uses the -development mode genesis configuration with a fixed low difficulty. A node started with -[`--network=dev`](../../public-networks/reference/cli/options.md#network) has an empty bootnodes list by -default. +When you specify [`--network=dev`](../../public-networks/reference/cli/options.md#network), Besu uses the development mode genesis configuration with a fixed low difficulty. A node started with [`--network=dev`](../../public-networks/reference/cli/options.md#network) has an empty bootnodes list by default. -Predefined genesis configurations for named networks are in the -[Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). +Predefined genesis configurations for named networks are in the [Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). ## Confirm node is running -If you started Besu with the -[`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option, use -[cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to -confirm the node is running. +If you started Besu with the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option, use [cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to confirm the node is running. -!!!example +- `eth_chainId` returns the chain ID of the network. - * `eth_chainId` returns the chain ID of the network. + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 + ``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 - ``` +- `eth_syncing` returns the starting, current, and highest block. - * `eth_syncing` returns the starting, current, and highest block. + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 + ``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 - ``` + For example, after connecting to Mainnet, `eth_syncing` will return something similar to: - For example, after connecting to Mainnet, `eth_syncing` will return something similar to: - - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : { - "startingBlock" : "0x0", - "currentBlock" : "0x2d0", - "highestBlock" : "0x66c0" - } - } - ``` + ```json + { + "jsonrpc": "2.0", + "id": 1, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x2d0", + "highestBlock": "0x66c0" + } + } + ``` ## Run a node for testing @@ -77,8 +66,7 @@ To run a node that mines blocks at a rate suitable for testing purposes: besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir ``` -You can also use the following [configuration file](../../public-networks/how-to/configuration-file.md) -on the command line to start a node with the same options as above: +You can also use the following [configuration file](../../public-networks/how-to/configuration-file.md) on the command line to start a node with the same options as above: ```toml network="dev" @@ -91,19 +79,15 @@ rpc-http-enabled=true data-path="/tmp/tmpdata-path" ``` -!!! caution +:::caution + +The following settings are a security risk in production environments: - The following settings are a security risk in production environments: +- Enabling the HTTP JSON-RPC service ([`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled)) and setting [`--rpc-http-host`](../../public-networks/reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the RPC connection on your node to any remote connection. +- Setting [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) to `"*"` allows JSON-RPC API access from any host. +- Setting [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) to `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. - * Enabling the HTTP JSON-RPC service - ([`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled)) and setting - [`--rpc-http-host`](../../public-networks/reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the - RPC connection on your node to any remote connection. - * Setting [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) to `"*"` - allows JSON-RPC API access from any host. - * Setting - [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) to - `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. +::: ## Run a node on a private network @@ -113,11 +97,10 @@ To run a node on your private network specifying a genesis file and data directo besu --genesis-file=/genesis.json --data-path= --rpc-http-enabled --bootnodes= ``` -Where `` is the path to the directory to save the chain data to. -Ensure you configure a peer discovery method, such as [bootnodes](../how-to/configure/bootnodes.md). +Where `` is the path to the directory to save the chain data to. Ensure you configure a peer discovery method, such as [bootnodes](../how-to/configure/bootnodes.md). + +:::note + +You might need to set [`--tx-pool-limit-by-account-percentage`](../../public-networks/reference/cli/options.md#tx-pool-limit-by-account-percentage) to 1. The default value is suitable for Mainnet, but may cause issues on private networks. -!!! note - You might need to set - [`--tx-pool-limit-by-account-percentage`](../../public-networks/reference/cli/options.md#tx-pool-limit-by-account-percentage) - to 1. - The default value is suitable for Mainnet, but may cause issues on private networks. +::: diff --git a/docs/private-networks/get-started/system-requirements.md b/docs/private-networks/get-started/system-requirements.md index 02586df3f08..18666307ee7 100644 --- a/docs/private-networks/get-started/system-requirements.md +++ b/docs/private-networks/get-started/system-requirements.md @@ -1,61 +1,52 @@ --- -title: Hyperledger Besu system requirements -description: System requirements to sync and run Besu +title: System requirements +description: Ensure you meet the system requirements to sync and run Besu. +sidebar_position: 1 +tags: + - private networks --- # System requirements Private network system requirements depend on many factors, including: -* Size of the world state for the network. -* Number of transactions submitted to the network. -* [Block gas limit](../../public-networks/reference/genesis-items.md#genesis-block-parameters). -* Number and complexity of [JSON-RPC](../../public-networks/how-to/use-besu-api/json-rpc.md), - [PubSub](../../public-networks/how-to/use-besu-api/rpc-pubsub.md), or [GraphQL](../../public-networks/how-to/use-besu-api/graphql.md) queries - handled by the node. +- Size of the world state for the network. +- Number of transactions submitted to the network. +- [Block gas limit](../../public-networks/reference/genesis-items.md#genesis-block-parameters). +- Number and complexity of [JSON-RPC](../../public-networks/how-to/use-besu-api/json-rpc.md), [PubSub](../../public-networks/how-to/use-besu-api/rpc-pubsub.md), or [GraphQL](../../public-networks/how-to/use-besu-api/graphql.md) queries handled by the node. -Participation in private networks is typically restricted in some way, so the volume of traffic is -much lower than on Mainnet, resulting in lower system requirements. +Participation in private networks is typically restricted in some way, so the volume of traffic is much lower than on Mainnet, resulting in lower system requirements. ## Determining system requirements -To determine system requirements, check CPU and disk space requirements using -[Prometheus](../../public-networks/how-to/monitor/metrics.md). Grafana provides a -[sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. +To determine system requirements, check CPU and disk space requirements using [Prometheus](../../public-networks/how-to/monitor/metrics.md). Grafana provides a [sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. ## Java Virtual Machine size -Depending on your environment and network setup, the minimum Java Virtual -Machine (JVM) memory requirement for private networks is 4 GB. +Depending on your environment and network setup, the minimum Java Virtual Machine (JVM) memory requirement for private networks is 4 GB. -JVM memory requirements are highest when syncing, but will reduce after the node is synchronized -to the chain head. Monitor your system to determine your actual JVM memory needs. +JVM memory requirements are highest when syncing, but will reduce after the node is synchronized to the chain head. Monitor your system to determine your actual JVM memory needs. ## VM requirements If you set up your own VM locally using a VM manager such as [VirtualBox](https://www.oracle.com/virtualization/virtualbox/): -* Ensure you enable Intel Virtualization Technology (VTx) and Virtualization Technology for - Directed I/O (VT-d) in the BIOS settings. -* On Windows, you might need to disable Hyper-V in the Windows Feature list. +- Ensure you enable Intel Virtualization Technology (VTx) and Virtualization Technology for Directed I/O (VT-d) in the BIOS settings. +- On Windows, you might need to disable Hyper-V in the Windows Feature list. We recommend you create a VM with the following attributes: -* Memory size: Set to 6 GB (recommended) -* Create a virtual hard disk with at least 10 GB (20 GB recommended) -* Virtual hard disk file type: VDI (if you need to share it with other apps, use VHD) -* (Optional) You can create a shared directory to copy block files or genesis files from the host - computer to the VM. For details on how to create a shared directory, see "Share Folders" in the - [Oracle VirtualBox documentation]. +- Memory size: Set to 6 GB (recommended) +- Create a virtual hard disk with at least 10 GB (20 GB recommended) +- Virtual hard disk file type: VDI (if you need to share it with other apps, use VHD) +- (Optional) You can create a shared directory to copy block files or genesis files from the host computer to the VM. For details on how to create a shared directory, see "Share Folders" in the [Oracle VirtualBox documentation]. ## Disk type -Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). -Read-only nodes can use a lower performance setup. +Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). Read-only nodes can use a lower performance setup. -You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). -For higher performance in production settings, we recommend upgrading to -[NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). +You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). For higher performance in production settings, we recommend upgrading to [NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). + [Oracle VirtualBox documentation]: https://docs.oracle.com/en/virtualization/virtualbox/6.1/user/ diff --git a/docs/private-networks/how-to/_category_.json b/docs/private-networks/how-to/_category_.json new file mode 100644 index 00000000000..ba43c43036f --- /dev/null +++ b/docs/private-networks/how-to/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "How to", + "position": 3 +} diff --git a/docs/private-networks/how-to/backup.md b/docs/private-networks/how-to/backup.md index ba6f2f6da1b..d81cca0621c 100644 --- a/docs/private-networks/how-to/backup.md +++ b/docs/private-networks/how-to/backup.md @@ -1,32 +1,28 @@ --- +title: Backup and restore description: Backing up and restoring Besu +sidebar_position: 7 +tags: + - private networks --- # Backup and restore Besu -In a decentralized blockchain, data replicates between nodes so it's not lost. But backing up -configuration and data ensures a smoother recovery from corrupted data or other failures. +In a decentralized blockchain, data replicates between nodes so it's not lost. But backing up configuration and data ensures a smoother recovery from corrupted data or other failures. ## Genesis file -The genesis file for a network must be accessible on every node. We recommend storing the genesis -file under source control. +The genesis file for a network must be accessible on every node. We recommend storing the genesis file under source control. ## Data backups If installed locally, the default data location is the Besu installation directory. -We recommend mounting a -[separate volume to store data](../get-started/install/run-docker-image.md). Use the -[`--data-path`](../../public-networks/reference/cli/options.md#data-path) command line option to pass the path -to Besu. +We recommend mounting a [separate volume to store data](../get-started/install/run-docker-image.md). Use the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) command line option to pass the path to Besu. -The default data location is the Besu installation directory, or `/opt/besu/database` if using the -[Besu Docker image](../get-started/install/run-docker-image.md). +The default data location is the Besu installation directory, or `/opt/besu/database` if using the [Besu Docker image](../get-started/install/run-docker-image.md). -Having some data reduces the time to synchronize a new node. You can perform periodic backups of -the data directory and send the data to your preferred backup mechanism. For example, `cron` job and -`rsync`, archives to the cloud such as s3, or `tar.gz` archives. +Having some data reduces the time to synchronize a new node. You can perform periodic backups of the data directory and send the data to your preferred backup mechanism. For example, `cron` job and `rsync`, archives to the cloud such as s3, or `tar.gz` archives. ## Data restores @@ -48,8 +44,8 @@ If log messages signify a corrupt database, the cleanest way to recover is: ## Find peers after restarting -The process for finding peers after restarting is the same as for -[finding peers after upgrading and restarting]. +The process for finding peers after restarting is the same as for [finding peers after upgrading and restarting]. + [finding peers after upgrading and restarting]: ../../public-networks/how-to/upgrade-node.md#find-peers-on-restarting diff --git a/docs/private-networks/how-to/configure/_category_.json b/docs/private-networks/how-to/configure/_category_.json new file mode 100644 index 00000000000..49e1f9da31b --- /dev/null +++ b/docs/private-networks/how-to/configure/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure", + "position": 1 +} diff --git a/docs/private-networks/how-to/configure/block-proposal-permissioning.md b/docs/private-networks/how-to/configure/block-proposal-permissioning.md index ed0a62e9fd7..c164fadeddd 100644 --- a/docs/private-networks/how-to/configure/block-proposal-permissioning.md +++ b/docs/private-networks/how-to/configure/block-proposal-permissioning.md @@ -1,17 +1,22 @@ --- +title: Block proposal permissioning description: Block proposal permissioning +sidebar_position: 7 +tags: + - private networks --- # Block proposal permissioning -!!! important +:::info - Only private networks using the [QBFT consensus protocol] support block proposal permissioning. +Only private networks using the [QBFT consensus protocol] support block proposal permissioning. - Block proposal permissioning is an early access feature, and functionality and options may be updated between releases. +Block proposal permissioning is an early access feature, and functionality and options may be updated between releases. -You can configure [block proposal permissioning](../../concepts/pki.md#block-proposal-permissioning) -to ensure only authorized validator nodes can propose blocks in the network. +::: + +You can configure [block proposal permissioning](../../concepts/pki.md#block-proposal-permissioning) to ensure only authorized validator nodes can propose blocks in the network. Use certificates issued by a trusted authority to ensure validators are authorized to propose blocks. @@ -19,10 +24,9 @@ Use certificates issued by a trusted authority to ensure validators are authoriz **Prerequisites**: -* A configured network. For example, - [see steps 1 to 5 in the QBFT tutorial](../../tutorials/qbft.md). -* A keystore containing the certificate and key for each network node. -* A truststore containing all the trusted certificates for the network. +- A configured network. For example, [see steps 1 to 5 in the QBFT tutorial](../../tutorials/qbft.md). +- A keystore containing the certificate and key for each network node. +- A truststore containing all the trusted certificates for the network. Start Besu and include the following command line options on the required nodes: @@ -40,217 +44,249 @@ besu --Xpki-block-creation-enabled=true \ In the command line: -* Enable block proposal permissioning using [`--Xpki-block-creation-enabled=true`](#xpki-block-creation-enabled). -* Specify the keystore type and keystore file using [`Xpki-block-creation-keystore-type`](#xpki-block-creation-keystore-type) and - [`--Xpki-block-creation-keystore-file`](#xpki-block-creation-keystore-file). -* Specify the text file containing the password to unlock the keystore file using [`Xpki-block-creation-keystore-password-file`](#xpki-block-creation-keystore-password-file). -* Specify the optional [certificate revocation list (CRL)] file using [`Xpki-block-creation-crl-file`](#xpki-block-creation-crl-file). -* Specify the alias of the certificate to be included in blocks proposed by this validator using - [`Xpki-block-creation-keystore-certificate-alias`](#xpki-block-creation-keystore-certificate-alias). -* Specify the truststore type and truststore file using [`Xpki-block-creation-truststore-type`](#xpki-block-creation-truststore-type) and - [`Xpki-block-creation-truststore-file`](#xpki-block-creation-truststore-file). -* Specify the text file containing the password to unlock the truststore file using - [`Xpki-block-creation-truststore-password-file`](#xpki-block-creation-truststore-password-file). +- Enable block proposal permissioning using [`--Xpki-block-creation-enabled=true`](#xpki-block-creation-enabled). +- Specify the keystore type and keystore file using [`Xpki-block-creation-keystore-type`](#xpki-block-creation-keystore-type) and [`--Xpki-block-creation-keystore-file`](#xpki-block-creation-keystore-file). +- Specify the text file containing the password to unlock the keystore file using [`Xpki-block-creation-keystore-password-file`](#xpki-block-creation-keystore-password-file). +- Specify the optional [certificate revocation list (CRL)] file using [`Xpki-block-creation-crl-file`](#xpki-block-creation-crl-file). +- Specify the alias of the certificate to be included in blocks proposed by this validator using [`Xpki-block-creation-keystore-certificate-alias`](#xpki-block-creation-keystore-certificate-alias). +- Specify the truststore type and truststore file using [`Xpki-block-creation-truststore-type`](#xpki-block-creation-truststore-type) and [`Xpki-block-creation-truststore-file`](#xpki-block-creation-truststore-file). +- Specify the text file containing the password to unlock the truststore file using [`Xpki-block-creation-truststore-password-file`](#xpki-block-creation-truststore-password-file). ## Command line options ### `Xpki-block-creation-crl-file` -=== "Syntax" + + +# Syntax + +```bash +--Xpki-block-creation-crl-file= +``` - ```bash - --Xpki-block-creation-crl-file= - ``` +# Example -=== "Example" +```bash +--Xpki-block-creation-crl-file=/home/cert/cert.crl.pem +``` - ```bash - --Xpki-block-creation-crl-file=/home/cert/cert.crl.pem - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XPKI_BLOCK_CREATION_CRL_FILE=/home/cert/cert.crl.pem +``` - ```bash - BESU_XPKI_BLOCK_CREATION_CRL_FILE=/home/cert/cert.crl.pem - ``` + Path to the optional certificate revocation list (CRL) file. ### `Xpki-block-creation-enabled` -=== "Syntax" + - ```bash - --Xpki-block-creation-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--Xpki-block-creation-enabled[=] +``` - ```bash - --Xpki-block-creation-enabled=true - ``` +# Example -=== "Environment variable" +```bash +--Xpki-block-creation-enabled=true +``` - ```bash - BESU_XPKI_BLOCK_CREATION_ENABLED=true - ``` +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_ENABLED=true +``` + + Enable PKI integration. The default is `false`. ### `Xpki-block-creation-keystore-certificate-alias` -=== "Syntax" + - ```bash - --Xpki-block-creation-keystore-certificate-alias= - ``` +# Syntax -=== "Example" +```bash +--Xpki-block-creation-keystore-certificate-alias= +``` - ```bash - --Xpki-block-creation-keystore-certificate-alias=validatorA - ``` +# Example -=== "Environment variable" +```bash +--Xpki-block-creation-keystore-certificate-alias=validatorA +``` + +# Environment variable - ```bash - BESU_XPKI_BLOCK_CREATION_KEYSTORE_CERTIFICATE_ALIAS=validatorA - ``` +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_CERTIFICATE_ALIAS=validatorA +``` + + Alias of the certificate to be included in the blocks proposed by this validator. The default is `validator`. ### `Xpki-block-creation-keystore-file` -=== "Syntax" + + +# Syntax + +```bash +--Xpki-block-creation-keystore-file= +``` - ```bash - --Xpki-block-creation-keystore-file= - ``` +# Example -=== "Example" +```bash +--Xpki-block-creation-keystore-file=/home/cert/keystore.jks +``` - ```bash - --Xpki-block-creation-keystore-file=/home/cert/keystore.jks - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_FILE=/home/cert/keystore.jks +``` - ```bash - BESU_XPKI_BLOCK_CREATION_KEYSTORE_FILE=/home/cert/keystore.jks - ``` + Keystore file containing the key and certificate for PKI block creation. ### `Xpki-block-creation-keystore-password-file` -=== "Syntax" + - ```bash - --Xpki-block-creation-keystore-password-file= - ``` +# Syntax -=== "Example" +```bash +--Xpki-block-creation-keystore-password-file= +``` - ```bash - --Xpki-block-creation-keystore-password-file=/home/cert/password.txt - ``` +# Example -=== "Environment variable" +```bash +--Xpki-block-creation-keystore-password-file=/home/cert/password.txt +``` - ```bash - BESU_XPKI_BLOCK_CREATION_KEYSTORE_PASSWORD-FILE=/home/cert/password.txt - ``` +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_PASSWORD-FILE=/home/cert/password.txt +``` + + Text file containing the password to unlock the keystore file. ### `Xpki-block-creation-keystore-type` -=== "Syntax" + - ```bash - --Xpki-block-creation-keystore-type= - ``` +# Syntax -=== "Example" +```bash +--Xpki-block-creation-keystore-type= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-type=JKS +``` - ```bash - --Xpki-block-creation-keystore-type=JKS - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_TYPE=JKS +``` - ```bash - BESU_XPKI_BLOCK_CREATION_KEYSTORE_TYPE=JKS - ``` + PKI keystore type. Valid options are `JKS` and `PKCS12`. The default is `JKS`. ### `Xpki-block-creation-truststore-file` -=== "Syntax" + - ```bash - --Xpki-block-creation-truststore-file= - ``` +# Syntax -=== "Example" +```bash +--Xpki-block-creation-truststore-file= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-file=/home/cert/truststore.jks +``` - ```bash - --Xpki-block-creation-truststore-file=/home/cert/truststore.jks - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_FILE=/home/cert/truststore.jks +``` - ```bash - BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_FILE=/home/cert/truststore.jks - ``` + Truststore containing the trusted certificates for PKI block creation. ### `Xpki-block-creation-truststore-password-file` -=== "Syntax" + - ```bash - --Xpki-block-creation-truststore-password-file= - ``` +# Syntax -=== "Example" +```bash +--Xpki-block-creation-truststore-password-file= +``` - ```bash - --Xpki-block-creation-truststore-password-file=/home/cert/password.txt - ``` +# Example -=== "Environment variable" +```bash +--Xpki-block-creation-truststore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt +``` - ```bash - BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt - ``` + Text file containing the password to unlock the truststore file. ### `Xpki-block-creation-truststore-type` -=== "Syntax" + - ```bash - --Xpki-block-creation-truststore-type= - ``` +# Syntax -=== "Example" +```bash +--Xpki-block-creation-truststore-type= +``` - ```bash - --Xpki-block-creation-truststore-type=JKS - ``` +# Example -=== "Environment variable" +```bash +--Xpki-block-creation-truststore-type=JKS +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_TYPE=JKS +``` - ```bash - BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_TYPE=JKS - ``` + PKI truststore type. Valid options are `JKS` and `PKCS12`. The default is `JKS`. -[QBFT consensus protocol]: /Consensus-Protocols/QBFT.md +[QBFT consensus protocol]: ./consensus/qbft.md [certificate revocation list (CRL)]: https://www.securew2.com/blog/certificate-revocation-crl-explained diff --git a/docs/private-networks/how-to/configure/bootnodes.md b/docs/private-networks/how-to/configure/bootnodes.md index 90aa77f297a..11787681a04 100644 --- a/docs/private-networks/how-to/configure/bootnodes.md +++ b/docs/private-networks/how-to/configure/bootnodes.md @@ -1,89 +1,71 @@ --- -description: Configuring bootnodoes +title: Bootnodes +description: Configuring bootnodes +sidebar_position: 3 +tags: + - private networks --- # Configure bootnodes -You can use bootnodes to initially discover peers. -Bootnodes are regular nodes used to discover other nodes. +You can use bootnodes to initially discover peers. Bootnodes are regular nodes used to discover other nodes. In private networks for development or testing purposes, specify at least one bootnode. In production networks, [configure two or more nodes as bootnodes](#configure-bootnodes-in-a-production-network). -!!! tip +:::tip - Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, - you can use only bootnodes, only static nodes, or both bootnodes and static nodes. +Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, you can use only bootnodes, only static nodes, or both bootnodes and static nodes. - To find peers, configure one or more bootnodes. To configure a specific set - of peer connections, use [static nodes](../../../public-networks/how-to/connect/static-nodes.md). +To find peers, configure one or more bootnodes. To configure a specific set of peer connections, use [static nodes](../../../public-networks/how-to/connect/static-nodes.md). -!!! note "Mainnet and public testnets" +::: - For Mainnet and the Sepolia and Goerli testnets, Hyperledger Besu has an - internal list of enode URLs and uses this list automatically when you specify the - [`--network`](../../../public-networks/reference/cli/options.md#network) option. +:::note Mainnet and public testnets -## Specify a bootnode +For Mainnet and the Sepolia and Goerli testnets, Hyperledger Besu has an internal list of enode URLs and uses this list automatically when you specify the [`--network`](../../../public-networks/reference/cli/options.md#network) option. + +::: -To start a node, specify a bootnode [enode](../../../public-networks/concepts/node-keys.md) for P2P discovery, -using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. +## Specify a bootnode -!!! example +To start a node, specify a bootnode [enode](../../../public-networks/concepts/node-keys.md) for P2P discovery, using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. - ```bash - besu --genesis-file=privateNetworkGenesis.json --data-path=nodeDataPath --bootnodes=enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb99bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303 - ``` +```bash +besu --genesis-file=privateNetworkGenesis.json --data-path=nodeDataPath --bootnodes=enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb99bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303 +``` -The default host and port advertised to other peers for P2P discovery is `127.0.0.1:30303`. To -specify a different host or port, use the -[`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) and -[`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) options. +The default host and port advertised to other peers for P2P discovery is `127.0.0.1:30303`. To specify a different host or port, use the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) and [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) options. -By default, peer discovery listens on all available network interfaces. If the device Besu is -running on must bind to a specific network interface, specify the interface using the -[`--p2p-interface`](../../../public-networks/reference/cli/options.md#p2p-interface) option. +By default, peer discovery listens on all available network interfaces. If the device Besu is running on must bind to a specific network interface, specify the interface using the [`--p2p-interface`](../../../public-networks/reference/cli/options.md#p2p-interface) option. ## Configure bootnodes in a production network -A network must have at least one operating bootnode. To allow for continuity in the event of -failure, configure two or more bootnodes in a production network. +A network must have at least one operating bootnode. To allow for continuity in the event of failure, configure two or more bootnodes in a production network. -We don't recommend putting bootnodes behind a load balancer because the -[enode](../../../public-networks/concepts/node-keys.md#enode-url) relates to the node public key, IP address, and -discovery ports. Any changes to a bootnode enode prevents other nodes from being able to establish -a connection with the bootnode. This is why we recommend putting more bootnodes on the network -itself. +We don't recommend putting bootnodes behind a load balancer because the [enode](../../../public-networks/concepts/node-keys.md#enode-url) relates to the node public key, IP address, and discovery ports. Any changes to a bootnode enode prevents other nodes from being able to establish a connection with the bootnode. This is why we recommend putting more bootnodes on the network itself. To ensure a bootnode enode doesn't change when recovering from a complete bootnode failure: -1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) - before starting the bootnode. -1. When creating bootnodes in the cloud (for example, AWS and Azure), attempt to assign a static IP - address to them. If your network is: +1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) before starting the bootnode. +1. When creating bootnodes in the cloud (for example, AWS and Azure), attempt to assign a static IP address to them. If your network is: - * Publicly accessible, assign an elastic IP. - * Internal only, specify a private IP address when you create the instance and record this IP - address. + - Publicly accessible, assign an elastic IP. + - Internal only, specify a private IP address when you create the instance and record this IP address. We recommend storing the bootnode configuration under source control. To allow for failure, specify all bootnodes on the command line (even to the bootnodes themselves). -!!! tip +:::tip + +Having each bootnode list the other bootnodes increases the speed of discovery. Nodes ignore their own enode in the bootnodes list so it isn't required to specify different bootnode lists to the bootnodes themselves. - Having each bootnode list the other bootnodes increases the speed of discovery. - Nodes ignore their own enode in the bootnodes list so it isn't required to specify different - bootnode lists to the bootnodes themselves. +::: ## Add and remove bootnodes -Adding new bootnodes is a similar process to creating bootnodes. After creating the bootnodes and -adding them to the network, update the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) -command line option for each node to include the new bootnodes. +Adding new bootnodes is a similar process to creating bootnodes. After creating the bootnodes and adding them to the network, update the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) command line option for each node to include the new bootnodes. -When adding bootnodes, you don't need to restart running nodes. By updating the -[`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option, the next time you restart the -nodes (for example, when [upgrading](../../../public-networks/how-to/upgrade-node.md)), the nodes -connect to the new bootnodes. +When adding bootnodes, you don't need to restart running nodes. By updating the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option, the next time you restart the nodes (for example, when [upgrading](../../../public-networks/how-to/upgrade-node.md)), the nodes connect to the new bootnodes. diff --git a/docs/private-networks/how-to/configure/consensus/_category_.json b/docs/private-networks/how-to/configure/consensus/_category_.json new file mode 100644 index 00000000000..bc0d5770af5 --- /dev/null +++ b/docs/private-networks/how-to/configure/consensus/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Consensus", + "position": 1 +} diff --git a/docs/private-networks/how-to/configure/consensus/add-validators-without-voting.md b/docs/private-networks/how-to/configure/consensus/add-validators-without-voting.md index 09acaccb266..70d875e33a0 100644 --- a/docs/private-networks/how-to/configure/consensus/add-validators-without-voting.md +++ b/docs/private-networks/how-to/configure/consensus/add-validators-without-voting.md @@ -1,317 +1,309 @@ --- +title: Add and remove validators without voting description: How to add or remove validators without voting +sidebar_position: 5 +tags: + - private networks --- # Add and remove validators without voting -[QBFT](qbft.md) or [IBFT 2.0](ibft.md) network -conditions might not allow voting to change validators. -For example, if a majority of the current validators are no longer participating in the network, a vote to add or -remove validators won't be successful. -You can bypass voting and specify new validators using a transition in the genesis file. +[QBFT](qbft.md) or [IBFT 2.0](ibft.md) network conditions might not allow voting to change validators. For example, if a majority of the current validators are no longer participating in the network, a vote to add or remove validators won't be successful. You can bypass voting and specify new validators using a transition in the genesis file. -!!! warning +:::caution - - In most cases, add or remove validators - [by voting or smart contract for QBFT](qbft.md#add-and-remove-validators); - or [by voting for IBFT 2.0](ibft.md#add-and-remove-validators). - Use transitions only when voting isn't possible. - Using transitions requires coordinating a rolling update of all the nodes in order to pick up the configuration at - the correct block height. - Using transitions also leaves the validator overrides permanently in your genesis configuration. - - Transitions are a Besu-specific feature. - If you run a mixed-client QBFT network, you can't use transitions to change the validators. +- In most cases, add or remove validators [by voting or smart contract for QBFT](qbft.md#add-and-remove-validators); or [by voting for IBFT 2.0](ibft.md#add-and-remove-validators). Use transitions only when voting isn't possible. Using transitions requires coordinating a rolling update of all the nodes in order to pick up the configuration at the correct block height. Using transitions also leaves the validator overrides permanently in your genesis configuration. +- Transitions are a Besu-specific feature. If you run a mixed-client QBFT network, you can't use transitions to change the validators. -To add or remove validators without voting: - -1. In the genesis file, add the `transitions` configuration item where: - - * `` is the upcoming block at which to change validators. - * ` ... ` are strings representing the account addresses - of the validators after ``. +::: - !!! example "Transitions object in the genesis file" - - === "QBFT syntax" +To add or remove validators without voting: - ```bash - { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - }, - "transitions": { - "qbft": [ - { - "block": , - "validators": [ - , - ... - - ] - } - ] - } - }, +1. In the genesis file, add the `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - ` ... ` are strings representing the account addresses of the validators after ``. + + + + # QBFT syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": , + "validators": [ + , ... - } - ``` - - === "QBFT example" - - ```bash + + ] + } + ] + } + }, + ... + } + ``` + + # QBFT example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - }, - "transitions": { - "qbft": [ - { - "block": 25, - "validators": [ - "0x372a70ace72b02cc7f1757183f98c620254f9c8d", - "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" - ] - } - ] - } - }, - ... + "block": 25, + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] } - ``` - - === "IBFT 2.0 syntax" - - ```bash - { - "config": { - ... - "ibft2": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - }, - "transitions": { - "ibft2": [ - { - "block": , - "validators": [ - , - ... - - ] - } - ] - } - }, + ] + } + }, + ... + } + ``` + + # IBFT 2.0 syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": , + "validators": [ + , ... - } - ``` + + ] + } + ] + } + }, + ... + } + ``` + + # IBFT 2.0 example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": 25, + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` - === "IBFT 2.0 example" + - ```bash - { - "config": { - ... - "ibft2": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - }, - "transitions": { - "ibft2": [ - { - "block": 25, - "validators": [ - "0x372a70ace72b02cc7f1757183f98c620254f9c8d", - "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" - ] - } - ] - } - }, - ... - } - ``` +2. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. +3. To verify the changes after the transition block, call [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber) or [`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. -1. Restart all nodes in the network using the updated genesis file. - You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. -1. To verify the changes after the transition block, call - [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber) or - [`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), - specifying `latest`. +:::caution -!!! caution +Don't specify a transition block in the past. - Don't specify a transition block in the past. - Specifying a transition block in the past can result in unexpected behavior, such as causing the network to fork. +Specifying a transition block in the past can result in unexpected behavior, such as causing the network to fork. + +::: ## Override smart contract validators -When using -[QBFT contract validator selection](qbft.md#add-and-remove-validators-using-a-smart-contract), -if network conditions require it, you can bypass the smart contract and specify new validators in the genesis file. -For example, you lose quorum for your current list of contract validators, and you can't perform a transaction to vote -more in. +When using [QBFT contract validator selection](qbft.md#add-and-remove-validators-using-a-smart-contract), if network conditions require it, you can bypass the smart contract and specify new validators in the genesis file. For example, you lose quorum for your current list of contract validators, and you can't perform a transaction to vote more in. -This requires temporarily -[switching to block header validator selection mode](qbft.md#swap-validator-management-methods). +This requires temporarily [switching to block header validator selection mode](qbft.md#swap-validator-management-methods). To bypass the smart contract and specify new validators: -1. In the genesis file, add a `transitions` configuration item where: - - * `` is the upcoming block at which to change validators. - * `` is the validator selection mode to switch to. In this case we'll switch to the - `blockheader` mode temporarily. - * ` ... ` are strings representing the account addresses - of the validators after ``. These validators only need to be sufficient to progress - the chain and allow a new contract to be deployed. - - === "Syntax" - - ```bash - { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4, - "validatorcontractaddress": "0x0000000000000000000000000000000000007777" - }, - "transitions": { - "qbft": [ - { - "block": , - "validatorselectionmode": , - "validators": [ - , - ... - - ] - } - ] - } - }, - ... +1. In the genesis file, add a `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - `` is the validator selection mode to switch to. In this case we'll switch to the `blockheader` mode temporarily. + - ` ... ` are strings representing the account addresses of the validators after ``. These validators only need to be sufficient to progress the chain and allow a new contract to be deployed. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": , + "validatorselectionmode": , + "validators": [ + , + ... + + ] + } + ] } - ``` - - === "Example" - - ```bash - { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4, - "validatorcontractaddress": "0x0000000000000000000000000000000000007777" - }, - "transitions": { - "qbft": [ - { - "block": 2555, - "validatorselectionmode": "blockheader", - "validators": [ - "0x372a70ace72b02cc7f1757183f98c620254f9c8d", - "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" - ] - } - ] - } - }, - ... + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] } - ``` - -1. Restart all nodes in the network using the updated genesis file. - You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. -1. Deploy a new contract to the blockchain containing the desired list of validators. -1. In the genesis file, add another `transitions` configuration item where: - - * `` is the upcoming block at which to change validators. - * `` is the validator selection mode to switch to. In this case we'll switch to - `contract` mode. - * `` is the address of the new smart contract. - - === "Syntax" - - ```bash - { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4, - “validatorcontractaddress”: “0x0000000000000000000000000000000000007777” - }, - "transitions": { - "qbft": [ - { - "block": 2555, - "validatorselectionmode": "blockheader", - "validators": [ - "0x372a70ace72b02cc7f1757183f98c620254f9c8d", - "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" - ] - }, - { - "block": , - "validatorselectionmode": , - "validatorcontractaddress": - } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. +1. Deploy a new contract to the blockchain containing the desired list of validators. +1. In the genesis file, add another `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - `` is the validator selection mode to switch to. In this case we'll switch to `contract` mode. + - `` is the address of the new smart contract. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + “validatorcontractaddress”: “0x0000000000000000000000000000000000007777” + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" ] - } - }, - ... - } - ``` - - === "Example" - - ```bash - { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4, - "validatorcontractaddress": "0x0000000000000000000000000000000000007777" }, - "transitions": { - "qbft": [ - { - "block": 2555, - "validatorselectionmode": "blockheader", - "validators": [ - "0x372a70ace72b02cc7f1757183f98c620254f9c8d", - "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" - ] - }, - { - "block": 2755, - "validatorselectionmode": "contract", - "validatorcontractaddress": "0x0000000000000000000000000000000000009999" - } + { + "block": , + "validatorselectionmode": , + "validatorcontractaddress": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" ] - } - }, - ... + }, + { + "block": 2755, + "validatorselectionmode": "contract", + "validatorcontractaddress": "0x0000000000000000000000000000000000009999" + } + ] } - ``` + }, + ... + } + ``` + + -1. Restart all nodes in the network using the updated genesis file. - You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. +1. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. diff --git a/docs/private-networks/how-to/configure/consensus/clique.md b/docs/private-networks/how-to/configure/consensus/clique.md index 4e145f7fcdc..6bf2aecf81f 100644 --- a/docs/private-networks/how-to/configure/consensus/clique.md +++ b/docs/private-networks/how-to/configure/consensus/clique.md @@ -1,22 +1,24 @@ --- +title: Clique description: Hyperledger Besu Clique Proof-of-Authority (PoA) consensus protocol implementation +sidebar_position: 4 path: blob/master/config/src/main/resources/ source: rinkeby.json +tags: + - private networks --- # Configure Clique consensus -Besu implements the [Clique](https://eips.ethereum.org/EIPS/eip-225) proof of authority (PoA) [consensus protocol](index.md). -Private networks can use Clique. +Besu implements the [Clique](https://eips.ethereum.org/EIPS/eip-225) proof of authority (PoA) [consensus protocol](index.md). Private networks can use Clique. -!!! warning +:::danger - Clique is not suitable for production environments. - Use only in development environments. +Clique is not suitable for production environments. Use only in development environments. -In Clique networks, approved accounts, known as signers, validate transactions and blocks. Signers -take turns to create the next block. -Existing signers propose and vote to [add or remove signers](#add-and-remove-signers). +::: + +In Clique networks, approved accounts, known as signers, validate transactions and blocks. Signers take turns to create the next block. Existing signers propose and vote to [add or remove signers](#add-and-remove-signers). You can [create a private network using Clique](../../../tutorials/clique.md). @@ -26,159 +28,131 @@ To use Clique in a private network, Besu requires a Clique [genesis file](../../ A Clique genesis file defines properties specific to Clique. -!!! example "Example Clique genesis file" - - ```json - { - "config":{ - "chainId":1981, - "berlinBlock": 0, - "clique":{ - "blockperiodseconds":15, - "epochlength":30000 - } - }, - "coinbase":"0x0000000000000000000000000000000000000000", - "difficulty":"0x1", - "extraData":"0x000000000000000000000000000000000000000000000000000000000000000001a54556254bfa3db2daa7673435ec63649925c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "gasLimit":"0x1fffffffffffff", - "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", - "nonce":"0x0", - "timestamp":"0x5c51a607", - "alloc": {}, - "number":"0x0", - "gasUsed":"0x0", - "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000" +```json title="Example Clique genesis file" +{ + "config": { + "chainId": 1981, + "berlinBlock": 0, + "clique": { + "blockperiodseconds": 15, + "epochlength": 30000 } - ``` + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "extraData": "0x000000000000000000000000000000000000000000000000000000000000000001a54556254bfa3db2daa7673435ec63649925c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x1fffffffffffff", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "timestamp": "0x5c51a607", + "alloc": {}, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` The properties specific to Clique are: -* `blockperiodseconds` - The block time, in seconds. -* `epochlength` - The number of blocks after which to reset all votes. -* `extraData` - [Extra data](#extra-data) including the initial signers. +- `blockperiodseconds` - The block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `extraData` - [Extra data](#extra-data) including the initial signers. ### Extra data The `extraData` property consists of: -* 0x prefix. -* 32 bytes of vanity data. -* A list of initial signer addresses (at least one initial signer is required). - 20 bytes for each signer. -* 65 bytes for the proposer signature. - In the genesis block there is no initial proposer, so the proposer signature is all zeros. +- 0x prefix. +- 32 bytes of vanity data. +- A list of initial signer addresses (at least one initial signer is required). 20 bytes for each signer. +- 65 bytes for the proposer signature. In the genesis block there is no initial proposer, so the proposer signature is all zeros. -!!! example "One initial signer" +### One initial signer - ![One Initial Signer](../../../../assets/images/CliqueOneIntialSigner.png) +![One Initial Signer](../../../../assets/images/CliqueOneIntialSigner.png) -!!! example "Two initial signers" +### Two initial signers - ![Two Initial Signers](../../../../assets/images/CliqueTwoIntialSigners.png) +![Two Initial Signers](../../../../assets/images/CliqueTwoIntialSigners.png) ### Post-Merge configuration -After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. -Their fields **must** contain only the constant values from the following chart. +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. | Field | Constant value | Comment | -|-------|----------------|---------| +| --- | --- | --- | | **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | | **`difficulty`** | `0` | Replaced with `prevrandao` | -| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | -| **`nonce`** | `0x0000000000000000` | | -| **`ommers`** | `[]` | `RLP([]) = 0xc0` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | Additionally, [`extraData`](#extra-data) is limited to 32 bytes of vanity data after The Merge. ## Connect to a Clique network -To start a node on a Clique private network, use the -[`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom -genesis file. +To start a node on a Clique private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. ## Add and remove signers -Existing signers propose and vote to add or remove validators using the Clique JSON-RPC API methods. -Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the -WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). +Existing signers propose and vote to add or remove validators using the Clique JSON-RPC API methods. Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). -The Clique API methods are disabled by default. -To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or -[`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `CLIQUE`. +The Clique API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `CLIQUE`. The methods to add or remove signers are: -* [`clique_propose`](../../../reference/api/index.md#clique_propose). -* [`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). -* [`clique_discard`](../../../reference/api/index.md#clique_discard). +- [`clique_propose`](../../../reference/api/index.md#clique_propose). +- [`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). +- [`clique_discard`](../../../reference/api/index.md#clique_discard). -To view signer metrics for a specified block range, call -[`clique_getSignerMetrics`](../../../reference/api/index.md#clique_getsignermetrics). +To view signer metrics for a specified block range, call [`clique_getSignerMetrics`](../../../reference/api/index.md#clique_getsignermetrics). ### Add a signer -To propose adding a signer to a Clique network, call -[`clique_propose`](../../../reference/api/index.md#clique_propose), specifying the address of the proposed signer and `true`. -A majority of signers must execute the call. - -!!! example "JSON-RPC `clique_propose` request example" +To propose adding a signer to a Clique network, call [`clique_propose`](../../../reference/api/index.md#clique_propose), specifying the address of the proposed signer and `true`. A majority of signers must execute the call. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' - ``` +```bash title="JSON-RPC clique_propose request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` When the signer creates the next block, the signer adds a vote to the block for the proposed signer. -When more than 50% of the existing signers propose adding the signer, with their votes distributed in blocks, the -signer can begin signing blocks. - -To return a list of signers and confirm the addition of a proposed signer, call -[`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). +When more than 50% of the existing signers propose adding the signer, with their votes distributed in blocks, the signer can begin signing blocks. -!!! example "JSON-RPC `clique_getSigners` request example" +To return a list of signers and confirm the addition of a proposed signer, call [`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' - ``` +```bash title="JSON-RPC clique_getSigners request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' +``` -To discard your proposal after confirming the addition of a signer, call -[`clique_discard`](../../../reference/api/index.md#clique_discard) specifying the address of the proposed signer. +To discard your proposal after confirming the addition of a signer, call [`clique_discard`](../../../reference/api/index.md#clique_discard) specifying the address of the proposed signer. -!!! example "JSON-RPC `clique_discard` request example" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' - ``` +```bash title="JSON-RPC clique_discard request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` ### Remove a signer -The process for removing a signer from a Clique network is the same as [adding a signer](#add-a-signer), except you -specify `false` as the second parameter of [`clique_propose`](../../../reference/api/index.md#clique_propose). +The process for removing a signer from a Clique network is the same as [adding a signer](#add-a-signer), except you specify `false` as the second parameter of [`clique_propose`](../../../reference/api/index.md#clique_propose). ### Epoch transition -At each epoch transition, Clique discards all pending votes collected from received blocks. -Existing proposals remain in effect and signers re-add their vote the next time they create a block. +At each epoch transition, Clique discards all pending votes collected from received blocks. Existing proposals remain in effect and signers re-add their vote the next time they create a block. Define the number of blocks between epoch transitions in the [Clique genesis file](#genesis-file). ## Limitations -In Clique, blocks created by in-turn validators are published immediately. -Out-of-turn validators create blocks that are published after a short delay. -In-turn blocks have a higher difficulty than out-of-turn blocks, which allows small forks to resolve to the chain with -more in-turn blocks. +In Clique, blocks created by in-turn validators are published immediately. Out-of-turn validators create blocks that are published after a short delay. In-turn blocks have a higher difficulty than out-of-turn blocks, which allows small forks to resolve to the chain with more in-turn blocks. + +However, when the out-of-turn delay is shorter than the block propagation delay, out-of-turn blocks may be published before in-turn blocks. This may cause large, irresolvable forks in a network. -However, when the out-of-turn delay is shorter than the block propagation delay, out-of-turn blocks may be published -before in-turn blocks. -This may cause large, irresolvable forks in a network. +:::tip -!!! important +We recommend using a more updated consensus protocol such as [IBFT 2.0](ibft.md) or [QBFT](qbft.md). - We recommend using a more updated consensus protocol such as [IBFT 2.0](ibft.md) or [QBFT](qbft.md). +::: -*[vanity data]: Signers can include anything they like as vanity data. +\*[vanity data]: Signers can include anything they like as vanity data. diff --git a/docs/private-networks/how-to/configure/consensus/ibft.md b/docs/private-networks/how-to/configure/consensus/ibft.md index 8a78f8ef45c..de26b5a2a2b 100644 --- a/docs/private-networks/how-to/configure/consensus/ibft.md +++ b/docs/private-networks/how-to/configure/consensus/ibft.md @@ -1,199 +1,160 @@ --- +title: IBFT 2.0 description: Hyperledger Besu IBFT 2.0 proof of authority (PoA) consensus protocol implementation +sidebar_position: 3 +tags: + - private networks --- # Configure IBFT 2.0 consensus -Besu implements the IBFT 2.0 proof of authority (PoA) [consensus protocol](index.md). -IBFT 2.0 is supported for existing private networks, but [QBFT](qbft.md) is the recommended enterprise-grade -consensus protocol for private networks. +Besu implements the IBFT 2.0 proof of authority (PoA) [consensus protocol](index.md). IBFT 2.0 is supported for existing private networks, but [QBFT](qbft.md) is the recommended enterprise-grade consensus protocol for private networks. -In IBFT 2.0 networks, approved accounts, known as validators, validate transactions and blocks. -Validators take turns to create the next block. Before inserting the block onto the chain, a -super-majority (greater than or equal to 2/3) of validators must first sign the block. +In IBFT 2.0 networks, approved accounts, known as validators, validate transactions and blocks. Validators take turns to create the next block. Before inserting the block onto the chain, a super-majority (greater than or equal to 2/3) of validators must first sign the block. Existing validators propose and vote to [add or remove validators](#add-and-remove-validators). You can [create a private network using IBFT](../../../tutorials/ibft/index.md). -!!! important +:::danger - Configure your network to ensure you never lose more than 1/3 of your validators. If more - than 1/3 of validators stop participating, new blocks are no longer created, and the - network stalls. It may take significant time to recover once nodes are restarted. +Configure your network to ensure you never lose more than 1/3 of your validators. If more than 1/3 of validators stop participating, new blocks are no longer created, and the network stalls. It may take significant time to recover once nodes are restarted. -!!! tip +::: - You can use a plugin to securely store a validator's key using the - [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. +:::tip + +You can use a plugin to securely store a validator's key using the [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. + +::: ## Genesis file -To use IBFT 2.0, Besu requires an IBFT 2.0 [genesis file](../../../../public-networks/concepts/genesis-file.md). The genesis file defines properties -specific to IBFT 2.0. - -!!! example "Example IBFT 2.0 genesis file" - - ```json - { - "config": { - "chainId": 1981, - "berlinBlock": 0, - "ibft2": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4, - "blockreward": "5000000000000000", - "miningbeneficiary": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" - } - }, - "nonce": "0x0", - "timestamp": "0x58ee40ba", - "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d594c2ab482b506de561668e07f04547232a72897daf808400000000c0", - "gasLimit": "0x1fffffffffffff", - "difficulty": "0x1", - "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", - "alloc": {} - } - ``` +To use IBFT 2.0, Besu requires an IBFT 2.0 [genesis file](../../../../public-networks/concepts/genesis-file.md). The genesis file defines properties specific to IBFT 2.0. + +```json title="Example IBFT 2.0 genesis file" +{ + "config": { + "chainId": 1981, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "blockreward": "5000000000000000", + "miningbeneficiary": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d594c2ab482b506de561668e07f04547232a72897daf808400000000c0", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "alloc": {} +} +``` The properties specific to IBFT 2.0 are: -* `blockperiodseconds` - The minimum block time, in seconds. -* `epochlength` - The number of blocks after which to reset all votes. -* `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. -* `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). - Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all - nodes on the network must use the identical value. -* `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator - that proposes the block. If set, then all nodes on the network must use the same beneficiary. -* `extraData` - RLP encoded [extra data](#extra-data). +- `blockperiodseconds` - The minimum block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. +- `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all nodes on the network must use the identical value. +- `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator that proposes the block. If set, then all nodes on the network must use the same beneficiary. +- `extraData` - RLP encoded [extra data](#extra-data). + +:::caution -!!! caution +We don't recommend changing `epochlength` in a running network. Changing the `epochlength` after genesis can result in illegal blocks. - We don't recommend changing `epochlength` in a running network. Changing the `epochlength` - after genesis can result in illegal blocks. +::: -??? caution "Invalid block header error" +:::caution Invalid block header error - When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, - the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. - The imported chain makes new blocks faster than the genesis file allows and Besu rejects them - with this error. - This error most often occurs when importing chains from older versions of Besu. +When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. The imported chain makes new blocks faster than the genesis file allows and Besu rejects them with this error. This error most often occurs when importing chains from older versions of Besu. - Decrease the `blockperiodseconds` in the new IBFT 2.0 genesis file to a lower value that - satisfies the block header validation. +Decrease the `blockperiodseconds` in the new IBFT 2.0 genesis file to a lower value that satisfies the block header validation. - !!! example +::: - If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp - 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, - decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. +If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. - After you update the new genesis file, if the imported chain has a `blockperiodseconds` value - set lower than you prefer, you can adjust it by [configuring the block time on an existing IBFT - 2.0 network](#configure-block-time-on-an-existing-network). +After you update the new genesis file, if the imported chain has a `blockperiodseconds` value set lower than you prefer, you can adjust it by [configuring the block time on an existing IBFT 2.0 network](#configure-block-time-on-an-existing-network). The properties with specific values in the IBFT 2.0 genesis files are: -* `nonce` - `0x0` -* `difficulty` - `0x1` -* `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul - block identification +- `nonce` - `0x0` +- `difficulty` - `0x1` +- `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul block identification -To start a node on an IBFT 2.0 private network, use the -[`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom -genesis file. +To start a node on an IBFT 2.0 private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. ### Extra data The `extraData` property is an RLP encoding of: -* 32 bytes of vanity data. -* A list of validator addresses. -* Any validator votes. No vote is included in the genesis block. -* The round the block was created on. The round in the genesis block is 0. -* A list of seals of the validators (signed block hashes). No seals are included in the genesis block. +- 32 bytes of vanity data. +- A list of validator addresses. +- Any validator votes. No vote is included in the genesis block. +- The round the block was created on. The round in the genesis block is 0. +- A list of seals of the validators (signed block hashes). No seals are included in the genesis block. -In the genesis block, the important information in the extra data is the list of validators. -All other details have empty values. -Formally, `extraData` in the genesis block contains -`RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. +In the genesis block, the important information in the extra data is the list of validators. All other details have empty values. Formally, `extraData` in the genesis block contains `RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. -!!! info +:::info - RLP encoding is a space-efficient object serialization scheme used in Ethereum. - -#### Generate extra data +RLP encoding is a space-efficient object serialization scheme used in Ethereum. -To generate the `extraData` RLP string for inclusion in the genesis file, use the -[`rlp encode`](../../../../public-networks/reference/cli/subcommands.md#rlp) Besu subcommand. +::: -!!! example +#### Generate extra data - ```bash - besu rlp encode --from=toEncode.json - ``` +To generate the `extraData` RLP string for inclusion in the genesis file, use the [`rlp encode`](../../../../public-networks/reference/cli/subcommands.md#rlp) Besu subcommand. -Where the `toEncode.json` file contains a list of the initial validators, in ascending order. -To write the validator address and copy it to the `toEncode.json` file, use the -[`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu subcommand. -For example: +```bash title="Example" +besu rlp encode --from=toEncode.json +``` -!!! example "One initial validator in `toEncode.json` file" +Where the `toEncode.json` file contains a list of the initial validators, in ascending order. To write the validator address and copy it to the `toEncode.json` file, use the [`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu subcommand. For example: - ```json - [ - "9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" - ] - ``` +```json title="One initial validator in toEncode.json file" +["9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb"] +``` Copy the RLP encoded data to the `extraData` property in the genesis file. ### Block time -When the protocol receives a new chain head, the block time (`blockperiodseconds`) and round -timeout (`requesttimeoutseconds`) timers start. When `blockperiodseconds` expires, the protocol -proposes a new block. +When the protocol receives a new chain head, the block time (`blockperiodseconds`) and round timeout (`requesttimeoutseconds`) timers start. When `blockperiodseconds` expires, the protocol proposes a new block. -If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with -the block time and timeout timers reset. The timeout period for the new round is two times -`requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a -block. +If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with the block time and timeout timers reset. The timeout period for the new round is two times `requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a block. -Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round -then starts, resetting the block time and round timeout timers. When `blockperiodseconds` -expires, the protocol proposes the next new block. +Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round then starts, resetting the block time and round timeout timers. When `blockperiodseconds` expires, the protocol proposes the next new block. -!!! warning +:::danger - If more than 1/3 of validators stop participating, new blocks can no longer be created and - `requesttimeoutseconds` doubles with each round change. The quickest method - to resume block production is to restart all validators, which resets `requesttimeoutseconds` to - its genesis value. +If more than 1/3 of validators stop participating, new blocks can no longer be created and `requesttimeoutseconds` doubles with each round change. The quickest method to resume block production is to restart all validators, which resets `requesttimeoutseconds` to its genesis value. -Once `blockperiodseconds` is over, the time from proposing a block to adding the block is -small (usually around one second) even in networks with geographically dispersed validators. +::: -!!! example - An internal network run by ConsenSys had four geographically dispersed validators in Sweden, - Sydney, and two in North Virginia. With a `blockperiodseconds` of 5 and a `requesttimeoutseconds` - of 10, the testnet consistently created blocks with a five second block time. +Once `blockperiodseconds` is over, the time from proposing a block to adding the block is small (usually around one second) even in networks with geographically dispersed validators. + +An internal network run by ConsenSys had four geographically dispersed validators in Sweden, Sydney, and two in North Virginia. With a `blockperiodseconds` of 5 and a `requesttimeoutseconds` of 10, the testnet consistently created blocks with a five second block time. #### Tune block timeout To tune the block timeout for your network deployment: -1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times - `blockperiodseconds`. +1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times `blockperiodseconds`. 1. Reduce `requesttimeoutseconds` until you start to see round changes occurring. 1. Increase `requesttimeoutseconds` to the value where round changes are no longer occurring. -!!! tip +:::tip + +View [`TRACE` logs](../../../../public-networks/reference/api/index.md#trace-methods) to see round change log messages. - View [`TRACE` logs](../../../../public-networks/reference/api/index.md#trace-methods) to see round change - log messages. +::: Use a [transition](#transitions) to update the `blockperiodseconds` in an existing network. @@ -201,368 +162,340 @@ Use a [transition](#transitions) to update the `blockperiodseconds` in an existi Optional configuration options in the genesis file are: -* `messageQueueLimit` - In large networks with limited resources, increasing the message queue - limit might help with message activity surges. The default is 1000. -* `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate - message limit might reduce the number of retransmissions. A value of two to three times the - number of validators is usually enough. The default is 100. -* `futureMessagesLimit` - The future messages buffer holds messages for a future chain - height. For large networks, increasing the future messages limit might be useful. The default is - 1000. -* `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering - messages in the future messages buffer. The default is 10. +- `messageQueueLimit` - In large networks with limited resources, increasing the message queue limit might help with message activity surges. The default is 1000. +- `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate message limit might reduce the number of retransmissions. A value of two to three times the number of validators is usually enough. The default is 100. +- `futureMessagesLimit` - The future messages buffer holds messages for a future chain height. For large networks, increasing the future messages limit might be useful. The default is 1000. +- `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering messages in the future messages buffer. The default is 10. ### Post-Merge configuration -After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. -Their fields **must** contain only the constant values from the following chart. +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. | Field | Constant value | Comment | -|-------|----------------|---------| +| --- | --- | --- | | **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | | **`difficulty`** | `0` | Replaced with `prevrandao` | -| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | -| **`nonce`** | `0x0000000000000000` | | -| **`ommers`** | `[]` | `RLP([]) = 0xc0` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | Additionally, [`extraData`](#extra-data) is limited to 32 bytes of vanity data after The Merge. ## Add and remove validators -Existing validators propose and vote to add or remove validators using the IBFT 2.0 JSON-RPC API methods. -Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the -WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). +Existing validators propose and vote to add or remove validators using the IBFT 2.0 JSON-RPC API methods. Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). -The IBFT 2.0 API methods are disabled by default. -To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or -[`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `IBFT`. +The IBFT 2.0 API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `IBFT`. The methods to add or remove validators are: -* [`ibft_getPendingVotes`](../../../reference/api/index.md#ibft_getpendingvotes). -* [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). -* [`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote). +- [`ibft_getPendingVotes`](../../../reference/api/index.md#ibft_getpendingvotes). +- [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). +- [`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote). -To view validator metrics for a specified block range, use -[`ibft_getSignerMetrics`](../../../../public-networks/reference/api/index.md#ibft_getsignermetrics). +To view validator metrics for a specified block range, use [`ibft_getSignerMetrics`](../../../../public-networks/reference/api/index.md#ibft_getsignermetrics). -!!! note +:::note - If network conditions render it impossible to add and remove validators by voting, you can - [add and remove validators without voting](add-validators-without-voting.md). +If network conditions render it impossible to add and remove validators by voting, you can [add and remove validators without voting](add-validators-without-voting.md). -### Add a validator +::: -To propose adding a validator to an IBFT 2.0 network, call -[`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the -proposed validator and `true`. -A majority of validators must execute the call. - -!!! example "JSON-RPC `ibft_proposeValidatorVote` request example" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' - ``` +### Add a validator -When the validator proposes the next block, the protocol inserts one proposal received from -[`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote) into the block. -If blocks include all proposals, subsequent blocks proposed by the validator will not contain a vote. +To propose adding a validator to an IBFT 2.0 network, call [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the proposed validator and `true`. A majority of validators must execute the call. -When more than 50% of the existing validators have published a matching proposal, the protocol adds the proposed -validator to the validator pool and the validator can begin validating blocks. +```bash title="JSON-RPC ibft_proposeValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` -To return a list of validators and confirm the addition of a proposed validator, use -[`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber). +When the validator proposes the next block, the protocol inserts one proposal received from [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote) into the block. If blocks include all proposals, subsequent blocks proposed by the validator will not contain a vote. -!!! example "JSON-RPC `ibft_getValidatorsByBlockNumber` request example" +When more than 50% of the existing validators have published a matching proposal, the protocol adds the proposed validator to the validator pool and the validator can begin validating blocks. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' - ``` +To return a list of validators and confirm the addition of a proposed validator, use [`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber). -To discard your proposal after confirming the addition of a validator, call -[`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote), -specifying the address of the proposed validator. +```bash title="JSON-RPC ibft_getValidatorsByBlockNumber request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' +``` -!!! example "JSON-RPC `ibft_discardValidatorVote` request example" +To discard your proposal after confirming the addition of a validator, call [`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote), specifying the address of the proposed validator. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' - ``` +```bash title="JSON-RPC ibft_discardValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` ### Remove a validator -The process for removing a validator from an IBFT 2.0 network is the same as [adding a validator](#add-a-validator) -except you specify `false` as the second parameter of -[`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). +The process for removing a validator from an IBFT 2.0 network is the same as [adding a validator](#add-a-validator) except you specify `false` as the second parameter of [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). ### Epoch transition -At each epoch transition, IBFT 2.0 discards all pending votes collected from received blocks. -Existing proposals remain in effect and validators re-add their vote the next time they create a -block. +At each epoch transition, IBFT 2.0 discards all pending votes collected from received blocks. Existing proposals remain in effect and validators re-add their vote the next time they create a block. -An epoch transition occurs every `epochLength` blocks. -Define `epochlength` in the [IBFT 2.0 genesis file](#genesis-file). +An epoch transition occurs every `epochLength` blocks. Define `epochlength` in the [IBFT 2.0 genesis file](#genesis-file). ### Minimum number of validators -IBFT 2.0 requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the -ability for a blockchain network to function correctly and reach consensus despite nodes failing or -propagating incorrect information to peers. +IBFT 2.0 requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the ability for a blockchain network to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. ### Maximum number of validators -As the number of validators increase, the message complexity increases, which can decrease performance. -In [network tests](https://wiki.hyperledger.org/display/BESU/Maximum+Validator+count+for+an+IBFT2+Network), IBFT 2.0 handles up to 30 validators with no loss of performance. +As the number of validators increase, the message complexity increases, which can decrease performance. In [network tests](https://wiki.hyperledger.org/display/BESU/Maximum+Validator+count+for+an+IBFT2+Network), IBFT 2.0 handles up to 30 validators with no loss of performance. Non-validator nodes don't affect performance and don't count towards the maximum limit. ## Transitions -The `transitions` genesis configuration item allows you to specify a future block number at which to change IBFT 2.0 -network configuration in an existing network. -For example, you can update the [block time](#configure-block-time-on-an-existing-network-deployment), -[block reward](#configure-block-rewards-on-an-existing-network-deployment), or -[mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). +The `transitions` genesis configuration item allows you to specify a future block number at which to change IBFT 2.0 network configuration in an existing network. For example, you can update the [block time](#configure-block-time-on-an-existing-network-deployment), [block reward](#configure-block-rewards-on-an-existing-network-deployment), or [mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). -!!! caution +:::caution - Do not specify a transition block in the past. - Specifying a transition block in the past could result in unexpected behavior, such as causing - the network to fork. +Do not specify a transition block in the past. Specifying a transition block in the past could result in unexpected behavior, such as causing the network to fork. + +::: ### Configure block time on an existing network deployment To update an existing network with a new `blockperiodseconds`: -1. Stop all nodes in the network. -1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: - * `` is the upcoming block at which to change `blockperiodseconds`. - * `` is the updated value for `blockperiodseconds`. + - `` is the upcoming block at which to change `blockperiodseconds`. + - `` is the updated value for `blockperiodseconds`. - !!! example "Transitions configuration" + - === "Syntax" + # Syntax - ```bash + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ { - "config": { - ... - "ibft2": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - }, - "transitions": { - "ibft2": [ - { - "block": , - "blockperiodseconds": - } - ] - } - }, - ... + "block": , + "blockperiodseconds": } - ``` + ] + } + }, + ... + } + ``` - === "Example" + # Example - ```bash + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ { - "config": { - ... - "ibft2": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - }, - "transitions": { - "ibft2": [ - { - "block": 1240, - "blockperiodseconds": 4 - } - ] - } - }, - ... + "block": 1240, + "blockperiodseconds": 4 } - ``` + ] + } + }, + ... + } + ``` -1. Restart all nodes in the network using the updated genesis file. -1. To verify the changes after the transition block, call - [`ibft_getValidatorsByBlockNumber`](../../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + + +1. Restart all nodes in the network using the updated genesis file. +1. To verify the changes after the transition block, call [`ibft_getValidatorsByBlockNumber`](../../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. ### Configure block rewards on an existing network deployment To update an existing network with a new `blockreward`: -1. Stop all nodes in the network. -1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: - * `` is the upcoming block at which to change `blockreward`. - * `` is the updated value for `blockreward`. + - `` is the upcoming block at which to change `blockreward`. + - `` is the updated value for `blockreward`. - !!! example "Transitions configuration" + - === "Syntax" + # Syntax - ```bash + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "ibft2": [ + { + "block": , + "blockreward": + }, { - "config": { - ... - "ibft2": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - "blockreward": "5000000000000000" - }, - "transitions": { - "ibft2": [ - { - "block": , - "blockreward": - }, - { - "block": , - "blockreward": - }, - { - "block": , - "blockreward": - } - ] - } - }, - ... + "block": , + "blockreward": + }, + { + "block": , + "blockreward": } - ``` + ] + } + }, + ... + } + ``` - === "Example" + # Example - ```bash + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "ibft2": [ + { + "block": 10, + "blockreward": "6000000000000000" + }, + { + "block": 15, + "blockreward": "75000000000000000" + }, { - "config": { - ... - "ibft2": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - "blockreward": "5000000000000000" - }, - "transitions": { - "ibft2": [ - { - "block": 10, - "blockreward": "6000000000000000" - }, - { - "block": 15, - "blockreward": "75000000000000000" - }, - { - "block": 20, - "blockreward": "0" - } - ] - } - }, - ... + "block": 20, + "blockreward": "0" } - ``` + ] + } + }, + ... + } + ``` + + + + :::note - !!! note + You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. - You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. + ::: -1. Restart all nodes in the network using the updated genesis file. +1. Restart all nodes in the network using the updated genesis file. ### Configure the mining beneficiary on an existing network deployment To update an existing network with a new mining beneficiary: -1. Stop all nodes in the network. -1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: - * `` is the upcoming block at which to change `miningbeneficiary`. - * `` is the updated 20-byte address for `miningbeneficiary`. - Starting at ``, block rewards go to this address. + - `` is the upcoming block at which to change `miningbeneficiary`. + - `` is the updated 20-byte address for `miningbeneficiary`. Starting at ``, block rewards go to this address. - !!! example "Transitions configuration" + - === "Syntax" + # Syntax - ```bash + ```bash + { + "config": { + "chainId": 999, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 1, + "epochlength": 30000, + "requesttimeoutseconds": 5, + "blockreward": "5000000000000000000", + "miningbeneficiary": "0x0000000000000000000000000000000000000001" + }, + "transitions": { + "ibft2": [ { - "config": { - "chainId": 999, - "berlinBlock": 0, - "ibft2": { - "blockperiodseconds": 1, - "epochlength": 30000, - "requesttimeoutseconds": 5, - "blockreward": "5000000000000000000", - "miningbeneficiary": "0x0000000000000000000000000000000000000001" - }, - "transitions": { - "ibft2": [ - { - "block": , - "miningbeneficiary": - }, - { - "block": , - "miningbeneficiary": - } - ] - } - }, - ... + "block": , + "miningbeneficiary": + }, + { + "block": , + "miningbeneficiary": } - ``` + ] + } + }, + ... + } + ``` - === "Example" + # Example - ```bash - { - "config": { - "chainId": 999, - "berlinBlock": 0, - "ibft2": { - "blockperiodseconds": 1, - "epochlength": 30000, - "requesttimeoutseconds": 5, - "blockreward": "5000000000000000000", - "miningbeneficiary": "0x0000000000000000000000000000000000000001" - }, - "transitions": { - "ibft2": [ - { - "block": 10000, - "miningbeneficiary": "", - }, - { - "block": 20000, - "miningbeneficiary": "0x0000000000000000000000000000000000000002", - } - ] - } - }, - ... - } - ``` + ```bash + { + "config": { + "chainId": 999, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 1, + "epochlength": 30000, + "requesttimeoutseconds": 5, + "blockreward": "5000000000000000000", + "miningbeneficiary": "0x0000000000000000000000000000000000000001" + }, + "transitions": { + "ibft2": [ + { + "block": 10000, + "miningbeneficiary": "", + }, + { + "block": 20000, + "miningbeneficiary": "0x0000000000000000000000000000000000000002", + } + ] + } + }, + ... + } + ``` + + - !!! note + :::note - Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the - block producer rather than a global override address. + Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the block producer rather than a global override address. -1. Restart all nodes in the network using the updated genesis file. + ::: + +1. Restart all nodes in the network using the updated genesis file. -*[vanity data]: Validators can include anything they like as vanity data. -*[RLP]: Recursive Length Prefix +_[vanity data]: Validators can include anything they like as vanity data. _[RLP]: Recursive Length Prefix + +``` + +``` diff --git a/docs/private-networks/how-to/configure/consensus/index.md b/docs/private-networks/how-to/configure/consensus/index.md index 5e5af57b2d6..8ea4813a032 100644 --- a/docs/private-networks/how-to/configure/consensus/index.md +++ b/docs/private-networks/how-to/configure/consensus/index.md @@ -1,79 +1,81 @@ --- +title: Consensus protocols description: Besu consensus protocols +sidebar_position: 1 +tags: + - private networks --- # Consensus protocols Besu supports the following consensus protocols: -* [QBFT](qbft.md) (proof of authority) - The recommended - enterprise-grade consensus protocol for private networks. -* [IBFT 2.0](ibft.md) (proof of authority) - Supported for existing private networks. -* [Clique](clique.md) (proof of authority) - Not recommended for - production use. -* [Proof of stake](../../../../public-networks/concepts/proof-of-stake/index.md) - Used on Ethereum - Mainnet and public testnets. -* [Ethash](https://ethereum.org/en/developers/docs/consensus-mechanisms/pow/) (proof of work) - Can - be used in [small development networks](../../../tutorials/ethash.md). +- [QBFT](qbft.md) (proof of authority) - The recommended enterprise-grade consensus protocol for private networks. +- [IBFT 2.0](ibft.md) (proof of authority) - Supported for existing private networks. +- [Clique](clique.md) (proof of authority) - Not recommended for production use. +- [Proof of stake](../../../../public-networks/concepts/proof-of-stake/index.md) - Used on Ethereum Mainnet and public testnets. +- [Ethash](https://ethereum.org/en/developers/docs/consensus-mechanisms/pow/) (proof of work) - Can be used in [small development networks](../../../tutorials/ethash.md). See a [comparison of the proof of authority consensus protocols](../../../concepts/poa.md). The `config` property in the genesis file specifies the consensus protocol for a chain. -!!! example + - === "Ethash" +# Ethash - ```json - { - "config": { - ... - "ethash": { - ... - } - }, - ... - } - ``` +```json +{ + "config": { + ... + "ethash": { + ... + } + }, + ... +} +``` - === "Clique" +# Clique - ```json - { - "config": { - ... - "clique": { - ... - } - }, - ... - } - ``` +```json +{ + "config": { + ... + "clique": { + ... + } + }, + ... +} +``` - === "IBFT 2.0" +# IBFT 2.0 - ```json - { - "config": { - ... - "ibft2": { - ... - } - }, - ... - } - ``` +```json +{ + "config": { + ... + "ibft2": { + ... + } + }, + ... +} +``` - === "QBFT" +# QBFT - ```json - { - "config": { - ... - "qbft": { - ... - } - }, - ... - } - ``` +```json +{ + "config": { + ... + "qbft": { + ... + } + }, + ... +} +``` + + diff --git a/docs/private-networks/how-to/configure/consensus/qbft.md b/docs/private-networks/how-to/configure/consensus/qbft.md index 62a376b0a21..727f2662887 100644 --- a/docs/private-networks/how-to/configure/consensus/qbft.md +++ b/docs/private-networks/how-to/configure/consensus/qbft.md @@ -1,30 +1,32 @@ --- +title: QBFT description: Hyperledger Besu QBFT proof of authority (PoA) consensus protocol implementation +sidebar_position: 2 +tags: + - private networks --- # Configure QBFT consensus -Hyperledger Besu implements the QBFT proof of authority (PoA) [consensus protocol](index.md). -QBFT is the recommended enterprise-grade consensus protocol for private networks. +Hyperledger Besu implements the QBFT proof of authority (PoA) [consensus protocol](index.md). QBFT is the recommended enterprise-grade consensus protocol for private networks. -In QBFT networks, approved accounts, known as validators, validate transactions and blocks. -Validators take turns to create the next block. Before inserting the block onto the chain, a -super-majority (greater than or equal to 2/3) of validators must first sign the block. +In QBFT networks, approved accounts, known as validators, validate transactions and blocks. Validators take turns to create the next block. Before inserting the block onto the chain, a super-majority (greater than or equal to 2/3) of validators must first sign the block. Existing validators propose and vote to [add or remove validators](#add-and-remove-validators). You can [create a private network using QBFT](../../../tutorials/qbft.md). -!!! important +:::caution - Configure your network to ensure you never lose more than 1/3 your validators. If more - than 1/3 of validators stop participating, new blocks are no longer created, and the - network stalls. It may take significant time to recover once nodes are restarted. +Configure your network to ensure you never lose more than 1/3 your validators. If more than 1/3 of validators stop participating, new blocks are no longer created, and the network stalls. It may take significant time to recover once nodes are restarted. -!!! tip +::: - You can use a plugin to securely store a validator's key using the - [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. +:::tip + +You can use a plugin to securely store a validator's key using the [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. + +::: ## Genesis file @@ -32,268 +34,235 @@ To use QBFT, define a [genesis file](../../../../public-networks/concepts/genesi The genesis file differs depending on the [validator management method](#add-and-remove-validators) you intend to use. -!!! note - - You can use a [transitions](#transitions) to change the `blockperiodseconds` or validator management method of the network - at a later time. - -!!! example "Example QBFT genesis files" - - === "Block header validator selection" - - ```json - { - "config": { - "chainid": 1337, - "berlinBlock": 0, - "qbft": { - "epochlength": 30000, - "blockperiodseconds": 5, - "requesttimeoutseconds": 10 - } - }, - "nonce": "0x0", - "timestamp": "0x5b3d92d7", - "extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549464a702e6263b7297a96638cac6ae65e6541f4169943923390ad55e90c237593b3b0e401f3b08a0318594aefdb9a738c9f433e5b6b212a6d62f6370c2f69294c7eeb9a4e00ce683cf93039b212648e01c6c6b78c080c0", - "gasLimit": "0x29b92700", - "difficulty": "0x1", - "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "64d9be4177f418bcf4e56adad85f33e3a64efe22": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - }, - "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - }, - "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - }, - "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ``` - - === "Contract validator selection" - - ```json - { - "config": { - "chainid": 1337, - "berlinBlock": 0, - "qbft": { - "epochlength": 30000, - "blockperiodseconds": 5, - "requesttimeoutseconds": 10, - "validatorcontractaddress": "0x0000000000000000000000000000000000007777" - } - }, - "nonce": "0x0", - "timestamp": "0x5b3d92d7", - "extraData": "0xe5a00000000000000000000000000000000000000000000000000000000000000000c0c080c0", - "gasLimit": "0x29b92700", - "difficulty": "0x1", - "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "64d9be4177f418bcf4e56adad85f33e3a64efe22": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - }, - "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - }, - "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - }, - "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { - "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" - }, - "0x0000000000000000000000000000000000007777": { - "comment": "validator smart contract", - "balance": "0", - "code": "0x608060405234801561001057600080fd5b50600436106100a5576000357c0100000000000000000000000000000000000000000000000000000000900480639692ea25116100785780639692ea2514610113578063b4ec9ac114610126578063b7ab4db514610139578063c76f24371461014e57600080fd5b80631c5a9d9c146100aa578063508adcfc146100bf57806351b42b00146100db5780635dc43899146100e3575b600080fd5b6100bd6100b8366004611399565b610161565b005b6100c860035481565b6040519081526020015b60405180910390f35b6100bd6104aa565b6100f66100f1366004611399565b61074e565b6040805193845260208401929092521515908201526060016100d2565b6100bd610121366004611399565b610bbd565b6100bd610134366004611399565b610deb565b6101416110a3565b6040516100d291906113c9565b6100bd61015c366004611399565b611105565b3360009081526001602052604090205460ff1661019c5760405160e560020a62461bcd02815260040161019390611416565b60405180910390fd5b600160a060020a03811661021b5760405160e560020a62461bcd02815260206004820152602860248201527f63616e6e6f742061637469766174652076616c696461746f722077697468206160448201527f64647265737320300000000000000000000000000000000000000000000000006064820152608401610193565b60005b6000548110156102b7576000818154811061023b5761023b611505565b600091825260209091200154600160a060020a03838116911614156102a55760405160e560020a62461bcd02815260206004820152601b60248201527f76616c696461746f7220697320616c72656164792061637469766500000000006044820152606401610193565b806102af816114b8565b91505061021e565b33600090815260016020526040902054610100900460ff16156103345733600090815260016020526040812054815484929162010000900460ff1690811061030157610301611505565b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550610432565b600054610100116103b05760405160e560020a62461bcd02815260206004820152602e60248201527f6e756d626572206f662076616c696461746f72732063616e6e6f74206265206c60448201527f6172676572207468616e203235360000000000000000000000000000000000006064820152608401610193565b3360009081526001602081905260408220805461ff001981166101009081178355845460ff16620100000262ffff001990921691909117179055815490810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563018054600160a060020a038416600160a060020a03199091161790555b600160a060020a0382166000818152600260205260408082208054600160a060020a03191633908117909155915490519192917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f9161049e916001909182521515602082015260400190565b60405180910390a35050565b3360009081526001602052604090205460ff166104dc5760405160e560020a62461bcd02815260040161019390611416565b6000546001106105315760405160e560020a62461bcd02815260206004820181905260248201527f63616e6e6f742064656163746976617465206c6173742076616c696461746f726044820152606401610193565b33600090815260016020526040902054610100900460ff166105be5760405160e560020a62461bcd02815260206004820152602860248201527f73656e64657220646f6573206e6f74206861766520616e20616374697665207660448201527f616c696461746f720000000000000000000000000000000000000000000000006064820152608401610193565b336000908152600160205260408120805461ff0019169081905581546201000090910460ff1691908190839081106105f8576105f8611505565b60009182526020822001548154600160a060020a03909116925081906106209060019061148a565b8154811061063057610630611505565b60009182526020822001548154600160a060020a03909116925082919060ff861690811061066057610660611505565b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055838316825260028152604080832054909316825260019052908120805462ff000019166201000060ff8716021790558054806106c6576106c66114ec565b6000828152602080822060001990840181018054600160a060020a03199081169091559301909355600160a060020a03851680825260028452604080832080549094169093558154835190815293840191909152339290917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f910160405180910390a3505050565b336000908152600160205260408120548190819060ff166107845760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a03851660009081526004602052604090205481101561082357600160a060020a038516600090815260046020526040812080546001929190849081106107d6576107d6611505565b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610811578361080d816114b8565b9450505b8061081b816114b8565b915050610787565b5060026003546108339190611465565b831115610b8657600160a060020a038416600090815260046020526040812061085b9161135f565b600160a060020a03841660009081526001602052604090205460ff1615610ab0576003805490600061088c836114a1565b9091555050600160a060020a038416600090815260016020526040902054610100900460ff1615610a89576000546001106109325760405160e560020a62461bcd02815260206004820152603860248201527f63616e6e6f742072656d6f766520616c6c6f776564206163636f756e7420776960448201527f7468206c617374206163746976652076616c696461746f7200000000000000006064820152608401610193565b600160a060020a03841660009081526001602052604081205481546201000090910460ff169160029181908490811061096d5761096d611505565b6000918252602080832090910154600160a060020a0316835282019290925260400181208054600160a060020a0319169055805481906109af9060019061148a565b815481106109bf576109bf611505565b60009182526020822001548154600160a060020a03909116925082919060ff85169081106109ef576109ef611505565b600091825260208220018054600160a060020a031916600160a060020a039390931692909217909155805480610a2757610a276114ec565b6000828152602080822083016000199081018054600160a060020a0319169055909201909255600160a060020a0392831682526002815260408083205490931682526001905220805460ff909216620100000262ff0000199092169190911790555b600160a060020a0384166000908152600160205260409020805462ffffff19169055610b32565b60038054906000610ac0836114b8565b909155505060408051606081018252600180825260006020808401828152848601838152600160a060020a038b16845293909152939020915182549351915160ff16620100000262ff0000199215156101000261ff00199215159290921661ffff199095169490941717169190911790555b600160a060020a03841660008181526001602090815260409182902054915160ff909216151582527f94154efdb7741591680558a88682943a481f1a468cb81f46fe7f8cead2e40519910160405180910390a25b826002600354610b969190611465565b610ba190600161144d565b6002600354610bb09190611465565b9196909550931192915050565b3360009081526001602052604090205460ff16610bef5760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a038216600090815260046020526040902054811015610d4b57600160a060020a0382166000908152600460205260409020805433919083908110610c3f57610c3f611505565b600091825260209091200154600160a060020a03161415610d3957600160a060020a03821660009081526004602052604090208054610c809060019061148a565b81548110610c9057610c90611505565b6000918252602080832090910154600160a060020a03858116845260049092526040909220805491909216919083908110610ccd57610ccd611505565b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559184168152600490915260409020805480610d1257610d126114ec565b60008281526020902081016000199081018054600160a060020a0319169055019055610d4b565b80610d43816114b8565b915050610bf2565b50600160a060020a0381166000818152600460205260409020546003543392917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba91610d9990600290611465565b610da490600161144d565b600160a060020a0386166000908152600160208181526040928390205483519586529085019390935260ff909216159083015260608201526080015b60405180910390a350565b3360009081526001602052604090205460ff16610e1d5760405160e560020a62461bcd02815260040161019390611416565b600160a060020a038116610e765760405160e560020a62461bcd02815260206004820152601f60248201527f6163636f756e7420746f2062652061646465642063616e6e6f742062652030006044820152606401610193565b600160a060020a03811660009081526001602081905260409091205460ff16151514610f0d5760405160e560020a62461bcd02815260206004820152602a60248201527f6163636f756e7420746f2072656d6f7665206973206e6f74206f6e207468652060448201527f616c6c6f77206c697374000000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a038216600090815260046020526040902054811015610ffb57600160a060020a0382166000908152600460205260409020805433919083908110610f5d57610f5d611505565b600091825260209091200154600160a060020a03161415610fe95760405160e560020a62461bcd02815260206004820152602a60248201527f73656e6465722068617320616c726561647920766f74656420746f2072656d6f60448201527f7665206163636f756e74000000000000000000000000000000000000000000006064820152608401610193565b80610ff3816114b8565b915050610f10565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061107490600290611465565b61107f90600161144d565b60408051928352602083019190915260009082018190526060820152608001610de0565b606060008054806020026020016040519081016040528092919081815260200182805480156110fb57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116110dd575b5050505050905090565b3360009081526001602052604090205460ff166111375760405160e560020a62461bcd02815260040161019390611416565b600160a060020a03811660009081526001602052604090205460ff16156111c95760405160e560020a62461bcd02815260206004820152602b60248201527f6163636f756e7420746f2061646420697320616c7265616479206f6e2074686560448201527f20616c6c6f77206c6973740000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a0382166000908152600460205260409020548110156112b757600160a060020a038216600090815260046020526040902080543391908390811061121957611219611505565b600091825260209091200154600160a060020a031614156112a55760405160e560020a62461bcd02815260206004820152602760248201527f73656e6465722068617320616c726561647920766f74656420746f206164642060448201527f6163636f756e74000000000000000000000000000000000000000000000000006064820152608401610193565b806112af816114b8565b9150506111cc565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061133090600290611465565b61133b90600161144d565b60408051928352602083019190915260019082015260006060820152608001610de0565b508054600082559060005260206000209081019061137d9190611380565b50565b5b808211156113955760008155600101611381565b5090565b6000602082840312156113ab57600080fd5b8135600160a060020a03811681146113c257600080fd5b9392505050565b6020808252825182820181905260009190848201906040850190845b8181101561140a578351600160a060020a0316835292840192918401916001016113e5565b50909695505050505050565b6020808252601f908201527f73656e646572206973206e6f74206f6e2074686520616c6c6f77206c69737400604082015260600190565b60008219821115611460576114606114d3565b500190565b6000826114855760e060020a634e487b7102600052601260045260246000fd5b500490565b60008282101561149c5761149c6114d3565b500390565b6000816114b0576114b06114d3565b506000190190565b60006000198214156114cc576114cc6114d3565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052603160045260246000fd5b60e060020a634e487b7102600052603260045260246000fdfea26469706673582212200c3e9c07521b155532c0de1605aae52f4ae953670f0afb0f30d320580b93213d64736f6c63430008070033", - "storage": { - "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000000000000000000000000000000000000002", - "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": "0000000000000000000000009a6d82ef3912d5ab60473124bccd2f2a640769d7", - "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564": "00000000000000000000000065463bf6268e5cc409b6501ec846487b935a1446", - "aedead2c33b41c31b4afd2246c6bf5131c209d4b0ca6c2247778ac7be7443a00": "0000000000000000000000000000000000000000000000000000000000000101", - "33784757d5da236467d27a7c5b0cc5aa9026ca3b79e29106a67a5e93c292a523": "0000000000000000000000000000000000000000000000000000000000010101", - "35aba1eb0bbe741ac01e5b6ce584bc042b1a0b7d115eb8f7dd02a1a1de2fd14d": "000000000000000000000000fe3b557e8fb62b89f4916b721be55ceb828dbd73", - "0d9217f0a1f7c602fd67052d20171ff73b156d1b87ea258cb6a5d94f71298158": "000000000000000000000000627306090abab3a6e1400e9345bc60c78a8bef57", - "0000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000000000000000000000000000000000000000002" - }, - "version": "0x01" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ``` +:::note + +You can use a [transitions](#transitions) to change the `blockperiodseconds` or validator management method of the network at a later time. + +::: + + + +# Block header validator selection + +```json +{ + "config": { + "chainid": 1337, + "berlinBlock": 0, + "qbft": { + "epochlength": 30000, + "blockperiodseconds": 5, + "requesttimeoutseconds": 10 + } + }, + "nonce": "0x0", + "timestamp": "0x5b3d92d7", + "extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549464a702e6263b7297a96638cac6ae65e6541f4169943923390ad55e90c237593b3b0e401f3b08a0318594aefdb9a738c9f433e5b6b212a6d62f6370c2f69294c7eeb9a4e00ce683cf93039b212648e01c6c6b78c080c0", + "gasLimit": "0x29b92700", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "64d9be4177f418bcf4e56adad85f33e3a64efe22": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +# Contract validator selection + +```json +{ + "config": { + "chainid": 1337, + "berlinBlock": 0, + "qbft": { + "epochlength": 30000, + "blockperiodseconds": 5, + "requesttimeoutseconds": 10, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + } + }, + "nonce": "0x0", + "timestamp": "0x5b3d92d7", + "extraData": "0xe5a00000000000000000000000000000000000000000000000000000000000000000c0c080c0", + "gasLimit": "0x29b92700", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "64d9be4177f418bcf4e56adad85f33e3a64efe22": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "0x0000000000000000000000000000000000007777": { + "comment": "validator smart contract", + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100a5576000357c0100000000000000000000000000000000000000000000000000000000900480639692ea25116100785780639692ea2514610113578063b4ec9ac114610126578063b7ab4db514610139578063c76f24371461014e57600080fd5b80631c5a9d9c146100aa578063508adcfc146100bf57806351b42b00146100db5780635dc43899146100e3575b600080fd5b6100bd6100b8366004611399565b610161565b005b6100c860035481565b6040519081526020015b60405180910390f35b6100bd6104aa565b6100f66100f1366004611399565b61074e565b6040805193845260208401929092521515908201526060016100d2565b6100bd610121366004611399565b610bbd565b6100bd610134366004611399565b610deb565b6101416110a3565b6040516100d291906113c9565b6100bd61015c366004611399565b611105565b3360009081526001602052604090205460ff1661019c5760405160e560020a62461bcd02815260040161019390611416565b60405180910390fd5b600160a060020a03811661021b5760405160e560020a62461bcd02815260206004820152602860248201527f63616e6e6f742061637469766174652076616c696461746f722077697468206160448201527f64647265737320300000000000000000000000000000000000000000000000006064820152608401610193565b60005b6000548110156102b7576000818154811061023b5761023b611505565b600091825260209091200154600160a060020a03838116911614156102a55760405160e560020a62461bcd02815260206004820152601b60248201527f76616c696461746f7220697320616c72656164792061637469766500000000006044820152606401610193565b806102af816114b8565b91505061021e565b33600090815260016020526040902054610100900460ff16156103345733600090815260016020526040812054815484929162010000900460ff1690811061030157610301611505565b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550610432565b600054610100116103b05760405160e560020a62461bcd02815260206004820152602e60248201527f6e756d626572206f662076616c696461746f72732063616e6e6f74206265206c60448201527f6172676572207468616e203235360000000000000000000000000000000000006064820152608401610193565b3360009081526001602081905260408220805461ff001981166101009081178355845460ff16620100000262ffff001990921691909117179055815490810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563018054600160a060020a038416600160a060020a03199091161790555b600160a060020a0382166000818152600260205260408082208054600160a060020a03191633908117909155915490519192917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f9161049e916001909182521515602082015260400190565b60405180910390a35050565b3360009081526001602052604090205460ff166104dc5760405160e560020a62461bcd02815260040161019390611416565b6000546001106105315760405160e560020a62461bcd02815260206004820181905260248201527f63616e6e6f742064656163746976617465206c6173742076616c696461746f726044820152606401610193565b33600090815260016020526040902054610100900460ff166105be5760405160e560020a62461bcd02815260206004820152602860248201527f73656e64657220646f6573206e6f74206861766520616e20616374697665207660448201527f616c696461746f720000000000000000000000000000000000000000000000006064820152608401610193565b336000908152600160205260408120805461ff0019169081905581546201000090910460ff1691908190839081106105f8576105f8611505565b60009182526020822001548154600160a060020a03909116925081906106209060019061148a565b8154811061063057610630611505565b60009182526020822001548154600160a060020a03909116925082919060ff861690811061066057610660611505565b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055838316825260028152604080832054909316825260019052908120805462ff000019166201000060ff8716021790558054806106c6576106c66114ec565b6000828152602080822060001990840181018054600160a060020a03199081169091559301909355600160a060020a03851680825260028452604080832080549094169093558154835190815293840191909152339290917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f910160405180910390a3505050565b336000908152600160205260408120548190819060ff166107845760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a03851660009081526004602052604090205481101561082357600160a060020a038516600090815260046020526040812080546001929190849081106107d6576107d6611505565b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610811578361080d816114b8565b9450505b8061081b816114b8565b915050610787565b5060026003546108339190611465565b831115610b8657600160a060020a038416600090815260046020526040812061085b9161135f565b600160a060020a03841660009081526001602052604090205460ff1615610ab0576003805490600061088c836114a1565b9091555050600160a060020a038416600090815260016020526040902054610100900460ff1615610a89576000546001106109325760405160e560020a62461bcd02815260206004820152603860248201527f63616e6e6f742072656d6f766520616c6c6f776564206163636f756e7420776960448201527f7468206c617374206163746976652076616c696461746f7200000000000000006064820152608401610193565b600160a060020a03841660009081526001602052604081205481546201000090910460ff169160029181908490811061096d5761096d611505565b6000918252602080832090910154600160a060020a0316835282019290925260400181208054600160a060020a0319169055805481906109af9060019061148a565b815481106109bf576109bf611505565b60009182526020822001548154600160a060020a03909116925082919060ff85169081106109ef576109ef611505565b600091825260208220018054600160a060020a031916600160a060020a039390931692909217909155805480610a2757610a276114ec565b6000828152602080822083016000199081018054600160a060020a0319169055909201909255600160a060020a0392831682526002815260408083205490931682526001905220805460ff909216620100000262ff0000199092169190911790555b600160a060020a0384166000908152600160205260409020805462ffffff19169055610b32565b60038054906000610ac0836114b8565b909155505060408051606081018252600180825260006020808401828152848601838152600160a060020a038b16845293909152939020915182549351915160ff16620100000262ff0000199215156101000261ff00199215159290921661ffff199095169490941717169190911790555b600160a060020a03841660008181526001602090815260409182902054915160ff909216151582527f94154efdb7741591680558a88682943a481f1a468cb81f46fe7f8cead2e40519910160405180910390a25b826002600354610b969190611465565b610ba190600161144d565b6002600354610bb09190611465565b9196909550931192915050565b3360009081526001602052604090205460ff16610bef5760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a038216600090815260046020526040902054811015610d4b57600160a060020a0382166000908152600460205260409020805433919083908110610c3f57610c3f611505565b600091825260209091200154600160a060020a03161415610d3957600160a060020a03821660009081526004602052604090208054610c809060019061148a565b81548110610c9057610c90611505565b6000918252602080832090910154600160a060020a03858116845260049092526040909220805491909216919083908110610ccd57610ccd611505565b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559184168152600490915260409020805480610d1257610d126114ec565b60008281526020902081016000199081018054600160a060020a0319169055019055610d4b565b80610d43816114b8565b915050610bf2565b50600160a060020a0381166000818152600460205260409020546003543392917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba91610d9990600290611465565b610da490600161144d565b600160a060020a0386166000908152600160208181526040928390205483519586529085019390935260ff909216159083015260608201526080015b60405180910390a350565b3360009081526001602052604090205460ff16610e1d5760405160e560020a62461bcd02815260040161019390611416565b600160a060020a038116610e765760405160e560020a62461bcd02815260206004820152601f60248201527f6163636f756e7420746f2062652061646465642063616e6e6f742062652030006044820152606401610193565b600160a060020a03811660009081526001602081905260409091205460ff16151514610f0d5760405160e560020a62461bcd02815260206004820152602a60248201527f6163636f756e7420746f2072656d6f7665206973206e6f74206f6e207468652060448201527f616c6c6f77206c697374000000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a038216600090815260046020526040902054811015610ffb57600160a060020a0382166000908152600460205260409020805433919083908110610f5d57610f5d611505565b600091825260209091200154600160a060020a03161415610fe95760405160e560020a62461bcd02815260206004820152602a60248201527f73656e6465722068617320616c726561647920766f74656420746f2072656d6f60448201527f7665206163636f756e74000000000000000000000000000000000000000000006064820152608401610193565b80610ff3816114b8565b915050610f10565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061107490600290611465565b61107f90600161144d565b60408051928352602083019190915260009082018190526060820152608001610de0565b606060008054806020026020016040519081016040528092919081815260200182805480156110fb57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116110dd575b5050505050905090565b3360009081526001602052604090205460ff166111375760405160e560020a62461bcd02815260040161019390611416565b600160a060020a03811660009081526001602052604090205460ff16156111c95760405160e560020a62461bcd02815260206004820152602b60248201527f6163636f756e7420746f2061646420697320616c7265616479206f6e2074686560448201527f20616c6c6f77206c6973740000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a0382166000908152600460205260409020548110156112b757600160a060020a038216600090815260046020526040902080543391908390811061121957611219611505565b600091825260209091200154600160a060020a031614156112a55760405160e560020a62461bcd02815260206004820152602760248201527f73656e6465722068617320616c726561647920766f74656420746f206164642060448201527f6163636f756e74000000000000000000000000000000000000000000000000006064820152608401610193565b806112af816114b8565b9150506111cc565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061133090600290611465565b61133b90600161144d565b60408051928352602083019190915260019082015260006060820152608001610de0565b508054600082559060005260206000209081019061137d9190611380565b50565b5b808211156113955760008155600101611381565b5090565b6000602082840312156113ab57600080fd5b8135600160a060020a03811681146113c257600080fd5b9392505050565b6020808252825182820181905260009190848201906040850190845b8181101561140a578351600160a060020a0316835292840192918401916001016113e5565b50909695505050505050565b6020808252601f908201527f73656e646572206973206e6f74206f6e2074686520616c6c6f77206c69737400604082015260600190565b60008219821115611460576114606114d3565b500190565b6000826114855760e060020a634e487b7102600052601260045260246000fd5b500490565b60008282101561149c5761149c6114d3565b500390565b6000816114b0576114b06114d3565b506000190190565b60006000198214156114cc576114cc6114d3565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052603160045260246000fd5b60e060020a634e487b7102600052603260045260246000fdfea26469706673582212200c3e9c07521b155532c0de1605aae52f4ae953670f0afb0f30d320580b93213d64736f6c63430008070033", + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000000000000000000000000000000000000002", + "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": "0000000000000000000000009a6d82ef3912d5ab60473124bccd2f2a640769d7", + "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564": "00000000000000000000000065463bf6268e5cc409b6501ec846487b935a1446", + "aedead2c33b41c31b4afd2246c6bf5131c209d4b0ca6c2247778ac7be7443a00": "0000000000000000000000000000000000000000000000000000000000000101", + "33784757d5da236467d27a7c5b0cc5aa9026ca3b79e29106a67a5e93c292a523": "0000000000000000000000000000000000000000000000000000000000010101", + "35aba1eb0bbe741ac01e5b6ce584bc042b1a0b7d115eb8f7dd02a1a1de2fd14d": "000000000000000000000000fe3b557e8fb62b89f4916b721be55ceb828dbd73", + "0d9217f0a1f7c602fd67052d20171ff73b156d1b87ea258cb6a5d94f71298158": "000000000000000000000000627306090abab3a6e1400e9345bc60c78a8bef57", + "0000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000000000000000000000000000000000000000002" + }, + "version": "0x01" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + + The QBFT properties are: -* `blockperiodseconds` - The minimum block time, in seconds. -* `epochlength` - The number of blocks after which to reset all votes. -* `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. -* `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). - Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all - nodes on the network must use the identical value. -* `validatorcontractaddress` - Address of the validator smart contract. - Required only if using a contract validator selection. - The address must be identical to the address in the `alloc` section. This option can also be - used in the [transitions](#transitions) configuration item if swapping - [validator management methods](#add-and-remove-validators) in an existing network. -* `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator - that proposes the block. If set, then all nodes on the network must use the same beneficiary. -* [`extraData`](#extra-data) - RLP encoded [extra data](#extra-data). +- `blockperiodseconds` - The minimum block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. +- `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all nodes on the network must use the identical value. +- `validatorcontractaddress` - Address of the validator smart contract. Required only if using a contract validator selection. The address must be identical to the address in the `alloc` section. This option can also be used in the [transitions](#transitions) configuration item if swapping [validator management methods](#add-and-remove-validators) in an existing network. +- `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator that proposes the block. If set, then all nodes on the network must use the same beneficiary. +- [`extraData`](#extra-data) - RLP encoded [extra data](#extra-data). -!!! caution +:::caution - We don't recommend changing `epochlength` in a running network. Changing the `epochlength` - after genesis can result in illegal blocks. +We don't recommend changing `epochlength` in a running network. Changing the `epochlength` after genesis can result in illegal blocks. -??? caution "Invalid block header error" +::: - When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, - the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. - The imported chain makes new blocks faster than the genesis file allows and Besu rejects them - with this error. - This error most often occurs when importing chains from older versions of Besu. +:::caution Invalid block header error - Decrease the `blockperiodseconds` in the new QBFT genesis file to a lower value that satisfies - the block header validation. +When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. The imported chain makes new blocks faster than the genesis file allows and Besu rejects them with this error. This error most often occurs when importing chains from older versions of Besu. - !!! example +Decrease the `blockperiodseconds` in the new QBFT genesis file to a lower value that satisfies the block header validation. - If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp - 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, - decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. +If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. - After you update the new genesis file, if the imported chain has a `blockperiodseconds` value - set lower than you prefer, you can adjust it by [configuring the block time on an existing QBFT - network](#configure-block-time-on-an-existing-network). +After you update the new genesis file, if the imported chain has a `blockperiodseconds` value set lower than you prefer, you can adjust it by [configuring the block time on an existing QBFT network](#configure-block-time-on-an-existing-network). + +::: The properties with specific values in the QBFT genesis files are: -* `difficulty` - `0x1` -* `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul - block identification +- `difficulty` - `0x1` +- `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul block identification -To start a node on a QBFT private network, use the -[`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom -genesis file. +To start a node on a QBFT private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. ### Extra data The `extraData` property is an RLP encoding of: -* 32 bytes of vanity data. -* If using: - * [Block header validator selection](#add-and-remove-validators-using-block-headers), a list of validator addresses. - * [Contract validator selection](#add-and-remove-validators-using-a-smart-contract), no validators. -* Any validator votes. No vote is included in the genesis block. -* The round the block was created on. The round in the genesis block is 0. -* A list of seals of the validators (signed block hashes). No seals are included in the genesis block. +- 32 bytes of vanity data. +- If using: + - [Block header validator selection](#add-and-remove-validators-using-block-headers), a list of validator addresses. + - [Contract validator selection](#add-and-remove-validators-using-a-smart-contract), no validators. +- Any validator votes. No vote is included in the genesis block. +- The round the block was created on. The round in the genesis block is 0. +- A list of seals of the validators (signed block hashes). No seals are included in the genesis block. + +When using block header validator selection, the important information in the genesis block extra data is the list of validators. All other details have empty values in the genesis block. -When using block header validator selection, the important information in the genesis block extra data is the list of validators. -All other details have empty values in the genesis block. +:::info -!!! important +When using contract validator selection to manage validators, the list of validators is configured in the `alloc` property's `storage` section. View the example smart contract for more information on how to generate the `storage` section. - When using contract validator selection to manage validators, the list of validators is configured in the `alloc` - property's `storage` section. - [View the example smart contract] for more information on how to generate the `storage` section. +::: Formally, `extraData` in the genesis block contains: -* If using block header validator selection: `RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. -* If using contract validator selection: `RLP([32 bytes Vanity, 0 Validators, No Vote, Round=Int(0), 0 Seals])`. +- If using block header validator selection: `RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. +- If using contract validator selection: `RLP([32 bytes Vanity, 0 Validators, No Vote, Round=Int(0), 0 Seals])`. -!!! info +:::info - RLP encoding is a space-efficient object serialization scheme used in Ethereum. +RLP encoding is a space-efficient object serialization scheme used in Ethereum. -#### Generate extra data +::: -To generate the `extraData` RLP string for inclusion in the genesis file, -use the [`rlp encode`](../../../reference/cli/subcommands.md#rlp) Besu subcommand. +#### Generate extra data -!!! example +To generate the `extraData` RLP string for inclusion in the genesis file, use the [`rlp encode`](../../../reference/cli/subcommands.md#rlp) Besu subcommand. - ```bash - besu rlp encode --from=toEncode.json --type=QBFT_EXTRA_DATA - ``` +```bash title="Example" +besu rlp encode --from=toEncode.json --type=QBFT_EXTRA_DATA +``` -Where the `toEncode.json` file contains a list of the initial validators, in ascending order. To -write the validator address and copy it to the `toEncode.json` file, use the -[`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu -subcommand. For example: +Where the `toEncode.json` file contains a list of the initial validators, in ascending order. To write the validator address and copy it to the `toEncode.json` file, use the [`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu subcommand. For example: -!!! example "Initial validators in `toEncode.json` file" - - ```json - [ - "0x4592c8e45706cc08b8f44b11e43cba0cfc5892cb", - "0x06e23768a0f59cf365e18c2e0c89e151bcdedc70", - "0xc5327f96ee02d7bcbc1bf1236b8c15148971e1de", - "0xab5e7f4061c605820d3744227eed91ff8e2c8908" - ] - ``` +```json title="Initial validators in toEncode.json file" +[ + "0x4592c8e45706cc08b8f44b11e43cba0cfc5892cb", + "0x06e23768a0f59cf365e18c2e0c89e151bcdedc70", + "0xc5327f96ee02d7bcbc1bf1236b8c15148971e1de", + "0xab5e7f4061c605820d3744227eed91ff8e2c8908" +] +``` Copy the RLP encoded data to the `extraData` property in the genesis file. -!!! example "RLP encoded data" - - ```no-lang - 0xf87aa00000000000000000000000000000000000000000000000000000000000000000f854944592c8e45706cc08b8f44b11e43cba0cfc5892cb9406e23768a0f59cf365e18c2e0c89e151bcdedc7094c5327f96ee02d7bcbc1bf1236b8c15148971e1de94ab5e7f4061c605820d3744227eed91ff8e2c8908c080c0 - ``` +```bash title="RLP encoded data" +0xf87aa00000000000000000000000000000000000000000000000000000000000000000f854944592c8e45706cc08b8f44b11e43cba0cfc5892cb9406e23768a0f59cf365e18c2e0c89e151bcdedc7094c5327f96ee02d7bcbc1bf1236b8c15148971e1de94ab5e7f4061c605820d3744227eed91ff8e2c8908c080c0 +``` When you start the network, the four nodes previously specified in `toEncode.json` are the validators for the network. ### Block time -When the protocol receives a new chain head, the block time (`blockperiodseconds`) timer starts. -When `blockperiodseconds` expires, the round timeout (`requesttimeoutseconds`) timer starts and -the protocol proposes a new block. +When the protocol receives a new chain head, the block time (`blockperiodseconds`) timer starts. When `blockperiodseconds` expires, the round timeout (`requesttimeoutseconds`) timer starts and the protocol proposes a new block. -If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with -the block time and timeout timers reset. The timeout period for the new round is two times -`requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a -block. +If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with the block time and timeout timers reset. The timeout period for the new round is two times `requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a block. -Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round -then starts, resetting the block time and round timeout timers. When `blockperiodseconds` -expires, the protocol proposes the next new block. +Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round then starts, resetting the block time and round timeout timers. When `blockperiodseconds` expires, the protocol proposes the next new block. -!!! warning +:::danger - If more than 1/3 of validators stop participating, new blocks can no longer be created and - `requesttimeoutseconds` doubles with each round change. The quickest method - to resume block production is to restart all validators, which resets `requesttimeoutseconds` to - its genesis value. +If more than 1/3 of validators stop participating, new blocks can no longer be created and `requesttimeoutseconds` doubles with each round change. The quickest method to resume block production is to restart all validators, which resets `requesttimeoutseconds` to its genesis value. -Once `blockperiodseconds` is over, the time from proposing a block to adding the block is -small (usually around one second) even in networks with geographically dispersed validators. +::: + +Once `blockperiodseconds` is over, the time from proposing a block to adding the block is small (usually around one second) even in networks with geographically dispersed validators. #### Tune block timeout To tune the block timeout for your network deployment: -1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times - `blockperiodseconds`. +1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times `blockperiodseconds`. 1. Reduce `requesttimeoutseconds` until you start to see round changes occurring. 1. Increase `requesttimeoutseconds` to the value where round changes are no longer occurring. -!!! tip +:::tip + +View [`TRACE` logs](../../../../public-networks/reference/api/index.md#admin_changeloglevel) to see round change log messages. - View [`TRACE` logs](../../../../public-networks/reference/api/index.md#admin_changeloglevel) to see round change - log messages. +::: Use a [transition](#transitions) to update the `blockperiodseconds` in an existing network. @@ -301,29 +270,22 @@ Use a [transition](#transitions) to update the `blockperiodseconds` in an existi Optional configuration options in the genesis file are: -* `messageQueueLimit` - In large networks with limited resources, increasing the message queue - limit might help with message activity surges. The default is 1000. -* `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate - message limit might reduce the number of retransmissions. A value of two to three times the - number of validators is usually enough. The default is 100. -* `futureMessagesLimit` - The future messages buffer holds messages for a future chain - height. For large networks, increasing the future messages limit might be useful. The default is - 1000. -* `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering - messages in the future messages buffer. The default is 10. +- `messageQueueLimit` - In large networks with limited resources, increasing the message queue limit might help with message activity surges. The default is 1000. +- `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate message limit might reduce the number of retransmissions. A value of two to three times the number of validators is usually enough. The default is 100. +- `futureMessagesLimit` - The future messages buffer holds messages for a future chain height. For large networks, increasing the future messages limit might be useful. The default is 1000. +- `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering messages in the future messages buffer. The default is 10. ### Post-Merge configuration -After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. -Their fields **must** contain only the constant values from the following chart. +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. | Field | Constant value | Comment | -|-------|----------------|---------| +| --- | --- | --- | | **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | | **`difficulty`** | `0` | Replaced with `prevrandao` | -| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | -| **`nonce`** | `0x0000000000000000` | | -| **`ommers`** | `[]` | `RLP([]) = 0xc0` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | Additionally, [`extraData`](#extra-data) is limited to the 32 bytes of vanity data after The Merge. @@ -331,432 +293,403 @@ Additionally, [`extraData`](#extra-data) is limited to the 32 bytes of vanity da QBFT provides two methods to manage validators: -* [Block header validator selection](#add-and-remove-validators-using-block-headers) - Existing validators propose and - vote to add or remove validators using the QBFT JSON-RPC API methods. +- [Block header validator selection](#add-and-remove-validators-using-block-headers) - Existing validators propose and vote to add or remove validators using the QBFT JSON-RPC API methods. -* [Contract validator selection](#add-and-remove-validators-using-a-smart-contract) - Use a smart contract to specify - the validators used to propose and validate blocks. +- [Contract validator selection](#add-and-remove-validators-using-a-smart-contract) - Use a smart contract to specify the validators used to propose and validate blocks. -You can use [transitions](#transitions) to swap between block header validator selection and contract -validator selection in an existing network. +You can use [transitions](#transitions) to swap between block header validator selection and contract validator selection in an existing network. -For block header validator selection, initial validators are configured in the genesis file's -[`extraData`](#extra-data) property, whereas the initial validators when using the contract validator selection -method are configured in the genesis file's `storage` section. +For block header validator selection, initial validators are configured in the genesis file's [`extraData`](#extra-data) property, whereas the initial validators when using the contract validator selection method are configured in the genesis file's `storage` section. ### Add and remove validators using block headers -Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the -WebSockets interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). +Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSockets interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). -The QBFT API methods are disabled by default. -To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or -[`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `QBFT`. +The QBFT API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `QBFT`. The methods to add or remove validators are: -* [`qbft_getPendingVotes`](../../../reference/api/index.md#qbft_getpendingvotes). -* [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). -* [`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote). - -To view validator metrics for a specified block range, use -[`qbft_getSignerMetrics`](../../../reference/api/index.md#qbft_getsignermetrics). +- [`qbft_getPendingVotes`](../../../reference/api/index.md#qbft_getpendingvotes). +- [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). +- [`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote). -!!! note +To view validator metrics for a specified block range, use [`qbft_getSignerMetrics`](../../../reference/api/index.md#qbft_getsignermetrics). - If network conditions render it impossible to add and remove validators by voting, you can - [add and remove validators without voting](add-validators-without-voting.md). +:::note -#### Add a validator - -To propose adding a validator, call -[`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote), -specifying the address of the proposed validator and `true`. A majority of validators must execute -the call. +If network conditions render it impossible to add and remove validators by voting, you can [add and remove validators without voting](add-validators-without-voting.md). -!!! example "JSON-RPC `qbft_proposeValidatorVote` request example" +::: - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' - ``` +#### Add a validator -When the validator proposes the next block, the protocol inserts one proposal received from -[`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote) into the -block. If blocks include all proposals, subsequent blocks proposed by the validator will not -contain a vote. +To propose adding a validator, call [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote), specifying the address of the proposed validator and `true`. A majority of validators must execute the call. -When more than 50% of the existing validators have published a matching proposal, the protocol -adds the proposed validator to the validator pool and the validator can begin validating blocks. +```bash title="JSON-RPC qbft_proposeValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` -To return a list of validators and confirm the addition of a proposed validator, use -[`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber). +When the validator proposes the next block, the protocol inserts one proposal received from [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote) into the block. If blocks include all proposals, subsequent blocks proposed by the validator will not contain a vote. -!!! example "JSON-RPC `qbft_getValidatorsByBlockNumber` request example" +When more than 50% of the existing validators have published a matching proposal, the protocol adds the proposed validator to the validator pool and the validator can begin validating blocks. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' - ``` +To return a list of validators and confirm the addition of a proposed validator, use [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber). -To discard your proposal after confirming the addition of a validator, call -[`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote), -specifying the address of the proposed validator. +```bash title="JSON-RPC qbft_getValidatorsByBlockNumber request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' +``` -!!! example "JSON-RPC `qbft_discardValidatorVote` request example" +To discard your proposal after confirming the addition of a validator, call [`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote), specifying the address of the proposed validator. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' - ``` +```bash title="JSON-RPC qbft_discardValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` #### Remove a validator -The process for removing a validator is the same as adding a validator except you specify `false` -as the second parameter of -[`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). +The process for removing a validator is the same as adding a validator except you specify `false` as the second parameter of [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). #### Epoch transition -At each epoch transition, QBFT discards all pending votes collected from received blocks. -Existing proposals remain in effect and validators re-add their vote the next time they create a -block. +At each epoch transition, QBFT discards all pending votes collected from received blocks. Existing proposals remain in effect and validators re-add their vote the next time they create a block. -An epoch transition occurs every `epochLength` blocks. Define `epochlength` in the QBFT genesis -file. +An epoch transition occurs every `epochLength` blocks. Define `epochlength` in the QBFT genesis file. ### Add and remove validators using a smart contract -Users can create their own smart contracts to add or remove validators based on their organizational requirements. -View the [example smart contract](https://github.com/ConsenSys/validator-smart-contracts) for more information on how to -create and deploy the smart contract. +Users can create their own smart contracts to add or remove validators based on their organizational requirements. View the [example smart contract](https://github.com/ConsenSys/validator-smart-contracts) for more information on how to create and deploy the smart contract. -You can pre-deploy the validator smart contract in a new QBFT network by specifying the contract details in the -[genesis file](qbft.md#genesis-file). For existing QBFT networks you need to compile and deploy the contract -using a transaction, then obtain the contract address from the receipt and use that in a -[transition](#swap-validator-management-methods). +You can pre-deploy the validator smart contract in a new QBFT network by specifying the contract details in the [genesis file](qbft.md#genesis-file). For existing QBFT networks you need to compile and deploy the contract using a transaction, then obtain the contract address from the receipt and use that in a [transition](#swap-validator-management-methods). -!!! important +:::info - You can't use the JSON-RPC methods to add or remove validators when using a smart contract to manage nodes. - You must interact with the contract functions using transactions. +You can't use the JSON-RPC methods to add or remove validators when using a smart contract to manage nodes. -!!! note +You must interact with the contract functions using transactions. - If network conditions render it impossible to add and remove validators using a smart contract, you can - [override smart contract validators](add-validators-without-voting.md#override-smart-contract-validators). +::: + +:::note + +If network conditions render it impossible to add and remove validators using a smart contract, you can [override smart contract validators](add-validators-without-voting.md#override-smart-contract-validators). + +::: ### Minimum number of validators -QBFT requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the -ability for a blockchain network to function correctly and reach consensus despite nodes failing or -propagating incorrect information to peers. +QBFT requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the ability for a blockchain network to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. ## Transitions -The `transitions` genesis configuration item allows you to specify a future block number at which to change QBFT -network configuration in an existing network. -For example, you can update the [block time](#configure-block-time-on-an-existing-network), -[block reward](#configure-block-rewards-on-an-existing-network-deployment), -[validator management method](#swap-validator-management-methods), or -[mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). +The `transitions` genesis configuration item allows you to specify a future block number at which to change QBFT network configuration in an existing network. For example, you can update the [block time](#configure-block-time-on-an-existing-network), [block reward](#configure-block-rewards-on-an-existing-network-deployment), [validator management method](#swap-validator-management-methods), or [mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). -!!! caution +:::caution - Do not specify a transition block in the past. - Specifying a transition block in the past could result in unexpected behavior, such as causing - the network to fork. +Do not specify a transition block in the past. Specifying a transition block in the past could result in unexpected behavior, such as causing the network to fork. + +::: ### Configure block time on an existing network To update an existing network with a new `blockperiodseconds`: -1. Stop all nodes in the network. -2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: - * `` is the upcoming block at which to change `blockperiodseconds`. - * `` is the updated value for `blockperiodseconds`. + - `` is the upcoming block at which to change `blockperiodseconds`. + - `` is the updated value for `blockperiodseconds`. - !!! example "Transitions configuration" + - === "Syntax" + # Syntax - ```bash + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - }, - "transitions": { - "qbft": [ - { - "block": , - "blockperiodseconds": - } - ] - } - }, - ... + "block": , + "blockperiodseconds": } - ``` + ] + } + }, + ... + } + ``` - === "Example" + # Example - ```bash + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - }, - "transitions": { - "qbft": [ - { - "block": 1240, - "blockperiodseconds": 4 - } - ] - } - }, - ... + "block": 1240, + "blockperiodseconds": 4 } - ``` + ] + } + }, + ... + } + ``` + + -3. Restart all nodes in the network using the updated genesis file. -4. To verify the changes after the transition block, call - [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. +3. Restart all nodes in the network using the updated genesis file. +4. To verify the changes after the transition block, call [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. ### Configure block rewards on an existing network deployment To update an existing network with a new `blockreward`: -1. Stop all nodes in the network. -2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: - * `` is the upcoming block at which to change `blockreward`. - * `` is the updated value for `blockreward`. + - `` is the upcoming block at which to change `blockreward`. + - `` is the updated value for `blockreward`. - !!! example "Transitions configuration" + - === "Syntax" + # Syntax - ```bash + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "qbft": [ + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + }, { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - "blockreward": "5000000000000000" - }, - "transitions": { - "qbft": [ - { - "block": , - "blockreward": - }, - { - "block": , - "blockreward": - }, - { - "block": , - "blockreward": - } - ] - } - }, - ... + "block": , + "blockreward": } - ``` + ] + } + }, + ... + } + ``` - === "Example" + # Example - ```bash + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "qbft": [ + { + "block": 10, + "blockreward": "6000000000000000" + }, { - "config": { - ... - "qbft": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - "blockreward": "5000000000000000" - }, - "transitions": { - "qbft": [ - { - "block": 10, - "blockreward": "6000000000000000" - }, - { - "block": 15, - "blockreward": "75000000000000000" - }, - { - "block": 20, - "blockreward": "0" - } - ] - } - }, - ... + "block": 15, + "blockreward": "75000000000000000" + }, + { + "block": 20, + "blockreward": "0" } - ``` + ] + } + }, + ... + } + ``` + + + + :::note - !!! note + You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. - You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. + ::: -3. Restart all nodes in the network using the updated genesis file. +3. Restart all nodes in the network using the updated genesis file. ### Swap validator management methods To swap between block header validator selection and contract validator selection methods in an existing network: -1. Stop all nodes in the network. -2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: - * `` is the upcoming block at which to change the validator selection method. - * `` is the validator selection mode to switch to. Valid options are `contract` and `blockheader`. - * `` is the smart contract address, if switching to the contract validator selection method. + - `` is the upcoming block at which to change the validator selection method. + - `` is the validator selection mode to switch to. Valid options are `contract` and `blockheader`. + - `` is the smart contract address, if switching to the contract validator selection method. - !!! example "Transitions configuration" + - === "Syntax" + # Syntax - ```bash + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ { - "config": { - ... - "qbft": { - "blockperiodseconds": 5, - "epochlength": 30000, - "requesttimeoutseconds": 10 - }, - "transitions": { - "qbft": [ - { - "block": , - "validatorselectionmode": , - "validatorcontractaddress": - } - ] - } - }, - ... + "block": , + "validatorselectionmode": , + "validatorcontractaddress": } - ``` + ] + } + }, + ... + } + ``` - === "Example" + # Example - ```bash - { - "config": { - ... - "qbft": { - "blockperiodseconds": 5, - "epochlength": 30000, - "requesttimeoutseconds": 10 - }, - "transitions": { - "qbft": [ - { - "block": 102885, - "validatorselectionmode": "contract", - "validatorcontractaddress": "0x0000000000000000000000000000000000007777" - } - ] - } - }, - ... - } - ``` + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": 102885, + "validatorselectionmode": "contract", + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + } + ] + } + }, + ... + } + ``` -3. Restart all nodes in the network using the updated genesis file. + + +3. Restart all nodes in the network using the updated genesis file. ### Configure the mining beneficiary on an existing network deployment To update an existing network with a new mining beneficiary: -1. Stop all nodes in the network. -2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: - * `` is the upcoming block at which to change `miningbeneficiary`. - * `` is the updated 20-byte address for `miningbeneficiary`. - Starting at ``, block rewards go to this address. + - `` is the upcoming block at which to change `miningbeneficiary`. + - `` is the updated 20-byte address for `miningbeneficiary`. Starting at ``, block rewards go to this address. - !!! example "Transitions configuration" + - === "Syntax" + # Syntax - ```bash - { - "config": { - ... - "qbft": { - "blockperiodseconds": 5, - "epochlength": 30000, - "requesttimeoutseconds": 10 - }, - "transitions": { - "qbft": [ - { - "block": , - "miningbeneficiary": - }, - { - "block": , - "miningbeneficiary": - } - ] - } - }, - ... - } - ``` + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": , + "miningbeneficiary": + }, + { + "block": , + "miningbeneficiary": + } + ] + } + }, + ... + } + ``` - === "Example" + # Example - ```bash - { - "config": { - ... - "qbft": { - "blockperiodseconds": 5, - "epochlength": 30000, - "requesttimeoutseconds": 10 - }, - "transitions": { - "qbft": [ - { - "block": 10000, - "miningbeneficiary": "0x0000000000000000000000000000000000000002", - }, - { - "block": 20000, - "miningbeneficiary": "", - } - ] - } - }, - ... - } - ``` + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": 10000, + "miningbeneficiary": "0x0000000000000000000000000000000000000002", + }, + { + "block": 20000, + "miningbeneficiary": "", + } + ] + } + }, + ... + } + ``` + + + + :::note - !!! note + Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the block producer rather than a global override address. - Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the - block producer rather than a global override address. + ::: -3. Restart all nodes in the network using the updated genesis file. +3. Restart all nodes in the network using the updated genesis file. -*[vanity data]: Validators can include anything they like as vanity data. -*[RLP]: Recursive Length Prefix +_[vanity data]: Validators can include anything they like as vanity data. _[RLP]: Recursive Length Prefix [GoQuorum]: https://consensys.net/docs/goquorum/en/stable/ [View the example smart contract]: https://github.com/ConsenSys/validator-smart-contracts diff --git a/docs/private-networks/how-to/configure/contracts.md b/docs/private-networks/how-to/configure/contracts.md index 20badad55df..a38c58e3894 100644 --- a/docs/private-networks/how-to/configure/contracts.md +++ b/docs/private-networks/how-to/configure/contracts.md @@ -1,33 +1,39 @@ --- +title: Pre-deploy a contract description: Pre-deploying contracts in the genesis file +sidebar_position: 5 +tags: + - private networks --- # Pre-deploy contracts in the genesis file To pre-deploy contracts when starting Besu, specify the contract code in the [genesis file](../../../public-networks/concepts/genesis-file.md). -!!! example "Contract code in the genesis file" +:::tip Contract code in the genesis file - ```json - { - ... - "alloc": { - "0x0ffd23af8eebc60b3cfdeed6f814988757237314": { - "balance": "0x100000000000000000000000000000000000000000000000000", - "code": "0x6080604052600436106043576000357c010000000000000000000000000000000000000000000000000000000090048063010fc84214604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b80600081905550807f04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce360405160405180910390a25056fea165627a7a7230582038cb7ea327af8f73feabcfbff64498f1e74831e67f7c75286760d3845c6747c70029", - "storage": { - "7aa07e0c924147697605046b7c2c32645b7bbfb41e0ac5d0a84ac93cbb759798": "0000000000000000000000000000000000000000000000000000000000000001", - "cea2b0602db61f92b76ec4402875cc38eedc9fc425cb1b697fc2265d50fc20fb": "0000000000000000000000000000000000000000000000000000000000000001", - } - } - }, - ... +```json +{ + ... + "alloc": { + "0x0ffd23af8eebc60b3cfdeed6f814988757237314": { + "balance": "0x100000000000000000000000000000000000000000000000000", + "code": "0x6080604052600436106043576000357c010000000000000000000000000000000000000000000000000000000090048063010fc84214604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b80600081905550807f04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce360405160405180910390a25056fea165627a7a7230582038cb7ea327af8f73feabcfbff64498f1e74831e67f7c75286760d3845c6747c70029", + "storage": { + "7aa07e0c924147697605046b7c2c32645b7bbfb41e0ac5d0a84ac93cbb759798": "0000000000000000000000000000000000000000000000000000000000000001", + "cea2b0602db61f92b76ec4402875cc38eedc9fc425cb1b697fc2265d50fc20fb": "0000000000000000000000000000000000000000000000000000000000000001", + } } - ``` + }, + ... +} +``` + +::: The contract code in the genesis file defines the: -* Address. -* Balance. -* Bytecode. -* Key value pairs for contract storage. +- Address. +- Balance. +- Bytecode. +- Key value pairs for contract storage. diff --git a/docs/private-networks/how-to/configure/curves.md b/docs/private-networks/how-to/configure/curves.md index 6b12dec1636..72edb764a18 100644 --- a/docs/private-networks/how-to/configure/curves.md +++ b/docs/private-networks/how-to/configure/curves.md @@ -1,18 +1,22 @@ --- +title: Alternative elliptic curves description: Using alternative elliptic curves in Besu +sidebar_position: 8 +tags: + - private networks --- # Configure alternative elliptic curves -!!! caution +:::caution - Configuring alternative elliptic curves is an early access feature. +Configuring alternative elliptic curves is an early access feature. -By default, Besu uses the Ethereum standard `secp256k1` elliptic curve (EC). -However, when running nodes in a private network, it is possible to configure an alternative elliptic curve. +::: -The configuration for what elliptic curve Besu will use is done in the network configuration section of genesis file, -using the [`ecCurve`](../../../public-networks/reference/genesis-items.md#Configuration_Items) key: +By default, Besu uses the Ethereum standard `secp256k1` elliptic curve (EC). However, when running nodes in a private network, it is possible to configure an alternative elliptic curve. + +The configuration for what elliptic curve Besu will use is done in the network configuration section of genesis file, using the [`ecCurve`](../../../public-networks/reference/genesis-items.md#Configuration_Items) key: ```bash { @@ -25,10 +29,11 @@ using the [`ecCurve`](../../../public-networks/reference/genesis-items.md#Config } ``` -!!! attention +:::danger Important + +All nodes in the network **MUST** use the same elliptic curve. Nodes with different EC configuration from the network won't be able to send messages to other nodes or verify transactions and blocks. - All nodes in the network **MUST** use the same elliptic curve. Nodes with different EC configuration from the - network won't be able to send messages to other nodes or verify transactions and blocks. +::: Besu supports the following elliptic curves: diff --git a/docs/private-networks/how-to/configure/free-gas.md b/docs/private-networks/how-to/configure/free-gas.md index d2afb976981..950ab0f1db6 100644 --- a/docs/private-networks/how-to/configure/free-gas.md +++ b/docs/private-networks/how-to/configure/free-gas.md @@ -1,45 +1,40 @@ --- +title: Free gas network description: Configuring free gas networks +sidebar_position: 2 +tags: + - private networks --- # Configure free gas networks -Transactions use computational resources so have an associated cost. Gas is the cost unit and the -gas price is the price per gas unit. The transaction cost is the gas used * gas price. +Transactions use computational resources so have an associated cost. Gas is the cost unit and the gas price is the price per gas unit. The transaction cost is the gas used \* gas price. -In public networks, the account submitting the transaction pays the transaction cost, in Ether. -The miner (or validator in PoA networks) that includes the transaction in a block receives -transaction cost. +In public networks, the account submitting the transaction pays the transaction cost, in Ether. The miner (or validator in PoA networks) that includes the transaction in a block receives transaction cost. -In many private networks, network participants run the validators and do not require gas as an -incentive. Networks that don't require gas as an incentive usually configure the gas price to be -zero (that is, free gas). Some private networks might allocate Ether and use a non-zero gas price -to limit resource use. +In many private networks, network participants run the validators and do not require gas as an incentive. Networks that don't require gas as an incentive usually configure the gas price to be zero (that is, free gas). Some private networks might allocate Ether and use a non-zero gas price to limit resource use. -!!! tip +:::tip - We use the term _free gas network_ to refer to a network with a gas price of zero. A network - with a gas price of zero is also known as a _zero gas network_ or _no gas network_. +We use the term _free gas network_ to refer to a network with a gas price of zero. A network with a gas price of zero is also known as a _zero gas network_ or _no gas network_. -!!! note +::: - Some pre-crafted transactions require the deployment account to have gas available. For - example, the transaction that creates the smart contract in - [EIP-1820](https://eips.ethereum.org/EIPS/eip-1820). +:::note -In a free gas network, transactions still use gas but the gas price is zero, meaning the -transaction cost is zero. Transaction cost = gas used * 0 (the gas price). +Some pre-crafted transactions require the deployment account to have gas available. For example, the transaction that creates the smart contract in [EIP-1820](https://eips.ethereum.org/EIPS/eip-1820). + +::: + +In a free gas network, transactions still use gas but the gas price is zero, meaning the transaction cost is zero. Transaction cost = gas used \* 0 (the gas price). ## Configure free gas in Besu -When gas is free, limiting block and contract sizes is less important. In free gas networks, we -increase the block size limit and set the contract size limit to the maximum value. +When gas is free, limiting block and contract sizes is less important. In free gas networks, we increase the block size limit and set the contract size limit to the maximum value. ### 1. Set the block size -If you want to remove gas from consideration and don't mind blocks potentially taking longer to -create, in the genesis file set the block size limit (measured in gas) to the maximum accepted by -Truffle (`0x1fffffffffffff`). In the genesis file, specify `gasLimit` following the `config` key. +If you want to remove gas from consideration and don't mind blocks potentially taking longer to create, in the genesis file set the block size limit (measured in gas) to the maximum accepted by Truffle (`0x1fffffffffffff`). In the genesis file, specify `gasLimit` following the `config` key. ```json { @@ -52,14 +47,11 @@ Truffle (`0x1fffffffffffff`). In the genesis file, specify `gasLimit` following } ``` -If you are more concerned about blocks arriving on time and don't have expensive individual -transactions, set `gasLimit` to a value closer to the amount of gas your validators can process in -the configured block time. +If you are more concerned about blocks arriving on time and don't have expensive individual transactions, set `gasLimit` to a value closer to the amount of gas your validators can process in the configured block time. ### 2. Set the contract size -In the `config` section of the genesis file, set the contract size limit to the maximum supported -size (in bytes). +In the `config` section of the genesis file, set the contract size limit to the maximum supported size (in bytes). ```json ( @@ -74,33 +66,35 @@ size (in bytes). ### 3. Start Besu with a minimum gas price of zero -When starting nodes, set the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) -to zero. +When starting nodes, set the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) to zero. + + + +# Command Line + +```bash +--min-gas-price=0 +``` + +# Configuration File -=== "Command Line" +```bash +min-gas-price=0 +``` - ```bash - --min-gas-price=0 - ``` + -=== "Configuration File" +# Command Line - ```bash - min-gas-price=0 - ``` +:::danger Important -!!! important - In a free gas network, ensure the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) - is set to zero for every node. - Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. - You can query a node's gas configuration using [`eth_gasPrice`](../../../public-networks/reference/api/index.md#eth_gasprice). +In a free gas network, ensure the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) is set to zero for every node. Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. You can query a node's gas configuration using [`eth_gasPrice`](../../../public-networks/reference/api/index.md#eth_gasprice). + +::: ### 4. Enable zero base fee if using London fork or later -If your network is configured to use the `londonBlock` or a later hard fork, then you must also enable the `zeroBaseFee` configuration. -You must set this on all your nodes. -Once it is set, future blocks produced by that node will set a `baseFee` of 0. -This is required because the London hard fork (EIP-1559) introduced a non-zero `baseFee` into the block which normally means transactions require gas. +If your network is configured to use the `londonBlock` or a later hard fork, then you must also enable the `zeroBaseFee` configuration. You must set this on all your nodes. Once it is set, future blocks produced by that node will set a `baseFee` of 0. This is required because the London hard fork (EIP-1559) introduced a non-zero `baseFee` into the block which normally means transactions require gas. ```json { @@ -115,16 +109,15 @@ This is required because the London hard fork (EIP-1559) introduced a non-zero ` ## Configure free gas in Truffle -If using Truffle to develop on your free gas network, you also need to configure free gas in -Truffle. +If using Truffle to develop on your free gas network, you also need to configure free gas in Truffle. + +Like setting block and contract size limits to their maximum values for Besu, set the transaction gas limit in Truffle to the maximum possible. -Like setting block and contract size limits to their maximum values for Besu, set the transaction -gas limit in Truffle to the maximum possible. +:::info -!!! important +Besu does not support private key management. To use Besu with Truffle, you must configure a [Truffle wallet](../../../public-networks/how-to/develop/truffle.md). - Besu does not support private key management. To use Besu with Truffle, you must configure - a [Truffle wallet](../../../public-networks/how-to/develop/truffle.md). +::: ### Update `truffle-config.js` @@ -132,12 +125,12 @@ Update the `truffle-config.js` file: 1. Set the gas price to zero. - ```js - gasPrice:0 - ``` + ```js + gasPrice: 0; + ``` 1. Set the gas limit for a transaction (that is, contract creation) to be the block gas limit - 1. - ```js - gas: "0x1ffffffffffffe" - ``` + ```js + gas: "0x1ffffffffffffe"; + ``` diff --git a/docs/private-networks/how-to/configure/tls/_category_.json b/docs/private-networks/how-to/configure/tls/_category_.json new file mode 100644 index 00000000000..dbda63e2b5b --- /dev/null +++ b/docs/private-networks/how-to/configure/tls/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "TLS", + "position": 6 +} diff --git a/docs/private-networks/how-to/configure/tls/client-and-server.md b/docs/private-networks/how-to/configure/tls/client-and-server.md index 6a6c4f3d443..5ee1722415d 100644 --- a/docs/private-networks/how-to/configure/tls/client-and-server.md +++ b/docs/private-networks/how-to/configure/tls/client-and-server.md @@ -1,13 +1,13 @@ --- -description: Configure TLS +title: Client and server TLS +sidebar_position: 1 +tags: + - private networks --- # Configure client and server TLS -Hyperledger Besu supports TLS for client and server communication. For example, you can -configure TLS for communication between -[EthSigner](https://docs.ethsigner.consensys.net/en/latest/Concepts/TLS/) and Besu, and Besu and -[Tessera](https://docs.tessera.consensys.net/HowTo/Configure/TLS/). +Hyperledger Besu supports TLS for client and server communication. For example, you can configure TLS for communication between [EthSigner](https://docs.ethsigner.consensys.net/en/latest/Concepts/TLS/) and Besu, and Besu and [Tessera](https://docs.tessera.consensys.net/HowTo/Configure/TLS/). The following diagram displays an example client and server TLS configuration. @@ -17,8 +17,8 @@ Configure TLS communication from the command line. ## Prerequisites -* Besu's password-protected PKCS12 keystore -* File containing the keystore password +- Besu's password-protected PKCS12 keystore +- File containing the keystore password ## Configure client TLS @@ -26,36 +26,28 @@ Allow clients (for example a dapp, curl, or EthSigner) to send and receive secur **Client prerequisites**: -* [Configure the client for TLS] -* Client's PKCS12 keystore information +- [Configure the client for TLS] +- Client's PKCS12 keystore information ### Create the known clients file -The known clients file allows clients with self-signed certificates or non-public certificates to -connect to Besu. +The known clients file allows clients with self-signed certificates or non-public certificates to connect to Besu. -Create a file (in this example, `knownClients`) that lists one or more trusted clients. Use the -format` ` where: +Create a file (in this example, `knownClients`) that lists one or more trusted clients. Use the format` ` where: -* `` is the Common Name specified in the client certificate. -* `` is the SHA-256 fingerprint of the client certificate. +- `` is the Common Name specified in the client certificate. +- `` is the SHA-256 fingerprint of the client certificate. -!!! example - - ``` - ethsigner 8E:E0:85:9F:FC:2E:2F:21:31:46:0B:82:4C:A6:88:AB:30:34:9A:C6:EA:4F:04:31:ED:0F:69:A7:B5:C2:2F:A7 - curl FC:18:BF:39:45:45:9A:15:46:76:A6:E7:C3:94:64:B8:34:84:A3:8E:B8:EA:67:DC:61:C0:29:E6:38:B8:B7:99 - ``` - -You can use [`openssl`](https://www.openssl.org/) or -[`keytool`](https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html) to display -the SHA256 fingerprint. +```bash title="Example" +ethsigner 8E:E0:85:9F:FC:2E:2F:21:31:46:0B:82:4C:A6:88:AB:30:34:9A:C6:EA:4F:04:31:ED:0F:69:A7:B5:C2:2F:A7 +curl FC:18:BF:39:45:45:9A:15:46:76:A6:E7:C3:94:64:B8:34:84:A3:8E:B8:EA:67:DC:61:C0:29:E6:38:B8:B7:99 +``` -!!! example +You can use [`openssl`](https://www.openssl.org/) or [`keytool`](https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html) to display the SHA256 fingerprint. - ``` - keytool -list -v -keystore -storetype PKCS12 -storepass `. - ``` +``` +keytool -list -v -keystore -storetype PKCS12 -storepass `. +``` ### Start Besu @@ -65,28 +57,20 @@ besu --rpc-http-enabled --rpc-http-tls-enabled --rpc-http-tls-client-auth-enable The command line: -* Enables the HTTP JSON-RPC service using the - [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. -* Enables TLS for the HTTP JSON-RPC service using the - [`--rpc-http-tls-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-enabled) option. -* Enables TLS client authentication using the - [`--rpc-http-tls-client-auth-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-client-auth-enabled) option. -* Specifies the keystore using the - [`--rpc-http-tls-keystore-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-file) - option. -* Specifies the file that contains the password to decrypt the keystore using the - [`--rpc-http-tls-keystore-password-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-password-file) option. -* [Specifies the clients](#create-the-known-clients-file) allowed to connect to Besu using the - [`--rpc-http-tls-known-clients-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-known-clients-file) option. -* specifies the Java cipher suites using the - [`--rpc-http-tls-cipher-suite`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-cipher-suite) option. -* specifies the TLS protocol version using the - [`--rpc-http-tls-protocol`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-protocol) option. - -!!! note - - Set [`--rpc-http-tls-ca-clients-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-ca-clients-enabled) - to `true` to allow access to clients with signed and trusted root CAs. +- Enables the HTTP JSON-RPC service using the [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables TLS for the HTTP JSON-RPC service using the [`--rpc-http-tls-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-enabled) option. +- Enables TLS client authentication using the [`--rpc-http-tls-client-auth-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-client-auth-enabled) option. +- Specifies the keystore using the [`--rpc-http-tls-keystore-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-file) option. +- Specifies the file that contains the password to decrypt the keystore using the [`--rpc-http-tls-keystore-password-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-password-file) option. +- [Specifies the clients](#create-the-known-clients-file) allowed to connect to Besu using the [`--rpc-http-tls-known-clients-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-known-clients-file) option. +- specifies the Java cipher suites using the [`--rpc-http-tls-cipher-suite`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-cipher-suite) option. +- specifies the TLS protocol version using the [`--rpc-http-tls-protocol`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-protocol) option. + +:::note + +Set [`--rpc-http-tls-ca-clients-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-ca-clients-enabled) to `true` to allow access to clients with signed and trusted root CAs. + +::: ## Configure server TLS @@ -94,29 +78,27 @@ Allow Besu to securely communicate with the server (Tessera). **Server prerequisites**: -* [Configure the server to allow TLS communication] -* Server's certificate information +- [Configure the server to allow TLS communication] +- Server's certificate information ### Create the known servers file -Create a file (in this example, `knownServers`) that lists one or more trusted servers. The file -contents use the format `: ` where: +Create a file (in this example, `knownServers`) that lists one or more trusted servers. The file contents use the format `: ` where: -* `` is the server hostname -* `` is the port used for communication -* `` is the SHA-256 fingerprint of the server's certificate. +- `` is the server hostname +- `` is the port used for communication +- `` is the SHA-256 fingerprint of the server's certificate. -!!! example +```bash title="Example" +localhost:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC +127.0.0.1:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC +``` - ``` - localhost:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC - 127.0.0.1:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC - ``` +:::note -!!! note +If you are unsure whether requests use the hostname or an IP address, configure both in the file. - If you are unsure whether requests use the hostname or an IP address, configure both in the - file. +::: ### Start Besu @@ -126,16 +108,12 @@ besu --privacy-tls-enabled --privacy-tls-keystore-file=/Users/me/my_node/keystor The command line: -* Enables TLS with the server using the - [`--privacy-tls-enabled`](../../../reference/cli/options.md#privacy-tls-enabled) option. -* Specifies the keystore using the - [`--privacy-tls-keystore-file`](../../../reference/cli/options.md#privacy-tls-keystore-file) - option. -* Specifies the file that contains the password to decrypt the keystore using the - [`--privacy-tls-keystore-password-file`](../../../reference/cli/options.md#privacy-tls-keystore-password-file) option. -* Specifies the trusted servers using the - [`--privacy-tls-known-enclave-file`](../../../reference/cli/options.md#privacy-tls-known-enclave-file) option. +- Enables TLS with the server using the [`--privacy-tls-enabled`](../../../reference/cli/options.md#privacy-tls-enabled) option. +- Specifies the keystore using the [`--privacy-tls-keystore-file`](../../../reference/cli/options.md#privacy-tls-keystore-file) option. +- Specifies the file that contains the password to decrypt the keystore using the [`--privacy-tls-keystore-password-file`](../../../reference/cli/options.md#privacy-tls-keystore-password-file) option. +- Specifies the trusted servers using the [`--privacy-tls-known-enclave-file`](../../../reference/cli/options.md#privacy-tls-known-enclave-file) option. + [Configure the client for TLS]: https://docs.ethsigner.consensys.net/en/latest/HowTo/Configure-TLS/#server-tls-connection [Configure the server to allow TLS communication]: https://docs.tessera.consensys.net/HowTo/Configure/TLS/ diff --git a/docs/private-networks/how-to/configure/tls/p2p.md b/docs/private-networks/how-to/configure/tls/p2p.md index 4ffa6402ec1..3121d25c520 100644 --- a/docs/private-networks/how-to/configure/tls/p2p.md +++ b/docs/private-networks/how-to/configure/tls/p2p.md @@ -1,16 +1,20 @@ --- +title: Peer-to-peer TLS +sidebar_position: 2 description: Configure P2P TLS communication +tags: + - private networks --- # Configure P2P TLS -You can configure TLS to secure the P2P communication between nodes by ensuring only authorized nodes can communicate -with each other. Use certificates issued by a trusted authority to connect authorized nodes in the network. +You can configure TLS to secure the P2P communication between nodes by ensuring only authorized nodes can communicate with each other. Use certificates issued by a trusted authority to connect authorized nodes in the network. -!!! warning +:::caution - P2P TLS is an early access feature, and functionality and options may be updated - between releases. +P2P TLS is an early access feature, and functionality and options may be updated between releases. + +::: Besu supports PKCS11, PKCS12, and JKS keystore and truststore types for P2P TLS. @@ -18,10 +22,9 @@ Besu supports PKCS11, PKCS12, and JKS keystore and truststore types for P2P TLS. **Prerequisites**: -* A configured network. For example, - [see steps 1 to 5 in the QBFT tutorial](../../../tutorials/qbft.md). -* Each node requires a keystore that contains the node's certificate and key. -* A truststore containing all the trusted certificates for the network. +- A configured network. For example, [see steps 1 to 5 in the QBFT tutorial](../../../tutorials/qbft.md). +- Each node requires a keystore that contains the node's certificate and key. +- A truststore containing all the trusted certificates for the network. Start Besu and include the following command line options on the required nodes: @@ -38,190 +41,220 @@ besu --Xp2p-tls-enabled=true \ In the command line: -* Enable TLS for P2P communication using [`--Xp2p-tls-enabled=true`](#xp2p-tls-enabled). -* Specify the keystore type and keystore file using [`--Xp2p-tls-keystore-type`](#xp2p-tls-keystore-type) and - [`--Xp2p-tls-keystore-file`](#xp2p-tls-keystore-file). -* Specify the text file containing the password to unlock the keystore file using [`--Xp2p-tls-keystore-password-file`](#xp2p-tls-keystore-password-file). -* Specify the optional [certificate revocation list (CRL)] file using [`--Xp2p-tls-crl-file`](#xp2p-tls-crl-file). -* Specify the truststore type and truststore file using [`--Xp2p-tls-truststore-type`](#xp2p-tls-truststore-type) and - [`--Xp2p-tls-truststore-file`](#xp2p-tls-truststore-file). -* Specify the text file containing the password to unlock the truststore file using [`--Xp2p-tls-truststore-password-file`](#xp2p-tls-keystore-password-file). +- Enable TLS for P2P communication using [`--Xp2p-tls-enabled=true`](#xp2p-tls-enabled). +- Specify the keystore type and keystore file using [`--Xp2p-tls-keystore-type`](#xp2p-tls-keystore-type) and [`--Xp2p-tls-keystore-file`](#xp2p-tls-keystore-file). +- Specify the text file containing the password to unlock the keystore file using [`--Xp2p-tls-keystore-password-file`](#xp2p-tls-keystore-password-file). +- Specify the optional [certificate revocation list (CRL)] file using [`--Xp2p-tls-crl-file`](#xp2p-tls-crl-file). +- Specify the truststore type and truststore file using [`--Xp2p-tls-truststore-type`](#xp2p-tls-truststore-type) and [`--Xp2p-tls-truststore-file`](#xp2p-tls-truststore-file). +- Specify the text file containing the password to unlock the truststore file using [`--Xp2p-tls-truststore-password-file`](#xp2p-tls-keystore-password-file). ## Command line options ### `Xp2p-tls-crl-file` -=== "Syntax" + - ```bash - --Xp2p-tls-crl-file= - ``` +# Syntax -=== "Example" +```bash +--Xp2p-tls-crl-file= +``` - ```bash - --Xp2p-tls-crl-file=/home/cert/cert.crl.pem - ``` +# Example -=== "Environment variable" +```bash +--Xp2p-tls-crl-file=/home/cert/cert.crl.pem +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_CRL_FILE=/home/cert/cert.crl.pem +``` - ```bash - BESU_XP2P_TLS_CRL_FILE=/home/cert/cert.crl.pem - ``` + Path to the optional certificate revocation list (CRL) file. ### `Xp2p-tls-enabled` -=== "Syntax" + - ```bash - --Xp2p-tls-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--Xp2p-tls-enabled[=] +``` + +# Example + +```bash +--Xp2p-tls-enabled=true +``` - ```bash - --Xp2p-tls-enabled=true - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XP2P_TLS_ENABLED=true +``` - ```bash - BESU_XP2P_TLS_ENABLED=true - ``` + Enable TLS for P2P communication. The default is `false`. ### `Xp2p-tls-keystore-file` -=== "Syntax" + - ```bash - --Xp2p-tls-keystore-file= - ``` +# Syntax -=== "Example" +```bash +--Xp2p-tls-keystore-file= +``` + +# Example + +```bash +--Xp2p-tls-keystore-file=/home/cert/keystore.jks +``` - ```bash - --Xp2p-tls-keystore-file=/home/cert/keystore.jks - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XP2P_TLS_KEYSTORE_FILE=/home/cert/keystore.jks +``` - ```bash - BESU_XP2P_TLS_KEYSTORE_FILE=/home/cert/keystore.jks - ``` + Keystore file containing the key and certificate to allow TLS for P2P communication. ### `Xp2p-tls-keystore-password-file` -=== "Syntax" + - ```bash - --Xp2p-tls-keystore-password-file= - ``` +# Syntax -=== "Example" +```bash +--Xp2p-tls-keystore-password-file= +``` + +# Example + +```bash +--Xp2p-tls-keystore-password-file=/home/cert/password.txt +``` - ```bash - --Xp2p-tls-keystore-password-file=/home/cert/password.txt - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XP2P_TLS_KEYSTORE_PASSWORD_FILE=/home/cert/password.txt +``` - ```bash - BESU_XP2P_TLS_KEYSTORE_PASSWORD_FILE=/home/cert/password.txt - ``` + Text file containing the password to unlock the keystore file. ### `Xp2p-tls-keystore-type` -=== "Syntax" + - ```bash - --Xp2p-tls-keystore-type= - ``` +# Syntax -=== "Example" +```bash +--Xp2p-tls-keystore-type= +``` + +# Example + +```bash +--Xp2p-tls-keystore-type=JKS +``` - ```bash - --Xp2p-tls-keystore-type=JKS - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XP2P_TLS_KEYSTORE_TYPE=JKS +``` - ```bash - BESU_XP2P_TLS_KEYSTORE_TYPE=JKS - ``` + Keystore type that allows TLS for P2P communication. Valid options are `JKS`, `PKCS11`, and `PKCS12`. The default is `JKS`. ### `Xp2p-tls-truststore-file` -=== "Syntax" + - ```bash - --Xp2p-tls-truststore-file= - ``` +# Syntax -=== "Example" +```bash +--Xp2p-tls-truststore-file= +``` + +# Example + +```bash +--Xp2p-tls-truststore-file=/home/cert/truststore.jks +``` - ```bash - --Xp2p-tls-truststore-file=/home/cert/truststore.jks - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XP2P_TLS_TRUSTSTORE_FILE=/home/cert/truststore.jks +``` - ```bash - BESU_XP2P_TLS_TRUSTSTORE_FILE=/home/cert/truststore.jks - ``` + Truststore containing the trusted certificates that allows TLS for P2P communication. ### `Xp2p-tls-truststore-password-file` -=== "Syntax" + - ```bash - --Xp2p-tls-truststore-password-file= - ``` +# Syntax -=== "Example" +```bash +--Xp2p-tls-truststore-password-file= +``` + +# Example + +```bash +--Xp2p-tls-truststore-password-file=/home/cert/password.txt +``` - ```bash - --Xp2p-tls-truststore-password-file=/home/cert/password.txt - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XP2P_TLS_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt +``` - ```bash - BESU_XP2P_TLS_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt - ``` + Text file containing the password to unlock the truststore file. ### `Xp2p-tls-truststore-type` -=== "Syntax" + - ```bash - --Xp2p-tls-truststore-type= - ``` +# Syntax -=== "Example" +```bash +--Xp2p-tls-truststore-type= +``` + +# Example + +```bash +--Xp2p-tls-truststore-type=JKS +``` - ```bash - --Xp2p-tls-truststore-type=JKS - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_XP2P_TLS_TRUSTSTORE_TYPE=JKS +``` - ```bash - BESU_XP2P_TLS_TRUSTSTORE_TYPE=JKS - ``` + Truststore type. Valid options are `JKS`, `PKCS11`, and `PKCS12`. The default is `JKS`. diff --git a/docs/private-networks/how-to/configure/validators.md b/docs/private-networks/how-to/configure/validators.md index f4b4c4bf1a3..0a5be8501e4 100644 --- a/docs/private-networks/how-to/configure/validators.md +++ b/docs/private-networks/how-to/configure/validators.md @@ -1,29 +1,29 @@ --- +title: Validators description: Configuring validators in production networks +sidebar_position: 4 +tags: + - private networks --- # Configure validators in a production network As when [configuring bootnodes](bootnodes.md): -1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) - before starting the validator. -1. When creating validators in the cloud (for example, AWS or Azure), attempt to assign static IP - addresses to them. If your network is: +1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) before starting the validator. +1. When creating validators in the cloud (for example, AWS or Azure), attempt to assign static IP addresses to them. If your network is: - * Publicly accessible, assign an elastic IP address. - * Internal only, specify a private IP address when you create the instance and record this IP - address. + - Publicly accessible, assign an elastic IP address. + - Internal only, specify a private IP address when you create the instance and record this IP address. We recommend storing validator configuration under source control. ## Number of validators required -Ensure you configure enough validators to allow for redundancy. IBFT 2.0 tolerates `f = (n-1)/3` -faulty validators, where: +Ensure you configure enough validators to allow for redundancy. IBFT 2.0 tolerates `f = (n-1)/3` faulty validators, where: -* `f` is the number of faulty validators -* `n` is the number of validators. +- `f` is the number of faulty validators +- `n` is the number of validators. ## Adding and removing validators @@ -31,11 +31,10 @@ You can [vote validators in or out of the validator pool]. ## Validators as bootnodes -Validators can also be bootnodes. Other than the [usual configuration for bootnodes](bootnodes.md), -you do not need to specify any extra configuration when a validator is also a bootnode. +Validators can also be bootnodes. Other than the [usual configuration for bootnodes](bootnodes.md), you do not need to specify any extra configuration when a validator is also a bootnode. -If you remove a validator that is also a bootnode, ensure there are enough remaining bootnodes on -the network. +If you remove a validator that is also a bootnode, ensure there are enough remaining bootnodes on the network. + [vote validators in or out of the validator pool]: consensus/ibft.md#add-and-remove-validators diff --git a/docs/private-networks/how-to/deploy/_category_.json b/docs/private-networks/how-to/deploy/_category_.json new file mode 100644 index 00000000000..5befebd2362 --- /dev/null +++ b/docs/private-networks/how-to/deploy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy for production", + "position": 6 +} diff --git a/docs/private-networks/how-to/deploy/ansible.md b/docs/private-networks/how-to/deploy/ansible.md index ee4f6a6970a..c8b9b82d5c1 100644 --- a/docs/private-networks/how-to/deploy/ansible.md +++ b/docs/private-networks/how-to/deploy/ansible.md @@ -1,17 +1,19 @@ --- -title: Deploy Hyperledger Besu with Ansible +sidebar_position: 2 +title: Use Ansible description: Deploying Hyperledger Besu with Ansible role on Galaxy +tags: + - private networks --- # Deploy Besu with Ansible -To deploy Besu using Ansible, use the -[Hyperledger Besu role](https://galaxy.ansible.com/consensys/hyperledger_besu) published on Galaxy. +To deploy Besu using Ansible, use the [Hyperledger Besu role](https://galaxy.ansible.com/consensys/hyperledger_besu) published on Galaxy. -For more information, see the "Read Me" button on the -[Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). +For more information, see the "Read Me" button on the [Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). -!!! important +:::tip - We strongly recommend automating network creation. Automating makes updates easier and ensures - your configuration is synchronized across the network. +We strongly recommend automating network creation. Automating makes updates easier and ensures your configuration is synchronized across the network. + +::: diff --git a/docs/private-networks/how-to/deploy/cloud.md b/docs/private-networks/how-to/deploy/cloud.md index 5e4fe35dcf5..d3d6b36a97c 100644 --- a/docs/private-networks/how-to/deploy/cloud.md +++ b/docs/private-networks/how-to/deploy/cloud.md @@ -1,13 +1,16 @@ --- +title: Deploy to the cloud +sidebar_position: 1 description: Deploying Besu to the cloud +tags: + - private networks --- # Deploy Besu to the cloud When deploying Besu to the cloud: -* Ensure you have enough spread across Availability Zones (AZs) and Regions, especially for - bootnodes and validators. -* If your network is a multi-region network, consider using VPC Peering to reduce latency. -* Where required, use VPNs to connect to your on premise systems, or single private chains. -* If deploying to Kubernetes, please refer to the [tutorial](../../tutorials/kubernetes/index.md). +- Ensure you have enough spread across Availability Zones (AZs) and Regions, especially for bootnodes and validators. +- If your network is a multi-region network, consider using VPC Peering to reduce latency. +- Where required, use VPNs to connect to your on premise systems, or single private chains. +- If deploying to Kubernetes, please refer to the [tutorial](../../tutorials/kubernetes/index.md). diff --git a/docs/private-networks/how-to/deploy/ethstats.md b/docs/private-networks/how-to/deploy/ethstats.md index 7ab16630dfb..a8a48610cc7 100644 --- a/docs/private-networks/how-to/deploy/ethstats.md +++ b/docs/private-networks/how-to/deploy/ethstats.md @@ -1,11 +1,14 @@ --- +sidebar_position: 4 +title: Use Ethstats network monitor description: Ethstats network monitor +tags: + - private networks --- # Connect to Ethstats network monitor -Connect to [Ethstats](https://ethstats.dev/) to display real time and historical [statistics](#statistics) about the network and nodes. -You can connect to the Ethstats dashboard by [connecting to a client and server](#connect-through-a-client-and-server) or by [connecting through the command line](#connect-through-the-command-line). +Connect to [Ethstats](https://ethstats.dev) to display real time and historical [statistics](#statistics) about the network and nodes. You can connect to the Ethstats dashboard by [connecting to a client and server](#connect-through-a-client-and-server) or by [connecting through the command line](#connect-through-the-command-line). ## Components @@ -20,8 +23,8 @@ Ethstats consists of: Statistics displayed by Ethstats include: - Nodes in the network. Metrics for nodes include: - - Information about the last received block such as block number, block hash, transaction count, uncle count, block time, and propagation time. - - Connected peers, whether the node is mining, hash rate, latency, and uptime. + - Information about the last received block such as block number, block hash, transaction count, uncle count, block time, and propagation time. + - Connected peers, whether the node is mining, hash rate, latency, and uptime. - Charts for block time, block difficulty, block gas limit, block uncles, block transactions, block gas used, block propagation histogram, and top miners. - IP-based geolocation overview. - Node logs, which display the data sent by a node. @@ -29,25 +32,23 @@ Statistics displayed by Ethstats include: ## Connect through a client and server -Refer to the external [Ethstats client](https://github.com/goerli/ethstats-client) and [Ethstats server](https://github.com/goerli/ethstats-server) documentation -for installing those components and connecting to a dashboard. +Refer to the external [Ethstats client](https://github.com/goerli/ethstats-client) and [Ethstats server](https://github.com/goerli/ethstats-server) documentation for installing those components and connecting to a dashboard. ## Connect through the command line You can use command line options to connect a node directly to a [dashboard](https://github.com/goerli/ethstats-client#available-dashboards), without using a client. -Start a node using the [`--ethstats`](../../../public-networks/reference/cli/options.md#ethstats) option to specify the Ethstats server URL. -You can specify a contact email to send to the server using [`--ethstats-contact`](../../../public-networks/reference/cli/options.md#ethstats-contact). +Start a node using the [`--ethstats`](../../../public-networks/reference/cli/options.md#ethstats) option to specify the Ethstats server URL. You can specify a contact email to send to the server using [`--ethstats-contact`](../../../public-networks/reference/cli/options.md#ethstats-contact). -!!! example +```bash +besu --ethstats=Dev-Node-1:secret@127.0.0.1:3001 --ethstats-contact=contact@mail.com +``` - ```bash - besu --ethstats=Dev-Node-1:secret@127.0.0.1:3001 --ethstats-contact=contact@mail.com - ``` +:::note -!!! note +A server must be specified by `--ethstats` in order to use `--ethstats-contact`. - A server must be specified by `--ethstats` in order to use `--ethstats-contact`. +::: Open the selected dashboard website. Find your node under the list of nodes to see the statistics for the node and the network. diff --git a/docs/private-networks/how-to/deploy/kubernetes.md b/docs/private-networks/how-to/deploy/kubernetes.md index 3327a0f6b09..fe1a95bec41 100644 --- a/docs/private-networks/how-to/deploy/kubernetes.md +++ b/docs/private-networks/how-to/deploy/kubernetes.md @@ -1,14 +1,13 @@ --- -title: Deploy a Hyperledger Besu private network with Kubernetes +sidebar_position: 3 +title: Use Kubernetes description: Deploying Hyperledger Besu with Kubernetes +tags: + - private networks --- # Deploy Besu with Kubernetes -Use the [reference implementations](https://github.com/ConsenSys/quorum-kubernetes) to install -private networks using Kubernetes (K8s). The repository has full support for cloud providers like -AWS, Azure, GCP, and IBM, and has production setups that use of identities and cloud-native -secret storage services like Azure KeyVault and AWS Secrets Manager. +Use the [reference implementations](https://github.com/ConsenSys/quorum-kubernetes) to install private networks using Kubernetes (K8s). The repository has full support for cloud providers like AWS, Azure, GCP, and IBM, and has production setups that use of identities and cloud-native secret storage services like Azure KeyVault and AWS Secrets Manager. -Refer to the [tutorial](../../tutorials/kubernetes/index.md) and familiarize yourself with -the reference implementations, and customize them to your requirements. +Refer to the [tutorial](../../tutorials/kubernetes/index.md) and familiarize yourself with the reference implementations, and customize them to your requirements. diff --git a/docs/private-networks/how-to/index.md b/docs/private-networks/how-to/index.md index ab19cc9b674..ae5ae0ada06 100644 --- a/docs/private-networks/how-to/index.md +++ b/docs/private-networks/how-to/index.md @@ -1,36 +1,37 @@ --- -description: private networks how to overview +description: Private networks how to overview +tags: + - private networks --- # How to This section provides instructional content for private network features. -The following features are shared with [public networks](../../public-networks/index.md) and the -content can be found in the public networks section: +The following features are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: - Configure and manage: - - [Use a configuration file](../../public-networks/how-to/configuration-file.md) - - [Configure high availability](../../public-networks/how-to/configure-ha/index.md) - - [Configure mining](../../public-networks/how-to/use-pow/mining.md) + - [Use a configuration file](../../public-networks/how-to/configuration-file.md) + - [Configure high availability](../../public-networks/how-to/configure-ha/index.md) + - [Configure mining](../../public-networks/how-to/use-pow/mining.md) - [Use the Besu API](../../public-networks/how-to/use-besu-api/index.md): - - [Use JSON-RPC over HTTP, WS, and IPC](../../public-networks/how-to/use-besu-api/json-rpc.md) - - [Use RPC Pub/Sub over WS](../../public-networks/how-to/use-besu-api/rpc-pubsub.md) - - [Use GraphQL over HTTP](../../public-networks/how-to/use-besu-api/graphql.md) - - [Authenticate JSON-RPC requests](../../public-networks/how-to/use-besu-api/authenticate.md) - - [Access logs using JSON-RPC API](../../public-networks/how-to/use-besu-api/access-logs.md) + - [Use JSON-RPC over HTTP, WS, and IPC](../../public-networks/how-to/use-besu-api/json-rpc.md) + - [Use RPC Pub/Sub over WS](../../public-networks/how-to/use-besu-api/rpc-pubsub.md) + - [Use GraphQL over HTTP](../../public-networks/how-to/use-besu-api/graphql.md) + - [Authenticate JSON-RPC requests](../../public-networks/how-to/use-besu-api/authenticate.md) + - [Access logs using JSON-RPC API](../../public-networks/how-to/use-besu-api/access-logs.md) - Find and connect to peers: - - [Configure static nodes](../../public-networks/how-to/connect/static-nodes.md) - - [Configure ports](../../public-networks/how-to/connect/configure-ports.md) - - [Manage peers](../../public-networks/how-to/connect/manage-peers.md) - - [Specify NAT method](../../public-networks/how-to/connect/specify-nat.md) + - [Configure static nodes](../../public-networks/how-to/connect/static-nodes.md) + - [Configure ports](../../public-networks/how-to/connect/configure-ports.md) + - [Manage peers](../../public-networks/how-to/connect/manage-peers.md) + - [Specify NAT method](../../public-networks/how-to/connect/specify-nat.md) - [Configure the Java Virtual Machine](../../public-networks/how-to/configure-jvm/index.md) - - [Pass JVM options](../../public-networks/how-to/configure-jvm/pass-jvm-options.md) - - [Manage JVM memory](../../public-networks/how-to/configure-jvm/manage-memory.md) - - [Use Java Flight Recorder](../../public-networks/how-to/configure-jvm/java-flight-recorder.md) + - [Pass JVM options](../../public-networks/how-to/configure-jvm/pass-jvm-options.md) + - [Manage JVM memory](../../public-networks/how-to/configure-jvm/manage-memory.md) + - [Use Java Flight Recorder](../../public-networks/how-to/configure-jvm/java-flight-recorder.md) - Develop dapps: - - [Use Truffle](../../public-networks/how-to/develop/truffle.md) - - [Use client libraries](../../public-networks/how-to/develop/client-libraries.md) + - [Use Truffle](../../public-networks/how-to/develop/truffle.md) + - [Use client libraries](../../public-networks/how-to/develop/client-libraries.md) - Troubleshoot: - - [Use EVM tool](../../public-networks/how-to/troubleshoot/evm-tool.md) - - [Trace transactions](../../public-networks/how-to/troubleshoot/trace-transactions.md) + - [Use EVM tool](../../public-networks/how-to/troubleshoot/evm-tool.md) + - [Trace transactions](../../public-networks/how-to/troubleshoot/trace-transactions.md) diff --git a/docs/private-networks/how-to/monitor/_category_.json b/docs/private-networks/how-to/monitor/_category_.json new file mode 100644 index 00000000000..8e8c27af9a7 --- /dev/null +++ b/docs/private-networks/how-to/monitor/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Monitor nodes", + "position": 3 +} diff --git a/docs/private-networks/how-to/monitor/elastic-stack.md b/docs/private-networks/how-to/monitor/elastic-stack.md index 98c8b69eb06..b74dd929dfd 100644 --- a/docs/private-networks/how-to/monitor/elastic-stack.md +++ b/docs/private-networks/how-to/monitor/elastic-stack.md @@ -1,33 +1,34 @@ --- -description: Using Elastick Stack (ELK) with Hyperledger Besu +title: Use Elastic Stack +sidebar_position: 3 +description: Using Elastic Stack (ELK) with Hyperledger Besu +tags: + - private networks --- # Use Elastic Stack -[Elastic Stack] (ELK) is an open-source log management platform that is available when using the -[Developer Quickstart](../../tutorials/quickstart.md). +[Elastic Stack] (ELK) is an open-source log management platform that is available when using the [Developer Quickstart](../../tutorials/quickstart.md). -The [Filebeat] configuration ingests logs and the [Metricbeat] configuration collects metrics from the nodes at regular -defined intervals and outputs them to Redis for storage. -Redis provides a highly available mechanism enabling storage by any of the Elastic Beats and pulled by Logstash as required. +The [Filebeat] configuration ingests logs and the [Metricbeat] configuration collects metrics from the nodes at regular defined intervals and outputs them to Redis for storage. Redis provides a highly available mechanism enabling storage by any of the Elastic Beats and pulled by Logstash as required. The [pipeline configuration] defines the JSON format used for Besu logs and automatically picks up any new log fields. -!!! note +:::note - The pipeline configuration must match the your log format. - If using the default log format, you can use the [grok plugin](https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html) - to extract the log fields. +The pipeline configuration must match the your log format. If using the default log format, you can use the [grok plugin](https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html) to extract the log fields. + +::: To see the Besu Quickstart network logs in Kibana: 1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting ELK monitoring. -1. Open the [`Kibana logs address`](http://localhost:5601/app/kibana#/discover) listed by the sample networks `list.sh` script. - The logs display in Kibana. +1. Open the [`Kibana logs address`](http://localhost:5601/app/kibana#/discover) listed by the sample networks `list.sh` script. The logs display in Kibana. - ![Kibana](../../../assets/images/KibanaQuickstart.png) + ![Kibana](../../../assets/images/KibanaQuickstart.png) + [Filebeat]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/filebeat/filebeat.yml [Metricbeat]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/metricbeat/metricbeat.yml [pipeline configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/logstash/pipeline/20_besu.conf diff --git a/docs/private-networks/how-to/monitor/index.md b/docs/private-networks/how-to/monitor/index.md index 6675b1124de..8dae03bb8ee 100644 --- a/docs/private-networks/how-to/monitor/index.md +++ b/docs/private-networks/how-to/monitor/index.md @@ -1,12 +1,12 @@ --- description: Monitoring using metrics and logging +tags: + - private networks --- # Monitoring -Use monitoring to identify node and network issues. In private networks, you can -[configure metrics and logging](../../../public-networks/how-to/monitor/index.md) as in public -networks. +Use monitoring to identify node and network issues. In private networks, you can [configure metrics and logging](../../../public-networks/how-to/monitor/index.md) as in public networks. You can also use the following monitoring tools in private networks: @@ -17,5 +17,4 @@ You can also use the following monitoring tools in private networks: - [OpenTelemetry](opentelemetry.md) - [Sirato Explorer](sirato-explorer.md) -For an overview of monitoring Hyperledger Besu, view -[this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). +For an overview of monitoring Hyperledger Besu, view [this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). diff --git a/docs/private-networks/how-to/monitor/loki.md b/docs/private-networks/how-to/monitor/loki.md index ef2abe96043..eabe6f0667b 100644 --- a/docs/private-networks/how-to/monitor/loki.md +++ b/docs/private-networks/how-to/monitor/loki.md @@ -1,31 +1,36 @@ --- +title: Use Grafana Loki +sidebar_position: 2 description: Using Grafana Loki log management platform with Hyperledger Besu +tags: + - private networks --- # Grafana Loki -[Grafana Loki] is an open-source log management platform that is available when using the -[Developer Quickstart](../../tutorials/quickstart.md). +[Grafana Loki] is an open-source log management platform that is available when using the [Developer Quickstart](../../tutorials/quickstart.md). The [Promtail configuration] ingests logs at regular defined intervals and outputs them to [Loki] for storage. The `pipeline configuration` in Promtail defines pipeline stages that can collate logs natively or using the JSON format. -!!! note +:::note - If using the pipeline regex stage in `Promtail`, configuration must match your log format. +If using the pipeline regex stage in `Promtail`, configuration must match your log format. + +::: To view the GoQuorum Quickstart network logs in Loki: 1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting Loki monitoring. -1. Open the [`Grafana Loki address`](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=&from=now-15m&to=now) listed - by the sample networks `list.sh` script. +2. Open the [`Grafana Loki address`](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=&from=now-15m&to=now) listed by the sample networks `list.sh` script. - The logs display in Loki. + The logs display in Loki. - ![Loki logs](../../../assets/images/grafana_loki.png) + ![Loki logs](../../../assets/images/grafana_loki.png) + [Promtail configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/promtail/promtail.yml [pipeline configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/promtail/promtail.yml [Loki]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/loki/loki.yml diff --git a/docs/private-networks/how-to/monitor/opentelemetry.md b/docs/private-networks/how-to/monitor/opentelemetry.md index 055b5e39ce0..185b61da3d5 100644 --- a/docs/private-networks/how-to/monitor/opentelemetry.md +++ b/docs/private-networks/how-to/monitor/opentelemetry.md @@ -1,174 +1,176 @@ --- +title: Use OpenTelemetry +sidebar_position: 6 description: Collect Besu information with the OpenTelemetry Collector +tags: + - private networks --- # Use OpenTelemetry -You can use the OpenTelemetry monitoring and tracing service to gather node metrics and traces. -To enable OpenTelemetry to access Hyperledger Besu, use the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) -and [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. -Use [Splunk](https://splunk.com) to visualize the collected data. -A [Besu Sync example](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu-sync) is available. +You can use the OpenTelemetry monitoring and tracing service to gather node metrics and traces. To enable OpenTelemetry to access Hyperledger Besu, use the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) and [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. Use [Splunk](https://splunk.com) to visualize the collected data. A [Besu Sync example](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu-sync) is available. -!!! example +:::tip - Use OpenTelemetry to monitor the sync time of your Besu node and show where time is spent internally and over the - JSON-RPC interface. +Use OpenTelemetry to monitor the sync time of your Besu node and show where time is spent internally and over the JSON-RPC interface. - [This office hours recording](https://wiki.hyperledger.org/display/BESU/2021-01-19+Office+Hours+Notes) shows examples - of monitoring Hyperledger Besu. +[This office hours recording](https://wiki.hyperledger.org/display/BESU/2021-01-19+Office+Hours+Notes) shows examples of monitoring Hyperledger Besu. + +::: ## Install OpenTelemetry Collector Download and install the [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases). -!!! tip +:::tip + +You can also install exporters that send system metrics to OpenTelemetry to monitor non-Besu-specific items such as disk and CPU usage. The OpenTelemetry Collector can connect to additional applications, and may be deployed in Kubernetes environments as a daemonset. - You can also install exporters that send system metrics to OpenTelemetry to monitor non-Besu-specific items such as - disk and CPU usage. - The OpenTelemetry Collector can connect to additional applications, and may be deployed in Kubernetes environments - as a daemonset. +::: ## Setting up and running OpenTelemetry with Besu -1. Configure OpenTelemetry to accept data from Besu. - For example, use the following configuration for your `otel-collector-config.yml` file, and send data to Splunk and Splunk APM: - - !!! example "`otel-collector-config.yml`" - - ```yml - receivers: - otlp: - protocols: - grpc: - http: - - exporters: - splunk_hec/traces: - # Splunk HTTP Event Collector token. - token: "11111111-1111-1111-1111-1111111111113" - # URL to a Splunk instance to send data to. - endpoint: "https://:8088/services/collector" - # Optional Splunk source: https://docs.splunk.com/Splexicon:Source - source: "besu:traces" - # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype - sourcetype: "otlp" - # Splunk index, optional name of the Splunk index targeted. - index: "traces" - # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. - max_connections: 20 - # Whether to disable gzip compression over HTTP. Defaults to false. - disable_compression: false - # HTTP timeout when sending data. Defaults to 10s. - timeout: 10s - # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. - # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. - insecure_skip_verify: true - splunk_hec/metrics: - # Splunk HTTP Event Collector token. - token: "11111111-1111-1111-1111-1111111111113" - # URL to a Splunk instance to send data to. - endpoint: "https://:8088/services/collector" - # Optional Splunk source: https://docs.splunk.com/Splexicon:Source - source: "besu:metrics" - # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype - sourcetype: "prometheus" - # Splunk index, optional name of the Splunk index targeted. - index: "metrics" - # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. - max_connections: 20 - # Whether to disable gzip compression over HTTP. Defaults to false. - disable_compression: false - # HTTP timeout when sending data. Defaults to 10s. - timeout: 10s - # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. - # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. - insecure_skip_verify: true - # Traces - sapm: - access_token: "${SPLUNK_ACCESS_TOKEN}" - endpoint: "https://ingest.${SPLUNK_REALM}.signalfx.com/v2/trace" - # Metrics + Events - signalfx: - access_token: "${SPLUNK_ACCESS_TOKEN}" - realm: "${SPLUNK_REALM}" - - processors: - batch: - - extensions: - health_check: - pprof: - zpages: - - service: - extensions: [pprof, zpages, health_check] - pipelines: - traces: - receivers: [otlp] - exporters: [splunk_hec/traces, sapm] - processors: [batch] - metrics: - receivers: [otlp] - exporters: [splunk_hec/metrics, signalfx] - processors: [batch] - ``` +1. Configure OpenTelemetry to accept data from Besu. For example, use the following configuration for your `otel-collector-config.yml` file, and send data to Splunk and Splunk APM: + + ```yml title="otel-collector-config.yml" + receivers: + otlp: + protocols: + grpc: + http: + + exporters: + splunk_hec/traces: + # Splunk HTTP Event Collector token. + token: "11111111-1111-1111-1111-1111111111113" + # URL to a Splunk instance to send data to. + endpoint: "https://:8088/services/collector" + # Optional Splunk source: https://docs.splunk.com/Splexicon:Source + source: "besu:traces" + # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype + sourcetype: "otlp" + # Splunk index, optional name of the Splunk index targeted. + index: "traces" + # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. + max_connections: 20 + # Whether to disable gzip compression over HTTP. Defaults to false. + disable_compression: false + # HTTP timeout when sending data. Defaults to 10s. + timeout: 10s + # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. + # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. + insecure_skip_verify: true + splunk_hec/metrics: + # Splunk HTTP Event Collector token. + token: "11111111-1111-1111-1111-1111111111113" + # URL to a Splunk instance to send data to. + endpoint: "https://:8088/services/collector" + # Optional Splunk source: https://docs.splunk.com/Splexicon:Source + source: "besu:metrics" + # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype + sourcetype: "prometheus" + # Splunk index, optional name of the Splunk index targeted. + index: "metrics" + # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. + max_connections: 20 + # Whether to disable gzip compression over HTTP. Defaults to false. + disable_compression: false + # HTTP timeout when sending data. Defaults to 10s. + timeout: 10s + # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. + # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. + insecure_skip_verify: true + # Traces + sapm: + access_token: "${SPLUNK_ACCESS_TOKEN}" + endpoint: "https://ingest.${SPLUNK_REALM}.signalfx.com/v2/trace" + # Metrics + Events + signalfx: + access_token: "${SPLUNK_ACCESS_TOKEN}" + realm: "${SPLUNK_REALM}" + + processors: + batch: + + extensions: + health_check: + pprof: + zpages: + + service: + extensions: [pprof, zpages, health_check] + pipelines: + traces: + receivers: [otlp] + exporters: [splunk_hec/traces, sapm] + processors: [batch] + metrics: + receivers: [otlp] + exporters: [splunk_hec/metrics, signalfx] + processors: [batch] + ``` It is easiest to run the OpenTelemetry collector with Docker with the following command: - === "Syntax" + + + # Syntax + + ```bash + docker run -d \ + -v ./otel-collector-config.yml:/etc/otel/config.yaml \ + -e SPLUNK_ACCESS_TOKEN= \ + -e SPLUNK_REALM= \ + -p 4317:4317 \ + otel/opentelemetry-collector-contrib:latest + ``` - ```bash - docker run -d \ - -v ./otel-collector-config.yml:/etc/otel/config.yaml \ - -e SPLUNK_ACCESS_TOKEN= \ - -e SPLUNK_REALM= \ - -p 4317:4317 \ - otel/opentelemetry-collector-contrib:latest - ``` + # Example - === "Example" + ```bash + docker run -d \ + -v ./otel-collector-config.yml:/etc/otel/config.yaml \ + -e SPLUNK_ACCESS_TOKEN=abcdefg654 \ + -e SPLUNK_REALM=us1 \ + -p 4317:4317 \ + otel/opentelemetry-collector-contrib:latest + ``` - ```bash - docker run -d \ - -v ./otel-collector-config.yml:/etc/otel/config.yaml \ - -e SPLUNK_ACCESS_TOKEN=abcdefg654 \ - -e SPLUNK_REALM=us1 \ - -p 4317:4317 \ - otel/opentelemetry-collector-contrib:latest - ``` + You can also refer to this [Docker-compose example](https://github.com/splunk/splunk-connect-for-ethereum/blob/989dc2ccae7d8235bf3ce2a83a18cf0cd1713294/examples/besu-sync/full-sync/docker-compose.yaml). -1. Start Besu with the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) and - [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. - For example, run the following command to start a single node: +2. Start Besu with the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) and [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. For example, run the following command to start a single node: - === "Syntax" + - ```bash - OTEL_EXPORTER_OTLP_ENDPOINT=https://: besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry - ``` + # Syntax - === "Example" + ```bash + OTEL_EXPORTER_OTLP_ENDPOINT=https://: besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry + ``` - ```bash - OTEL_EXPORTER_OTLP_ENDPOINT=https://localhost:4317 besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry - ``` + # Example - The [OpenTelemetry SDK](https://github.com/open-telemetry/opentelemetry-specification/blob/8f7cdb73618a0b3afa9532b8f8103d719e352781/specification/sdk-environment-variables.md) - mandates how to configure the OpenTelemetry gRPC client, so data flows to the collector from Besu. + ```bash + OTEL_EXPORTER_OTLP_ENDPOINT=https://localhost:4317 besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry + ``` + + + + The [OpenTelemetry SDK](https://github.com/open-telemetry/opentelemetry-specification/blob/8f7cdb73618a0b3afa9532b8f8103d719e352781/specification/sdk-environment-variables.md) mandates how to configure the OpenTelemetry gRPC client, so data flows to the collector from Besu. You can use the following environment variables: - | Name | Description | Required | - |-----------------------------|-------------------------------------------------------------------------------------------------------------------|----------| - | OTEL_EXPORTER_OTLP_ENDPOINT | OpenTelemetry Collector endpoint, of the form `https://host:port`. The default value is `https://localhost:4317` | Yes | - | OTEL_EXPORTER_OTLP_INSECURE | Whether to allow insecure connections for OpenTelemetry data. False by default. | No | + | Name | Description | Required | + | --- | --- | --- | + | OTEL_EXPORTER_OTLP_ENDPOINT | OpenTelemetry Collector endpoint, of the form `https://host:port`. The default value is `https://localhost:4317` | Yes | + | OTEL_EXPORTER_OTLP_INSECURE | Whether to allow insecure connections for OpenTelemetry data. False by default. | No | + [Monitoring Besu synchronization to chain with Splunk]: https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu-sync -*[APM]: Application Performance Monitoring +\*[APM]: Application Performance Monitoring diff --git a/docs/private-networks/how-to/monitor/quorum-hibernate.md b/docs/private-networks/how-to/monitor/quorum-hibernate.md index 8af6ccffaff..2d6b6139db0 100644 --- a/docs/private-networks/how-to/monitor/quorum-hibernate.md +++ b/docs/private-networks/how-to/monitor/quorum-hibernate.md @@ -1,17 +1,20 @@ --- +title: Use Quorum Hibernate +sidebar_position: 4 description: Use Quorum Hibernate with Hyperledger Besu +tags: + - private networks --- # Use Quorum Hibernate -[Quorum Hibernate] is a proxy that monitors a node's API traffic and hibernates the node when inactive. -This reduces infrastructure costs by ensuring only nodes receiving API requests or nodes required to establish consensus -are running. +[Quorum Hibernate] is a proxy that monitors a node's API traffic and hibernates the node when inactive. This reduces infrastructure costs by ensuring only nodes receiving API requests or nodes required to establish consensus are running. Quorum Hibernate wakes up hibernating nodes: -* When a new transaction or API request is received. -* To allow it to periodically sync with the network. +- When a new transaction or API request is received. +- To allow it to periodically sync with the network. + [Quorum Hibernate]: https://github.com/ConsenSys/quorum-hibernate diff --git a/docs/private-networks/how-to/monitor/sirato-explorer.md b/docs/private-networks/how-to/monitor/sirato-explorer.md index 37550925d15..0b197267531 100644 --- a/docs/private-networks/how-to/monitor/sirato-explorer.md +++ b/docs/private-networks/how-to/monitor/sirato-explorer.md @@ -1,23 +1,22 @@ --- +title: Use Sirato Explorer +sidebar_position: 7 description: Use Sirato Explorer on a privacy-enabled Besu network +tags: + - private networks --- # Use Sirato Blockchain Explorer -[Sirato Blockchain Explorer](https://www.web3labs.com/sirato) supports public and private EVM networks. -This page describes how to use the free version of Sirato with its built-in support for -[privacy-enabled](../../concepts/privacy/index.md) Besu networks created using the -[Developer Quickstart](../../tutorials/quickstart.md). +[Sirato Blockchain Explorer](https://www.web3labs.com/sirato) supports public and private EVM networks. This page describes how to use the free version of Sirato with its built-in support for [privacy-enabled](../../concepts/privacy/index.md) Besu networks created using the [Developer Quickstart](../../tutorials/quickstart.md). -Sirato provides an overview of the entire network, including block information, contract metadata, -transaction searches, and -[more](https://medium.com/web3labs/epirus-ethereum-saas-blockchain-explorer-d5d961717d15). +Sirato provides an overview of the entire network, including block information, contract metadata, transaction searches, and [more](https://medium.com/web3labs/epirus-ethereum-saas-blockchain-explorer-d5d961717d15). -!!! note - You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, - in order to allow access for Besu [privacy API methods](../../reference/api/index.md#priv-methods). - In production networks, you must - [secure access](../../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. +:::note + +You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, in order to allow access for Besu [privacy API methods](../../reference/api/index.md#priv-methods). In production networks, you must [secure access](../../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. + +::: ## Prerequisites @@ -31,41 +30,42 @@ Clone the [Sirato GitHub repository](https://github.com/web3labs/sirato-free): git clone https://github.com/web3labs/sirato-free ``` -The repository contains Docker Compose scripts to allow Sirato to start with a Developer Quickstart -test network. +The repository contains Docker Compose scripts to allow Sirato to start with a Developer Quickstart test network. From the Sirato directory, run the following script: -=== "Command" - - ```bash - ./start_sirato_besu.sh - ``` - -=== "Result" - - ```bash - ************************************* - Sirator Explorer for Besu - ************************************* - Starting explorer - -------------------- - [+] Running 5/5 - â ŋ Container docker-compose-mongodb-1 Started 3.3s - â ŋ Container docker-compose-api-1 Started 4.1s - â ŋ Container docker-compose-ingestion-1 Started 4.2s - â ŋ Container docker-compose-web-1 Started 4.4s - â ŋ Container docker-compose-nginx-1 Started 5.0s - ---------------------------------- - Services - ---------------------------------- - Sirato explorer HTTP endpoint : http://localhost:260012 - Sirato is connected to node : http://rpcnode:8545 - ``` - -Open `http://localhost/` on your browser. -You’ll see the new initialization page while it boots up. -This may take 5–10 minutes for the all services to start and the ingestion sync to complete. + + +# Command + +```bash +./start_sirato_besu.sh +``` + +# Result + +```bash +************************************* +Sirator Explorer for Besu +************************************* +Starting explorer +-------------------- +[+] Running 5/5 + â ŋ Container docker-compose-mongodb-1 Started 3.3s + â ŋ Container docker-compose-api-1 Started 4.1s + â ŋ Container docker-compose-ingestion-1 Started 4.2s + â ŋ Container docker-compose-web-1 Started 4.4s + â ŋ Container docker-compose-nginx-1 Started 5.0s +---------------------------------- +Services +---------------------------------- +Sirato explorer HTTP endpoint : http://localhost:260012 +Sirato is connected to node : http://rpcnode:8545 +``` + + + +Open `http://localhost/` on your browser. You’ll see the new initialization page while it boots up. This may take 5–10 minutes for the all services to start and the ingestion sync to complete. ![`Sirato-dashboard`](../../../assets/images/sirato-loading.png) @@ -75,9 +75,7 @@ The **Dashboard** page provides an aggregated view of network activities. ![`Epirus-dashboard`](../../../assets/images/sirato-dashboard.png) -The **Network** page provides an overview of the network status and connected peers. -This page is disabled by default, and is only visible if you set `DISPLAY_NETWOR_TAB=enabled` using -the following command: +The **Network** page provides an overview of the network status and connected peers. This page is disabled by default, and is only visible if you set `DISPLAY_NETWOR_TAB=enabled` using the following command: ```bash NODE_ENDPOINT=http://member1besu:8545 DISPLAY_NETWORK_TAB=enabled docker-compose -f docker-compose.yml -f sirato-extensions/docker-compose-quorum-dev-quickstart.yml up @@ -101,23 +99,27 @@ The **Transactions** page shows a paginated view of new and historical transacti To stop all the services from running, run the following script: -=== "Command" - - ```bash - ./stop.sh - ``` - -=== "Result" - - ```bash - ************************************* - Sirator Explorer for Besu - ************************************* - Stopping explorer - [+] Running 5/5 - â ŋ Container docker-compose-nginx-1 Stopped 0.5s - â ŋ Container docker-compose-ingestion-1 Stopped 4.0s - â ŋ Container docker-compose-web-1 Stopped 10.3s - â ŋ Container docker-compose-api-1 Stopped 2.9s - â ŋ Container docker-compose-mongodb-1 Stopped - ``` + + +# Command + +```bash +./stop.sh +``` + +# Result + +```bash +************************************* +Sirator Explorer for Besu +************************************* +Stopping explorer +[+] Running 5/5 + â ŋ Container docker-compose-nginx-1 Stopped 0.5s + â ŋ Container docker-compose-ingestion-1 Stopped 4.0s + â ŋ Container docker-compose-web-1 Stopped 10.3s + â ŋ Container docker-compose-api-1 Stopped 2.9s + â ŋ Container docker-compose-mongodb-1 Stopped +``` + + diff --git a/docs/private-networks/how-to/monitor/splunk.md b/docs/private-networks/how-to/monitor/splunk.md index 2e7675ba31d..2b749536740 100644 --- a/docs/private-networks/how-to/monitor/splunk.md +++ b/docs/private-networks/how-to/monitor/splunk.md @@ -1,21 +1,31 @@ --- +title: Use Splunk +sidebar_position: 5 description: Send Hyperledger Besu logs to Splunk +tags: + - private networks --- # Use Splunk -[Splunk](https://splunkbase.splunk.com/app/4866/) is a third-party monitoring solution compatible with Besu. -A Splunk server can receive Besu logs and enable complex search, visualization, and analysis. +[Splunk](https://splunkbase.splunk.com/app/4866/) is a third-party monitoring solution compatible with Besu. A Splunk server can receive Besu logs and enable complex search, visualization, and analysis. -Splunk can aggregate multiple logs in one place and run complex queries without being connected to the machine running -Besu to read the standard output. +Splunk can aggregate multiple logs in one place and run complex queries without being connected to the machine running Besu to read the standard output. Options for running Splunk and Besu are: -- [Developer Quickstart with Splunk](#developer-quickstart-with-splunk) -- [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose). -- [Splunk Enterprise Docker container](#use-splunk-enterprise-as-a-docker-container) with a trial license. -- [Splunk Enterprise](#run-a-splunk-enterprise-instance). +- [Use Splunk](#use-splunk) + - [Developer Quickstart with Splunk](#developer-quickstart-with-splunk) + - [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose) + - [Requirements](#requirements) + - [Steps](#steps) + - [Use Splunk Enterprise as a Docker container](#use-splunk-enterprise-as-a-docker-container) + - [Prerequisites](#prerequisites) + - [Steps](#steps-1) + - [Run a Splunk Enterprise instance](#run-a-splunk-enterprise-instance) + - [Prerequisites](#prerequisites-1) + - [Steps](#steps-2) + - [Splunk options reference](#splunk-options-reference) ## Developer Quickstart with Splunk @@ -26,42 +36,44 @@ To view the Quickstart network logs in Splunk: ## Splunk Connect for Ethereum Docker Compose -To run a development Besu node and connect it to Splunk Enterprise, use the Splunk Connect for Ethereum demonstration -Docker Compose environment provided by Splunk. +To run a development Besu node and connect it to Splunk Enterprise, use the Splunk Connect for Ethereum demonstration Docker Compose environment provided by Splunk. ### Requirements - [Git](https://git-scm.com/) - [Docker and Docker-compose](https://docs.docker.com/compose/install/) -!!! important +:::info - A Splunk license is not required to use the Splunk Connect for Ethereum demonstration. +A Splunk license is not required to use the Splunk Connect for Ethereum demonstration. + +::: ### Steps -1. Clone the Splunk Connect for Ethereum repository: +1. Clone the Splunk Connect for Ethereum repository: ```bash git clone https://github.com/splunk/splunk-connect-for-ethereum.git cd splunk-connect-for-ethereum ``` -1. Start the demonstration environment by following the Splunk Connect for Ethereum repository - [README](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu). +1. Start the demonstration environment by following the Splunk Connect for Ethereum repository [README](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu). - !!! note + :::note - Splunk enterprise takes some time to start. + Splunk enterprise takes some time to start. - Run `docker ps` and wait for the `STATUS` of the 3 containers to be `Up [number] seconds (healthy)`. + Run `docker ps` and wait for the `STATUS` of the 3 containers to be `Up [number] seconds (healthy)`. - ``` - CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - 127600dd1173 splunkdlt/ethlogger:latest "ethlogger" 53 seconds ago Up 51 seconds (healthy) ethlogger - 88dfcee683c4 splunk/splunk:latest "/sbin/entrypoint.shâ€Ļ" 53 seconds ago Up 52 seconds (healthy) 8065/tcp, 8088-8089/tcp, 8191/tcp, 9887/tcp, 9997/tcp, 0.0.0.0:18000->8000/tcp splunk - 111b0c6d6072 hyperledger/besu:1.4.4 "besu" 53 seconds ago Up 52 seconds (healthy) 8545-8547/tcp, 30303/tcp besu - ``` + ``` + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 127600dd1173 splunkdlt/ethlogger:latest "ethlogger" 53 seconds ago Up 51 seconds (healthy) ethlogger + 88dfcee683c4 splunk/splunk:latest "/sbin/entrypoint.shâ€Ļ" 53 seconds ago Up 52 seconds (healthy) 8065/tcp, 8088-8089/tcp, 8191/tcp, 9887/tcp, 9997/tcp, 0.0.0.0:18000->8000/tcp splunk + 111b0c6d6072 hyperledger/besu:1.4.4 "besu" 53 seconds ago Up 52 seconds (healthy) 8545-8547/tcp, 30303/tcp besu + ``` + + ::: ## Use Splunk Enterprise as a Docker container @@ -70,20 +82,21 @@ Docker Compose environment provided by Splunk. - [Docker](https://docs.docker.com/compose/install/) - [Besu 1.4.4](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/CHANGELOG.md#144) or later [installed](../../get-started/install/binary-distribution.md) -!!! important +:::info + +A Splunk license is not required to use the trial version of the Splunk Docker image. The image is not suitable for production use and has [restrictions on daily log volume](https://www.splunk.com/). - A Splunk license is not required to use the trial version of the Splunk Docker image. - The image is not suitable for production use and has [restrictions on daily log volume](https://www.splunk.com/). +::: -!!! note +:::note - If running [Besu as a Docker container](../../get-started/install/run-docker-image.md), consider using - [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose) or - [Kubernetes](../deploy/kubernetes.md) instead of the Splunk Enterprise trial container. +If running [Besu as a Docker container](../../get-started/install/run-docker-image.md), consider using [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose) or [Kubernetes](../deploy/kubernetes.md) instead of the Splunk Enterprise trial container. + +::: ### Steps -1. Start the Splunk Enterprise container: +1. Start the Splunk Enterprise container: ```bash docker run \ @@ -97,26 +110,26 @@ Docker Compose environment provided by Splunk. splunk/splunk:latest ``` - Once the service is started, connect on [`http://localhost:8080/`](http://localhost:8080/) and login as the `admin` - user with a password of `changeme`. + Once the service is started, connect on [`http://localhost:8080/`](http://localhost:8080/) and login as the `admin` user with a password of `changeme`. + + :::tip - !!! tip + To follow the logs of the Splunk container: - To follow the logs of the Splunk container: + ```bash + docker logs -f splunk-demo + ``` - ```bash - docker logs -f splunk-demo - ``` + ::: -1. Create the Besu index: +2. Create the Besu index: 1. In the Splunk Web interface, navigate to the [index list in the settings](http://localhost:8080/en-US/manager/search/data/indexes). - 1. [Create an event index] with an Index Name of `besu`. - 1. Leave other fields with the default values. - 1. Save the `besu` index. + 2. [Create an event index] with an Index Name of `besu`. + 3. Leave other fields with the default values. + 4. Save the `besu` index. -1. Run Besu. - To start a Besu node running in development mode, run the following command: +3. Run Besu. To start a Besu node running in development mode, run the following command: ```bash LOGGER=Splunk \ @@ -130,20 +143,15 @@ Docker Compose environment provided by Splunk. --logging=trace ``` - The environment variables specified send the Besu logs to Splunk. - Only `LOGGER`, `SPLUNK_URL`, `SPLUNK_TOKEN` and `SPLUNK_SKIPTLSVERIFY` are required in this example. - The complete list of options is in the [Splunk options reference table](#splunk-options-reference). + The environment variables specified send the Besu logs to Splunk. Only `LOGGER`, `SPLUNK_URL`, `SPLUNK_TOKEN` and `SPLUNK_SKIPTLSVERIFY` are required in this example. The complete list of options is in the [Splunk options reference table](#splunk-options-reference). -1. In the Splunk Web interface, navigate to the [search page](http://localhost:8080/en-US/app/search/search). - Type `index="besu"` in the search field. - Log events sent by Besu are displayed. +4. In the Splunk Web interface, navigate to the [search page](http://localhost:8080/en-US/app/search/search). Type `index="besu"` in the search field. Log events sent by Besu are displayed. Congratulations! You can now play with the search and other Splunk features to explore your Besu logs. ![Splunk search page](../../../assets/images/splunk-ui.png) -1. Stop Besu with ++ctrl+c++. - Stop the Splunk container with `docker stop splunk-demo`. +5. Stop Besu with ++ctrl+c++. Stop the Splunk container with `docker stop splunk-demo`. ## Run a Splunk Enterprise instance @@ -154,33 +162,31 @@ Docker Compose environment provided by Splunk. ### Steps -1. Follow the steps in the [Splunk Enterprise documentation](https://docs.splunk.com/Documentation/Splunk/8.0.4/Installation) - to download, install, and run Splunk Enterprise. +1. Follow the steps in the [Splunk Enterprise documentation](https://docs.splunk.com/Documentation/Splunk/8.0.4/Installation) to download, install, and run Splunk Enterprise. 1. After logging into the Splunk Enterprise Web interface, navigate to the settings to: - 1. [Create an HTTP Event Collector](https://docs.splunk.com/Documentation/Splunk/8.0.4/Data/UsetheHTTPEventCollector). - 1. [Create an event index] named `besu`. + 1. [Create an HTTP Event Collector](https://docs.splunk.com/Documentation/Splunk/8.0.4/Data/UsetheHTTPEventCollector). + 1. [Create an event index] named `besu`. -1. Run Besu as in step 3 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). - Set the `SPLUNK_URL` value to match the HTTP Event Collector address and port. +1. Run Besu as in step 3 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). Set the `SPLUNK_URL` value to match the HTTP Event Collector address and port. - You can display logs and use the search engine as in step 4 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). + You can display logs and use the search engine as in step 4 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). ## Splunk options reference -| Name | Description | Required | -|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|----------| -| LOGGER | Set to `Splunk` to activate sending logs to Splunk. | Yes | -| HOST | Current host. If in a Docker environment, the default value is the docker container ID. Otherwise, the default value is `localhost`. | No | -| SPLUNK_URL | URL of the Splunk HTTP Event Collector. For example, use `https://localhost:8088` | Yes | -| SPLUNK_TOKEN | Authentication token, usually of the form `11111111-1111-1111-1111-111111111111` | Yes | -| SPLUNK_INDEX | [Index](https://docs.splunk.com/Splexicon:Index) to store logs. Defaults to `besu` | No | -| SPLUNK_SOURCE | [Source of the logs](https://docs.splunk.com/Splexicon:Source). Defaults to `besu` | No | -| SPLUNK_SOURCETYPE | [Source type of the logs](https://docs.splunk.com/Splexicon:Sourcetype). Defaults to `besu` | No | -| SPLUNK_BATCH_SIZE_BYTES | Size of a log batch in bytes. Defaults to `65536` | No | -| SPLUNK_BATCH_SIZE_COUNT | Size of a log batch in number of events. Defaults to `1000` | No | -| SPLUNK_BATCH_INTERVAL | Interval at which to send log batches. Defaults to `500` | No | -| SPLUNK_SKIPTLSVERIFY | Whether to check the Splunk instance TLS certificate when sending data. Defaults to `false` | No | +| Name | Description | Required | +| --- | --- | --- | +| LOGGER | Set to `Splunk` to activate sending logs to Splunk. | Yes | +| HOST | Current host. If in a Docker environment, the default value is the docker container ID. Otherwise, the default value is `localhost`. | No | +| SPLUNK_URL | URL of the Splunk HTTP Event Collector. For example, use `https://localhost:8088` | Yes | +| SPLUNK_TOKEN | Authentication token, usually of the form `11111111-1111-1111-1111-111111111111` | Yes | +| SPLUNK_INDEX | [Index](https://docs.splunk.com/Splexicon:Index) to store logs. Defaults to `besu` | No | +| SPLUNK_SOURCE | [Source of the logs](https://docs.splunk.com/Splexicon:Source). Defaults to `besu` | No | +| SPLUNK_SOURCETYPE | [Source type of the logs](https://docs.splunk.com/Splexicon:Sourcetype). Defaults to `besu` | No | +| SPLUNK_BATCH_SIZE_BYTES | Size of a log batch in bytes. Defaults to `65536` | No | +| SPLUNK_BATCH_SIZE_COUNT | Size of a log batch in number of events. Defaults to `1000` | No | +| SPLUNK_BATCH_INTERVAL | Interval at which to send log batches. Defaults to `500` | No | +| SPLUNK_SKIPTLSVERIFY | Whether to check the Splunk instance TLS certificate when sending data. Defaults to `false` | No | [Create an event index]: https://docs.splunk.com/Documentation/Splunk/8.0.4/Indexer/Setupmultipleindexes#Create_events_indexes diff --git a/docs/private-networks/how-to/send-transactions/_category_.json b/docs/private-networks/how-to/send-transactions/_category_.json new file mode 100644 index 00000000000..a663c5c6ed7 --- /dev/null +++ b/docs/private-networks/how-to/send-transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create and send transactions", + "position": 2 +} diff --git a/docs/private-networks/how-to/send-transactions/concurrent-private-transactions.md b/docs/private-networks/how-to/send-transactions/concurrent-private-transactions.md index fec907309e9..a1fb71eb48a 100644 --- a/docs/private-networks/how-to/send-transactions/concurrent-private-transactions.md +++ b/docs/private-networks/how-to/send-transactions/concurrent-private-transactions.md @@ -1,42 +1,37 @@ --- +title: Send concurrent private transactions description: Creating and sending concurrent private transactions with Hyperledger Besu +sidebar_position: 2 +tags: + - private networks --- # Send concurrent private transactions -Private transaction processing involves two transactions, the private transaction and the -[privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md). -The private transaction and the PMT each have their own [nonce](../../concepts/privacy/private-transactions/index.md#nonces). +Private transaction processing involves two transactions, the private transaction and the [privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md). The private transaction and the PMT each have their own [nonce](../../concepts/privacy/private-transactions/index.md#nonces). -If your private transaction rate requires sending private transactions without waiting for the previous -private transaction to be mined, using [`eth_getTransactionCount`](../../../public-networks/reference/api/index.md#eth_gettransactioncount) -and [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) may result in -[incorrect nonces](../../concepts/privacy/private-transactions/index.md#private-nonce-management). +If your private transaction rate requires sending private transactions without waiting for the previous private transaction to be mined, using [`eth_getTransactionCount`](../../../public-networks/reference/api/index.md#eth_gettransactioncount) and [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) may result in [incorrect nonces](../../concepts/privacy/private-transactions/index.md#private-nonce-management). -In this case, use [`priv_distributeRawTransaction`](private-transactions.md#priv_distributerawtransaction) -instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). +In this case, use [`priv_distributeRawTransaction`](private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). -!!! note +:::note - You can use [`priv_getTransactionCount`](../../reference/api/index.md#priv_gettransactioncount) or - [`priv_getEeaTransactionCount`](../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for - an account for the specified privacy group or participants. +You can use [`priv_getTransactionCount`](../../reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for an account for the specified privacy group or participants. -Send the corresponding PMT using [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), -specifying the public PMT nonce. -This method allows you to create and send the PMT yourself rather than -[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) handling the PMT. +::: -!!! important +Send the corresponding PMT using [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), specifying the public PMT nonce. This method allows you to create and send the PMT yourself rather than [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) handling the PMT. - When using `priv_distributeRawTransaction` to distribute transactions with consecutive nonces for the same account, - the corresponding PMTs must use one account with the nonces in the same order as the private transactions. - This is to ensure that the private transactions are executed in the correct order. +:::caution -!!! example +When using `priv_distributeRawTransaction` to distribute transactions with consecutive nonces for the same account, the corresponding PMTs must use one account with the nonces in the same order as the private transactions. - The [web3js-quorum library](https://github.com/ConsenSys/web3js-quorum/tree/master/example/concurrentPrivateTransactions) - includes an example of how to send concurrent private transactions. - The example uses [offchain privacy groups](../../concepts/privacy/privacy-groups.md). - Use [`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress) to get the - precompile address to specify in the `to` field when creating the PMT. +This is to ensure that the private transactions are executed in the correct order. + +::: + +:::info + +The [web3js-quorum library](https://github.com/ConsenSys/web3js-quorum/tree/master/example/concurrentPrivateTransactions) includes an example of how to send concurrent private transactions. The example uses [offchain privacy groups](../../concepts/privacy/privacy-groups.md). Use [`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress) to get the precompile address to specify in the `to` field when creating the PMT. + +::: diff --git a/docs/private-networks/how-to/send-transactions/index.md b/docs/private-networks/how-to/send-transactions/index.md index 5bc3b015e27..3f9920a3d31 100644 --- a/docs/private-networks/how-to/send-transactions/index.md +++ b/docs/private-networks/how-to/send-transactions/index.md @@ -1,11 +1,13 @@ --- +title: Create and send transactions description: private networks send transactions overview +tags: + - private networks --- # Create and send transactions -In private networks, you can create and [send regular transactions](../../../public-networks/how-to/send-transactions.md) -as in public networks. +In private networks, you can create and [send regular transactions](../../../public-networks/how-to/send-transactions.md) as in public networks. You can also: diff --git a/docs/private-networks/how-to/send-transactions/private-transactions.md b/docs/private-networks/how-to/send-transactions/private-transactions.md index c298103af16..cdeb49aec37 100644 --- a/docs/private-networks/how-to/send-transactions/private-transactions.md +++ b/docs/private-networks/how-to/send-transactions/private-transactions.md @@ -1,165 +1,140 @@ --- +title: Create and send private transactions description: Creating and sending private transactions with Hyperledger Besu +sidebar_position: 1 +tags: + - private networks --- # Create and send private transactions Create and send [private transactions](../../concepts/privacy/index.md) using: -* [web3js-quorum client library](../use-privacy/web3js-quorum.md) or - [web3j client library](https://github.com/web3j/web3j) -* [`eea_sendTransaction` with EthSigner](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction) -* [`eea_sendRawTransaction`](#eea_sendrawtransaction) -* [`priv_distributeRawTransaction`](#priv_distributerawtransaction). +- [web3js-quorum client library](../use-privacy/web3js-quorum.md) or [web3j client library](https://github.com/web3j/web3j) +- [`eea_sendTransaction` with EthSigner](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction) +- [`eea_sendRawTransaction`](#eea_sendrawtransaction) +- [`priv_distributeRawTransaction`](#priv_distributerawtransaction). -All private transaction participants must be online for a private transaction to be successfully -distributed. If any participants are offline when submitting the private transaction, the -transaction is not attempted and you must resubmit the transaction. +All private transaction participants must be online for a private transaction to be successfully distributed. If any participants are offline when submitting the private transaction, the transaction is not attempted and you must resubmit the transaction. -The `gas` and `gasPrice` specified when sending a private transaction are used by the -[privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md), not the private transaction itself. +The `gas` and `gasPrice` specified when sending a private transaction are used by the [privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md), not the private transaction itself. -!!! note +:::note - Private transactions either deploy contracts or call contract functions. Ether transfer - transactions cannot be private. +Private transactions either deploy contracts or call contract functions. Ether transfer transactions cannot be private. -## `eea_sendRawTransaction` +::: -[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) distributes the -private transaction to the participating nodes, and signs and submits the PMT, as described in -[Private transaction processing](../../concepts/privacy/private-transactions/processing.md). +## eea_sendRawTransaction -!!! note +[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) distributes the private transaction to the participating nodes, and signs and submits the PMT, as described in [Private transaction processing](../../concepts/privacy/private-transactions/processing.md). - If [sending concurrent transactions](concurrent-private-transactions.md), you must use - [`priv_distributeRawTransaction`](#priv_distributerawtransaction) instead of - [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). +:::note -## `priv_distributeRawTransaction` +If [sending concurrent transactions](concurrent-private-transactions.md), you must use [`priv_distributeRawTransaction`](#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). -Use [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) instead of -[`eea_sendRawTransaction`](#eea_sendrawtransaction) when sending [concurrent private transactions](concurrent-private-transactions.md). +::: -[`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) -distributes the private transaction to the participating nodes but does not sign and submit the PMT. -That is, it performs steps 1 to 5 of [private transaction processing](../../concepts/privacy/private-transactions/processing.md). +## priv_distributeRawTransaction -If using -[`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) -instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction), use -the value returned by -[`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction), -which is the enclave key to the private transaction in [Tessera](https://docs.tessera.consensys.net/), -in the `data` field of a call to -[`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction). -Use the value returned by -[`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress), which is the -address of the [privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md), in the `to` -field of the call. +Use [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction) when sending [concurrent private transactions](concurrent-private-transactions.md). -By using the [public Ethereum transaction](../../how-to/send-transactions/index.md), -[`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), you are signing -and submitting the PMT yourself instead of having it signed by the Besu node, giving you greater control over the PMT. +[`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) distributes the private transaction to the participating nodes but does not sign and submit the PMT. That is, it performs steps 1 to 5 of [private transaction processing](../../concepts/privacy/private-transactions/processing.md). -!!! warning +If using [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction), use the value returned by [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction), which is the enclave key to the private transaction in [Tessera](https://docs.tessera.consensys.net/), in the `data` field of a call to [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction). Use the value returned by [`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress), which is the address of the [privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md), in the `to` field of the call. - If the PMT is not sent after distributing the private transaction, the distributed private transaction is not - executed and the private states are not updated. +By using the [public Ethereum transaction](../../how-to/send-transactions/index.md), [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), you are signing and submitting the PMT yourself instead of having it signed by the Besu node, giving you greater control over the PMT. -!!! example +:::warning - Distribute private transaction using `priv_distributeRawTransaction`: +If the PMT is not sent after distributing the private transaction, the distributed private transaction is not executed and the private states are not updated. - ```json - { - "jsonrpc":"2.0", - "method":"priv_distributeRawTransaction", - "params":["0xf90198808203e8832dc6c08080b8fb608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c003600291ba05393543d483654fd01d9ee818cddfc7527dd6e13e6ef7b45a61e2ca13ffb6b70a0452338873862803ffe04056aea98cd0e3417ff971dcb384e54fce8ca1756a665a09de8260dc3763f8383a6a9ffe96909d36cd3ff4c346e3846a6467c50feaf0119e1a0839f41993789227ec721c9eaf1541683287fa436ef6edd9ec8fd088bad1a0c3c8a72657374726963746564"], - "id":1 - } - ``` +::: - Enclave key to the private transaction in Tessera returned by `priv_distributeRawTransaction`: +```json title="Distribute private transaction using priv_distributeRawTransaction" +{ + "jsonrpc": "2.0", + "method": "priv_distributeRawTransaction", + "params": [ + "0xf90198808203e8832dc6c08080b8fb608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c003600291ba05393543d483654fd01d9ee818cddfc7527dd6e13e6ef7b45a61e2ca13ffb6b70a0452338873862803ffe04056aea98cd0e3417ff971dcb384e54fce8ca1756a665a09de8260dc3763f8383a6a9ffe96909d36cd3ff4c346e3846a6467c50feaf0119e1a0839f41993789227ec721c9eaf1541683287fa436ef6edd9ec8fd088bad1a0c3c8a72657374726963746564" + ], + "id": 1 +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" - } - ``` +```json title="Enclave key to the private transaction in Tessera returned by priv_distributeRawTransaction" +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" +} +``` - Send the enclave key in the `data` field, and the [privacy precompile address](../../reference/api/index.md#priv_getprivacyprecompileaddress) in the `to` field of `eth_sendRawTransaction`: +Send the enclave key in the `data` field, and the [privacy precompile address](../../reference/api/index.md#priv_getprivacyprecompileaddress) in the `to` field of `eth_sendRawTransaction`: - ```json +```json +{ + "jsonrpc": "2.0", + "method": "eth_sendRawTransaction", + "params": [ { - "jsonrpc":"2.0", - "method":"eth_sendRawTransaction", - "params":[{ - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "to": "0x000000000000000000000000000000000000007e", - "data": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b", - "gas": "0x2E1800", - "gasPrice": "0x9184e72a000" - }], - "id":1 + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "to": "0x000000000000000000000000000000000000007e", + "data": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b", + "gas": "0x2E1800", + "gasPrice": "0x9184e72a000" } - ``` + ], + "id": 1 +} +``` ## EEA-compliant or Besu-extended privacy -To create an [EEA-compliant private transaction], specify `privateFor` when creating the signed -transaction passed as an input parameter to -[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). +To create an [EEA-compliant private transaction], specify `privateFor` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). -To create a [Besu-extended private transaction], specify a `privacyGroupId` when creating the -signed transaction passed as an input parameter to -[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). +To create a [Besu-extended private transaction], specify a `privacyGroupId` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). ## Unsigned and unencoded private transactions -The [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) parameter is -a signed RLP-encoded private transaction. Shown below are examples of unsigned and unencoded -private transactions to create a contract. - -!!! example "Unencoded and unsigned EEA-compliant private transaction" - - ``` - { - "to": null, - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0x7600", - "gasPrice": "0x0", - "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", - "nonce": "0x0", - "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", - "privateFor": ["g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=","6fg8q5rWMBoAT2oIiU3tYJbk4b7oAr7dxaaVY7TeM3U="], - "restriction": "restricted" - } - ``` - -!!! example "Unencoded and unsigned Besu-extended private transaction" - - ``` - { - "to": null, - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0x7600", - "gasPrice": "0x0", - "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", - "nonce": "0x0", - "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", - "privacyGroupId": "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=", - "restriction": "restricted" - } - ``` - -!!! tip - - The `example` directory in the - [web3js-quorum client library](../use-privacy/web3js-quorum.md) contains examples of - signing and encoding private transactions. +The [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) parameter is a signed RLP-encoded private transaction. Shown below are examples of unsigned and unencoded private transactions to create a contract. + +```json title="Unencoded and unsigned EEA-compliant private transaction" +{ + "to": null, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x7600", + "gasPrice": "0x0", + "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "nonce": "0x0", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privateFor": [ + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=", + "6fg8q5rWMBoAT2oIiU3tYJbk4b7oAr7dxaaVY7TeM3U=" + ], + "restriction": "restricted" +} +``` + +```json title="Unencoded and unsigned Besu-extended private transaction" +{ + "to": null, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x7600", + "gasPrice": "0x0", + "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "nonce": "0x0", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privacyGroupId": "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=", + "restriction": "restricted" +} +``` + +:::tip + +The `example` directory in the [web3js-quorum client library](../use-privacy/web3js-quorum.md) contains examples of signing and encoding private transactions. + +::: diff --git a/docs/private-networks/how-to/send-transactions/revert-reason.md b/docs/private-networks/how-to/send-transactions/revert-reason.md index a54f8a10907..b501e3a09dc 100644 --- a/docs/private-networks/how-to/send-transactions/revert-reason.md +++ b/docs/private-networks/how-to/send-transactions/revert-reason.md @@ -1,145 +1,120 @@ --- +title: Include revert reason description: Including revert reason in transactions with Hyperledger Besu +sidebar_position: 3 +tags: + - private networks --- # Revert reason -In smart contracts, the -[`revert`](https://docs.soliditylang.org/en/v0.8.12/control-structures.html#revert) operation -triggers an exception to flag an error and revert the current call. The EVM passes back to the -client an optional string message containing information about the error. - -!!! example - - ```sol - pragma solidity ^0.8.4; - - contract VendingMachine { - address owner; - constructor() { - owner = msg.sender; - } - error Unauthorized(); - function buy(uint amount) public payable { - if (amount > msg.value / 2 ether) - revert("Not enough Ether provided."); - // Alternative way to do it: - require( - amount <= msg.value / 2 ether, - "Not enough Ether provided." - ); - // Perform the purchase. - } - function withdraw() public { - if (msg.sender != owner) - revert Unauthorized(); - - payable(msg.sender).transfer(address(this).balance); - } - } - ``` - -## Enable revert reason +In smart contracts, the [`revert`](https://docs.soliditylang.org/en/v0.8.12/control-structures.html#revert) operation triggers an exception to flag an error and revert the current call. The EVM passes back to the client an optional string message containing information about the error. -Use the [`--revert-reason-enabled`](../../../public-networks/reference/cli/options.md#revert-reason-enabled) -command line option to include the revert reason in the transaction receipt, -[`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) error, -[`eth_call`](../../../public-networks/reference/api/index.md#eth_call) error, and -[`trace`](../../../public-networks/reference/trace-types.md#trace) response in Hyperledger Besu. +```sol +pragma solidity ^0.8.4; -!!! caution +contract VendingMachine { + address owner; + constructor() { + owner = msg.sender; + } + error Unauthorized(); + function buy(uint amount) public payable { + if (amount > msg.value / 2 ether) + revert("Not enough Ether provided."); + // Alternative way to do it: + require( + amount <= msg.value / 2 ether, + "Not enough Ether provided." + ); + // Perform the purchase. + } + function withdraw() public { + if (msg.sender != owner) + revert Unauthorized(); - Enabling revert reason may use a significant amount of memory. We do not recommend enabling - revert reason when connected to public Ethereum networks. + payable(msg.sender).transfer(address(this).balance); + } +} +``` -## Where the revert reason is included +## Enable revert reason -With revert reason enabled, the transaction receipt returned by -[`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt) includes -the revert reason as an ABI-encoded string. +Use the [`--revert-reason-enabled`](../../../public-networks/reference/cli/options.md#revert-reason-enabled) command line option to include the revert reason in the transaction receipt, [`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) error, [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) error, and [`trace`](../../../public-networks/reference/trace-types.md#trace) response in Hyperledger Besu. -!!! important +:::caution - The revert reason is not included in the transactions receipt's root hash. Not including the - revert reason in the transactions receipt's root hash means the revert reason is only available - to nodes that execute the transaction when importing the block. That is, the revert reason is - not available if using fast synchronization - ([`--sync-mode=FAST`](../../../public-networks/reference/cli/options.md#sync-mode)). +Enabling revert reason may use a significant amount of memory. We do not recommend enabling revert reason when connected to public Ethereum networks. -!!! example +::: - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", - "blockNumber": "0x50", - "contractAddress": null, - "cumulativeGasUsed": "0x5208", - "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", - "gasUsed": "0x5208", - "logs": [], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "status": "0x1", - "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", - "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", - "transactionIndex": "0x0","revertReason":"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" - } - } - ``` +## Where the revert reason is included -The error returned by [`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) and -[`eth_call`](../../../public-networks/reference/api/index.md#eth_call) includes the revert reason as an ABI-encoded string in the `data` field. +With revert reason enabled, the transaction receipt returned by [`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt) includes the revert reason as an ABI-encoded string. + +:::info + +The revert reason is not included in the transactions receipt's root hash. Not including the revert reason in the transactions receipt's root hash means the revert reason is only available to nodes that execute the transaction when importing the block. That is, the revert reason is not available if using fast synchronization ([`--sync-mode=FAST`](../../../public-networks/reference/cli/options.md#sync-mode)). + +::: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": null, + "cumulativeGasUsed": "0x5208", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gasUsed": "0x5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", + "transactionIndex": "0x0", + "revertReason": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" + } +} +``` -!!! example "Example of `eth_estimateGas` and `eth_call` error" +The error returned by [`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) and [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) includes the revert reason as an ABI-encoded string in the `data` field. - ```json - { - "jsonrpc": "2.0", - "id": 3, - "error": { - "code": -32000, - "message": "Execution reverted", - "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" - } - } - ``` +```json title="Exampleof `eth_estimateGas`and`eth_call` error" { "jsonrpc": "2.0", "id": 3, "error": { "code": -32000, "message": "Execution reverted", "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" } } -The list items in the [`trace`](../../../public-networks/reference/trace-types.md#trace) response returned by -[`trace_replayBlockTransactions`](../../../public-networks/reference/api/index.md#trace_replayblocktransactions), -[`trace_block`](../../../public-networks/reference/api/index.md#trace_block), and -[`trace_transaction`](../../../public-networks/reference/api/index.md#trace_transaction) include the revert reason as an ABI-encoded string. +```` -!!! example "Example of `trace` response list item" +The list items in the [`trace`](../../../public-networks/reference/trace-types.md#trace) response returned by [`trace_replayBlockTransactions`](../../../public-networks/reference/api/index.md#trace_replayblocktransactions), [`trace_block`](../../../public-networks/reference/api/index.md#trace_block), and [`trace_transaction`](../../../public-networks/reference/api/index.md#trace_transaction) include the revert reason as an ABI-encoded string. - ```json +```json title="Example of `trace` response list item" +{ + "jsonrpc": "2.0", + "id": 415, + "result": [ { - "jsonrpc": "2.0", - "id": 415, - "result": [ - { - "action": { - "callType": "call", - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0xffadea", - "input": "0x", - "to": "0x0110000000000000000000000000000000000000", - "value": "0x0" - }, - "blockHash": "0x220bc13dc4f1ed38dcca927a5be15eca16497d279f4c40d7b8fe9704eadf1464", - "blockNumber": 18, - "error": "Reverted", - "revertReason": "0x7d88c1856cc95352", - "subtraces": 0, - "traceAddress": [], - "transactionHash": "0xc388baa0e55e6b73e850b22dc7e9853700f6b995fd55d95dd6ccd5a13d63c566", - "transactionPosition": 1, - "type": "call" - } - ] + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffadea", + "input": "0x", + "to": "0x0110000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x220bc13dc4f1ed38dcca927a5be15eca16497d279f4c40d7b8fe9704eadf1464", + "blockNumber": 18, + "error": "Reverted", + "revertReason": "0x7d88c1856cc95352", + "subtraces": 0, + "traceAddress": [], + "transactionHash": "0xc388baa0e55e6b73e850b22dc7e9853700f6b995fd55d95dd6ccd5a13d63c566", + "transactionPosition": 1, + "type": "call" } - ``` + ] +} +```` ## Revert reason format @@ -152,17 +127,14 @@ As described in the [Solidity documentation], the revert reason is an ABI-encode 0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data ``` -!!! example "Example of revert reason string for \"Not enough Ether provided.\"" - - ```bash - "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" - ``` +```bash title="Example of revert reason string for 'Not enough Ether provided' " +"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" +``` ## Dapp support -Client libraries, such as web3j, do not support extracting the revert reason from the transaction -receipt. To extract the revert reason your dapp must interact directly with Besu using a custom -JSON -> Object converter. +Client libraries, such as web3j, do not support extracting the revert reason from the transaction receipt. To extract the revert reason your dapp must interact directly with Besu using a custom JSON -> Object converter. + [Solidity documentation]: https://docs.soliditylang.org/en/v0.8.12/control-structures.html#revert diff --git a/docs/private-networks/how-to/upgrade.md b/docs/private-networks/how-to/upgrade.md index 69e2fb3ee76..9d985eeb6e4 100644 --- a/docs/private-networks/how-to/upgrade.md +++ b/docs/private-networks/how-to/upgrade.md @@ -1,45 +1,44 @@ --- +title: Upgrade description: Upgrading protocol versions +sidebar_position: 8 +tags: + - private networks --- # Network and protocol upgrades -!!! important +:::info - Node upgrades upgrade your Besu client to a later version. - In private networks, you can [upgrade your node](../../public-networks/how-to/upgrade-node.md) - as in public networks. +Node upgrades upgrade your Besu client to a later version. In private networks, you can [upgrade your node](../../public-networks/how-to/upgrade-node.md) as in public networks. -Network upgrades are the mechanism for upgrading the Ethereum protocol. -Protocol upgrades occur during the network upgrades. +::: -For Ethereum Mainnet and public testnets, the milestone block definitions are included in Besu. -Upgrading your Besu client applies the network upgrade. +Network upgrades are the mechanism for upgrading the Ethereum protocol. Protocol upgrades occur during the network upgrades. -For private networks, all network participants must agree on the protocol upgrades and coordinate -the network upgrades. -The genesis file specifies the milestone block at which to apply the protocol upgrade. +For Ethereum Mainnet and public testnets, the milestone block definitions are included in Besu. Upgrading your Besu client applies the network upgrade. + +For private networks, all network participants must agree on the protocol upgrades and coordinate the network upgrades. The genesis file specifies the milestone block at which to apply the protocol upgrade. ## Upgrade the protocol To upgrade the protocol in a private network: -1. Review included EIPs for breaking changes. - A [meta EIP](https://eips.ethereum.org/meta) for each protocol upgrade lists included EIPs. - For example, [Istanbul](https://eips.ethereum.org/EIPS/eip-1679). +1. Review included EIPs for breaking changes. A [meta EIP](https://eips.ethereum.org/meta) for each protocol upgrade lists included EIPs. For example, [Istanbul](https://eips.ethereum.org/EIPS/eip-1679). 1. Network participants agree on the block number at which to upgrade. 1. For each node in the network: - 1. Add the [milestone block number](../../public-networks/reference/genesis-items.md#milestone-blocks) - to the genesis file. - 1. Restart the node before reaching milestone block. + 1. Add the [milestone block number](../../public-networks/reference/genesis-items.md#milestone-blocks) to the genesis file. + 1. Restart the node before reaching milestone block. + +:::caution + +To avoid a forked network, all network participants must update their genesis file to include the agreed on milestone block and restart their node before reaching the milestone block. -!!! caution +::: - To avoid a forked network, all network participants must update their genesis file to include - the agreed on milestone block and restart their node before reaching the milestone block. +:::tip -!!! tip "Tips" +- For compatibility with future protocol upgrades, don't hardcode any gas price assumptions. +- Implementing upgradeable contracts enables contracts to be upgraded if a protocol upgrade does include breaking changes. - - For compatibility with future protocol upgrades, don't hardcode any gas price assumptions. - - Implementing upgradeable contracts enables contracts to be upgraded if a protocol upgrade does - include breaking changes. +::: diff --git a/docs/private-networks/how-to/use-permissioning/_category_.json b/docs/private-networks/how-to/use-permissioning/_category_.json new file mode 100644 index 00000000000..cbca3cfba02 --- /dev/null +++ b/docs/private-networks/how-to/use-permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use permissioning", + "position": 5 +} diff --git a/docs/private-networks/how-to/use-permissioning/local.md b/docs/private-networks/how-to/use-permissioning/local.md index 53cd22ab12c..c1269a66d9e 100644 --- a/docs/private-networks/how-to/use-permissioning/local.md +++ b/docs/private-networks/how-to/use-permissioning/local.md @@ -1,5 +1,9 @@ --- +title: Use local permissioning +sidebar_position: 1 description: Hyperledger Besu local permissioning +tags: + - private networks --- # Use local permissioning @@ -8,225 +12,180 @@ description: Hyperledger Besu local permissioning ## Node allowlisting -You can allow access to specified nodes in the -[permissions configuration file](#permissions-configuration-file). With node allowlisting -enabled, communication is only between nodes in the allowlist. +You can allow access to specified nodes in the [permissions configuration file](#permissions-configuration-file). With node allowlisting enabled, communication is only between nodes in the allowlist. -!!! important +:::info - Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option - to enable domain name support. +Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option to enable domain name support. - If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can - connect to a container after being restarted, even if the IP address of the container changes. +If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can connect to a container after being restarted, even if the IP address of the container changes. -!!! example "Nodes allowlist in the permissions configuration file" +::: - `nodes-allowlist=["enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.168.0.9:4567","enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.169.0.9:4568"]` +:::info Nodes allowlist in the permissions configuration file -Node allowlisting is at the node level. That is, each node in the network has a -[permissions configuration file](#permissions-configuration-file) file in the -[data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. +`nodes-allowlist=["enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.168.0.9:4567","enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.169.0.9:4568"]` -Local permissioning doesn't check that the node using the permissions configuration file is listed in the -allowlist, it only checks that the remote end of the connection is in the allowlist. Use [onchain permissioning] if you -need to check both ends of the connection. +::: + +Node allowlisting is at the node level. That is, each node in the network has a [permissions configuration file](#permissions-configuration-file) file in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +Local permissioning doesn't check that the node using the permissions configuration file is listed in the allowlist, it only checks that the remote end of the connection is in the allowlist. Use [onchain permissioning] if you need to check both ends of the connection. ### Specify bootnodes in the allowlist -The nodes permissions list must include the [bootnodes](../configure/bootnodes.md) or Hyperledger Besu doesn't -start with node permissions enabled. +The nodes permissions list must include the [bootnodes](../configure/bootnodes.md) or Hyperledger Besu doesn't start with node permissions enabled. -!!! example +If you start Besu with specified bootnodes and have node permissioning enabled: - If you start Besu with specified bootnodes and have node permissioning enabled: +```bash +--bootnodes="enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305" +``` - ```bash - --bootnodes="enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305" - ``` +The `nodes-allowlist` in the [permissions configuration file](#permissions-configuration-file) must contain the specified bootnodes. - The `nodes-allowlist` in the [permissions configuration file](#permissions-configuration-file) - must contain the specified bootnodes. +:::tip -!!! tip +If your node has two different IP addresses for ingress and egress (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. - If your node has two different IP addresses for ingress and egress - (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), - add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. +::: ### Enable node allowlisting -To enable node allowlisting, specify the -[`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) -option when starting Besu. +To enable node allowlisting, specify the [`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) option when starting Besu. -The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the -[`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or -[`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. +The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. ### Update the node allowlist To update the nodes allowlist while the node is running, use the following JSON-RPC API methods: -* [perm_addNodesToAllowlist](../../reference/api/index.md#perm_addnodestoallowlist) -* [perm_removeNodesFromAllowlist](../../reference/api/index.md#perm_removenodesfromallowlist) +- [perm_addNodesToAllowlist](../../reference/api/index.md#perm_addnodestoallowlist) +- [perm_removeNodesFromAllowlist](../../reference/api/index.md#perm_removenodesfromallowlist) -You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly -and then update the allowlist using the -[`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) -method. +You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly and then update the allowlist using the [`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) method. Updates to the permissions configuration file persist across node restarts. ### View the node allowlist -To view the nodes allowlist, use the -[perm_getNodesAllowlist](../../reference/api/index.md#perm_getnodesallowlist) method. +To view the nodes allowlist, use the [perm_getNodesAllowlist](../../reference/api/index.md#perm_getnodesallowlist) method. -!!! note +:::note - Each node has a [permissions configuration file](#permissions-configuration-file), which means - nodes can have different nodes allowlists. This means nodes might be participating in the - network that are not on the allowlist of other nodes in the network. We recommend each node in - the network has the same nodes allowlist. +Each node has a [permissions configuration file](#permissions-configuration-file), which means nodes can have different nodes allowlists. This means nodes might be participating in the network that are not on the allowlist of other nodes in the network. We recommend each node in the network has the same nodes allowlist. -!!! example "Example of different node allowlists" +::: - Node 1 Allowlist = [Node 2, Node 3] +```bash Example of different node allowlists - Node 2 Allowlist = [Node 3, Node 5] +Node 1 Allowlist = [Node 2, Node 3] - Node 5 is participating in the same network as Node 1 even though Node 1 does not have Node 5 - on their allowlist. +Node 2 Allowlist = [Node 3, Node 5] + +Node 5 is participating in the same network as Node 1 even though Node 1 does not have Node 5 +on their allowlist. +``` ## Account allowlisting -You can specify accounts in the accounts allowlist in the -[permissions configuration file](#permissions-configuration-file). A node with account -permissioning accepts transactions only from accounts in the accounts allowlist. +You can specify accounts in the accounts allowlist in the [permissions configuration file](#permissions-configuration-file). A node with account permissioning accepts transactions only from accounts in the accounts allowlist. + +:::info Accounts allowlist in the permissions configuration file -!!! example "Accounts allowlist in the permissions configuration file" +`accounts-allowlist=["0x0000000000000000000000000000000000000009"]` - `accounts-allowlist=["0x0000000000000000000000000000000000000009"]` +::: -Account allowlisting is at the node level. That is, each node in the network has a -[permissions configuration file](#permissions-configuration-file) in the -[data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. +Account allowlisting is at the node level. That is, each node in the network has a [permissions configuration file](#permissions-configuration-file) in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. -!!! caution "Using account permissioning and privacy" +:::caution Using account permissioning and privacy - Account permissioning is incompatible with - [random key signing](../use-privacy/sign-pmts.md) for - [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md). +Account permissioning is incompatible with [random key signing](../use-privacy/sign-pmts.md) for [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md). - If using account permissioning and privacy, a signing key must be specified using the - [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) - command line option and the corresponding public key included in the accounts allowlist. +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: Transaction validation against the accounts allowlist occurs at the following points: -* Submitted by JSON-RPC API method - [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) -* Received via propagation from another node -* Added to a block by a mining node +- Submitted by JSON-RPC API method [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) +- Received via propagation from another node +- Added to a block by a mining node -After adding transactions to a block, the transactions are not validated against the allowlist -when received by another node. That is, a node can synchronize and add blocks containing -transactions from accounts that are not on the accounts allowlist of that node. +After adding transactions to a block, the transactions are not validated against the allowlist when received by another node. That is, a node can synchronize and add blocks containing transactions from accounts that are not on the accounts allowlist of that node. The following diagram illustrates applying local and onchain permissioning rules. ![Permissioning Flow](../../../assets/images/PermissioningFlow.png) -!!! example "Example of different account allowlists" +```bash title="Example of different account allowlists" + +Node 1 Allowlist = [Account A, Account B] - Node 1 Allowlist = [Account A, Account B] +Node 2 Allowlist = [Account B, Account C] - Node 2 Allowlist = [Account B, Account C] +Mining Node Allowlist = [Account A, Account B] - Mining Node Allowlist = [Account A, Account B] +Account A submits a transaction on Node 1. Node 1 validates and propagates the transaction. The +Mining Node receives the transaction, validates it is from an account in the Mining Node +accounts allowlist, and includes the transaction in the block. Node 2 receives and adds +the block created by the Mining Node. - Account A submits a transaction on Node 1. Node 1 validates and propagates the transaction. The - Mining Node receives the transaction, validates it is from an account in the Mining Node - accounts allowlist, and includes the transaction in the block. Node 2 receives and adds - the block created by the Mining Node. +Node 2 now has a transaction in the blockchain from Account A, which is not on the accounts +allowlist for Node 2. - Node 2 now has a transaction in the blockchain from Account A, which is not on the accounts - allowlist for Node 2. +``` -!!! note +:::note - Each node has a [permissions configuration file](#permissions-configuration-file) which means - nodes in the network can have different accounts allowlists. This means a transaction can - be successfully submitted by Node A from an account in the Node A allowlist but rejected - by Node B to which it's propagated if the account is not in the Node B allowlist. We - recommend each node in the network has the same accounts allowlist. +Each node has a [permissions configuration file](#permissions-configuration-file) which means nodes in the network can have different accounts allowlists. This means a transaction can be successfully submitted by Node A from an account in the Node A allowlist but rejected by Node B to which it's propagated if the account is not in the Node B allowlist. We recommend each node in the network has the same accounts allowlist. + +::: ### Enable account allowlisting -To enable account allowlisting, specify the -[`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled) -option when starting Besu. +To enable account allowlisting, specify the [`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled) option when starting Besu. -The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the -[`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or -[`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. +The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. ### Update the account allowlist To update the accounts allowlist when the node is running, use the JSON-RPC API methods: -* [`perm_addAccountsToAllowlist`](../../reference/api/index.md#perm_addaccountstoallowlist) -* [`perm_removeAccountsFromAllowlist`](../../reference/api/index.md#perm_removeaccountsfromallowlist). +- [`perm_addAccountsToAllowlist`](../../reference/api/index.md#perm_addaccountstoallowlist) +- [`perm_removeAccountsFromAllowlist`](../../reference/api/index.md#perm_removeaccountsfromallowlist). -You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly -and use the -[`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) -method to update the allowlists. +You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly and use the [`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) method to update the allowlists. Updates to the permissions configuration file persist across node restarts. ### View the account allowlist -To view the accounts allowlist, use the -[`perm_getAccountsAllowlist`](../../reference/api/index.md#perm_getaccountsallowlist) method. +To view the accounts allowlist, use the [`perm_getAccountsAllowlist`](../../reference/api/index.md#perm_getaccountsallowlist) method. ## Permissions configuration file -The permissions configuration file contains the nodes and accounts allowlists. If the -[`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) -and [`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) -options are not specified, the name of the permissions configuration file must be -[`permissions_config.toml`](#permissions-configuration-file) and must be in the -[data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. +The permissions configuration file contains the nodes and accounts allowlists. If the [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options are not specified, the name of the permissions configuration file must be [`permissions_config.toml`](#permissions-configuration-file) and must be in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. -You can specify the accounts and nodes allowlists in the same file or in separate files for -accounts and nodes. +You can specify the accounts and nodes allowlists in the same file or in separate files for accounts and nodes. -To specify a permissions configuration file (or separate files for accounts and nodes) in any -location, use the -[`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) -and -[`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) -options. +To specify a permissions configuration file (or separate files for accounts and nodes) in any location, use the [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options. -!!!note +:::note - The [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) - and [`permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) - options are not used when running Besu from the - [Docker image](../../get-started/install/run-docker-image.md). Use a bind mount to - [specify a permissions configuration file with Docker]. +The [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options are not used when running Besu from the [Docker image](../../get-started/install/run-docker-image.md). Use a bind mount to [specify a permissions configuration file with Docker]. -!!! example "Sample permissions configuration file" +::: - ```toml - accounts-allowlist=["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"] +```toml title="Sample permissions configuration file" +accounts-allowlist=["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"] - nodes-allowlist=["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305"] - ``` +nodes-allowlist=["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305"] +``` + [specify a permissions configuration file with Docker]: ../../get-started/install/run-docker-image.md [support domain names]: ../../../public-networks/concepts/node-keys.md#domain-name-support [onchain permissioning]: ../../concepts/permissioning/onchain.md diff --git a/docs/private-networks/how-to/use-permissioning/onchain.md b/docs/private-networks/how-to/use-permissioning/onchain.md index fcc35a70a0f..4b177026a20 100644 --- a/docs/private-networks/how-to/use-permissioning/onchain.md +++ b/docs/private-networks/how-to/use-permissioning/onchain.md @@ -1,62 +1,59 @@ --- +title: Use onchain permissioning +sidebar_position: 2 description: Use onchain permissioning allowlists +tags: + - private networks --- # Use onchain permissioning This page contains some extra info if you're using [onchain permissioning](../../concepts/permissioning/onchain.md). -!!! tip +:::tip - If your node has two different IP addresses for ingress and egress - (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), - add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. +If your node has two different IP addresses for ingress and egress (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. -!!! important +::: - Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option - to enable domain name support. +:::important - If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can - connect to a container after being restarted, even if the IP address of the container changes. +Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option to enable domain name support. -!!! tip +If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can connect to a container after being restarted, even if the IP address of the container changes. - If you add a running node, the node does not attempt to reconnect to the bootnode and - synchronize until peer discovery restarts. To add an allowlisted node as a peer without waiting - for peer discovery to restart, use - [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer). +::: - If you add the node to the allowlist before starting the node, using `admin_addPeer` is not - required because peer discovery is run on node startup. +:::tip -!!! tip +If you add a running node, the node does not attempt to reconnect to the bootnode and synchronize until peer discovery restarts. To add an allowlisted node as a peer without waiting for peer discovery to restart, use [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer). - If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) - and search for messages containing `Node permissioning` to identify the issue. +If you add the node to the allowlist before starting the node, using `admin_addPeer` is not required because peer discovery is run on node startup. - Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been - correctly configured for all nodes with the - externally accessible address. +::: - If you change your network configuration, you may need to update the node allowlist. +:::tip + +If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) and search for messages containing `Node permissioning` to identify the issue. + +Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been correctly configured for all nodes with the externally accessible address. + +If you change your network configuration, you may need to update the node allowlist. + +::: ## Specify the permissioning contract interface version -Use the [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version) -command line option to specify the version of the [permissioning contract interface](../../concepts/permissioning/onchain.md#permissioning-contracts). -The default is 1. +Use the [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version) command line option to specify the version of the [permissioning contract interface](../../concepts/permissioning/onchain.md#permissioning-contracts). The default is 1. -Specify the contract interface version that maps to the version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/) -the contract interface implements. +Specify the contract interface version that maps to the version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/) the contract interface implements. | | EEA Client Specification | Contract interface | -|:--------|:-------------------------|:-------------------| +| :------ | :----------------------- | :----------------- | | Version | 5 | 1 | | Version | 6 | 2 | -The permissioning contracts in the [`ConsenSys/permissioning-smart-contracts`](https://github.com/ConsenSys/permissioning-smart-contracts) -repository implement the version 2 contract interface. +The permissioning contracts in the [`ConsenSys/permissioning-smart-contracts`](https://github.com/ConsenSys/permissioning-smart-contracts) repository implement the version 2 contract interface. [support domain names]: ../../../public-networks/concepts/node-keys.md#domain-name-support [projects release page]: https://github.com/ConsenSys/permissioning-smart-contracts/releases/latest diff --git a/docs/private-networks/how-to/use-privacy/_category_.json b/docs/private-networks/how-to/use-privacy/_category_.json new file mode 100644 index 00000000000..f2a1d4ca864 --- /dev/null +++ b/docs/private-networks/how-to/use-privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use privacy", + "position": 4 +} diff --git a/docs/private-networks/how-to/use-privacy/access-private-transactions.md b/docs/private-networks/how-to/use-privacy/access-private-transactions.md index 3d2694820f7..611f57269a3 100644 --- a/docs/private-networks/how-to/use-privacy/access-private-transactions.md +++ b/docs/private-networks/how-to/use-privacy/access-private-transactions.md @@ -1,38 +1,33 @@ --- +title: Access private and privacy marker transactions description: Methods for accessing and managing private transactions and privacy groups in Hyperledger Besu +sidebar_position: 6 +tags: + - private networks --- # Access private and privacy marker transactions -A Hyperledger Besu private transaction creates a -[privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) and -the private transaction itself. +A Hyperledger Besu private transaction creates a [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) and the private transaction itself. ## Transaction receipts -With the transaction hash returned when submitting the private transaction, to get the transaction -receipt for the: +With the transaction hash returned when submitting the private transaction, to get the transaction receipt for the: -* Private transaction, use - [`priv_getTransactionReceipt`](../../reference/api/index.md#priv_gettransactionreceipt). -* Privacy marker transaction, use - [`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt). +- Private transaction, use [`priv_getTransactionReceipt`](../../reference/api/index.md#priv_gettransactionreceipt). +- Privacy marker transaction, use [`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt). -The transaction receipt includes a `status` indicating if the transaction failed (`0x0`), succeeded (`0x1`), or -was invalid (`0x2`). +The transaction receipt includes a `status` indicating if the transaction failed (`0x0`), succeeded (`0x1`), or was invalid (`0x2`). -!!! example "Private transaction failure example" +:::note Private transaction failure example - To deploy a private contract, you submit a transaction using - [`eea_sendRawTransaction`](../send-transactions/private-transactions.md). If - contract deployment fails because of insufficient gas, the privacy marker transaction receipt - has a status of success and the private transaction receipt has a status of failure. +To deploy a private contract, you submit a transaction using [`eea_sendRawTransaction`](../send-transactions/private-transactions.md). If contract deployment fails because of insufficient gas, the privacy marker transaction receipt has a status of success and the private transaction receipt has a status of failure. + +::: ## Transactions With the transaction hash returned when submitting the private transaction, to get the: -* Private transaction, use - [`priv_getPrivateTransaction`](../../reference/api/index.md#priv_getprivatetransaction). -* Privacy marker transaction, use - [`eth_getTransactionByHash`](../../../public-networks/reference/api/index.md#eth_gettransactionbyhash). +- Private transaction, use [`priv_getPrivateTransaction`](../../reference/api/index.md#priv_getprivatetransaction). +- Privacy marker transaction, use [`eth_getTransactionByHash`](../../../public-networks/reference/api/index.md#eth_gettransactionbyhash). diff --git a/docs/private-networks/how-to/use-privacy/besu-extended.md b/docs/private-networks/how-to/use-privacy/besu-extended.md index 3618a613f84..40c1c7d365e 100644 --- a/docs/private-networks/how-to/use-privacy/besu-extended.md +++ b/docs/private-networks/how-to/use-privacy/besu-extended.md @@ -1,48 +1,40 @@ --- +title: Use Besu-extended privacy description: Hyperledger Besu-extended privacy +sidebar_position: 2 +tags: + - private networks --- # Use Besu-extended privacy -Hyperledger Besu provides an extended implementation of privacy allowing you to -[create a privacy group for a set of participants](../../concepts/privacy/privacy-groups.md). You -must specify the privacy group ID when sending private transactions. +Hyperledger Besu provides an extended implementation of privacy allowing you to [create a privacy group for a set of participants](../../concepts/privacy/privacy-groups.md). You must specify the privacy group ID when sending private transactions. -To enable the [`PRIV` API methods](../../reference/api/index.md#priv-methods), use the -[`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or -[`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. +To enable the [`PRIV` API methods](../../reference/api/index.md#priv-methods), use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. -To create the privacy group containing the recipients of a private transaction, use -[`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup). +To create the privacy group containing the recipients of a private transaction, use [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup). -To create an EEA-compliant private transaction, specify `privacyGroupId` when creating the signed -transaction passed as an input parameter to -[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). +To create an EEA-compliant private transaction, specify `privacyGroupId` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). ## Privacy group type -Privacy groups created using -[`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) -have a `BESU` privacy group type when returned by -[`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). +Privacy groups created using [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) have a `BESU` privacy group type when returned by [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). -!!! example - - ```json +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", - "name": "Group B", - "description": "Description of Group B", - "type": "BESU", - "members": [ - "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", - "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" - ] - } + "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", + "name": "Group B", + "description": "Description of Group B", + "type": "BESU", + "members": [ + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" ] } - ``` + ] +} +``` diff --git a/docs/private-networks/how-to/use-privacy/eea-compliant.md b/docs/private-networks/how-to/use-privacy/eea-compliant.md index 95ba27307ad..300c0b987fd 100644 --- a/docs/private-networks/how-to/use-privacy/eea-compliant.md +++ b/docs/private-networks/how-to/use-privacy/eea-compliant.md @@ -1,44 +1,38 @@ --- +title: Use EEA-compliant privacy description: Hyperledger Besu JSON-RPC methods to use for EEA-compliant privacy +sidebar_position: 1 +tags: + - private networks --- # Use EEA-compliant privacy -When using Hyperledger Besu [EEA-compliant privacy](../../concepts/privacy/privacy-groups.md), the -group of nodes specified by `privateFrom` and `privateFor` form a privacy group, to which Tessera -assigns a unique privacy group ID. +When using Hyperledger Besu [EEA-compliant privacy](../../concepts/privacy/privacy-groups.md), the group of nodes specified by `privateFrom` and `privateFor` form a privacy group, to which Tessera assigns a unique privacy group ID. -To enable the [`EEA` API methods](../../reference/api/index.md#eea-methods), use the -[`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or -[`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. +To enable the [`EEA` API methods](../../reference/api/index.md#eea-methods), use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. -To create an EEA-compliant private transaction, specify `privateFor` when creating the signed -transaction passed as an input parameter to -[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). +To create an EEA-compliant private transaction, specify `privateFor` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). ## Privacy group type -Privacy groups created when specifying `privateFrom` and `privateFor` have a `LEGACY` privacy group -type when returned by -[`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). +Privacy groups created when specifying `privateFrom` and `privateFor` have a `LEGACY` privacy group type when returned by [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). -!!! example - - ```json +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "privacyGroupId": "68/Cq0mVjB8FbXDLE1tbDRAvD/srluIok137uFOaClM=", - "name": "legacy", - "description": "Privacy groups to support the creation of groups by privateFor and privateFrom", - "type": "LEGACY", - "members": [ - "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=", - "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=" - ] - } - ] + "privacyGroupId": "68/Cq0mVjB8FbXDLE1tbDRAvD/srluIok137uFOaClM=", + "name": "legacy", + "description": "Privacy groups to support the creation of groups by privateFor and privateFrom", + "type": "LEGACY", + "members": [ + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=", + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=" + ] } - ``` + ] +} +``` diff --git a/docs/private-networks/how-to/use-privacy/flexible.md b/docs/private-networks/how-to/use-privacy/flexible.md index f1cec168e78..abf1892732b 100644 --- a/docs/private-networks/how-to/use-privacy/flexible.md +++ b/docs/private-networks/how-to/use-privacy/flexible.md @@ -1,69 +1,62 @@ --- +title: Use flexible privacy groups description: Use flexible privacy groups +sidebar_position: 5 +tags: + - private networks --- # Use flexible privacy groups -Use the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) to create and update -membership of [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). +Use the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) to create and update membership of [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). -!!! tip +:::tip - Because group membership for flexible privacy groups is stored in a smart contract, flexible - privacy groups are also known as onchain privacy groups. +Because group membership for flexible privacy groups is stored in a smart contract, flexible privacy groups are also known as onchain privacy groups. -!!! important +::: - [Flexible privacy groups](../../concepts/privacy/flexible-privacy.md) are an early access - feature. Don't use in production networks. +:::info - The flexible privacy group interfaces may change between releases. There might not be an - upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy - group functionality in future versions. +[Flexible privacy groups](../../concepts/privacy/flexible-privacy.md) are an early access feature. Don't use in production networks. - We don't recommend creating flexible privacy groups in a chain with existing - [offchain privacy groups](../../concepts/privacy/privacy-groups.md). +The flexible privacy group interfaces may change between releases. There might not be an upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy group functionality in future versions. + +We don't recommend creating flexible privacy groups in a chain with existing [offchain privacy groups](../../concepts/privacy/privacy-groups.md). + +::: ## Enable flexible privacy groups -Use the [`--privacy-flexible-groups-enabled`](../../reference/cli/options.md#privacy-flexible-groups-enabled) -command line option to enable [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). -When flexible privacy groups are enabled, the [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup), -[`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup), -and [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) methods for -[offchain privacy groups](../../concepts/privacy/privacy-groups.md) are disabled. +Use the [`--privacy-flexible-groups-enabled`](../../reference/cli/options.md#privacy-flexible-groups-enabled) command line option to enable [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). When flexible privacy groups are enabled, the [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup), [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup), and [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) methods for [offchain privacy groups](../../concepts/privacy/privacy-groups.md) are disabled. ## Simple flexible privacy group example -To create and find a [flexible privacy group](../../concepts/privacy/flexible-privacy.md) using -the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum): +To create and find a [flexible privacy group](../../concepts/privacy/flexible-privacy.md) using the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum): 1. Update the `example/keys.js` file to match your network configuration. 1. Run: - ```bash - cd example/onchainPrivacy - node simpleExample.js - ``` + ```bash + cd example/onchainPrivacy + node simpleExample.js + ``` - This script creates the flexible privacy group with two members. `findPrivacyGroup` finds and - displays the created privacy group. + This script creates the flexible privacy group with two members. `findPrivacyGroup` finds and displays the created privacy group. -!!! tip +:::tip - The Tessera logs for Tessera 1 and Tessera 2 display `PrivacyGroupNotFound` errors. This is - expected behavior because private transactions check offchain and onchain to find the privacy - group for a private transaction. +The Tessera logs for Tessera 1 and Tessera 2 display `PrivacyGroupNotFound` errors. This is expected behavior because private transactions check offchain and onchain to find the privacy group for a private transaction. + +::: ## Add and remove members -To add and remove members from a [flexible privacy group](../../concepts/privacy/flexible-privacy.md), -use the `addTo` and `removeFrom` methods in the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) -client library. +To add and remove members from a [flexible privacy group](../../concepts/privacy/flexible-privacy.md), use the `addTo` and `removeFrom` methods in the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) client library. + +:::note -!!! note +When adding a member, Besu pushes all existing group transactions to the new member and processes them. If there are a large number of existing transactions, adding the member may take some time. - When adding a member, Besu pushes all existing group transactions to the new member and - processes them. If there are a large number of existing transactions, adding the member may - take some time. +::: diff --git a/docs/private-networks/how-to/use-privacy/performance-best-practices.md b/docs/private-networks/how-to/use-privacy/performance-best-practices.md index 9deade5f948..5559d610189 100644 --- a/docs/private-networks/how-to/use-privacy/performance-best-practices.md +++ b/docs/private-networks/how-to/use-privacy/performance-best-practices.md @@ -1,74 +1,61 @@ +--- +title: Performance best practices +description: Performance best practices +sidebar_position: 10 +tags: + - private networks +--- + # Performance best practices -This document collects deployment and usage tips to help you achieve high performance for private transactions. -If transaction throughput or latency is not meeting your expectations, please consider the following before raising an issue. +This document collects deployment and usage tips to help you achieve high performance for private transactions. If transaction throughput or latency is not meeting your expectations, please consider the following before raising an issue. ## General performance -Private transactions use the same facilities as public ones. -General Besu performance tunings apply. -Specific approaches are out of scope of this document, except for the following, which strongly impacts performance: +Private transactions use the same facilities as public ones. General Besu performance tunings apply. Specific approaches are out of scope of this document, except for the following, which strongly impacts performance: ### Use fast, local, solid state storage -Running EVM transactions creates a lot of random reads that are executed sequentially. -The Besu data folder for high throughput nodes should be located on the fastest possible storage media. +Running EVM transactions creates a lot of random reads that are executed sequentially. The Besu data folder for high throughput nodes should be located on the fastest possible storage media. -* Prefer [NVMe](https://cloud.google.com/compute/docs/disks/local-ssd#performance) attached SLC flash or Intel Optane. -* Avoid network attached SSDs or cloud storage with limited input/output operations per second. -* Do not use spinning disks under any circumstances. +- Prefer [NVMe](https://cloud.google.com/compute/docs/disks/local-ssd#performance) attached SLC flash or Intel Optane. +- Avoid network attached SSDs or cloud storage with limited input/output operations per second. +- Do not use spinning disks under any circumstances. ## Private transaction performance ### Use concurrent submission -When submitting a private transaction using [web3js-quorum](https://github.com/ConsenSys/web3js-quorum), the submit call will only return once the privacy marker transaction has been included in a block. -This limits the throughput to at most one private transaction per block when submitting from a single thread. -To increase throughput, use web3js-quorum from multiple concurrent threads or processes. +When submitting a private transaction using [web3js-quorum](https://github.com/ConsenSys/web3js-quorum), the submit call will only return once the privacy marker transaction has been included in a block. This limits the throughput to at most one private transaction per block when submitting from a single thread. To increase throughput, use web3js-quorum from multiple concurrent threads or processes. ### Co-locate Besu and Tessera -Besu has to talk to its local Tessera node frequently while handling a block. -While we do not recommend running them on the same node, minimizing the latency between Besu and Tessera will improve block processing times. -Besu and Tessera should not be hosted in geographically distributed locations. +Besu has to talk to its local Tessera node frequently while handling a block. While we do not recommend running them on the same node, minimizing the latency between Besu and Tessera will improve block processing times. Besu and Tessera should not be hosted in geographically distributed locations. ### Optimize worst-case latency between Tessera nodes -When distributing a new private transaction between Tessera nodes, the overall throughput is determined by the slowest Tessera nodes. -Try to minimize network latency between Tessera nodes and do not mix different machine types when hosting Tessera. +When distributing a new private transaction between Tessera nodes, the overall throughput is determined by the slowest Tessera nodes. Try to minimize network latency between Tessera nodes and do not mix different machine types when hosting Tessera. ### Use stateful nonce management -Management of public and private nonces in web3js-quorum is stateless: before a transaction is sent, web3js-quorum has to query for those nonces. -This is increasing latency, the node's load, and is a source of fragility due to nonce collision when multiple senders try to use the same account concurrently. +Management of public and private nonces in web3js-quorum is stateless: before a transaction is sent, web3js-quorum has to query for those nonces. This is increasing latency, the node's load, and is a source of fragility due to nonce collision when multiple senders try to use the same account concurrently. -For performance and reliability it is advantageous to statefully manage nonces on the client side instead of querying them for every transaction. -If custom code for this is not an option, [Orchestrate](https://consensys.net/codefi/orchestrate/) can be used. +For performance and reliability it is advantageous to manage nonces in a stateful manner on the client side instead of querying them for every transaction. If custom code for this is not an option, [Orchestrate](https://consensys.net/codefi/orchestrate/) can be used. ### Use random senders for privacy marker transactions -To avoid public nonce management, privacy marker transactions can be sent using a [random account per transaction](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#privacy-marker-transaction-signing-key-file). -This option is only available for zero gas networks. +To avoid public nonce management, privacy marker transactions can be sent using a [random account per transaction](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#privacy-marker-transaction-signing-key-file). This option is only available for zero gas networks. ### Avoid queuing transactions in Tessera -When Tessera is overloaded with transactions, the performance breaks down catastrophically due to unbounded growth of the request queue. -Avoid sending more transactions to Tessera than it can handle. -Sudden jumps in submission latency and submission failure rate should be answered with a load reduction on the client side, for example using a backoff scheme. +When Tessera is overloaded with transactions, the performance breaks down catastrophically due to unbounded growth of the request queue. Avoid sending more transactions to Tessera than it can handle. Sudden jumps in submission latency and submission failure rate should be answered with a load reduction on the client side, for example using a back-off scheme. -Please note that this is not Tessera specific but a general issue in distributed systems. -It just happens that if queueing discipline is not maintained, Tessera tends to be the first component to fail. +Please note that this is not Tessera specific but a general issue in distributed systems. It just happens that if queueing discipline is not maintained, Tessera tends to be the first component to fail. ### Limit the group size to reduce communication overhead -Smaller groups need fewer communication for transaction propagation. -If reducing the number of Tessera nodes involved in a transaction is an option, it will lead to slightly better tail latencies. -Multi-tenancy Tessera can be used to have large groups with a small number of Tessera nodes (possibly only one). +Smaller groups need fewer communication for transaction propagation. If reducing the number of Tessera nodes involved in a transaction is an option, it will lead to slightly better tail latencies. Multi-tenancy Tessera can be used to have large groups with a small number of Tessera nodes (possibly only one). ### Limit group membership changes and make them quick -Groups are locked (prevented from executing transactions) during membership changes. -Try to minimize the number of times the membership changes. -When possible, spread load across multiple groups to always have some groups available while others are locked. -Consider batching group membership changes if possible. -Note however that this does not work with the default management contract, yet. +Groups are locked (prevented from executing transactions) during membership changes. Try to minimize the number of times the membership changes. When possible, spread load across multiple groups to always have some groups available while others are locked. Consider batching group membership changes if possible. Note however that this does not work with the default management contract, yet. diff --git a/docs/private-networks/how-to/use-privacy/privacy-groups.md b/docs/private-networks/how-to/use-privacy/privacy-groups.md index 2c19effb285..1b3f0fadf23 100644 --- a/docs/private-networks/how-to/use-privacy/privacy-groups.md +++ b/docs/private-networks/how-to/use-privacy/privacy-groups.md @@ -1,19 +1,21 @@ --- +title: Create and manage privacy groups description: Create and manage privacy groups with Hyperledger Besu +sidebar_position: 4 +tags: + - private networks --- # Create and manage privacy groups -Hyperledger Besu-extended privacy provides JSON-RPC API methods for creating and managing privacy -groups: +Hyperledger Besu-extended privacy provides JSON-RPC API methods for creating and managing privacy groups: -* [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) -* [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) -* [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). +- [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) +- [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) +- [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). -!!! tip +:::tip - You can find and delete - [EEA-compliant privacy groups](../../concepts/privacy/privacy-groups.md) using - [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) and - [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). +You can find and delete [EEA-compliant privacy groups](../../concepts/privacy/privacy-groups.md) using [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) and [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). + +::: diff --git a/docs/private-networks/how-to/use-privacy/sign-pmts.md b/docs/private-networks/how-to/use-privacy/sign-pmts.md index 7417c8ee44d..7ad0029f5d1 100644 --- a/docs/private-networks/how-to/use-privacy/sign-pmts.md +++ b/docs/private-networks/how-to/use-privacy/sign-pmts.md @@ -1,40 +1,39 @@ --- +title: Sign privacy marker transactions description: How to sign a privacy marker transaction with Hyperledger Besu +sidebar_position: 7 +tags: + - private networks --- # Sign privacy marker transactions -You can sign privacy marker transactions (PMTs) with either a random key or a specified key. To sign -privacy marker transactions with a specified private key, use -[`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) -when starting Hyperledger Besu. +You can sign privacy marker transactions (PMTs) with either a random key or a specified key. To sign privacy marker transactions with a specified private key, use [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) when starting Hyperledger Besu. -!!! note +:::note - The private key file can be the same file used by - [`--node-private-key-file`](#node-private-key-file), or a different key file to identify who - signed the privacy marker transaction. +The private key file can be the same file used by [`--node-private-key-file`](#node-private-key-file), or a different key file to identify who signed the privacy marker transaction. -In networks where you pay gas, you must specify a key and the associated account must contain -adequate funds. +::: -In [free gas networks](../configure/free-gas.md), to provide further anonymity by signing -each privacy marker transaction with a different random key, exclude the -[`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) -command line option when starting Besu. +In networks where you pay gas, you must specify a key and the associated account must contain adequate funds. -!!! caution "Using account permissioning and privacy" +In [free gas networks](../configure/free-gas.md), to provide further anonymity by signing each privacy marker transaction with a different random key, exclude the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option when starting Besu. - You can't use [account permissioning] with random key signing. +:::caution "Using account permissioning and privacy" - If using account permissioning and privacy, a signing key must be specified using the - [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) - command line option and the corresponding public key included in the accounts allowlist. +You can't use [account permissioning] with random key signing. -!!! note +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. - Besu signs privacy marker transactions during the - [private transaction process](../../concepts/privacy/private-transactions/processing.md). +::: + +:::note + +Besu signs privacy marker transactions during the [private transaction process](../../concepts/privacy/private-transactions/processing.md). + +::: + [account permissioning]: ../../concepts/permissioning/index.md#account-permissioning diff --git a/docs/private-networks/how-to/use-privacy/tessera.md b/docs/private-networks/how-to/use-privacy/tessera.md index 1ee9642630e..02754f3fe8f 100644 --- a/docs/private-networks/how-to/use-privacy/tessera.md +++ b/docs/private-networks/how-to/use-privacy/tessera.md @@ -1,43 +1,41 @@ --- +title: Run Tessera with Besu description: Running ConsenSys Quorum Tessera with Hyperledger Besu +sidebar_position: 3 +tags: + - private networks --- # Run Tessera with Besu -To enable [privacy functionality](../../concepts/privacy/index.md) in production -systems, [Tessera](https://docs.tessera.consensys.net/) must be [highly available](#high-availability) -and [run in a separate instance](#separate-instances) to Hyperledger Besu. +To enable [privacy functionality](../../concepts/privacy/index.md) in production systems, [Tessera](https://docs.tessera.consensys.net/) must be [highly available](#high-availability) and [run in a separate instance](#separate-instances) to Hyperledger Besu. ![Besu-Tessera-High-Availability](../../../assets/images/Besu-Tessera-High-Availability.png) -!!! note +:::note - You can also configure Besu for high availability using load balancers. +You can also configure Besu for high availability using load balancers. + +::: ## High availability -Privacy requires you to [configure Tessera for high availability]. -Besu also requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode) -to be enabled in Tessera. +Privacy requires you to [configure Tessera for high availability]. Besu also requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode) to be enabled in Tessera. + +To successfully distribute a private transaction, all private transaction participants must be online. If any participants are offline when submitting the private transaction, the transaction is not attempted and you need to resubmit the transaction. -To successfully distribute a private transaction, all private transaction participants must be -online. If any participants are offline when submitting the private transaction, the transaction is -not attempted and you need to resubmit the transaction. +If a Tessera node is unavailable when Besu attempts to process a privacy marker transaction, the Besu node stops processing all new blocks until Tessera is available. The Besu node continually attempts to process the privacy marker transaction until Tessera is available again. -If a Tessera node is unavailable when Besu attempts to process a privacy marker transaction, the -Besu node stops processing all new blocks until Tessera is available. The Besu node continually -attempts to process the privacy marker transaction until Tessera is available again. +:::caution -!!! caution +If Tessera becomes available but has lost data, Besu resumes processing blocks and the private states in the Besu nodes might become inconsistent. - If Tessera becomes available but has lost data, Besu resumes processing blocks and the private - states in the Besu nodes might become inconsistent. +::: ## Separate instances -For production systems, we recommend running Besu and Tessera in separate instances. If running Besu -and Tessera in the same instance, restrict the amount of memory used by each JVM to ensure each has -enough memory. +For production systems, we recommend running Besu and Tessera in separate instances. If running Besu and Tessera in the same instance, restrict the amount of memory used by each JVM to ensure each has enough memory. + [configure Tessera for high availability]: https://consensys.net/docs/goquorum//en/stable/configure-and-manage/configure/high-availability/ diff --git a/docs/private-networks/how-to/use-privacy/web3js-quorum.md b/docs/private-networks/how-to/use-privacy/web3js-quorum.md index c98dc9e8236..5e96ec51a9e 100644 --- a/docs/private-networks/how-to/use-privacy/web3js-quorum.md +++ b/docs/private-networks/how-to/use-privacy/web3js-quorum.md @@ -1,29 +1,33 @@ --- +title: Use the web3js-quorum library description: web3js-quorum client library +sidebar_position: 9 +tags: + - private networks --- # Use the web3js-quorum client library -[web3js-quorum](https://github.com/ConsenSys/web3js-quorum) is an Ethereum JavaScript library -extending [web3.js](https://github.com/ethereum/web3.js/) that adds support for Besu-specific JSON-RPC -APIs and features. -Use the library to create and send RLP-encoded transactions using JSON-RPC. +[web3js-quorum](https://github.com/ConsenSys/web3js-quorum) is an Ethereum JavaScript library extending [web3.js](https://github.com/ethereum/web3.js/) that adds support for Besu-specific JSON-RPC APIs and features. Use the library to create and send RLP-encoded transactions using JSON-RPC. -!!! important - web3js-quorum supports JSON-RPC over HTTP only. +:::caution important +web3js-quorum supports JSON-RPC over HTTP only. +::: -!!! note +:::note - web3js-quorum includes all [quorum.js](https://github.com/ConsenSys/quorum.js) and [web3js-eea](https://github.com/ConsenSys/web3js-eea) features. +web3js-quorum includes all [quorum.js](https://github.com/ConsenSys/quorum.js) and [web3js-eea](https://github.com/ConsenSys/web3js-eea) features. - If migrating to web3js-quorum, update your JavaScript code as indicated in the following examples. +If migrating to web3js-quorum, update your JavaScript code as indicated in the following examples. - [Read the migration guide for more information about updating your code.](https://consensys.github.io/web3js-quorum/latest/tutorial-Migrate%20from%20web3js-eea.html) +[Read the migration guide for more information about updating your code.](https://consensys.github.io/web3js-quorum/latest/tutorial-Migrate%20from%20web3js-eea.html) + +::: ## Prerequisites -* [Node.js (version > 10)](https://nodejs.org/en/download/) -* [The web3 library must be installed in your project](https://github.com/ChainSafe/web3.js#installation) +- [Node.js (version > 10)](https://nodejs.org/en/download/) +- [The web3 library must be installed in your project](https://github.com/ChainSafe/web3.js#installation) ## Add web3js-quorum to project @@ -35,54 +39,50 @@ npm install web3js-quorum Initialize your client where: -* `` is the JSON-RPC HTTP endpoint of your Hyperledger Besu node. Specified - by the [`--rpc-http-host`](../../../public-networks/reference/cli/options.md#rpc-http-host) and - [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) command line options. +- `` is the JSON-RPC HTTP endpoint of your Hyperledger Besu node. Specified by the [`--rpc-http-host`](../../../public-networks/reference/cli/options.md#rpc-http-host) and [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) command line options. -!!! example + - === "Syntax" +# Syntax - ```js - const Web3 = require("web3"); - const Web3Quorum = require("web3js-quorum"); - const web3 = new Web3Quorum(new Web3("")); - ``` +```js +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); +const web3 = new Web3Quorum(new Web3("")); +``` - === "Example" +# Example - ```js - const Web3 = require("web3"); - const Web3Quorum = require("web3js-quorum"); - const web3 = new Web3Quorum(new Web3("http://localhost:8545")); - ``` +```js +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); +const web3 = new Web3Quorum(new Web3("http://localhost:8545")); +``` -!!! note - When migrating from web3js-eea to web3js-quorum, use `Web3Quorum`. The constructor doesn't require the chain ID anymore. - Chain ID is automatically retrieved from the chain using the specified JSON-RPC HTTP endpoint. + -## Deploy a contract with `generateAndSendRawTransaction` +:::note -To deploy a private contract, you need the contract binary. You can use -[Solidity](https://solidity.readthedocs.io/en/develop/using-the-compiler.html) to get the -contract binary. +When migrating from web3js-eea to web3js-quorum, use `Web3Quorum`. The constructor doesn't require the chain ID anymore. Chain ID is automatically retrieved from the chain using the specified JSON-RPC HTTP endpoint. -!!! example "Deploying a contract with `web3.priv.generateAndSendRawTransaction`" +::: - ```js - const contractOptions = { - data: `0x123`, // contract binary - privateFrom: "tesseraNode1PublicKey", - privateFor: ["tesseraNode3PublicKey"], - privateKey: "besuNode1PrivateKey" - }; - return web3.priv.generateAndSendRawTransaction(contractOptions); - ``` +## Deploy a contract with `generateAndSendRawTransaction` + +To deploy a private contract, you need the contract binary. You can use [Solidity](https://solidity.readthedocs.io/en/develop/using-the-compiler.html) to get the contract binary. + +```js title="Deploying a contract with 'web3.priv.generateAndSendRawTransaction'" +const contractOptions = { + data: `0x123`, // contract binary + privateFrom: "tesseraNode1PublicKey", + privateFor: ["tesseraNode3PublicKey"], + privateKey: "besuNode1PrivateKey", +}; +return web3.priv.generateAndSendRawTransaction(contractOptions); +``` -`web3.priv.generateAndSendRawTransaction(contractOptions)` returns the transaction hash. To get the private -transaction receipt, use `web3.priv.waitForTransactionReceipt(txHash)`. +`web3.priv.generateAndSendRawTransaction(contractOptions)` returns the transaction hash. To get the private transaction receipt, use `web3.priv.waitForTransactionReceipt(txHash)`. ## web3js-quorum methods -For more information about the web3js-quorum methods, see the -[web3js-quorum reference documentation](https://consensys.github.io/web3js-quorum/latest/index.html). +For more information about the web3js-quorum methods, see the [web3js-quorum reference documentation](https://consensys.github.io/web3js-quorum/latest/index.html). diff --git a/docs/private-networks/index.md b/docs/private-networks/index.md index b8ad0dcb23c..377c1af8e90 100644 --- a/docs/private-networks/index.md +++ b/docs/private-networks/index.md @@ -1,26 +1,24 @@ --- -# page icon, insider only, see https://squidfunk.github.io/mkdocs-material/reference/#setting-the-page-icon -icon: material/book-lock-outline +title: Private networks +sidebar_position: 1 +sidebar_label: Introduction +id: index description: Private networks overview +tags: + - private networks --- # Hyperledger Besu for private networks -You can use Besu to develop enterprise applications requiring secure, high-performance transaction -processing in a private network. +You can use Besu to develop enterprise applications requiring secure, high-performance transaction processing in a private network. -A private network is a network not connected to Ethereum Mainnet or an Ethereum testnet. -Private networks typically use a different [chain ID](../public-networks/concepts/network-and-chain-id.md) and -proof of authority consensus ([QBFT](how-to/configure/consensus/qbft.md), -[IBFT 2.0](how-to/configure/consensus/ibft.md), or [Clique](how-to/configure/consensus/clique.md)). +A private network is a network not connected to Ethereum Mainnet or an Ethereum testnet. Private networks typically use a different [chain ID](../public-networks/concepts/network-and-chain-id.md) and proof of authority consensus ([QBFT](how-to/configure/consensus/qbft.md), [IBFT 2.0](how-to/configure/consensus/ibft.md), or [Clique](how-to/configure/consensus/clique.md)). You can also [create a local development network](tutorials/ethash.md) using proof of work (Ethash). -Besu supports enterprise features including [privacy](concepts/privacy/index.md) and -[permissioning](concepts/permissioning/index.md). +Besu supports enterprise features including [privacy](concepts/privacy/index.md) and [permissioning](concepts/permissioning/index.md). -Get started with the [Developer Quickstart](tutorials/quickstart.md) to rapidly generate local -blockchain networks. +Get started with the [Developer Quickstart](tutorials/quickstart.md) to rapidly generate local blockchain networks. ## Architecture @@ -28,5 +26,5 @@ The following diagram outlines the high-level architecture of Besu for private n ![Private architecture](../assets/images/private-architecture.jpeg) -If you have any questions about Besu for private networks, contact us on the -[Besu channel on Hyperledger Discord](https://discord.gg/hyperledger). +If you have any questions about Besu for private networks, ask on the **besu** channel on +[Hyperledger Discord](https://discord.gg/hyperledger). diff --git a/docs/private-networks/reference/_category_.json b/docs/private-networks/reference/_category_.json new file mode 100644 index 00000000000..3ce2f2b757b --- /dev/null +++ b/docs/private-networks/reference/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Reference", + "position": 6 +} diff --git a/docs/private-networks/reference/accounts-for-testing.md b/docs/private-networks/reference/accounts-for-testing.md index 222f87c6662..f32a1dbf8a1 100644 --- a/docs/private-networks/reference/accounts-for-testing.md +++ b/docs/private-networks/reference/accounts-for-testing.md @@ -1,26 +1,27 @@ --- +title: Accounts for testing +sidebar_position: 3 description: Ethereum accounts used for Hyperledger Besu testing only on private networks +tags: + - private networks --- +import TestAccounts from '../../global/test_accounts.md'; + # Accounts for testing -You can use existing accounts for testing by including them in the genesis file for a private -network. Hyperledger Besu also provides predefined accounts for use in development mode. +You can use existing accounts for testing by including them in the genesis file for a private network. Hyperledger Besu also provides predefined accounts for use in development mode. ## Development mode -When you start Besu with the [`--network=dev`](../../public-networks/reference/cli/options.md#network) command line option, Besu -uses the `dev.json` genesis file by default. +When you start Besu with the [`--network=dev`](../../public-networks/reference/cli/options.md#network) command line option, Besu uses the `dev.json` genesis file by default. The `dev.json` genesis file defines the following accounts used for testing. ---8<-- "global/test_accounts.md" + ## Genesis file -To use existing test accounts, specify the accounts and balances in a genesis file for your test -network. For an example of how to define accounts in the genesis file, see -[`dev.json`](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/config/src/main/resources/dev.json). +To use existing test accounts, specify the accounts and balances in a genesis file for your test network. For an example of how to define accounts in the genesis file, see [`dev.json`](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/config/src/main/resources/dev.json). -To start Besu with the genesis file defining the existing accounts, use the -[`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) command line option . +To start Besu with the genesis file defining the existing accounts, use the [`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) command line option . diff --git a/docs/private-networks/reference/api/_category_.json b/docs/private-networks/reference/api/_category_.json new file mode 100644 index 00000000000..777d7bb818f --- /dev/null +++ b/docs/private-networks/reference/api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu API", + "position": 2 +} diff --git a/docs/private-networks/reference/api/index.md b/docs/private-networks/reference/api/index.md index 616afc85f16..4d0b71dd721 100644 --- a/docs/private-networks/reference/api/index.md +++ b/docs/private-networks/reference/api/index.md @@ -1,27 +1,27 @@ --- description: Hyperledger Besu private network JSON-RPC API methods reference +tags: + - private networks --- # Private network API methods -!!! attention +:::warning - * This reference contains API methods that apply to only private networks. - For API methods that apply to both private and public networks, see the - [public network API reference](../../../public-networks/reference/api/index.md). - * All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If - using the [--rpc-http-host](../../../public-networks/reference/cli/options.md#rpc-http-host) or - [--rpc-http-port](../../../public-networks/reference/cli/options.md#rpc-http-port) options, update the endpoint. +- This reference contains API methods that apply to only private networks. For API methods that apply to both private and public networks, see the [public network API reference](../../../public-networks/reference/api/index.md). +- All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If using the [--rpc-http-host](../../../public-networks/reference/cli/options.md#rpc-http-host) or [--rpc-http-port](../../../public-networks/reference/cli/options.md#rpc-http-port) options, update the endpoint. + +::: ## `CLIQUE` methods The `CLIQUE` API methods provide access to the [Clique](../../how-to/configure/consensus/clique.md) consensus engine. -!!! note +:::note + +The `CLIQUE` API methods are not enabled by default for JSON-RPC. To enable the `CLIQUE` API methods use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. - The `CLIQUE` API methods are not enabled by default for JSON-RPC. To enable the `CLIQUE` API - methods use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) - or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. +::: ### `clique_discard` @@ -29,35 +29,37 @@ Discards a proposal to [add or remove a signer with the specified address]. #### Parameters -`address`: *string* - 20-byte address of proposed signer +`address`: _string_ - 20-byte address of proposed signer #### Returns -`result`: *boolean* - indicates if the proposal is discarded +`result`: _boolean_ - indicates if the proposal is discarded -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + ### `clique_getSigners` @@ -65,113 +67,111 @@ Lists [signers for the specified block]. #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *array* of *string* - list of 20-byte addresses of signers +`result`: _array_ of _string_ - list of 20-byte addresses of signers + + -!!! example +# curl HTTP request - === "curl HTTP request" + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' http://127.0.0.1:8545 + ``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" + ```bash + {"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1} + ``` - ```bash - {"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1} - ``` +# JSON result - === "JSON result" + ```json + { + "jsonrpc" : "2.0", + "id" : 1, + "result" : [ "0x42eb768f2244c8811c63729a21a3569731535f06", "0x7ffc57839b00206d1ad20c69a1981b489f772031", "0xb279182d99e65703f0076e4812653aab85fca0f0" ] + } + ``` - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : [ "0x42eb768f2244c8811c63729a21a3569731535f06", "0x7ffc57839b00206d1ad20c69a1981b489f772031", "0xb279182d99e65703f0076e4812653aab85fca0f0" ] - } - ``` + ### `clique_getSignerMetrics` Provides the following validator metrics for the specified range: -* Number of blocks from each validator +- Number of blocks from each validator -* Block number of the last block proposed by each validator (if any proposed in the specified - range) +- Block number of the last block proposed by each validator (if any proposed in the specified range) -* All validators present in the last block +- All validators present in the last block #### Parameters -* `fromBlockNumber`: *string* - integer representing a block number or the string tag `earliest`, as described - in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) -* `toBlockNumber`: *string* - integer representing a block number or one of the string tags `latest` or - `pending`, as described in - [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) If you specify: -* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less - than 100 blocks. +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. -* Only the first parameter, the call provides metrics for all blocks from the block specified to - the latest block. +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. #### Returns -`result`: *array* of *objects* - list of validator objects +`result`: _array_ of _objects_ - list of validator objects -!!! note +:::note - The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. -!!! example +::: - === "curl HTTP" + - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 - ``` +# curl HTTP - === "wscat WS" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` - ```bash - {"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1} - ``` +# wscat WS - === "JSON result" +```bash +{"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", - "proposedBlockCount": "0x21", - "lastProposedBlockNumber": "0x61" - }, - { - "address": "0x42eb768f2244c8811c63729a21a3569731535f06", - "proposedBlockCount": "0x21", - "lastProposedBlockNumber": "0x63" - }, - { - "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", - "proposedBlockCount": "0x21", - "lastProposedBlockNumber": "0x62" - } - ] - } - ``` +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + ### `clique_getSignersAtHash` @@ -179,40 +179,45 @@ Lists signers for the specified block. #### Parameters -`hash`: *string* - 32-byte block hash +`hash`: _string_ - 32-byte block hash #### Returns -`result`: *array* of *string* - list of 20-byte addresses of signers +`result`: _array_ of _string_ - list of 20-byte addresses of signers -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : [ "0x42eb768f2244c8811c63729a21a3569731535f06", "0x7ffc57839b00206d1ad20c69a1981b489f772031", "0xb279182d99e65703f0076e4812653aab85fca0f0" ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42eb768f2244c8811c63729a21a3569731535f06", + "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "0xb279182d99e65703f0076e4812653aab85fca0f0" + ] +} +``` + + ### `clique_proposals` -Returns -[current proposals](../../how-to/configure/consensus/clique.md#add-and-remove-signers). +Returns [current proposals](../../how-to/configure/consensus/clique.md#add-and-remove-signers). #### Parameters @@ -220,36 +225,36 @@ None #### Returns -`result`: *map* of *strings* to *booleans* - map of account addresses to corresponding boolean values indicating the -proposal for each account (if `true`, the proposal is to add a signer; if `false`, the proposal is to -remove a signer.) +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the proposal for each account (if `true`, the proposal is to add a signer; if `false`, the proposal is to remove a signer.) + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0x42eb768f2244c8811c63729a21a3569731535f07": false, + "0x12eb759f2222d7711c63729a45c3585731521d01": true + } +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "0x42eb768f2244c8811c63729a21a3569731535f07": false, - "0x12eb759f2222d7711c63729a45c3585731521d01": true - } - } - ``` + ### `clique_propose` @@ -257,130 +262,121 @@ Proposes to [add or remove a signer with the specified address]. #### Parameters -* `address`: *string* - 20-byte address +- `address`: _string_ - 20-byte address -* `proposal`: *boolean* - `true` to propose adding signer or `false` to propose removing signer +- `proposal`: _boolean_ - `true` to propose adding signer or `false` to propose removing signer #### Returns -`result`: *boolean* - `true` +`result`: _boolean_ - `true` -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + ## `EEA` methods -The `EEA` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and -[privacy groups](../../concepts/privacy/privacy-groups.md). +The `EEA` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and [privacy groups](../../concepts/privacy/privacy-groups.md). + +:::note -!!! note +The `EEA` API methods are not enabled by default for JSON-RPC. To enable the `EEA` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. - The `EEA` API methods are not enabled by default for JSON-RPC. To enable the `EEA` API methods, - use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. +::: ### `eea_sendRawTransaction` -Distributes the -[private transaction](../../how-to/send-transactions/private-transactions.md), -generates the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) -and submits it to the transaction pool, and returns the transaction hash of the -[privacy marker transaction](../../concepts/privacy/private-transactions/processing.md). +Distributes the [private transaction](../../how-to/send-transactions/private-transactions.md), generates the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) and submits it to the transaction pool, and returns the transaction hash of the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md). -The signed transaction passed as an input parameter includes the `privateFrom`, -[`privateFor` or `privacyGroupId`](../../how-to/send-transactions/private-transactions.md#eea-compliant-or-besu-extended-privacy), -and `restriction` fields. +The signed transaction passed as an input parameter includes the `privateFrom`, [`privateFor` or `privacyGroupId`](../../how-to/send-transactions/private-transactions.md#eea-compliant-or-besu-extended-privacy), and `restriction` fields. -The `gas` and `gasPrice` are used by the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) -not the private transaction itself. +The `gas` and `gasPrice` are used by the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) not the private transaction itself. -To avoid exposing your private key, create signed transactions offline and send the signed -transaction data using `eea_sendRawTransaction`. +To avoid exposing your private key, create signed transactions offline and send the signed transaction data using `eea_sendRawTransaction`. -!!! important +:::important - For production systems requiring private transactions, use a network with a consensus mechanism - supporting transaction finality to make sure the private state does not become inconsistent - with the chain. For example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md) - and [QBFT](../../how-to/configure/consensus/qbft.md) provide the required finality. +For production systems requiring private transactions, use a network with a consensus mechanism supporting transaction finality to make sure the private state does not become inconsistent with the chain. For example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md) and [QBFT](../../how-to/configure/consensus/qbft.md) provide the required finality. - Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md#pruning) - or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. +Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md#pruning) or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. - Besu doesn't implement - [`eea_sendTransaction`](../../how-to/send-transactions/private-transactions.md). +Besu doesn't implement [`eea_sendTransaction`](../../how-to/send-transactions/private-transactions.md). - [EthSigner](https://docs.ethsigner.consensys.net/en/latest/) provides transaction signing and - implements [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). +[EthSigner](https://docs.ethsigner.consensys.net/en/latest/) provides transaction signing and implements [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +::: #### Parameters -`transaction`: *string* - signed RLP-encoded private transaction +`transaction`: _string_ - signed RLP-encoded private transaction #### Returns -`result`: *string* - 32-byte transaction hash of the -[privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) +`result`: _string_ - 32-byte transaction hash of the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) + +:::tip -!!! tip +If creating a contract, use [priv_getTransactionReceipt](#priv_gettransactionreceipt) to retrieve the contract address after the transaction is finalized. - If creating a contract, use [priv_getTransactionReceipt](#priv_gettransactionreceipt) to - retrieve the contract address after the transaction is finalized. +::: -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "id":1, - "jsonrpc": "2.0", - "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" - } - ``` +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + + ## `IBFT` 2.0 methods The `IBFT` API methods provide access to the [IBFT 2.0](../../how-to/configure/consensus/ibft.md) consensus engine. -!!! note +:::note + +The `IBFT` API methods are not enabled by default for JSON-RPC. To enable the `IBFT` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. - The `IBFT` API methods are not enabled by default for JSON-RPC. To enable the `IBFT` API - methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. +::: ### `ibft_discardValidatorVote` @@ -388,40 +384,41 @@ Discards a proposal to [add or remove a validator] with the specified address. #### Parameters -`address`: *string* - 20-byte address of proposed validator +`address`: _string_ - 20-byte address of proposed validator #### Returns -`result`: *boolean* - indicates if the proposal is discarded +`result`: _boolean_ - indicates if the proposal is discarded + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : true - } - ``` + ### `ibft_getPendingVotes` -Returns [votes](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) cast in the current -[epoch](../../how-to/configure/consensus/ibft.md#genesis-file). +Returns [votes](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) cast in the current [epoch](../../how-to/configure/consensus/ibft.md#genesis-file). #### Parameters @@ -429,112 +426,110 @@ None #### Returns -`result`: *map* of *strings* to *booleans* - map of account addresses to corresponding boolean values indicating the -vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to -remove a validator. +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to remove a validator. -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, - "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, + "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true + } +} +``` + + ### `ibft_getSignerMetrics` Provides the following validator metrics for the specified range: -* Number of blocks from each validator +- Number of blocks from each validator -* Block number of the last block proposed by each validator (if any proposed in the specified - range) +- Block number of the last block proposed by each validator (if any proposed in the specified range) -* All validators present in the last block of the range +- All validators present in the last block of the range #### Parameters -* `fromBlockNumber`: *string* - integer representing a block number or the string tag `earliest` as described - in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest` as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) -* `toBlockNumber`: *string* - integer representing a block number or one of the string tags `latest` or - `pending`, as described in - [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) If you specify: -* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less - than 100 blocks. +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. -* Only the first parameter, the call provides metrics for all blocks from the block specified to - the latest block. +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. #### Returns -`result`: *array* of *objects* - list of validator objects +`result`: _array_ of _objects_ - list of validator objects + +:::note -!!! note +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. - The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. +::: -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", - "proposedBlockCount": "0x21", - "lastProposedBlockNumber": "0x61" - }, - { - "address": "0x42eb768f2244c8811c63729a21a3569731535f06", - "proposedBlockCount": "0x21", - "lastProposedBlockNumber": "0x63" - }, - { - "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", - "proposedBlockCount": "0x21", - "lastProposedBlockNumber": "0x62" - } - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + ### `ibft_getValidatorsByBlockHash` @@ -542,39 +537,41 @@ Lists the validators defined in the specified block. #### Parameters -`block`: *string* - 32-byte block hash +`block`: _string_ - 32-byte block hash #### Returns -`result`: *array* of *strings* - list of validator addresses +`result`: _array_ of _strings_ - list of validator addresses + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "0x42d4287eac8078828cf5f3486cfe601a275a49a5", - "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", - "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" - ] - } - ``` + ### `ibft_getValidatorsByBlockNumber` @@ -582,41 +579,41 @@ Lists the validators defined in the specified block. #### Parameters -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, - `earliest`, or `pending`, as described in - [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *array* of *strings* - list of validator addresses +`result`: _array_ of _strings_ - list of validator addresses -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "0x42d4287eac8078828cf5f3486cfe601a275a49a5", - "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", - "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + ### `ibft_proposeValidatorVote` @@ -624,146 +621,149 @@ Proposes to [add or remove a validator] with the specified address. #### Parameters -* `address`: *string* - account address +- `address`: _string_ - account address -* `proposal`: *boolean* - `true` to propose adding validator or `false` to propose removing validator +- `proposal`: _boolean_ - `true` to propose adding validator or `false` to propose removing validator #### Returns -`result`: *boolean* - `true` +`result`: _boolean_ - `true` + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : true - } - ``` + ## `PERM` (Permissioning) methods -The `PERM` API methods provide permissioning functionality. -Use these methods for [local permissioning](../../how-to/use-permissioning/local.md) only. +The `PERM` API methods provide permissioning functionality. Use these methods for [local permissioning](../../how-to/use-permissioning/local.md) only. -!!! important +:::important - The `PERM` API methods are not enabled by default for JSON-RPC. To enable the `PERM` API - methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) CLI options. +The `PERM` API methods are not enabled by default for JSON-RPC. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) CLI options. + +::: ### `perm_addAccountsToAllowlist` -Adds accounts (participants) to the -[accounts permission list](../../how-to/use-permissioning/local.md#account-permissioning). +Adds accounts (participants) to the [accounts permission list](../../how-to/use-permissioning/local.md#account-permissioning). #### Parameters -`addresses`: *array* of *strings* - list of account addresses +`addresses`: _array_ of _strings_ - list of account addresses + +:::note -!!! note +The parameters list contains a list which is why the account addresses are enclosed by double square brackets. - The parameters list contains a list which is why the account addresses are enclosed by double - square brackets. +::: #### Returns -`result`: *string* - `Success` or `error` (errors include attempting to add accounts already on the -allowlist and including invalid account addresses.) +`result`: _string_ - `Success` or `error` (errors include attempting to add accounts already on the allowlist and including invalid account addresses.) -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "Success" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + ### `perm_addNodesToAllowlist` -Adds nodes to the -[nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). +Adds nodes to the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +To use domain names in enode URLs, ensure you [enable DNS support](../../../public-networks/concepts/node-keys.md#domain-name-support) to avoid receiving a `request contains an invalid node` error. -To use domain names in enode URLs, ensure you [enable DNS support](../../../public-networks/concepts/node-keys.md#domain-name-support) -to avoid receiving a `request contains an invalid node` error. +:::warning -!!! warning +Enode URL domain name support is an early access feature. - Enode URL domain name support is an early access feature. +::: #### Parameters -`enodes`: *array* of *strings* - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) +`enodes`: _array_ of _strings_ - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) -!!! note +:::note - The parameters list contains a list which is why the enode URLs are enclosed by double - square brackets. +The parameters list contains a list which is why the enode URLs are enclosed by double square brackets. + +::: #### Returns -`result`: *string* - `Success` or `error`; errors include attempting to add nodes already on the allowlist or -including invalid enode URLs. +`result`: _string_ - `Success` or `error`; errors include attempting to add nodes already on the allowlist or including invalid enode URLs. + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "Success" - } - ``` + ### `perm_getAccountsAllowlist` -Lists accounts (participants) in the -[accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). +Lists accounts (participants) in the [accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). #### Parameters @@ -771,39 +771,40 @@ None #### Returns -`result`: *array* of *strings* - list of accounts (participants) in the accounts allowlist +`result`: _array_ of _strings_ - list of accounts (participants) in the accounts allowlist -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "0x0000000000000000000000000000000000000009", - "0xb9b81ee349c3807e46bc71aa2632203c5b462033" - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x0000000000000000000000000000000000000009", + "0xb9b81ee349c3807e46bc71aa2632203c5b462033" + ] +} +``` + + ### `perm_getNodesAllowlist` -Lists nodes in the -[nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). +Lists nodes in the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). #### Parameters @@ -811,35 +812,36 @@ None #### Returns -`result`: *array* of *strings* - [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) -of nodes in the nodes allowlist +`result`: _array_ of _strings_ - [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) of nodes in the nodes allowlist + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305", + "enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304" + ] +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305", - "enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304" - ] - } - ``` + ### `perm_reloadPermissionsFromFile` @@ -851,209 +853,211 @@ None #### Returns -`result`: *string* - `Success`, or `error` if the permissions configuration file is not valid +`result`: _string_ - `Success`, or `error` if the permissions configuration file is not valid + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "Success" - } - ``` + ### `perm_removeAccountsFromAllowlist` -Removes accounts (participants) from the -[accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). +Removes accounts (participants) from the [accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). #### Parameters -`addresses`: *array* of *strings* - list of account addresses +`addresses`: _array_ of _strings_ - list of account addresses -!!! note +:::note - The parameters list contains a list which is why the account addresses are enclosed by double - square brackets. +The parameters list contains a list which is why the account addresses are enclosed by double square brackets. + +::: #### Returns -`result`: *string* - `Success` or `error` (errors include attempting to remove accounts not on the allowlist -and including invalid account addresses.) +`result`: _string_ - `Success` or `error` (errors include attempting to remove accounts not on the allowlist and including invalid account addresses.) + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "Success" - } - ``` + ### `perm_removeNodesFromAllowlist` -Removes nodes from the -[nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). +Removes nodes from the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). #### Parameters -`enodes`: *array* of *strings* - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) +`enodes`: _array_ of _strings_ - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) -!!! note +:::note - The parameters list contains a list which is why the enode URLs are enclosed by double square - brackets. +The parameters list contains a list which is why the enode URLs are enclosed by double square brackets. + +::: #### Returns -`result`: *string* - `Success` or `error` (errors include attempting to remove nodes not on the allowlist -and including invalid enode URLs.) +`result`: _string_ - `Success` or `error` (errors include attempting to remove nodes not on the allowlist and including invalid enode URLs.) + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "Success" - } - ``` + ## `PRIV` methods -The `PRIV` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and -[privacy groups](../../concepts/privacy/privacy-groups.md). +The `PRIV` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and [privacy groups](../../concepts/privacy/privacy-groups.md). -!!! note +:::note - The `PRIV` API methods are not enabled by default for JSON-RPC. To enable the `PRIV` API - methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. +The `PRIV` API methods are not enabled by default for JSON-RPC. To enable the `PRIV` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: ### `priv_call` Invokes a private contract function locally and does not change the privacy group state. -For private contracts, `priv_call` is the same as [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) -for public contracts. +For private contracts, `priv_call` is the same as [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) for public contracts. #### Parameters -* `privacyGroupId`: *string* - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) -* `call`: *object* - [transaction call object](../../../public-networks/reference/api/objects.md#transaction-call-object) +- `call`: _object_ - [transaction call object](../../../public-networks/reference/api/objects.md#transaction-call-object) -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, - `earliest`, or `pending`, as described in - [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *data* - return value of the executed contract +`result`: _data_ - return value of the executed contract + + -!!! example +# curl HTTP - === "curl HTTP" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1}' http://127.0.0.1:8545 - ``` +# wscat WS - === "wscat WS" +```bash +{"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x0000000000000000000000000000000000000000000000000000000000000001" +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - ``` +# curl GraphQL - === "curl GraphQL" +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql +``` - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql - ``` +# GraphQL - === "GraphQL" +```bash +{ + block { + number + call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { + data + status + } + } +} +``` - ```bash - { - block { - number - call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { - data - status - } - } - } - ``` +# GraphQL result - === "GraphQL result" +```json +{ + "data": { + "block": { + "number": 17449, + "call": { + "data": "0x", + "status": 1 + } + } + } +} +``` - ```json - { - "data" : { - "block" : { - "number" : 17449, - "call" : { - "data" : "0x", - "status" : 1 - } - } - } - } - ``` + ### `priv_createPrivacyGroup` @@ -1061,42 +1065,43 @@ Creates a group of nodes, specified by their [Tessera](https://docs.tessera.cons #### Parameters -`options`: *object* - request options object with the following fields: +`options`: _object_ - request options object with the following fields: -* `addresses`: *array* of *strings* - list of nodes specified by - [Tessera](https://docs.tessera.consensys.net/) public keys +- `addresses`: _array_ of _strings_ - list of nodes specified by [Tessera](https://docs.tessera.consensys.net/) public keys -* `name`: *string* - (optional) privacy group name +- `name`: _string_ - (optional) privacy group name -* `description`: *string* - (optional) privacy group description +- `description`: _string_ - (optional) privacy group description #### Returns -`result`: *string* - privacy group ID +`result`: _string_ - privacy group ID -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" +} +``` + + ### `priv_debugGetStateRoot` @@ -1104,40 +1109,39 @@ Returns the state root of the specified privacy group at the specified block. #### Parameters -* `privacyGroupId`: *string* - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, - `earliest`, or `pending`, as described in - [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *string* - 32-byte state root +`result`: _string_ - 32-byte state root -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" - } +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" +} +``` - ``` + ### `priv_deletePrivacyGroup` @@ -1145,439 +1149,433 @@ Deletes the specified privacy group. #### Parameters -`privacyGroupId`: *string* - privacy group ID +`privacyGroupId`: _string_ - privacy group ID #### Returns -`result`: *string* - deleted privacy group ID +`result`: _string_ - deleted privacy group ID + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 53, - "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" - } - ``` + ### `priv_distributeRawTransaction` -Distributes a signed, RLP encoded -[private transaction](../../how-to/send-transactions/private-transactions.md). +Distributes a signed, RLP encoded [private transaction](../../how-to/send-transactions/private-transactions.md). -!!! tip +:::tip - If you want to sign the [privacy marker transaction](../../how-to/use-privacy/sign-pmts.md) - outside of Besu, use [`priv_distributeRawTransaction`](../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) - instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction). +If you want to sign the [privacy marker transaction](../../how-to/use-privacy/sign-pmts.md) outside of Besu, use [`priv_distributeRawTransaction`](../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction). + +::: #### Parameters -`transaction`: *string* - signed RLP-encoded private transaction +`transaction`: _string_ - signed RLP-encoded private transaction #### Returns -`result`: *string* - 32-byte enclave key (the enclave key is a pointer to the private transaction in -[Tessera](https://docs.tessera.consensys.net/).) +`result`: _string_ - 32-byte enclave key (the enclave key is a pointer to the private transaction in [Tessera](https://docs.tessera.consensys.net/).) + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" - } - ``` + ### `priv_findPrivacyGroup` -Returns a list of privacy groups containing only the listed members. For example, if the listed -members are A and B, a privacy group containing A, B, and C is not returned. +Returns a list of privacy groups containing only the listed members. For example, if the listed members are A and B, a privacy group containing A, B, and C is not returned. #### Parameters -`members`: *array* of *strings* - members specified by [Tessera](https://docs.tessera.consensys.net/) public keys +`members`: _array_ of _strings_ - members specified by [Tessera](https://docs.tessera.consensys.net/) public keys #### Returns -`result`: *array* of *objects* - privacy group objects containing only the specified members; privacy groups are -[EEA-compliant](../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy) -or [Besu-extended](../../concepts/privacy/privacy-groups.md#besu-extended-privacy) with types: +`result`: _array_ of _objects_ - privacy group objects containing only the specified members; privacy groups are [EEA-compliant](../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy) or [Besu-extended](../../concepts/privacy/privacy-groups.md#besu-extended-privacy) with types: -* `LEGACY` for EEA-compliant groups. +- `LEGACY` for EEA-compliant groups. -* `PANTHEON` for Besu-extended groups. +- `PANTHEON` for Besu-extended groups. -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1} - ``` +```bash +{"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", - "name": "Group B", - "description": "Description of Group B", - "type": "PANTHEON", - "members": [ - "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", - "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" - ] - } - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", + "name": "Group B", + "description": "Description of Group B", + "type": "PANTHEON", + "members": [ + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" + ] + } + ] +} +``` + + ### `priv_getCode` -Returns the code of the private smart contract at the specified address. Compiled smart contract code -is stored as a hexadecimal value. +Returns the code of the private smart contract at the specified address. Compiled smart contract code is stored as a hexadecimal value. #### Parameters -* `privacyGroupId`: *string* - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) -* `address`: *string* - 20-byte contract address +- `address`: _string_ - 20-byte contract address -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, `earliest`, - or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *data* - code stored at the specified address +`result`: _data_ - code stored at the specified address -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" +} +``` -### `priv_getEeaTransactionCount` + -Returns the private transaction count for the specified account and -[group of sender and recipients]. +### `priv_getEeaTransactionCount` -!!! important +Returns the private transaction count for the specified account and [group of sender and recipients]. - If sending more than one transaction to be mined in the same block (that is, you are not - waiting for the transaction receipt), you must calculate the private transaction nonce outside - Besu instead of using `priv_getEeaTransactionCount`. +::caution important +If sending more than one transaction to be mined in the same block (that is, you are not +waiting for the transaction receipt), you must calculate the private transaction nonce outside +Besu instead of using `priv_getEeaTransactionCount`. +::: #### Parameters -* `address`: *string* - account address +- `address`: _string_ - account address -* `sender`: *string* - base64-encoded Tessera address of the sender +- `sender`: _string_ - base64-encoded Tessera address of the sender -* `recipients`: *array* of *strings* - base64-encoded Tessera addresses of recipients +- `recipients`: _array_ of _strings_ - base64-encoded Tessera addresses of recipients #### Returns -`result`: *string* - integer representing the number of private transactions sent from the address to the -specified group of sender and recipients +`result`: _string_ - integer representing the number of private transactions sent from the address to the specified group of sender and recipients + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x1" - } - ``` + ### `priv_getFilterChanges` -Polls the specified filter for a private contract and returns an array of changes that have occurred -since the last poll. +Polls the specified filter for a private contract and returns an array of changes that have occurred since the last poll. -Filters for private contracts can only be created by [`priv_newFilter`](#priv_newfilter) so unlike -[`eth_getFilterChanges`](../../../public-networks/reference/api/index.md#eth_getfilterchanges), -`priv_getFilterChanges` always returns an array of log objects or an empty list. +Filters for private contracts can only be created by [`priv_newFilter`](#priv_newfilter) so unlike [`eth_getFilterChanges`](../../../public-networks/reference/api/index.md#eth_getfilterchanges), `priv_getFilterChanges` always returns an array of log objects or an empty list. #### Parameters -* `privacyGroupId`: *string* - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) -* `filterId`: *string* - filter ID +- `filterId`: _string_ - filter ID #### Returns -`result`: *array* of *objects* - list of [log objects](../../../public-networks/reference/api/objects.md#log-object), -or an empty list if nothing has changed since the last poll - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x4d0", - "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", - "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", - "transactionIndex": "0x0", - "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", - "data": "0x", - "topics": [ - "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", - "0x0000000000000000000000000000000000000000000000000000000000000002" - ] - } - ] - } - ``` +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object), or an empty list if nothing has changed since the last poll + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d0", + "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", + "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + ### `priv_getFilterLogs` -Returns an array of [logs](../../../public-networks/concepts/events-and-logs.md) for the specified filter for a private -contract. +Returns an array of [logs](../../../public-networks/concepts/events-and-logs.md) for the specified filter for a private contract. + +For private contracts, `priv_getFilterLogs` is the same as [`eth_getFilterLogs`](../../../public-networks/reference/api/index.md#eth_getfilterlogs) for public contracts except there's no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) for private contracts. -For private contracts, `priv_getFilterLogs` is the same as -[`eth_getFilterLogs`](../../../public-networks/reference/api/index.md#eth_getfilterlogs) for public -contracts except there's no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) -for private contracts. +:::note -!!! note +`priv_getFilterLogs` is only used for filters created with [`priv_newFilter`](#priv_newfilter). To specify a filter object and get logs without creating a filter, use [`priv_getLogs`](#priv_getlogs). - `priv_getFilterLogs` is only used for filters created with [`priv_newFilter`](#priv_newfilter). - To specify a filter object and get logs without creating a filter, use [`priv_getLogs`](#priv_getlogs). +::: #### Parameters -* `privacyGroupId`: *string* - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) -* `filterId`: *string* - filter ID +- `filterId`: _string_ - filter ID #### Returns -`result`: *array* of *objects* - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x493", - "blockHash": "0xd9cb3a852e1e02c95f035a2e32d57f82c10cab61faa3e8f5c010adf979bb4786", - "transactionHash": "0x78866dc51fdf189d8cca74f6a8fe54f172348fbd2163bbe80fa8b106cfc7deb4", - "transactionIndex": "0x0", - "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", - "data": "0x", - "topics": [ - "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", - "0x0000000000000000000000000000000000000000000000000000000000000001" - ] - }, - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x4d0", - "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", - "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", - "transactionIndex": "0x0", - "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", - "data": "0x", - "topics": [ - "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", - "0x0000000000000000000000000000000000000000000000000000000000000002" - ] - } - ] - } - ``` +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x493", + "blockHash": "0xd9cb3a852e1e02c95f035a2e32d57f82c10cab61faa3e8f5c010adf979bb4786", + "transactionHash": "0x78866dc51fdf189d8cca74f6a8fe54f172348fbd2163bbe80fa8b106cfc7deb4", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d0", + "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", + "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + ### `priv_getLogs` Returns an array of [logs](../../../public-networks/concepts/events-and-logs.md) matching a specified filter object. -For private contracts, `priv_getLogs` is the same as [`eth_getLogs`](../../../public-networks/reference/api/index.md#eth_getlogs) -for public contracts except there is no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) -for private contracts. +For private contracts, `priv_getLogs` is the same as [`eth_getLogs`](../../../public-networks/reference/api/index.md#eth_getlogs) for public contracts except there is no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) for private contracts. #### Parameters -* `privacyGroupId`: *string* - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) -* `filterOptions`: *object* - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) +- `filterOptions`: _object_ - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) #### Returns -`result`: *array* of *objects* - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x342", - "blockHash": "0xf5954f068fa2f2f7741281e8c753a8e92047e27ab3c4971836d2c89fab86d92b", - "transactionHash": "0xa9ba5cffde9d4ad8997c5c4352d5d49eeea0e9def8a4ea69991b8837c49d4e4f", - "transactionIndex": "0x0", - "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", - "data": "0x", - "topics": [ - "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", - "0x0000000000000000000000000000000000000000000000000000000000000001" - ] - }, - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x383", - "blockHash": "0x91b73a47d53e3a88d62ed091a89a4be7557ad91b552e7ff7d86bf78977d5d45d", - "transactionHash": "0xc2a185faf00e87434e55b7f70cc4c38be354c2128b4b96b5f5def0b54a2173ec", - "transactionIndex": "0x0", - "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", - "data": "0x", - "topics": [ - "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", - "0x0000000000000000000000000000000000000000000000000000000000000002" - ] - } - ] - } - ``` +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x342", + "blockHash": "0xf5954f068fa2f2f7741281e8c753a8e92047e27ab3c4971836d2c89fab86d92b", + "transactionHash": "0xa9ba5cffde9d4ad8997c5c4352d5d49eeea0e9def8a4ea69991b8837c49d4e4f", + "transactionIndex": "0x0", + "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x383", + "blockHash": "0x91b73a47d53e3a88d62ed091a89a4be7557ad91b552e7ff7d86bf78977d5d45d", + "transactionHash": "0xc2a185faf00e87434e55b7f70cc4c38be354c2128b4b96b5f5def0b54a2173ec", + "transactionIndex": "0x0", + "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + ### `priv_getPrivacyPrecompileAddress` -Returns the address of the -[privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md). -The address -is derived and based on the value of the -[`privacy-flexible-groups-enabled`](../cli/options.md#privacy-flexible-groups-enabled) option. +Returns the address of the [privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md). The address is derived and based on the value of the [`privacy-flexible-groups-enabled`](../cli/options.md#privacy-flexible-groups-enabled) option. #### Parameters @@ -1585,31 +1583,33 @@ None #### Returns -`result`: *string* - address of the privacy precompile +`result`: _string_ - address of the privacy precompile -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x000000000000000000000000000000000000007e" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x000000000000000000000000000000000000007e" +} +``` + + ### `priv_getPrivateTransaction` @@ -1617,302 +1617,299 @@ Returns the private transaction if you are a participant, otherwise, `null`. #### Parameters -`transaction`: *string* - transaction hash returned by [`eea_sendRawTransaction`](#eea_sendrawtransaction) or -[`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). +`transaction`: _string_ - transaction hash returned by [`eea_sendRawTransaction`](#eea_sendrawtransaction) or [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). #### Returns -`result`: *object* - [private transaction object](objects.md#private-transaction-object), or `null` if not -a participant in the private transaction - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0x2dc6c0", - "gasPrice": "0x0", - "hash": "0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498", - "input": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610221806100606000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f2451461005c5780636057361d1461008757806367e404ce146100b4575b600080fd5b34801561006857600080fd5b5061007161010b565b6040518082815260200191505060405180910390f35b34801561009357600080fd5b506100b260048036038101908080359060200190929190505050610115565b005b3480156100c057600080fd5b506100c96101cb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600254905090565b7fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f53382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18060028190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050905600a165627a7a723058208efaf938851fb2d235f8bf9a9685f149129a30fe0f4b20a6c1885dc02f639eba0029", - "nonce": "0x0", - "to": null, - "value": "0x0", - "v": "0xfe8", - "r": "0x654a6a9663ca70bb13e27cca14b3777cc92da184e19a151cdeef2ccbbd5c6405", - "s": "0x5dd4667b020c8a5af7ae28d4c3126f8dcb1187f49dcf0de9d7a39b1651892eef", - "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", - "privateFor": [ - "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" - ], - "restriction": "restricted" - } - } - ``` +`result`: _object_ - [private transaction object](objects.md#private-transaction-object), or `null` if not a participant in the private transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x2dc6c0", + "gasPrice": "0x0", + "hash": "0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498", + "input": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610221806100606000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f2451461005c5780636057361d1461008757806367e404ce146100b4575b600080fd5b34801561006857600080fd5b5061007161010b565b6040518082815260200191505060405180910390f35b34801561009357600080fd5b506100b260048036038101908080359060200190929190505050610115565b005b3480156100c057600080fd5b506100c96101cb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600254905090565b7fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f53382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18060028190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050905600a165627a7a723058208efaf938851fb2d235f8bf9a9685f149129a30fe0f4b20a6c1885dc02f639eba0029", + "nonce": "0x0", + "to": null, + "value": "0x0", + "v": "0xfe8", + "r": "0x654a6a9663ca70bb13e27cca14b3777cc92da184e19a151cdeef2ccbbd5c6405", + "s": "0x5dd4667b020c8a5af7ae28d4c3126f8dcb1187f49dcf0de9d7a39b1651892eef", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privateFor": ["g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="], + "restriction": "restricted" + } +} +``` + + ### `priv_getTransactionCount` Returns the private transaction count for specified account and privacy group. -!!! important +:::important + +If sending more than one transaction to be mined in the same block (that is, you are not waiting for the transaction receipt), you must calculate the private transaction nonce outside Besu instead of using `priv_getTransactionCount`. - If sending more than one transaction to be mined in the same block (that is, you are not - waiting for the transaction receipt), you must calculate the private transaction nonce outside - Besu instead of using `priv_getTransactionCount`. +::: #### Parameters -* `address`: *string* - account address +- `address`: _string_ - account address -* `privacyGroupId`: *string* - privacy group ID +- `privacyGroupId`: _string_ - privacy group ID #### Returns -`result`: *string* - integer representing the number of private transactions sent from the address to the -specified privacy group +`result`: _string_ - integer representing the number of private transactions sent from the address to the specified privacy group -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x1" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + + ### `priv_getTransactionReceipt` -Returns information about the private transaction after mining the transaction. Receipts for -pending transactions are not available. +Returns information about the private transaction after mining the transaction. Receipts for pending transactions are not available. #### Parameters -`transaction`: *string* - 32-byte hash of a transaction +`transaction`: _string_ - 32-byte hash of a transaction #### Returns -`result`: *object* - [private Transaction receipt object](objects.md#private-transaction-receipt-object), -or `null` if no receipt found - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", - "blockNumber": "0x50", - "contractAddress": "0x493b76031593402e24e16faa81f677b58e2d53f3", - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "logs": [], - "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", - "transactionHash": "0x36219e92b5f53d4150aa9ef7d2d793118cced523de6724100da5b534e3ceb4b8", - "transactionIndex": "0x0", - "output": "0x6080604052600436106049576000357c010000000000000000000000000000000000000000000 - 0000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b3480156059 - 57600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b - 50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b8060008190555050560 - 0a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", - "commitmentHash": "0x79b9e6b0856db398ad7dc208f15b1d38c0c0b0c5f99e4a443a2c5a85510e96a5", - "status": "0x1", - "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", - "privacyGroupId": "cD636RZlcqVSpoxT/ExbkWQfBO7kPAZO0QlWHErNSL8=", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - } - } - ``` +`result`: _object_ - [private Transaction receipt object](objects.md#private-transaction-receipt-object), or `null` if no receipt found + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": "0x493b76031593402e24e16faa81f677b58e2d53f3", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "logs": [], + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0x36219e92b5f53d4150aa9ef7d2d793118cced523de6724100da5b534e3ceb4b8", + "transactionIndex": "0x0", + "output": "0x6080604052600436106049576000357c010000000000000000000000000000000000000000000 + 0000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b3480156059 + 57600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b + 50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b8060008190555050560 + 0a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "commitmentHash": "0x79b9e6b0856db398ad7dc208f15b1d38c0c0b0c5f99e4a443a2c5a85510e96a5", + "status": "0x1", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privacyGroupId": "cD636RZlcqVSpoxT/ExbkWQfBO7kPAZO0QlWHErNSL8=", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } +} +``` + + ### `priv_newFilter` -Creates a [log filter](../../../public-networks/concepts/events-and-logs.md) for a private contract. -To poll for logs associated with the created filter, use [`priv_getFilterChanges`](#priv_getfilterchanges). -To get all logs associated with the filter, use [`priv_getFilterLogs`](#priv_getfilterlogs). +Creates a [log filter](../../../public-networks/concepts/events-and-logs.md) for a private contract. To poll for logs associated with the created filter, use [`priv_getFilterChanges`](#priv_getfilterchanges). To get all logs associated with the filter, use [`priv_getFilterLogs`](#priv_getfilterlogs). -For private contracts, `priv_newFilter` is the same as [`eth_newFilter`](../../../public-networks/reference/api/index.md#eth_newfilter) -for public contracts. +For private contracts, `priv_newFilter` is the same as [`eth_newFilter`](../../../public-networks/reference/api/index.md#eth_newfilter) for public contracts. #### Parameters -* `privacyGroupId`: *string* - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterOptions`: _object_ - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) -* `filterOptions`: *object* - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) +:::note -!!! note +`fromBlock` and `toBlock` in the filter options object default to `latest`. - `fromBlock` and `toBlock` in the filter options object default to `latest`. +::: #### Returns -`result`: *string* - filter ID +`result`: _string_ - filter ID -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} - ``` +```bash +{"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x4a35b92809d73f4f53a2355d62125442" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4a35b92809d73f4f53a2355d62125442" +} +``` + + ### `priv_uninstallFilter` -Uninstalls a filter for a private contract with the specified ID. When a filter is no longer required, -call this method. +Uninstalls a filter for a private contract with the specified ID. When a filter is no longer required, call this method. -Filters time out when not requested by [`priv_getFilterChanges`](#priv_getfilterchanges) or -[`priv_getFilterLogs`](#priv_getfilterlogs) for 10 minutes. +Filters time out when not requested by [`priv_getFilterChanges`](#priv_getfilterchanges) or [`priv_getFilterLogs`](#priv_getfilterlogs) for 10 minutes. -For private contracts, `priv_uninstallFilter` is the same as -[`eth_uninstallFilter`](../../../public-networks/reference/api/index.md#eth_uninstallfilter) -for public contracts. +For private contracts, `priv_uninstallFilter` is the same as [`eth_uninstallFilter`](../../../public-networks/reference/api/index.md#eth_uninstallfilter) for public contracts. #### Parameters -* `privacyGroupId`: *string* - 32-byte [privacy group ID](../../concepts/privacy/privacy-groups.md) +- `privacyGroupId`: _string_ - 32-byte [privacy group ID](../../concepts/privacy/privacy-groups.md) -* `filterId`: *string* - filter ID +- `filterId`: _string_ - filter ID #### Returns -`result`: *boolean* - indicates if the filter is successfully uninstalled +`result`: _boolean_ - indicates if the filter is successfully uninstalled + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` - ```bash - {"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": true - } - ``` + ## `QBFT` methods The `QBFT` API methods provide access to the [QBFT](../../how-to/configure/consensus/qbft.md) consensus engine. -!!! note +:::note - The `QBFT` API methods are not enabled by default for JSON-RPC. To enable the `QBFT` API - methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. +The `QBFT` API methods are not enabled by default for JSON-RPC. To enable the `QBFT` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: ### `qbft_discardValidatorVote` -Discards a proposal to -[add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with -the specified address. +Discards a proposal to [add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with the specified address. #### Parameters -`address`: *string* - 20-byte address of proposed validator +`address`: _string_ - 20-byte address of proposed validator #### Returns -`result`: *boolean* - indicates if the proposal is discarded +`result`: _boolean_ - indicates if the proposal is discarded + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : true - } - ``` + ### `qbft_getPendingVotes` -Returns [votes](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) cast in the current -[epoch](../../how-to/configure/consensus/qbft.md#genesis-file). +Returns [votes](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) cast in the current [epoch](../../how-to/configure/consensus/qbft.md#genesis-file). #### Parameters @@ -1920,112 +1917,110 @@ None #### Returns -`result`: *map* of *strings* to *booleans* - map of account addresses to corresponding boolean values indicating the -vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to -remove a validator. +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to remove a validator. -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, - "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, + "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true + } +} +``` + + ### `qbft_getSignerMetrics` Provides the following validator metrics for the specified range: -* Number of blocks from each validator +- Number of blocks from each validator -* Block number of the last block proposed by each validator (if any proposed in the specified - range) +- Block number of the last block proposed by each validator (if any proposed in the specified range) -* All validators present in the last block of the range +- All validators present in the last block of the range #### Parameters -* `fromBlockNumber`: *string* - integer representing a block number or the string tag `earliest` as described - in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest` as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) -* `toBlockNumber`: *string* - integer representing a block number or one of the string tags `latest` or - `pending`, as described in - [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) If you specify: -* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less - than 100 blocks. +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. -* Only the first parameter, the call provides metrics for all blocks from the block specified to - the latest block. +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. #### Returns -`result`: *array* of *objects* - list of validator objects +`result`: _array_ of _objects_ - list of validator objects + +:::note -!!! note +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. - The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. +::: -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", - "proposedBlockCount": "0x21", - "lastProposedBlockNumber": "0x61" - }, - { - "address": "0x42eb768f2244c8811c63729a21a3569731535f06", - "proposedBlockCount": "0x21", - "lastProposedBlockNumber": "0x63" - }, - { - "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", - "proposedBlockCount": "0x21", - "lastProposedBlockNumber": "0x62" - } - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + ### `qbft_getValidatorsByBlockHash` @@ -2033,39 +2028,41 @@ Lists the validators defined in the specified block. #### Parameters -`block`: *string* - 32-byte block hash +`block`: _string_ - 32-byte block hash #### Returns -`result`: *array* of *strings* - list of validator addresses +`result`: _array_ of _strings_ - list of validator addresses + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "0x42d4287eac8078828cf5f3486cfe601a275a49a5", - "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", - "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" - ] - } - ``` + ### `qbft_getValidatorsByBlockNumber` @@ -2073,87 +2070,88 @@ Lists the validators defined in the specified block. #### Parameters -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, - `earliest`, or `pending`, as described in - [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *array* of *strings* - list of validator addresses +`result`: _array_ of _strings_ - list of validator addresses -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "0x42d4287eac8078828cf5f3486cfe601a275a49a5", - "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", - "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + ### `qbft_proposeValidatorVote` -Proposes to -[add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with -the specified address. +Proposes to [add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with the specified address. #### Parameters -* `address`: *string* - account address +- `address`: _string_ - account address -* `proposal`: *boolean* - `true` to propose adding validator or `false` to propose removing validator +- `proposal`: _boolean_ - `true` to propose adding validator or `false` to propose removing validator #### Returns -`result`: *boolean* - `true` +`result`: _boolean_ - `true` + + -!!! example +# curl HTTP request - === "curl HTTP request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 - ``` +# wscat WS request - === "wscat WS request" +```bash +{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} +``` - ```bash - {"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : true - } - ``` + + [add or remove a signer with the specified address]: ../../how-to/configure/consensus/clique.md#add-and-remove-signers [signers for the specified block]: ../../how-to/configure/consensus/clique.md#adding-and-removing-signers [add or remove a validator]: ../../how-to/configure/consensus/ibft.md#add-and-remove-validators [permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file [group of sender and recipients]: ../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy -*[EEA]: Enterprise Ethereum Alliance +\*[EEA]: Enterprise Ethereum Alliance diff --git a/docs/private-networks/reference/api/objects.md b/docs/private-networks/reference/api/objects.md index 605b31b3865..747a50db098 100644 --- a/docs/private-networks/reference/api/objects.md +++ b/docs/private-networks/reference/api/objects.md @@ -1,55 +1,59 @@ --- +title: Private network API objects +sidebar_position: 2 description: Hyperledger Besu private network API objects reference +tags: + - private networks --- # Private network API objects The following objects are parameters for or returned by Besu private network API methods. -!!! attention +:::warning - This reference contains API objects that apply to only private networks. - For API objects that apply to both private and public networks, see the - [public network API objects reference](../../../public-networks/reference/api/objects.md). +This reference contains API objects that apply to only private networks. For API objects that apply to both private and public networks, see the [public network API objects reference](../../../public-networks/reference/api/objects.md). + +::: ## Private transaction object Returned by [`priv_getPrivateTransaction`](index.md#priv_getprivatetransaction). | Key | Type | Value | -|-----|:----:|-------| -| `from` | Data, 20 bytes | Address of the sender. | -| `gas` | Quantity | Gas provided by the sender. | -| `gasPrice` | Quantity | Gas price, in Wei, provided by the sender. | -| `input` | Data | The data to create or invoke a contract. | -| `nonce` | Quantity | Number of transactions made by the sender to the privacy group before this one. | -| `to` | Data, 20 bytes | `null` if a contract creation transaction, otherwise, the contract address. | -| `value` | Quantity | `null` because private transactions cannot transfer Ether. | -| `v` | Quantity | ECDSA Recovery ID. | -| `r` | Data, 32 bytes | ECDSA signature r. | -| `s` | Data, 32 bytes | ECDSA signature s. | -| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | -| `privateFor` | Array of Data, 32 bytes each | [Tessera](https://docs.tessera.consensys.net/) public keys of recipients. Not returned if using `privacyGroupId` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | -| `privacyGroupId` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) privacy group ID of recipients. Not returned if using `privateFor` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | -| `restriction` | String | Must be [`restricted`](../../../private-networks/concepts/privacy/private-transactions/index.md). | +| --- | :-: | --- | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | Gas price, in Wei, provided by the sender. | +| `input` | Data | The data to create or invoke a contract. | +| `nonce` | Quantity | Number of transactions made by the sender to the privacy group before this one. | +| `to` | Data, 20 bytes | `null` if a contract creation transaction, otherwise, the contract address. | +| `value` | Quantity | `null` because private transactions cannot transfer Ether. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | +| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | +| `privateFor` | Array of Data, 32 bytes each | [Tessera](https://docs.tessera.consensys.net/) public keys of recipients. Not returned if using `privacyGroupId` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | +| `privacyGroupId` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) privacy group ID of recipients. Not returned if using `privateFor` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | +| `restriction` | String | Must be [`restricted`](../../../private-networks/concepts/privacy/private-transactions/index.md). | ## Private transaction receipt object Returned by [`priv_getTransactionReceipt`](index.md#priv_gettransactionreceipt). -| Key | Type | Value | -|-----|:----:|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | -| `blockNumber` | Quantity | Block number of block containing this transaction. | -| `contractAddress` | Data, 20 bytes | Contract address created if a contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | -| `from` | Data, 20 bytes | Address of the sender. | -| `logs` | Array | Array of [log objects](../../../public-networks/reference/api/objects.md#log-object) generated by this private transaction. | -| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | -| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | -| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | -| `output` | Data | RLP-encoded return value of a contract call if a value returns, otherwise, `null`. | -| `commitmentHash` | Data, 32 bytes | Hash of the privacy marker transaction. | -| `status` | Quantity | Either `0x1` (success) or `0x0` (failure). | -| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | -| `privateFor` or `privacyGroupId` | Array or Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public keys or privacy group ID of the recipients. | -| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | +| Key | Type | Value | +| --- | :-: | --- | +| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | +| `blockNumber` | Quantity | Block number of block containing this transaction. | +| `contractAddress` | Data, 20 bytes | Contract address created if a contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | +| `from` | Data, 20 bytes | Address of the sender. | +| `logs` | Array | Array of [log objects](../../../public-networks/reference/api/objects.md#log-object) generated by this private transaction. | +| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | +| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | +| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | +| `output` | Data | RLP-encoded return value of a contract call if a value returns, otherwise, `null`. | +| `commitmentHash` | Data, 32 bytes | Hash of the privacy marker transaction. | +| `status` | Quantity | Either `0x1` (success) or `0x0` (failure). | +| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | +| `privateFor` or `privacyGroupId` | Array or Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public keys or privacy group ID of the recipients. | +| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | diff --git a/docs/private-networks/reference/cli/_category_.json b/docs/private-networks/reference/cli/_category_.json new file mode 100644 index 00000000000..bec3b04721b --- /dev/null +++ b/docs/private-networks/reference/cli/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu CLI", + "position": 1 +} diff --git a/docs/private-networks/reference/cli/options.md b/docs/private-networks/reference/cli/options.md index 63a479bc22a..064549d46f2 100644 --- a/docs/private-networks/reference/cli/options.md +++ b/docs/private-networks/reference/cli/options.md @@ -1,40 +1,42 @@ --- +title: Private network options +sidebar_position: 1 description: Hyperledger Besu private networks CLI reference +tags: + - private networks --- # Private network command line options -This reference describes the syntax of the Hyperledger Besu private network command line interface -(CLI) options. +This reference describes the syntax of the Hyperledger Besu private network command line interface (CLI) options. -!!! attention +:::danger - This reference contains options that apply to only private networks. - For options that apply to both private and public networks, see the - [public network options reference](../../../public-networks/reference/cli/options.md). +This reference contains options that apply to only private networks. For options that apply to both private and public networks, see the [public network options reference](../../../public-networks/reference/cli/options.md). + +::: ## Specify options You can specify Besu options: -* On the command line. +- On the command line. + + ```bash + besu [OPTIONS] [SUBCOMMAND] + ``` - ```bash - besu [OPTIONS] [SUBCOMMAND] - ``` +- As an environment variable. For each command line option, the equivalent environment variable is: -* As an environment variable. - For each command line option, the equivalent environment variable is: - * Uppercase. - * `_` replaces `-`. - * Has a `BESU_` prefix. + - Uppercase. + - `_` replaces `-`. + - Has a `BESU_` prefix. For example, set `--miner-coinbase` using the `BESU_MINER_COINBASE` environment variable. -* In a [configuration file](../../../public-networks/how-to/configuration-file.md). +- In a [configuration file](../../../public-networks/how-to/configuration-file.md). -If you specify an option in more than one place, the order of priority is command line, environment -variable, configuration file. +If you specify an option in more than one place, the order of priority is command line, environment variable, configuration file. If using Bash or Z shell, you can view option suggestions by entering `--` and pressing the Tab key twice. @@ -42,417 +44,458 @@ If using Bash or Z shell, you can view option suggestions by entering `--` and p besu --Tab+Tab ``` -!!! caution +:::caution - Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. - Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em - hyphens. +Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em hyphens. + +::: ## Options ### `permissions-accounts-config-file` -=== "Syntax" + - ```bash - --permissions-accounts-config-file= - ``` +# Syntax -=== "Example" +```bash +--permissions-accounts-config-file= +``` - ```bash - --permissions-accounts-config-file=/home/me/me_configFiles/myPermissionsFile - ``` +# Example -=== "Environment variable" +```bash +--permissions-accounts-config-file=/home/me/me_configFiles/myPermissionsFile +``` - ```bash - BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile +``` + +# Configuration file + +```bash +permissions-accounts-config-file="/home/me/me_configFiles/myPermissionsFile" +``` - ```bash - permissions-accounts-config-file="/home/me/me_configFiles/myPermissionsFile" - ``` + -The [accounts permissions configuration file]. The default is the `permissions_config.toml` file in -the [data directory](../../../public-networks/reference/cli/options.md#data-path). +The [accounts permissions configuration file]. The default is the `permissions_config.toml` file in the [data directory](../../../public-networks/reference/cli/options.md#data-path). -!!! tip +:::tip - `--permissions-accounts-config-file` and - [`--permissions-nodes-config-file`](#permissions-nodes-config-file) can use the same file. +`--permissions-accounts-config-file` and [`--permissions-nodes-config-file`](#permissions-nodes-config-file) can use the same file. + +::: ### `permissions-accounts-config-file-enabled` -=== "Syntax" + + +# Syntax + +```bash +--permissions-accounts-config-file-enabled[=] +``` - ```bash - --permissions-accounts-config-file-enabled[=] - ``` +# Example -=== "Example" +```bash +--permissions-accounts-config-file-enabled=true +``` - ```bash - --permissions-accounts-config-file-enabled=true - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE_ENABLED=true +``` - ```bash - BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE_ENABLED=true - ``` +# Configuration file -=== "Configuration file" +```bash +permissions-accounts-config-file-enabled=true +``` - ```bash - permissions-accounts-config-file-enabled=true - ``` + Enables or disables file-based account level permissions. The default is `false`. ### `permissions-accounts-contract-address` -=== "Syntax" + + +# Syntax - ```bash - --permissions-accounts-contract-address= - ``` +```bash +--permissions-accounts-contract-address= +``` -=== "Example" +# Example - ```bash - --permissions-accounts-contract-address=xyz - ``` +```bash +--permissions-accounts-contract-address=xyz +``` -=== "Environment variable" +# Environment variable - ```bash - BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ADDRESS=xyz - ``` +```bash +BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ADDRESS=xyz +``` -=== "Configuration file" +# Configuration file - ```bash - permissions-accounts-contract-address="xyz" - ``` +```bash +permissions-accounts-contract-address="xyz" +``` + + -The contract address for -[onchain account permissioning](../../concepts/permissioning/onchain.md). +The contract address for [onchain account permissioning](../../concepts/permissioning/onchain.md). ### `permissions-accounts-contract-enabled` -=== "Syntax" + - ```bash - --permissions-accounts-contract-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--permissions-accounts-contract-enabled[=] +``` - ```bash - --permissions-accounts-contract-enabled=true - ``` +# Example -=== "Environment variable" +```bash +--permissions-accounts-contract-enabled=true +``` - ```bash - BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ENABLED=true - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ENABLED=true +``` + +# Configuration file + +```bash +permissions-accounts-contract-enabled=true +``` - ```bash - permissions-accounts-contract-enabled=true - ``` + -Enables or disables contract-based -[onchain account permissioning](../../concepts/permissioning/onchain.md). The default -is `false`. +Enables or disables contract-based [onchain account permissioning](../../concepts/permissioning/onchain.md). The default is `false`. ### `permissions-nodes-config-file` -=== "Syntax" + - ```bash - --permissions-nodes-config-file= - ``` +# Syntax + +```bash +--permissions-nodes-config-file= +``` + +# Example + +```bash +--permissions-nodes-config-file=/home/me/me_configFiles/myPermissionsFile +``` -=== "Example" +# Environment variable - ```bash - --permissions-nodes-config-file=/home/me/me_configFiles/myPermissionsFile - ``` +```bash +BESU_PERMISSIONS_NODES_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile +``` -=== "Environment variable" +# Configuration file - ```bash - BESU_PERMISSIONS_NODES_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile - ``` +```bash +permissions-nodes-config-file="/home/me/me_configFiles/myPermissionsFile" +``` -=== "Configuration file" + - ```bash - permissions-nodes-config-file="/home/me/me_configFiles/myPermissionsFile" - ``` +The [nodes permissions configuration file]. The default is the `permissions_config.toml` file in the [data directory](../../../public-networks/reference/cli/options.md#data-path). -The [nodes permissions configuration file]. The default is the `permissions_config.toml` file in -the [data directory](../../../public-networks/reference/cli/options.md#data-path). +:::tip -!!! tip +`--permissions-nodes-config-file` and [`--permissions-accounts-config-file`](#permissions-accounts-config-file) can use the same file. - `--permissions-nodes-config-file` and - [`--permissions-accounts-config-file`](#permissions-accounts-config-file) can use the same - file. +::: ### `permissions-nodes-config-file-enabled` -=== "Syntax" + - ```bash - --permissions-nodes-config-file-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--permissions-nodes-config-file-enabled[=] +``` - ```bash - --permissions-nodes-config-file-enabled=true - ``` +# Example -=== "Environment variable" +```bash +--permissions-nodes-config-file-enabled=true +``` - ```bash - BESU_PERMISSIONS_NODES_CONFIG_FILE_ENABLED=true - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PERMISSIONS_NODES_CONFIG_FILE_ENABLED=true +``` - ```bash - permissions-nodes-config-file-enabled=true - ``` +# Configuration file + +```bash +permissions-nodes-config-file-enabled=true +``` + + Enables or disables file-based node level permissions. The default is `false`. ### `permissions-nodes-contract-address` -=== "Syntax" + + +# Syntax + +```bash +--permissions-nodes-contract-address= +``` - ```bash - --permissions-nodes-contract-address= - ``` +# Example -=== "Example" +```bash +--permissions-nodes-contract-address=xyz +``` - ```bash - --permissions-nodes-contract-address=xyz - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_PERMISSIONS_NODES_CONTRACT_ADDRESS=xyz +``` - ```bash - BESU_PERMISSIONS_NODES_CONTRACT_ADDRESS=xyz - ``` +# Configuration file -=== "Configuration file" +```bash +permissions-nodes-contract-address="xyz" +``` - ```bash - permissions-nodes-contract-address="xyz" - ``` + -The contract address for -[onchain node permissioning](../../concepts/permissioning/onchain.md). +The contract address for [onchain node permissioning](../../concepts/permissioning/onchain.md). ### `permissions-nodes-contract-enabled` -=== "Syntax" + - ```bash - --permissions-nodes-contract-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--permissions-nodes-contract-enabled[=] +``` - ```bash - --permissions-nodes-contract-enabled=true - ``` +# Example -=== "Environment variable" +```bash +--permissions-nodes-contract-enabled=true +``` - ```bash - BESU_PERMISSIONS_NODES_CONTRACT_ENABLED=true - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PERMISSIONS_NODES_CONTRACT_ENABLED=true +``` - ```bash - permissions-nodes-contract-enabled=true - ``` +# Configuration file -Enables or disables contract-based -[onchain node permissioning](../../concepts/permissioning/onchain.md). The default is -`false`. +```bash +permissions-nodes-contract-enabled=true +``` + + + +Enables or disables contract-based [onchain node permissioning](../../concepts/permissioning/onchain.md). The default is `false`. ### `permissions-nodes-contract-version` -=== "Syntax" + - ```bash - --permissions-nodes-contract-version= - ``` +# Syntax -=== "Example" +```bash +--permissions-nodes-contract-version= +``` - ```bash - --permissions-nodes-contract-version=2 - ``` +# Example -=== "Environment variable" +```bash +--permissions-nodes-contract-version=2 +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_VERSION=2 +``` - ```bash - BESU_PERMISSIONS_NODES_CONTRACT_VERSION=2 - ``` +# Configuration file -=== "Configuration file" +```bash +permissions-nodes-contract-version=2 +``` - ```bash - permissions-nodes-contract-version=2 - ``` + -Version of the EEA [node permissioning interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version). -The default is 1. +Version of the EEA [node permissioning interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version). The default is 1. ### `privacy-enabled` -=== "Syntax" + - ```bash - --privacy-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--privacy-enabled[=] +``` - ```bash - --privacy-enabled=false - ``` +# Example -=== "Environment variable" +```bash +--privacy-enabled=false +``` - ```bash - BESU_PRIVACY_ENABLED=false - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PRIVACY_ENABLED=false +``` + +# Configuration file - ```bash - privacy-enabled=false - ``` +```bash +privacy-enabled=false +``` -Enables or disables [private transactions](../../concepts/privacy/index.md). The default -is `false`. + -!!! important +Enables or disables [private transactions](../../concepts/privacy/index.md). The default is `false`. - Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md) - or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) is not supported. +:::important + +Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md) or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) is not supported. + +::: ### `privacy-marker-transaction-signing-key-file` -=== "Syntax" + - ```bash - --privacy-marker-transaction-signing-key-file= - ``` +# Syntax -=== "Example" +```bash +--privacy-marker-transaction-signing-key-file= +``` - ```bash - --privacy-marker-transaction-signing-key-file=/home/me/me_node/myPrivateKey - ``` +# Example -=== "Environment variable" +```bash +--privacy-marker-transaction-signing-key-file=/home/me/me_node/myPrivateKey +``` - ```bash - BESU_PRIVACY_MARKER_TRANSACTION_SIGNING_KEY_FILE=/home/me/me_node/myPrivateKey - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PRIVACY_MARKER_TRANSACTION_SIGNING_KEY_FILE=/home/me/me_node/myPrivateKey +``` - ```bash - privacy-marker-transaction-signing-key-file="/home/me/me_node/myPrivateKey" - ``` +# Configuration file -`` is the name of the private key file used to -[sign privacy marker transactions](../../how-to/use-privacy/sign-pmts.md). +```bash +privacy-marker-transaction-signing-key-file="/home/me/me_node/myPrivateKey" +``` + + + +`` is the name of the private key file used to [sign privacy marker transactions](../../how-to/use-privacy/sign-pmts.md). -!!! note +:::note - This can be the same file used by [`--node-private-key-file`](../../../public-networks/reference/cli/options.md#node-private-key-file), - or a different key file to identify who signed the privacy marker transaction. +This can be the same file used by [`--node-private-key-file`](../../../public-networks/reference/cli/options.md#node-private-key-file), or a different key file to identify who signed the privacy marker transaction. + +::: You must specify this option if you're using: -* a privacy network where you pay gas. Also, the associated account must contain adequate funds. -* [account permissioning] and privacy. You must include the corresponding public key in the - accounts allowlist. +- a privacy network where you pay gas. Also, the associated account must contain adequate funds. +- [account permissioning] and privacy. You must include the corresponding public key in the accounts allowlist. -If you do not specify this option (for example, in a free gas network), Besu signs each transaction -with a different randomly generated key. +If you do not specify this option (for example, in a free gas network), Besu signs each transaction with a different randomly generated key. ### `privacy-multi-tenancy-enabled` -=== "Syntax" + + +# Syntax + +```bash +--privacy-multi-tenancy-enabled[=] +``` - ```bash - --privacy-multi-tenancy-enabled[=] - ``` +# Example -=== "Example" +```bash +--privacy-multi-tenancy-enabled=false +``` - ```bash - --privacy-multi-tenancy-enabled=false - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_PRIVACY_MULTI_TENANCY_ENABLED=false +``` - ```bash - BESU_PRIVACY_MULTI_TENANCY_ENABLED=false - ``` +# Configuration file -=== "Configuration file" +```bash +privacy-multi-tenancy-enabled=false +``` - ```bash - privacy-multi-tenancy-enabled=false - ``` + -Enables or disables [multi-tenancy](../../concepts/privacy/multi-tenancy.md) for private -transactions. The default is `false`. +Enables or disables [multi-tenancy](../../concepts/privacy/multi-tenancy.md) for private transactions. The default is `false`. ### `privacy-flexible-groups-enabled` -=== "Syntax" + - ```bash - --privacy-flexible-groups-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--privacy-flexible-groups-enabled[=] +``` - ```bash - --privacy-flexible-groups-enabled=true - ``` +# Example -=== "Environment variable" +```bash +--privacy-flexible-groups-enabled=true +``` - ```bash - BESU_PRIVACY_FLEXIBLE_GROUPS_ENABLED=true - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PRIVACY_FLEXIBLE_GROUPS_ENABLED=true +``` + +# Configuration file + +```bash +privacy-flexible-groups-enabled=true +``` - ```bash - privacy-flexible-groups-enabled=true - ``` + Enables or disables [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). The default is `false`. @@ -460,186 +503,206 @@ Deprecated syntax for this option is `--privacy-onchain-groups-enabled`. ### `privacy-public-key-file` -=== "Syntax" + - ```bash - --privacy-public-key-file= - ``` +# Syntax -=== "Example" +```bash +--privacy-public-key-file= +``` + +# Example + +```bash +--privacy-public-key-file=Tessera/nodeKey.pub +``` - ```bash - --privacy-public-key-file=Tessera/nodeKey.pub - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_PRIVACY_PUBLIC_KEY_FILE=Tessera/nodeKey.pub +``` - ```bash - BESU_PRIVACY_PUBLIC_KEY_FILE=Tessera/nodeKey.pub - ``` +# Configuration file -=== "Configuration file" +```bash +privacy-public-key-file="Tessera/nodeKey.pub" +``` - ```bash - privacy-public-key-file="Tessera/nodeKey.pub" - ``` + The [public key of the Tessera node](https://docs.tessera.consensys.net/). -!!! important +:::important - You cannot specify `privacy-public-key-file` when - [`--privacy-multi-tenancy-enabled`](#privacy-multi-tenancy-enabled) is `true` +You cannot specify `privacy-public-key-file` when [`--privacy-multi-tenancy-enabled`](#privacy-multi-tenancy-enabled) is `true` + +::: ### `privacy-tls-enabled` -=== "Syntax" + - ```bash - --privacy-tls-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--privacy-tls-enabled[=] +``` - ```bash - --privacy-tls-enabled=false - ``` +# Example -=== "Environment variable" +```bash +--privacy-tls-enabled=false +``` - ```bash - BESU_PRIVACY_TLS_ENABLED=false - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PRIVACY_TLS_ENABLED=false +``` - ```bash - privacy-tls-enabled=false - ``` +# Configuration file + +```bash +privacy-tls-enabled=false +``` -Enables or disables [TLS on communication with the private transaction manager]. The default is -false. + + +Enables or disables [TLS on communication with the private transaction manager]. The default is false. ### `privacy-tls-keystore-file` -=== "Syntax" + - ```bash - --privacy-tls-keystore-file= - ``` +# Syntax -=== "Example" +```bash +--privacy-tls-keystore-file= +``` - ```bash - --privacy--keystore-file=/home/me/me_node/key - ``` +# Example -=== "Environment variable" +```bash +--privacy--keystore-file=/home/me/me_node/key +``` - ```bash - BESU_PRIVACY_TLS_KEYSTORE_FILE=/home/me/me_node/key - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PRIVACY_TLS_KEYSTORE_FILE=/home/me/me_node/key +``` + +# Configuration file + +```bash +privacy-tls-keystore-file="/home/me/me_node/key" +``` - ```bash - privacy-tls-keystore-file="/home/me/me_node/key" - ``` + -The keystore file (in PKCS #12 format) containing the private key and the certificate presented -during authentication. +The keystore file (in PKCS #12 format) containing the private key and the certificate presented during authentication. -You must specify `privacy-tls-keystore-file` if [`--privacy-tls-enabled`](#privacy-tls-enabled) is -`true`. +You must specify `privacy-tls-keystore-file` if [`--privacy-tls-enabled`](#privacy-tls-enabled) is `true`. ### `privacy-tls-keystore-password-file` -=== "Syntax" + - ```bash - --privacy-tls-keystore-password-file= - ``` +# Syntax -=== "Example" +```bash +--privacy-tls-keystore-password-file= +``` - ```bash - --privacy-tls-keystore-password-file=/home/me/me_node/password - ``` +# Example -=== "Environment variable" +```bash +--privacy-tls-keystore-password-file=/home/me/me_node/password +``` - ```bash - BESU_PRIVACY_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_PRIVACY_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password +``` - ```bash - privacy-tls-keystore-password-file="/home/me/me_node/password" - ``` +# Configuration file + +```bash +privacy-tls-keystore-password-file="/home/me/me_node/password" +``` + + The path to the file containing the password to decrypt the keystore. ### `privacy-tls-known-enclave-file` -=== "Syntax" + + +# Syntax + +```bash +--privacy-tls-known-enclave-file= +``` - ```bash - --privacy-tls-known-enclave-file= - ``` +# Example -=== "Example" +```bash +--privacy-tls-known-enclave-file=/home/me/me_node/knownEnclave +``` - ```bash - --privacy-tls-known-enclave-file=/home/me/me_node/knownEnclave - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_PRIVACY_TLS_KNOWN_ENCLAVE_FILE=/home/me/me_node/knownEnclave +``` - ```bash - BESU_PRIVACY_TLS_KNOWN_ENCLAVE_FILE=/home/me/me_node/knownEnclave - ``` +# Configuration file -=== "Configuration file" +```bash +privacy-tls-known-enclave-file="/home/me/me_node/knownEnclave" +``` - ```bash - privacy-tls-known-enclave-file="/home/me/me_node/knownEnclave" - ``` + -The path to the file containing the hostnames, ports, and SHA256 certificate fingerprints of the -[authorized privacy enclave](../../how-to/configure/tls/client-and-server.md#create-the-known-servers-file). +The path to the file containing the hostnames, ports, and SHA256 certificate fingerprints of the [authorized privacy enclave](../../how-to/configure/tls/client-and-server.md#create-the-known-servers-file). ### `privacy-url` -=== "Syntax" + + +# Syntax + +```bash +--privacy-url= +``` - ```bash - --privacy-url= - ``` +# Example -=== "Example" +```bash +--privacy-url=http://127.0.0.1:8888 +``` - ```bash - --privacy-url=http://127.0.0.1:8888 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_PRIVACY_URL=http://127.0.0.1:8888 +``` - ```bash - BESU_PRIVACY_URL=http://127.0.0.1:8888 - ``` +# Configuration file -=== "Configuration file" +```bash +privacy-url="http://127.0.0.1:8888" +``` - ```bash - privacy-url="http://127.0.0.1:8888" - ``` + -The URL on which the -[Tessera node](../../tutorials/privacy/index.md#3-create-tessera-configuration-files) is -running. +The URL on which the [Tessera node](../../tutorials/privacy/index.md#3-create-tessera-configuration-files) is running. + [accounts permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file [nodes permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file [account permissioning]: ../../concepts/permissioning/index.md#account-permissioning diff --git a/docs/private-networks/reference/cli/subcommands.md b/docs/private-networks/reference/cli/subcommands.md index 61361ae3e8a..5b8b07c4dbd 100644 --- a/docs/private-networks/reference/cli/subcommands.md +++ b/docs/private-networks/reference/cli/subcommands.md @@ -1,17 +1,20 @@ --- +title: Private network subcommands +sidebar_position: 2 description: Hyperledger Besu command line interface subcommands +tags: + - private networks --- # Private network subcommands -This reference describes the syntax of the Hyperledger Besu private network command line interface -(CLI) subcommands. +This reference describes the syntax of the Hyperledger Besu private network command line interface (CLI) subcommands. -!!! attention +:::danger - This reference contains subcommands that apply to only private networks. - For subcommands that apply to both private and public networks, see the - [public network subcommands reference](../../../public-networks/reference/cli/subcommands.md). +This reference contains subcommands that apply to only private networks. For subcommands that apply to both private and public networks, see the [public network subcommands reference](../../../public-networks/reference/cli/subcommands.md). + +::: To start a Besu node using subcommands, run: @@ -31,25 +34,25 @@ Provides operator actions. ### `generate-blockchain-config` -=== "Syntax" + - ```bash - besu operator generate-blockchain-config --config-file= --to= [--genesis-file-name=] [--private-key-file-name=] [--public-key-file-name=] - ``` +# Syntax -=== "Example" +```bash +besu operator generate-blockchain-config --config-file= --to= [--genesis-file-name=] [--private-key-file-name=] [--public-key-file-name=] +``` - ```bash - besu operator generate-blockchain-config --config-file=config.json --to=myNetworkFiles - ``` -Generates an -[IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) or -[QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. +# Example -The configuration file has two nested JSON nodes. -The first is the `genesis` property defining the IBFT 2.0 or QBFT genesis file, except for the -`extraData` string. -The second is the `blockchain` property defining the number of key pairs to generate. +```bash +besu operator generate-blockchain-config --config-file=config.json --to=myNetworkFiles +``` + + + +Generates an [IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) or [QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 or QBFT genesis file, except for the `extraData` string. The second is the `blockchain` property defining the number of key pairs to generate. ## `rlp` @@ -57,83 +60,84 @@ Provides RLP related actions. ### `encode` -=== "Syntax" + - ```bash - besu rlp encode [--from=] [--to=] [--type=] - ``` +# Syntax + +```bash +besu rlp encode [--from=] [--to=] [--type=] +``` -=== "File example" +# File example ```bash besu rlp encode --from=ibft_extra_data.json --to=extra_data_for_ibft_genesis.txt --type=IBFT_EXTRA_DATA ``` -=== "Standard input/output example" +# Standard input/output example - ```bash - cat extra_data.json | besu rlp encode > rlp.txt - ``` +```bash +cat extra_data.json | besu rlp encode > rlp.txt +``` -Encodes the RLP hexadecimal string for use in an [IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) -or [QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. -The default type is `IBFT_EXTRA_DATA`. + + +Encodes the RLP hexadecimal string for use in an [IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) or [QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. The default type is `IBFT_EXTRA_DATA`. Supported types are: -* `IBFT_EXTRA_DATA` - The IBFT 2.0 genesis file includes the `IBFT_EXTRA_DATA` type in the - [`extraData`](../../how-to/configure/consensus/ibft.md#extra-data) property. - -* `QBFT_EXTRA_DATA` - The QBFT genesis file includes the `QBFT_EXTRA_DATA` type in the - [`extraData`](../../how-to/configure/consensus/qbft.md#extra-data) property. - -???+ summary "IBFT 2.0 extra data" - - To generate the RLP encoded `extraData` string, specify a JSON input that is an array of - validator addresses in ascending order. - - ??? tip "JSON Schema for IBFT_EXTRA_DATA" - - Use the following JSON Schema to validate that your JSON data is well formed. - To validate your JSON content, use an online validation tool, such as - [JSON Schema Validator](https://www.jsonschemavalidator.net/). - - ```json - { - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "http://org.hyperledger.besu/cli_rlp_ibft_extra_data.json", - "type": "array", - "definitions": {}, - "title": "IBFT extra data", - "description":"JSON format used as input to generate an IBFT extra data RLP string", - "items": { - "$id": "#/address", - "type": "string", - "title": "Validator address", - "description":"The validator node address", - "default": "", - "examples": [ - "be068f726a13c8d46c44be6ce9d275600e1735a4", - "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" - ], - "pattern":"^([0-9a-f]{40})$" - } - } - ``` - - !!! example "Example IBFT_EXTRA_DATA encoding" - - === "JSON input" - - ```json - [ - "be068f726a13c8d46c44be6ce9d275600e1735a4", - "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" - ] - ``` - - === "RLP output" - - ``` - 0xf853a00000000000000000000000000000000000000000000000000000000000000000ea94be068f726a13c8d46c44be6ce9d275600e1735a4945ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193808400000000c0 - ``` +- `IBFT_EXTRA_DATA` - The IBFT 2.0 genesis file includes the `IBFT_EXTRA_DATA` type in the [`extraData`](../../how-to/configure/consensus/ibft.md#extra-data) property. + +- `QBFT_EXTRA_DATA` - The QBFT genesis file includes the `QBFT_EXTRA_DATA` type in the [`extraData`](../../how-to/configure/consensus/qbft.md#extra-data) property. + +## IBFT 2.0 extra data + +To generate the RLP encoded `extraData` string, specify a JSON input that is an array of validator addresses in ascending order. + +:::tip JSON Schema for IBFT_EXTRA_DATA + +Use the following JSON Schema to validate that your JSON data is well formed. To validate your JSON content, use an online validation tool, such as [JSON Schema Validator](https://www.jsonschemavalidator.net/). + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://org.hyperledger.besu/cli_rlp_ibft_extra_data.json", + "type": "array", + "definitions": {}, + "title": "IBFT extra data", + "description": "JSON format used as input to generate an IBFT extra data RLP string", + "items": { + "$id": "#/address", + "type": "string", + "title": "Validator address", + "description": "The validator node address", + "default": "", + "examples": [ + "be068f726a13c8d46c44be6ce9d275600e1735a4", + "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" + ], + "pattern": "^([0-9a-f]{40})$" + } +} +``` + +Example IBFT_EXTRA_DATA encoding + + + +# JSON input + +```json +[ + "be068f726a13c8d46c44be6ce9d275600e1735a4", + "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" +] +``` + +# RLP output + +``` +0xf853a00000000000000000000000000000000000000000000000000000000000000000ea94be068f726a13c8d46c44be6ce9d275600e1735a4945ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193808400000000c0 +``` + + diff --git a/docs/private-networks/reference/index.md b/docs/private-networks/reference/index.md index 60b8f6f8e47..079ea80b12b 100644 --- a/docs/private-networks/reference/index.md +++ b/docs/private-networks/reference/index.md @@ -1,20 +1,21 @@ --- description: private networks reference overview +tags: + - private networks --- # Reference This section provides reference material for private network features. -The following features and resources are shared with [public networks](../../public-networks/index.md) -and the content can be found in the public networks section: +The following features and resources are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: - Besu command line: - - [Standard options](../../public-networks/reference/cli/options.md) - - [Standard subcommands](../../public-networks/reference/cli/subcommands.md) + - [Standard options](../../public-networks/reference/cli/options.md) + - [Standard subcommands](../../public-networks/reference/cli/subcommands.md) - Besu API: - - [Standard Besu API methods](../../public-networks/reference/api/index.md) - - [Standard Besu API objects](../../public-networks/reference/api/objects.md) + - [Standard Besu API methods](../../public-networks/reference/api/index.md) + - [Standard Besu API objects](../../public-networks/reference/api/objects.md) - [Genesis file items](../../public-networks/reference/genesis-items.md) - [EVM tool options](../../public-networks/reference/evm-tool.md) - [Transaction trace types](../../public-networks/reference/trace-types.md) diff --git a/docs/private-networks/reference/plugin-api-interfaces.md b/docs/private-networks/reference/plugin-api-interfaces.md index 75517b9e5b1..54d4beda062 100644 --- a/docs/private-networks/reference/plugin-api-interfaces.md +++ b/docs/private-networks/reference/plugin-api-interfaces.md @@ -1,62 +1,61 @@ --- +title: Plugin API interfaces +sidebar_position: 4 description: Plugin interfaces +tags: + - private networks --- # Plugin API interfaces -API interfaces in Hyperledger Besu allow users to [build plugins](../concepts/plugins.md) to -extend Besu functionality. +API interfaces in Hyperledger Besu allow users to [build plugins](../concepts/plugins.md) to extend Besu functionality. -For more information about the available interfaces, see the -[Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). +For more information about the available interfaces, see the [Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). -!!! note "Javadoc issue" +:::note Javadoc issue - The plugin API documentation is currently not being updated. We're working on a fix, but in the - meantime, some links are temporarily pointing to wiki.hyperledger.org. +The plugin API documentation is currently not being updated. We're working on a fix, but in the meantime, some links are temporarily pointing to wiki.hyperledger.org. + +::: ## Core plugin classes The following table lists the interfaces providing core plugin classes. -| Interface | Description | -|-------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------| +| Interface | Description | +| --- | --- | | [**BesuContext**](https://wiki.hyperledger.org/display/BESU/BesuContext) | Allows plugins to access Besu services. | -| [**BesuPlugin**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/BesuPlugin.html) | Used to manage the plugin lifecycle. | +| [**BesuPlugin**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/BesuPlugin.html) | Used to manage the plugin lifecycle. | ## Plugin services The following table lists interfaces providing services you can retrieve. -| Interface | Description | -|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------| -| [**BesuEvents**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuEvents.html) | Allows plugins to attach to events during Besu operation. | -| [**BesuConfiguration**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuConfiguration.html) | Provides file system locations of Besu's storage. | -| [**IbftQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/IbftQueryService.html) | Allows query of the IBFT 2.0 aspects of the blockchain. | -| [**MetricCategoryRegistry**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/metrics/MetricCategoryRegistry.html) | Adds a new metrics category to the CLI. | -| [**MetricsSystem**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/MetricsSystem.html) | Register metrics with the Prometheus endpoint. | -| [**PoaQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/PoaQueryService.html) | Query the current state of Clique and IBFT 2.0 consensus protocols. | -| [**PicoCLIOptions**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/PicoCLIOptions.html) | Adds CLI commands to the Besu command line. | -| [**SecurityModuleService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/SecurityModuleService.html) | Allows plugins to register a security module. | -| [**StorageService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/StorageService.html) | Allows plugins to register as a storage engine. For example, to connect to a hardware security module (HSM). | -| [**PermissioningService**](https://wiki.hyperledger.org/display/BESU/PermissioningService) | Allows for fine grain control of node connection and node messaging permissioning. | -| [**PrivacyPluginService**](https://wiki.hyperledger.org/display/BESU/PrivacyPluginService) | Provides a way to define how [privacy marker transactions] are created, and what private genesis to use. | -| [**RpcEndpointService**](https://wiki.hyperledger.org/display/BESU/RpcEndpointService) | Register custom RPC endpoints. | - -To use the interfaces in your plugin, ensure the -[Gradle build file](https://github.com/ConsenSys/PluginsAPIDemo/blob/957628b3c6f533f3c3f405e2a17e369cd1f02c31/build.gradle) contains -the `https://hyperledger.jfrog.io/hyperledger/besu-maven` repository and the `plugin-api` dependency. - -!!! warning "Known issue" - - As indicated in [issue #406](https://github.com/hyperledger/besu-docs/issues/406), - plugins may need to access the parsed command line during registration, but the command line is not yet - initialized at this stage. - - It's in our roadmap to improve lifecycle steps and provide additional visibility for some data. - A workaround is to create a supplier during the `register` step and store it in memory. - - The `start` step can be ignored and your plugin module will be instantiated when - the command line interface is parsed and available. +| Interface | Description | +| --- | --- | +| [**BesuEvents**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuEvents.html) | Allows plugins to attach to events during Besu operation. | +| [**BesuConfiguration**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuConfiguration.html) | Provides file system locations of Besu's storage. | +| [**IbftQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/IbftQueryService.html) | Allows query of the IBFT 2.0 aspects of the blockchain. | +| [**MetricCategoryRegistry**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/metrics/MetricCategoryRegistry.html) | Adds a new metrics category to the CLI. | +| [**MetricsSystem**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/MetricsSystem.html) | Register metrics with the Prometheus endpoint. | +| [**PoaQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/PoaQueryService.html) | Query the current state of Clique and IBFT 2.0 consensus protocols. | +| [**PicoCLIOptions**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/PicoCLIOptions.html) | Adds CLI commands to the Besu command line. | +| [**SecurityModuleService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/SecurityModuleService.html) | Allows plugins to register a security module. | +| [**StorageService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/StorageService.html) | Allows plugins to register as a storage engine. For example, to connect to a hardware security module (HSM). | +| [**PermissioningService**](https://wiki.hyperledger.org/display/BESU/PermissioningService) | Allows for fine grain control of node connection and node messaging permissioning. | +| [**PrivacyPluginService**](https://wiki.hyperledger.org/display/BESU/PrivacyPluginService) | Provides a way to define how [privacy marker transactions] are created, and what private genesis to use. | +| [**RpcEndpointService**](https://wiki.hyperledger.org/display/BESU/RpcEndpointService) | Register custom RPC endpoints. | + +To use the interfaces in your plugin, ensure the [Gradle build file](https://github.com/ConsenSys/PluginsAPIDemo/blob/957628b3c6f533f3c3f405e2a17e369cd1f02c31/build.gradle) contains the `https://hyperledger.jfrog.io/hyperledger/besu-maven` repository and the `plugin-api` dependency. + +:::warning Known issue + +As indicated in [issue #406](https://github.com/hyperledger/besu-docs/issues/406), plugins may need to access the parsed command line during registration, but the command line is not yet initialized at this stage. + +It's in our roadmap to improve lifecycle steps and provide additional visibility for some data. A workaround is to create a supplier during the `register` step and store it in memory. + +The `start` step can be ignored and your plugin module will be instantiated when the command line interface is parsed and available. + +::: [privacy marker transactions]: ../concepts/privacy/private-transactions/processing.md diff --git a/docs/private-networks/tutorials/_category_.json b/docs/private-networks/tutorials/_category_.json new file mode 100644 index 00000000000..25d3afe68ac --- /dev/null +++ b/docs/private-networks/tutorials/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Tutorials", + "position": 5, + "link": { + "type": "generated-index", + "slug": "private-networks/tutorials" + } +} diff --git a/docs/private-networks/tutorials/azure.md b/docs/private-networks/tutorials/azure.md index 18f723e5b06..ab62e978fcc 100644 --- a/docs/private-networks/tutorials/azure.md +++ b/docs/private-networks/tutorials/azure.md @@ -1,21 +1,24 @@ --- -description: Hyperledger Besu private network example on Azure +title: Deploy using Microsoft Azure +sidebar_position: 10 +description: Deploy a private IBFT 2.0 network using Microsoft Azure. +tags: + - private networks --- # Deploy private network example on Azure The [Quorum Dev Quickstart on Azure Marketplace] enables deploying a private IBFT 2.0 network, which includes: -* A bootnode. -* An RPC node. -* Three regular nodes. -* A block explorer. -* Prometheus and Grafana with the Besu dashboard installed. +- A bootnode. +- An RPC node. +- Three regular nodes. +- A block explorer. +- Prometheus and Grafana with the Besu dashboard installed. These are deployed on a single Azure VM in minutes. -Once deployed, you can develop and test applications and connect to the Visual Studio Code (VSCode) plugin using the RPC -endpoint `http:///jsonrpc`. +Once deployed, you can develop and test applications and connect to the Visual Studio Code (VSCode) plugin using the RPC endpoint `http:///jsonrpc`. ## Overview @@ -31,38 +34,32 @@ To deploy the private network example on Azure: 1. Go to the [Quorum Dev Quickstart on Azure Marketplace]. -1. Click **Get It Now** and **Continue**. - The Quickstart landing page is displayed. +1. Click **Get It Now** and **Continue**. The Quickstart landing page is displayed. - ![Image landing](../../assets/images/mp_0_landing.png) + ![Image landing](../../assets/images/mp_0_landing.png) -1. Click **Create**. - The **Basics** page is displayed. +1. Click **Create**. The **Basics** page is displayed. - ![Image basics](../../assets/images/mp_1_basics.png) + ![Image basics](../../assets/images/mp_1_basics.png) 1. Enter: - * Details of the Resource Group you created earlier. - * Basic user credentials to start a VM. - * Prefix for your new VM and any other resources created. - * Region to which you wish to deploy the VM. + - Details of the Resource Group you created earlier. + - Basic user credentials to start a VM. + - Prefix for your new VM and any other resources created. + - Region to which you wish to deploy the VM. 1. Click **Next: Size** and select the size of the VM you want to use. 1. To start the deployment, click **Review + create** at the bottom left of the page. - The deployment typically takes 3--5 minutes. - The progress of your deployment is displayed. + The deployment typically takes 3--5 minutes. The progress of your deployment is displayed. - When the deployment is complete, the resources created are displayed. + When the deployment is complete, the resources created are displayed. -1. Click **Go to Resource**. - Everything created in the deployment is displayed. +1. Click **Go to Resource**. Everything created in the deployment is displayed. -1. Click on the VM name. - The VM details such as the IP and DNS name are displayed. - Use the IP and DNS name displayed to connect to the VM, either in browser or via RPC calls. +1. Click on the VM name. The VM details such as the IP and DNS name are displayed. Use the IP and DNS name displayed to connect to the VM, either in browser or via RPC calls. ## Block explorer @@ -72,35 +69,29 @@ To display the block explorer, open a new tab and enter either the IP of the VM ## Metrics -The deployment includes Prometheus metrics and Grafana with a custom Besu Dashboard installed. -To display the dashboard: +The deployment includes Prometheus metrics and Grafana with a custom Besu Dashboard installed. To display the dashboard: -1. Open a new tab and enter the IP or DNS name appended with `/grafana`. - For example: `http:///grafana`. +1. Open a new tab and enter the IP or DNS name appended with `/grafana`. For example: `http:///grafana`. 1. Click on home and select the Besu dashboard. - ![Grafana screenshot](../../assets/images/mp_9_grafana.png) + ![Grafana screenshot](../../assets/images/mp_9_grafana.png) -The dashboard provides a visual way to monitor your network and nodes as the chain progresses. -Alerting can also be configured. +The dashboard provides a visual way to monitor your network and nodes as the chain progresses. Alerting can also be configured. ## Connect to VM RPC endpoint -You can connect dapps or develop directly from the IDE by using VSCode and connecting to the VM RPC endpoint. -The endpoint is the DNS name appended with `/jsonrpc`: `http:///jsonrpc`. +You can connect dapps or develop directly from the IDE by using VSCode and connecting to the VM RPC endpoint. The endpoint is the DNS name appended with `/jsonrpc`: `http:///jsonrpc`. ## SSH -You can SSH into the VM to see how everything is set up and working. -Use the credentials from step 5 of [deployment](#deploy) and your preferred client: +You can SSH into the VM to see how everything is set up and working. Use the credentials from step 5 of [deployment](#deploy) and your preferred client: ```bash ssh username@ ``` -To list all containers running, run `docker ps`. -Find the complete setup in `/home//besu-quickstart`. +To list all containers running, run `docker ps`. Find the complete setup in `/home//besu-quickstart`. ![Image ssh](../../assets/images/mp_10_ssh.png) diff --git a/docs/private-networks/tutorials/clique.md b/docs/private-networks/tutorials/clique.md index 67ce8e92d6f..5a92e40122f 100644 --- a/docs/private-networks/tutorials/clique.md +++ b/docs/private-networks/tutorials/clique.md @@ -1,21 +1,25 @@ --- -description: Hyperledger Besu private network using the Clique (proof of authority) consensus protocol +title: Create a Clique network +sidebar_position: 4 +description: Create a private network using the Clique consensus protocol. +tags: + - private networks --- # Create a private network using Clique -A private network provides a configurable network for testing. This private network uses the -[Clique (proof of authority) consensus protocol]. +A private network provides a configurable network for testing. This private network uses the [Clique (proof of authority) consensus protocol]. -!!!important +:::danger - The steps in this tutorial create an isolated, but not protected or secure, Ethereum private - network. We recommend running the private network behind a properly configured firewall. +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +::: ## Prerequisites -* [Hyperledger Besu](../get-started/install/binary-distribution.md) -* [Curl (or similar webservice client)](https://curl.haxx.se/download.html). +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). ## Steps @@ -23,11 +27,9 @@ Listed on the right-hand side of the page are the steps to create a private netw ### 1. Create directories -Each node requires a data directory for the blockchain data. When the node starts, Besu saves the -[node key](../../public-networks/concepts/node-keys.md) in this directory. +Each node requires a data directory for the blockchain data. When the node starts, Besu saves the [node key](../../public-networks/concepts/node-keys.md) in this directory. -Create directories for your private network, each of the three nodes, and a data directory for each -node: +Create directories for your private network, each of the three nodes, and a data directory for each node: ```bash Clique-Network/ @@ -41,194 +43,184 @@ Clique-Network/ ### 2. Get the address for Node-1 -In Clique networks, you must include the address of at least one initial signer in the genesis -file. For this Clique network, we'll use Node-1 as the initial signer. This requires obtaining the -address for Node-1. +In Clique networks, you must include the address of at least one initial signer in the genesis file. For this Clique network, we'll use Node-1 as the initial signer. This requires obtaining the address for Node-1. -To get the address for Node-1, in the `Node-1` directory, use the -[`public-key export-address`](../../public-networks/reference/cli/subcommands.md#export-address) subcommand to -write the node address to the specified file (`node1Address` in this example). +To get the address for Node-1, in the `Node-1` directory, use the [`public-key export-address`](../../public-networks/reference/cli/subcommands.md#export-address) subcommand to write the node address to the specified file (`node1Address` in this example). -=== "MacOS" + - ```bash - besu --data-path=data public-key export-address --to=data/node1Address - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data public-key export-address --to=data/node1Address +``` - ```bash - besu --data-path=data public-key export-address --to=data\node1Address - ``` +# Windows + +```bash +besu --data-path=data public-key export-address --to=data\node1Address +``` + + ### 3. Create the genesis file -The genesis file defines the genesis block of the blockchain (that is, the start of the -blockchain). The -[Clique genesis file](../how-to/configure/consensus/clique.md#genesis-file) includes -the address of Node-1 as the initial signer in the `extraData` field. +The genesis file defines the genesis block of the blockchain (that is, the start of the blockchain). The [Clique genesis file](../how-to/configure/consensus/clique.md#genesis-file) includes the address of Node-1 as the initial signer in the `extraData` field. All nodes in a network must use the same genesis file. -Copy the following genesis definition to a file called `cliqueGenesis.json` and save it in the -`Clique-Network` directory: +Copy the following genesis definition to a file called `cliqueGenesis.json` and save it in the `Clique-Network` directory: ```json { - "config":{ - "chainId":1337, + "config": { + "chainId": 1337, "berlinBlock": 0, - "clique":{ - "blockperiodseconds":15, - "epochlength":30000 + "clique": { + "blockperiodseconds": 15, + "epochlength": 30000 } }, - "coinbase":"0x0000000000000000000000000000000000000000", - "difficulty":"0x1", - -"extraData":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "gasLimit":"0xa00000", - "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", - "nonce":"0x0", - "timestamp":"0x5c51a607", + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0xa00000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "timestamp": "0x5c51a607", "alloc": { - "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { - "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", - "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", - "balance": "0xad78ebc5ac6200000" - }, - "627306090abaB3A6e1400e9345bC60c78a8BEf57": { - "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", - "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", - "balance": "90000000000000000000000" - }, - "f17f52151EbEF6C7334FAD080c5704D77216b732": { - "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", - "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", - "balance": "90000000000000000000000" - } + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } } } ``` -!!! note +:::note - We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating - the genesis file for a private network. - This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. -In `extraData`, replace `` with the -[address for Node-1](#2-get-the-address-for-node-1), excluding the 0x prefix. +::: -!!! example +In `extraData`, replace `` with the [address for Node-1](#2-get-the-address-for-node-1), excluding the 0x prefix. - ```json - { - ... - "extraData":"0x0000000000000000000000000000000000000000000000000000000000000000b9b81ee349c3807e46bc71aa2632203c5b4620340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - ... - } - ``` +```json +{ + ... +"extraData":"0x0000000000000000000000000000000000000000000000000000000000000000b9b81ee349c3807e46bc71aa2632203c5b4620340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + ... +} +``` + +:::warning -!!! warning +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. - Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except - for testing. The private keys display, which means the accounts are not secure. +::: ### 4. Start the first node as the bootnode Start Node-1: -=== "MacOS" + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" +``` - ```bash - besu --data-path=data --genesis-file=../cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" +``` - ```bash - besu --data-path=data --genesis-file=..\cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" - ``` + The command line enables: -* The JSON-RPC API using the - [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option -* The ETH, NET, and CLIQUE APIs using the - [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option -* All-host access to the HTTP JSON-RPC API using the - [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option -* All-domain access to the node through the HTTP JSON-RPC API using the - [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option +- The JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option +- The ETH, NET, and CLIQUE APIs using the [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option +- All-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option +- All-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option -When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. -Copy the enode URL to specify Node-1 as the bootnode in the following steps. +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. ![Node 1 Enode URL](../../assets/images/EnodeStartup.png) ### 5. Start Node-2 -Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: -=== "MacOS" + - ```bash - besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` - ```bash - besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 - ``` +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + The command line specifies: -* A different port to Node-1 for P2P discovery using the - [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. -* A different port to Node-1 for HTTP JSON-RPC using the - [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. -* The enode URL of Node-1 using the - [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. -* The data directory for Node-2 using the - [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. -* Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- The data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). ### 6. Start Node-3 -Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + -=== "MacOS" +# MacOS - ```bash - besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 - ``` +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` - ```bash - besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 - ``` + The command line specifies: -* A different port to Node-1 and Node-2 for P2P discovery using the - [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. -* A different port to Node-1 and Node-2 for HTTP JSON-RPC using the - [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. -* The data directory for Node-3 using the - [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. -* The bootnode as for [Node-2](#5-start-node-2). -* Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- The bootnode as for [Node-2](#5-start-node-2). +- Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). ### 7. Confirm the private network is working -Start another terminal, use curl to call the JSON-RPC API -[`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are -functioning as peers: +Start another terminal, use curl to call the JSON-RPC API [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: ```bash curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 @@ -238,40 +230,43 @@ The result confirms Node-1 has two peers (Node-2 and Node-3): ```json { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x2" + "jsonrpc": "2.0", + "id": 1, + "result": "0x2" } ``` ## Next steps -Look at the logs displayed to confirm Node-1 is producing blocks and Node-2 and Node-3 are -importing blocks. +Look at the logs displayed to confirm Node-1 is producing blocks and Node-2 and Node-3 are importing blocks. Use the [Clique API to add] Node-2 or Node-3 as a signer. -!!! note +:::note - To add Node-2 or Node-3 as a signer you need the - [node address as when specifying Node-1](#2-get-the-address-for-node-1) as the initial signer. +To add Node-2 or Node-3 as a signer you need the [node address as when specifying Node-1](#2-get-the-address-for-node-1) as the initial signer. -Import accounts to MetaMask and send transactions, as described in the -[Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). +::: -!!! info +Import accounts to MetaMask and send transactions, as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). - Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). +:::info + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: ## Stop the nodes When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. -!!!tip +:::tip - To restart the Clique network in the future, start from - [4. Start First Node as Bootnode](#4-start-the-first-node-as-the-bootnode). +To restart the Clique network in the future, start from [4. Start First Node as Bootnode](#4-start-the-first-node-as-the-bootnode). + +::: + [Clique (proof of authority) consensus protocol]: ../how-to/configure/consensus/clique.md [Clique API to add]: ../how-to/configure/consensus/clique.md#add-and-remove-signers diff --git a/docs/private-networks/tutorials/contracts/_category_.json b/docs/private-networks/tutorials/contracts/_category_.json new file mode 100644 index 00000000000..3ba8177fcc1 --- /dev/null +++ b/docs/private-networks/tutorials/contracts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy a smart contract", + "position": 8 +} diff --git a/docs/private-networks/tutorials/contracts/index.md b/docs/private-networks/tutorials/contracts/index.md index 1d832171ed3..2b7d7f039cc 100644 --- a/docs/private-networks/tutorials/contracts/index.md +++ b/docs/private-networks/tutorials/contracts/index.md @@ -1,5 +1,9 @@ --- +title: Deploy a smart contract +sidebar_position: 1 description: deploying smart contracts +tags: + - private networks --- # Deploy smart contracts to an Ethereum chain @@ -8,57 +12,48 @@ This tutorial shows you how to deploy smart contracts as transactions to a netwo ## Prerequisites -This tutorial requires a local blockchain network. -You can use the [Developer Quickstart](../quickstart.md) to rapidly generate one. -If deploying a private contract, enable privacy on the network (public contracts can also be deployed on privacy-enabled -networks). +This tutorial requires a local blockchain network. You can use the [Developer Quickstart](../quickstart.md) to rapidly generate one. If deploying a private contract, enable privacy on the network (public contracts can also be deployed on privacy-enabled networks). ## Use `eth_sendSignedTransaction` -To deploy a smart contract using -[`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sendsignedtransaction), use an -account's private key to sign and serialize the transaction, and send the API request. +To deploy a smart contract using [`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sendsignedtransaction), use an account's private key to sign and serialize the transaction, and send the API request. This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. -Using the -[`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) -smart contract as an example, create a new file called `compile.js` with the following content: - -!!! example "`compile.js`" - - ```js - const fs = require('fs').promises; - const solc = require('solc'); - - async function main() { - // Load the contract source code - const sourceCode = await fs.readFile('SimpleStorage.sol', 'utf8'); - // Compile the source code and retrieve the ABI and bytecode - const { abi, bytecode } = compile(sourceCode, 'SimpleStorage'); - // Store the ABI and bytecode into a JSON file - const artifact = JSON.stringify({ abi, bytecode }, null, 2); - await fs.writeFile('SimpleStorage.json', artifact); - } - - function compile(sourceCode, contractName) { - // Create the Solidity Compiler Standard Input and Output JSON - const input = { - language: 'Solidity', - sources: { main: { content: sourceCode } }, - settings: { outputSelection: { '*': { '*': ['abi', 'evm.bytecode'] } } }, - }; - // Parse the compiler output to retrieve the ABI and bytecode - const output = solc.compile(JSON.stringify(input)); - const artifact = JSON.parse(output).contracts.main[contractName]; - return { - abi: artifact.abi, - bytecode: artifact.evm.bytecode.object, - }; - } - - main().then(() => process.exit(0)); - ``` +Using the [`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) smart contract as an example, create a new file called `compile.js` with the following content: + +```js title="compile.js" +const fs = require("fs").promises; +const solc = require("solc"); + +async function main() { + // Load the contract source code + const sourceCode = await fs.readFile("SimpleStorage.sol", "utf8"); + // Compile the source code and retrieve the ABI and bytecode + const { abi, bytecode } = compile(sourceCode, "SimpleStorage"); + // Store the ABI and bytecode into a JSON file + const artifact = JSON.stringify({ abi, bytecode }, null, 2); + await fs.writeFile("SimpleStorage.json", artifact); +} + +function compile(sourceCode, contractName) { + // Create the Solidity Compiler Standard Input and Output JSON + const input = { + language: "Solidity", + sources: { main: { content: sourceCode } }, + settings: { outputSelection: { "*": { "*": ["abi", "evm.bytecode"] } } }, + }; + // Parse the compiler output to retrieve the ABI and bytecode + const output = solc.compile(JSON.stringify(input)); + const artifact = JSON.parse(output).contracts.main[contractName]; + return { + abi: artifact.abi, + bytecode: artifact.evm.bytecode.object, + }; +} + +main().then(() => process.exit(0)); +``` Run `compile.js` to get the smart contract's output JSON: @@ -72,62 +67,61 @@ Run `solc` to get the contract's bytecode and ABI: solc SimpleStorage.sol --bin --abi ``` -Once you have the bytecode and ABI, you can rename the output files to make them easier to use; -this tutorial refers to them as `SimpleStorage.bin` and `SimpleStorage.abi`. - -Create a new file named `public_tx.js` to send the transaction (or run the following commands in a JavaScript console). -The Developer Quickstart provides an [example of a public transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js). - -!!! example "`public_tx.js`" - - ```js - const web3 = new Web3(host); - // use an existing account, or make an account - const privateKey = "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63"; - const account = web3.eth.accounts.privateKeyToAccount(privateKey); - - // read in the contracts - const contractJsonPath = path.resolve(__dirname, 'SimpleStorage.json'); - const contractJson = JSON.parse(fs.readFileSync(contractJsonPath)); - const contractAbi = contractJson.abi; - const contractBinPath = path.resolve(__dirname,'SimpleStorage.bin'); - const contractBin = fs.readFileSync(contractBinPath); - // initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode - const contractConstructorInit = "000000000000000000000000000000000000000000000000000000000000002F"; - - // get txnCount for the nonce value - const txnCount = await web3.eth.getTransactionCount(account.address); - - const rawTxOptions = { - nonce: web3.utils.numberToHex(txnCount), - from: account.address, - to: null, //public tx - value: "0x00", - data: '0x'+contractBin+contractInit, // contract binary appended with initialization value - gasPrice: "0x0", //ETH per unit of gas - gasLimit: "0x24A22" //max number of gas units the tx is allowed to use - }; - console.log("Creating transaction..."); - const tx = new Tx(rawTxOptions); - console.log("Signing transaction..."); - tx.sign(privateKey); - console.log("Sending transaction..."); - var serializedTx = tx.serialize(); - const pTx = await web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex').toString("hex")); - console.log("tx transactionHash: " + pTx.transactionHash); - console.log("tx contractAddress: " + pTx.contractAddress); - ``` +Once you have the bytecode and ABI, you can rename the output files to make them easier to use; this tutorial refers to them as `SimpleStorage.bin` and `SimpleStorage.abi`. + +Create a new file named `public_tx.js` to send the transaction (or run the following commands in a JavaScript console). The Developer Quickstart provides an [example of a public transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js). + +```js titl="public_tx.js" +const web3 = new Web3(host); +// use an existing account, or make an account +const privateKey = + "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63"; +const account = web3.eth.accounts.privateKeyToAccount(privateKey); + +// read in the contracts +const contractJsonPath = path.resolve(__dirname, "SimpleStorage.json"); +const contractJson = JSON.parse(fs.readFileSync(contractJsonPath)); +const contractAbi = contractJson.abi; +const contractBinPath = path.resolve(__dirname, "SimpleStorage.bin"); +const contractBin = fs.readFileSync(contractBinPath); +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +// get txnCount for the nonce value +const txnCount = await web3.eth.getTransactionCount(account.address); + +const rawTxOptions = { + nonce: web3.utils.numberToHex(txnCount), + from: account.address, + to: null, //public tx + value: "0x00", + data: "0x" + contractBin + contractInit, // contract binary appended with initialization value + gasPrice: "0x0", //ETH per unit of gas + gasLimit: "0x24A22", //max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const tx = new Tx(rawTxOptions); +console.log("Signing transaction..."); +tx.sign(privateKey); +console.log("Sending transaction..."); +var serializedTx = tx.serialize(); +const pTx = await web3.eth.sendSignedTransaction( + "0x" + serializedTx.toString("hex").toString("hex"), +); +console.log("tx transactionHash: " + pTx.transactionHash); +console.log("tx contractAddress: " + pTx.contractAddress); +``` `rawTxOptions` contains the following fields: -* `nonce` - the number of transactions sent from an address. -* `from` - address of the sending account. For example `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`. -* `to` - address of the receiver. To deploy a contract, set to `null`. -* `gas` - amount of gas provided by the sender for the transaction. -* `gasPrice` - price for each unit of gas the sender is willing to pay. -* `data` - binary of the contract (in this example there's also a constructor initialization value, - so we append that to the binary value). -* `value` - amount of Ether/Wei transferred from the sender to the recipient. +- `nonce` - the number of transactions sent from an address. +- `from` - address of the sending account. For example `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`. +- `to` - address of the receiver. To deploy a contract, set to `null`. +- `gas` - amount of gas provided by the sender for the transaction. +- `gasPrice` - price for each unit of gas the sender is willing to pay. +- `data` - binary of the contract (in this example there's also a constructor initialization value, so we append that to the binary value). +- `value` - amount of Ether/Wei transferred from the sender to the recipient. Run the `public_tx.js` to send the transaction: @@ -135,176 +129,147 @@ Run the `public_tx.js` to send the transaction: node public_tx.js ``` -This example code creates the transaction `tx`, signs it with the private key of the account, serializes it, then calls -`eth_sendSignedTransaction` to deploy the contract. +This example code creates the transaction `tx`, signs it with the private key of the account, serializes it, then calls `eth_sendSignedTransaction` to deploy the contract. ## Use `eth_sendTransaction` -You can use [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) as an alternative to `eth_sendSignedTransaction`. -However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account management separate for -stronger security. -Configure [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) with your Besu node to make the -`eth_sendTransaction` API call. - -An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC node is paired with EthSigner. -Refer to the [EthSigner documentation](https://docs.ethsigner.consensys.net/) for configuration details. - -Pass the following parameters to the -[`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods/#eth_sendtransaction) call -to EthSigner; EthSigner then converts the request to an -[`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) call that Besu uses: - -* `to` - address of the receiver. To deploy a contract, set to `null`. -* `from` - address of the sender account. For example `0x9b790656b9ec0db1936ed84b3bea605873558198`. -* `gas` - amount of gas provided by the sender for the transaction -* `gasPrice` - price for each unit of gas the sender is willing to pay -* `data` - one of the following: - * For contract deployments (this use case) - compiled code of the contract - * For contract interactions - hash of the invoked method signature and encoded parameters - (see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html)) - * For simple ether transfers - empty - -!!! example "`eth_sendTransaction` parameters" - - ```json - params: { - "to": null, - "from": "0x9b790656b9ec0db1936ed84b3bea605873558198", - "gas": "0x76c0", - "gasPrice": "0x9184e72a000", - "data": "0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033" - } - ``` +You can use [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) as an alternative to `eth_sendSignedTransaction`. However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account management separate for stronger security. Configure [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) with your Besu node to make the `eth_sendTransaction` API call. + +An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC node is paired with EthSigner. Refer to the [EthSigner documentation](https://docs.ethsigner.consensys.net/) for configuration details. + +Pass the following parameters to the [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods/#eth_sendtransaction) call to EthSigner; EthSigner then converts the request to an [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) call that Besu uses: + +- `to` - address of the receiver. To deploy a contract, set to `null`. +- `from` - address of the sender account. For example `0x9b790656b9ec0db1936ed84b3bea605873558198`. +- `gas` - amount of gas provided by the sender for the transaction +- `gasPrice` - price for each unit of gas the sender is willing to pay +- `data` - one of the following: + - For contract deployments (this use case) - compiled code of the contract + - For contract interactions - hash of the invoked method signature and encoded parameters (see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html)) + - For simple ether transfers - empty + +```json title="'eth_sendTransaction' parameters" +params: { + "to": null, + "from": "0x9b790656b9ec0db1936ed84b3bea605873558198", + "gas": "0x76c0", + "gasPrice": "0x9184e72a000", + "data": "0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033" +} +``` Make the request using `eth_sendTransaction`: -!!! example "`eth_sendTransaction` curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0x9b790656b9ec0db1936ed84b3bea605873558198", "to":null, "gas":"0x7600","gasPrice":"0x9184e72a000", "data":"0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"}], "id":1}' - ``` +```bash title="'eth_sendTransaction' curl HTTP request" +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0x9b790656b9ec0db1936ed84b3bea605873558198", "to":null, "gas":"0x7600","gasPrice":"0x9184e72a000", "data":"0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"}], "id":1}' +``` ## Use `eea_sendRawTransaction` for private contracts with web3js-quorum -To deploy a private contract to another node or [privacy group](../../concepts/privacy/privacy-groups.md) member, use the -[web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library and -the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. -You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu -keeps account management separate for stronger security. +To deploy a private contract to another node or [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. -The Developer Quickstart provides an -[example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). +The Developer Quickstart provides an [example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. -Use [`web3.priv.generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) -by running the following commands in a JavaScript console, or by including them in a `private_tx.js` file and running -`node private_tx.js`: - -!!! example "`private_tx.js` using `web3.priv.generateAndSendRawTransaction`" - - ```js - const Web3 = require('web3'); - const Web3Quorum = require('web3js-quorum'); - - const bytecode="608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; - // initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode - const contractConstructorInit = "000000000000000000000000000000000000000000000000000000000000002F"; - - const chainId = 1337; - const web3 = new Web3(clientUrl); - const web3quorum = new Web3Quorum(web3, chainId); - - const txOptions = { - data: '0x'+bytecode+contractConstructorInit, - privateKey: fromPrivateKey, - privateFrom: fromPublicKey, - privateFor: [toPublicKey] - }; - console.log("Creating contract..."); - const txHash = await web3quorum.priv.generateAndSendRawTransaction(txOptions); - console.log("Getting contractAddress from txHash: ", txHash); - - const privateTxReceipt = await web3quorum.priv.waitForTransactionReceipt(txHash); - console.log("Private Transaction Receipt: ", privateTxReceipt); - return privateTxReceipt; - ``` +Use [`web3.priv.generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) by running the following commands in a JavaScript console, or by including them in a `private_tx.js` file and running `node private_tx.js`: + +```js title="'private_tx.js' using 'web3.priv.generateAndSendRawTransaction'" +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); + +const bytecode = + "608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +const chainId = 1337; +const web3 = new Web3(clientUrl); +const web3quorum = new Web3Quorum(web3, chainId); + +const txOptions = { + data: "0x" + bytecode + contractConstructorInit, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], +}; +console.log("Creating contract..."); +const txHash = await web3quorum.priv.generateAndSendRawTransaction(txOptions); +console.log("Getting contractAddress from txHash: ", txHash); + +const privateTxReceipt = await web3quorum.priv.waitForTransactionReceipt( + txHash, +); +console.log("Private Transaction Receipt: ", privateTxReceipt); +return privateTxReceipt; +``` `txOptions` contains the following field: -* `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append - that to the bytecode). - -The deployment process includes creating the client as in the previous examples, but rather than deploying the contract -with `to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. -Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing -the contract's address. - -!!! note - - This example doesn't use a privacy group and makes a simple node-to-node transaction. - To use a privacy group: +- `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append that to the bytecode). - * Create the privacy group using the public keys of the nodes in the group. - * Specify the `privacyGroupId` instead of the `privateFor` option in the txOptions above and then send the transaction. +The deployment process includes creating the client as in the previous examples, but rather than deploying the contract with `to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the contract's address. - The Developer Quickstart provides an - [example of a private transaction with a privacy group](https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/besu/smart_contracts/privacy/scripts/private_tx_privacy_group.js). +:::note -## Use `eea_sendRawTransaction` for private contracts with web3js-eea +This example doesn't use a privacy group and makes a simple node-to-node transaction. To use a privacy group: -!!! warning +- Create the privacy group using the public keys of the nodes in the group. +- Specify the `privacyGroupId` instead of the `privateFor` option in the txOptions above and then send the transaction. - This web3js-eea library will be deprecated on December 31, 2021. - Please use the [web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library instead and refer to the previous section. +The Developer Quickstart provides an [example of a private transaction with a privacy group](https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/besu/smart_contracts/privacy/scripts/private_tx_privacy_group.js). -To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the -[web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and -the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. -You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu -keeps account management separate for stronger security. +::: -The Developer Quickstart provides an -[example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). +## Use `eea_sendRawTransaction` for private contracts with web3js-eea -This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. +:::warning -Use `eea_sendRawTransaction` by running the following commands in a JavaScript console, or by including them in a -`private_tx.js` file and running `node private_tx.js`: +This web3js-eea library will be deprecated on December 31, 2021. Please use the [web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library instead and refer to the previous section. -!!! example "`private_tx.js` using `eea_sendRawTransaction`" +::: - ```js - const Web3 = require('web3'); - const EEAClient = require('web3-eea'); +To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. - const bytecode="608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; - // initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode - const contractConstructorInit = "000000000000000000000000000000000000000000000000000000000000002F"; +The Developer Quickstart provides an [example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). - const web3 = new Web3(clientUrl); - const web3eea = new EEAClient(web3, 1337); - const txOptions = { - data: '0x'+bytecode+contractConstructorInit, - privateKey: fromPrivateKey, - privateFrom: fromPublicKey, - privateFor: [toPublicKey] - }; - console.log("Creating contract..."); - const txHash = await web3eea.eea.sendRawTransaction(txOptions); - console.log("Getting contractAddress from txHash: ", txHash); +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. - const privateTxReceipt = await web3.priv.getTransactionReceipt(txHash, fromPublicKey); - // console.log("Private Transaction Receipt: ", privateTxReceipt); - return privateTxReceipt; - ``` +Use `eea_sendRawTransaction` by running the following commands in a JavaScript console, or by including them in a `private_tx.js` file and running `node private_tx.js`: + +```js title="'private_tx.js' using 'eea_sendRawTransaction'" +const Web3 = require("web3"); +const EEAClient = require("web3-eea"); + +const bytecode = + "608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +const web3 = new Web3(clientUrl); +const web3eea = new EEAClient(web3, 1337); +const txOptions = { + data: "0x" + bytecode + contractConstructorInit, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], +}; +console.log("Creating contract..."); +const txHash = await web3eea.eea.sendRawTransaction(txOptions); +console.log("Getting contractAddress from txHash: ", txHash); + +const privateTxReceipt = await web3.priv.getTransactionReceipt( + txHash, + fromPublicKey, +); +// console.log("Private Transaction Receipt: ", privateTxReceipt); +return privateTxReceipt; +``` `txOptions` contains the following field: -* `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append - that to the bytecode). +- `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append that to the bytecode). -The deployment process includes creating the client as in the previous examples, but rather than deploying the contract with -`to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. -Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing -the contract's address. +The deployment process includes creating the client as in the previous examples, but rather than deploying the contract with `to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the contract's address. diff --git a/docs/private-networks/tutorials/contracts/interact.md b/docs/private-networks/tutorials/contracts/interact.md index 94a8bb6ff9b..11da4b07e28 100644 --- a/docs/private-networks/tutorials/contracts/interact.md +++ b/docs/private-networks/tutorials/contracts/interact.md @@ -1,23 +1,24 @@ --- +title: Interact with a deployed contract +sidebar_position: 2 description: calling smart contracts functions +tags: + - private networks --- # Interact with deployed smart contracts -You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate -local blockchain networks. +You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate local blockchain networks. This tutorial shows you how to interact with smart contracts that have been deployed to a network. ## Prerequisites -* A network with a deployed smart contract as in the [deploying smart contracts tutorial](index.md) +- A network with a deployed smart contract as in the [deploying smart contracts tutorial](index.md) ## Interact with public contracts -This tutorial uses the -[`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) -contract: +This tutorial uses the [`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) contract: ```js pragma solidity ^0.7.0; @@ -39,49 +40,55 @@ contract SimpleStorage { } ``` -Once the contract is deployed, you can perform a read operation using the `get` function call and a -write operation using the `set` function call. -This tutorial uses the [web3js](https://www.npmjs.com/package/web3) library to interact with the contract. -A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js) -of these calls can be found in the [Developer Quickstart]. +Once the contract is deployed, you can perform a read operation using the `get` function call and a write operation using the `set` function call. This tutorial uses the [web3js](https://www.npmjs.com/package/web3) library to interact with the contract. A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js) of these calls can be found in the [Developer Quickstart]. ### 1. Perform a read operation -To perform a read operation, you need the address that the contract was deployed to and the contract's ABI. -The contract's ABI can be obtained from compiling the contract; see the -[deploying smart contracts tutorial](index.md) for an example. +To perform a read operation, you need the address that the contract was deployed to and the contract's ABI. The contract's ABI can be obtained from compiling the contract; see the [deploying smart contracts tutorial](index.md) for an example. -Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new -instance of the smart contract, then make the `get` function call from the contract's list of methods, which will return the value stored: +Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new instance of the smart contract, then make the `get` function call from the contract's list of methods, which will return the value stored: ```js -async function getValueAtAddress(host, deployedContractAbi, deployedContractAddress){ +async function getValueAtAddress( + host, + deployedContractAbi, + deployedContractAddress, +) { const web3 = new Web3(host); - const contractInstance = new web3.eth.Contract(deployedContractAbi, deployedContractAddress); + const contractInstance = new web3.eth.Contract( + deployedContractAbi, + deployedContractAddress, + ); const res = await contractInstance.methods.get().call(); - console.log("Obtained value at deployed contract is: "+ res); - return res + console.log("Obtained value at deployed contract is: " + res); + return res; } ``` ### 2. Perform a write operation -To perform a write operation, send a transaction to update the stored value. -As with the [`get` call](#1-perform-a-read-operation), you need to use the address that the contract was deployed to and the contract's ABI. -The account address must correspond to an actual account with some ETH in it to perform the transaction. -Because Besu doesn't manage accounts, this address is the address you use in -[EthSigner](https://docs.ethsigner.consensys.net/en/stable/) (or equivalent) to manage your accounts. +To perform a write operation, send a transaction to update the stored value. As with the [`get` call](#1-perform-a-read-operation), you need to use the address that the contract was deployed to and the contract's ABI. The account address must correspond to an actual account with some ETH in it to perform the transaction. Because Besu doesn't manage accounts, this address is the address you use in [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) (or equivalent) to manage your accounts. -Make the `set` call passing in your account address, `value` as the updated value of the contract, and the amount of gas -you are willing to spend for the transaction: +Make the `set` call passing in your account address, `value` as the updated value of the contract, and the amount of gas you are willing to spend for the transaction: ```js // You need to use the accountAddress details provided to Besu to send/interact with contracts -async function setValueAtAddress(host, accountAddress, value, deployedContractAbi, deployedContractAddress){ +async function setValueAtAddress( + host, + accountAddress, + value, + deployedContractAbi, + deployedContractAddress, +) { const web3 = new Web3(host); - const contractInstance = new web3.eth.Contract(deployedContractAbi, deployedContractAddress); - const res = await contractInstance.methods.set(value).send({from: accountAddress, gasPrice: "0xFF", gasLimit: "0x24A22"}); - return res + const contractInstance = new web3.eth.Contract( + deployedContractAbi, + deployedContractAddress, + ); + const res = await contractInstance.methods + .set(value) + .send({ from: accountAddress, gasPrice: "0xFF", gasLimit: "0x24A22" }); + return res; } ``` @@ -91,35 +98,30 @@ To verify that a value has been updated, perform a `get` call after a `set` upda ## Interact with private contracts -This private contracts example uses the same `SimpleStorage.sol` contract as in the -[public contracts example](#interact-with-public-contracts), but it uses the -[web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the -[`generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) method to interact with the contract. -Both read and write operations are performed using the `generateAndSendRawTransaction` API call. -A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js) -can be found in the [Developer Quickstart]. +This private contracts example uses the same `SimpleStorage.sol` contract as in the [public contracts example](#interact-with-public-contracts), but it uses the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) method to interact with the contract. Both read and write operations are performed using the `generateAndSendRawTransaction` API call. A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js) can be found in the [Developer Quickstart]. ### 1. Perform a read operation -As in the public contracts example, to perform a read operation, you need the address that the contract was deployed to -and the contract's ABI. -You also need your private and public keys and the recipient's public key. +As in the public contracts example, to perform a read operation, you need the address that the contract was deployed to and the contract's ABI. You also need your private and public keys and the recipient's public key. -Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new -instance of the smart contract, extract the signature of function's ABI for the `get` method, and then use this value as -the `data` parameter for the `generateAndSendRawTransaction` transaction. +Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new instance of the smart contract, extract the signature of function's ABI for the `get` method, and then use this value as the `data` parameter for the `generateAndSendRawTransaction` transaction. -The keys remain the same for the sender and recipient, and the `to` field is the contract's address. -Once you make the request, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing -the value stored: +The keys remain the same for the sender and recipient, and the `to` field is the contract's address. Once you make the request, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the value stored: ```js -async function getValueAtAddress(clientUrl, address, contractAbi, fromPrivateKey, fromPublicKey, toPublicKey) { +async function getValueAtAddress( + clientUrl, + address, + contractAbi, + fromPrivateKey, + fromPublicKey, + toPublicKey, +) { const Web3 = require("web3"); const Web3Quorum = require("web3js-quorum"); const web3 = new Web3Quorum(new Web3("http://localhost:22000")); // eslint-disable-next-line no-underscore-dangle - const functionAbi = contract._jsonInterface.find(e => { + const functionAbi = contract._jsonInterface.find((e) => { return e.name === "get"; }); const functionParams = { @@ -127,28 +129,41 @@ async function getValueAtAddress(clientUrl, address, contractAbi, fromPrivateKey data: functionAbi.signature, privateKey: fromPrivateKey, privateFrom: fromPublicKey, - privateFor: [toPublicKey] + privateFor: [toPublicKey], }; - const transactionHash = await web3quorum.priv.generateAndSendRawTransaction(functionParams); + const transactionHash = await web3quorum.priv.generateAndSendRawTransaction( + functionParams, + ); // console.log(`Transaction hash: ${transactionHash}`); - const result = await web3quorum.priv.waitForTransactionReceipt(transactionHash); - console.log("" + nodeName + " value from deployed contract is: " + result.output); + const result = await web3quorum.priv.waitForTransactionReceipt( + transactionHash, + ); + console.log( + "" + nodeName + " value from deployed contract is: " + result.output, + ); return result; -}; +} ``` ### 2. Perform a write operation -Performing a write operation is almost the same process as the read operation, except that you encode the new value to -the `set` function's ABI, and then append these arguments to the `set` function's ABI and use this as the `data` field: +Performing a write operation is almost the same process as the read operation, except that you encode the new value to the `set` function's ABI, and then append these arguments to the `set` function's ABI and use this as the `data` field: ```js -async function setValueAtAddress(clientUrl, address, value, contractAbi, fromPrivateKey, fromPublicKey, toPublicKey) { +async function setValueAtAddress( + clientUrl, + address, + value, + contractAbi, + fromPrivateKey, + fromPublicKey, + toPublicKey, +) { const Web3 = require("web3"); const Web3Quorum = require("web3js-quorum"); const web3 = new Web3Quorum(new Web3("http://localhost:22000")); // eslint-disable-next-line no-underscore-dangle - const functionAbi = contract._jsonInterface.find(e => { + const functionAbi = contract._jsonInterface.find((e) => { return e.name === "set"; }); const functionArgs = web3quorum.eth.abi @@ -159,13 +174,17 @@ async function setValueAtAddress(clientUrl, address, value, contractAbi, fromPri data: functionAbi.signature + functionArgs, privateKey: fromPrivateKey, privateFrom: fromPublicKey, - privateFor: [toPublicKey] + privateFor: [toPublicKey], }; - const transactionHash = await web3quorum.priv.generateAndSendRawTransaction(functionParams); + const transactionHash = await web3quorum.priv.generateAndSendRawTransaction( + functionParams, + ); console.log(`Transaction hash: ${transactionHash}`); - const result = await web3quorum.priv.waitForTransactionReceipt(transactionHash); + const result = await web3quorum.priv.waitForTransactionReceipt( + transactionHash, + ); return result; -}; +} ``` ### 3. Verify an updated value diff --git a/docs/private-networks/tutorials/contracts/transfer-funds.md b/docs/private-networks/tutorials/contracts/transfer-funds.md index 4b185d6f28c..d2ae16ca8f4 100644 --- a/docs/private-networks/tutorials/contracts/transfer-funds.md +++ b/docs/private-networks/tutorials/contracts/transfer-funds.md @@ -1,60 +1,65 @@ --- +title: Transfer account funds +sidebar_position: 1 description: funds transfer transactions +tags: + - private networks --- # Transfer funds between accounts in a transaction -You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate -local blockchain networks. +You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate local blockchain networks. This tutorial shows you how to transfer funds (ETH) between accounts in a transaction. ## Prerequisites -* A [private network](../quickstart.md) +- A [private network](../quickstart.md) ## Use `eth_sendSignedTransaction` -The simplest way to transfer funds between externally-owned accounts is using -[`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendsignedtransaction). -This example uses `eth_sendSignedTransaction` and one of the [test accounts](../../reference/accounts-for-testing.md) -to transfer funds to a newly created account. +The simplest way to transfer funds between externally-owned accounts is using [`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendsignedtransaction). This example uses `eth_sendSignedTransaction` and one of the [test accounts](../../reference/accounts-for-testing.md) to transfer funds to a newly created account. -!!! critical "Do not use the test accounts on Ethereum Mainnet or any production network." +:::danger Do not use the test accounts on Ethereum Mainnet or any production network - The private key is publicly displayed, which means the account is not secure. +The private key is publicly displayed, which means the account is not secure. -Before making the transaction, check the balances of both accounts to verify the funds transfer -after the transaction. +::: + +Before making the transaction, check the balances of both accounts to verify the funds transfer after the transaction. ```js const web3 = new Web3(host); // Pre-seeded account with 90000 ETH -const privateKeyA = "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; +const privateKeyA = + "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; const accountA = web3.eth.accounts.privateKeyToAccount(privateKeyA); -var accountABalance = web3.utils.fromWei(await web3.eth.getBalance(accountA.address)); +var accountABalance = web3.utils.fromWei( + await web3.eth.getBalance(accountA.address), +); console.log("Account A has balance of: " + accountABalance); // Create a new account to transfer ETH to var accountB = web3.eth.accounts.create(); -var accountBBalance = web3.utils.fromWei(await web3.eth.getBalance(accountB.address)); +var accountBBalance = web3.utils.fromWei( + await web3.eth.getBalance(accountB.address), +); console.log("Account B has balance of: " + accountBBalance); ``` -Use the test account address (Account A) for the `from` parameter, the recipient account address -(Account B) for the `to` parameter, and the amount of ETH to transfer between accounts for the -`value` parameter. Sign the transaction with Account A's private key and send it using -`eth_sendSignedTransaction`. +Use the test account address (Account A) for the `from` parameter, the recipient account address (Account B) for the `to` parameter, and the amount of ETH to transfer between accounts for the `value` parameter. Sign the transaction with Account A's private key and send it using `eth_sendSignedTransaction`. ```js // Send some ETH from A to B const rawTxOptions = { - nonce: web3.utils.numberToHex(await web3.eth.getTransactionCount(accountA.address)), + nonce: web3.utils.numberToHex( + await web3.eth.getTransactionCount(accountA.address), + ), from: accountA.address, to: accountB.address, value: "0x100", // Amount of ETH to transfer gasPrice: "0x0", // ETH per unit of gas - gasLimit: "0x24A22" // Max number of gas units the tx is allowed to use + gasLimit: "0x24A22", // Max number of gas units the tx is allowed to use }; console.log("Creating transaction..."); const tx = new Tx(rawTxOptions); @@ -62,7 +67,9 @@ console.log("Signing transaction..."); tx.sign(Buffer.from(accountA.privateKey.substring(2), "hex")); console.log("Sending transaction..."); var serializedTx = tx.serialize(); -const pTx = await web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex').toString("hex")); +const pTx = await web3.eth.sendSignedTransaction( + "0x" + serializedTx.toString("hex").toString("hex"), +); console.log("tx transactionHash: " + pTx.transactionHash); ``` @@ -77,23 +84,15 @@ console.log("Account B has an updatedbalance of: " + accountBBalance); } ``` -A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/eth_tx.js) -can be found in the Developer Quickstart. +A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/eth_tx.js) can be found in the Developer Quickstart. ## Use `eth_sendTransaction` -An alternative to using `eth_sendSignedTransaction` is -[`eth_sendTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendtransaction). -However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account -management separate for stronger security. Instead, Besu uses -[EthSigner](https://docs.ethsigner.consensys.net/en/stable/) to make the `eth_sendTransaction` API call. +An alternative to using `eth_sendSignedTransaction` is [`eth_sendTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendtransaction). However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account management separate for stronger security. Instead, Besu uses [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) to make the `eth_sendTransaction` API call. -An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC -node is paired with EthSigner. Refer to the -[EthSigner documentation](https://docs.ethsigner.consensys.net/en/stable/) configuration details. +An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC node is paired with EthSigner. Refer to the [EthSigner documentation](https://docs.ethsigner.consensys.net/en/stable/) configuration details. -Use `eth_sendTransaction` similarly to [using `eth_sendSignedTransaction`](#use-eth_sendsignedtransaction) (without -the signing step which is done by EthSigner): +Use `eth_sendTransaction` similarly to [using `eth_sendSignedTransaction`](#use-eth_sendsignedtransaction) (without the signing step which is done by EthSigner): ```js const web3 = new Web3(host); diff --git a/docs/private-networks/tutorials/ethash.md b/docs/private-networks/tutorials/ethash.md index 63d4c851824..ea464438383 100644 --- a/docs/private-networks/tutorials/ethash.md +++ b/docs/private-networks/tutorials/ethash.md @@ -1,24 +1,27 @@ --- -description: Hyperledger Besu private network using Ethash (proof of work) Consensus Protocol tutorial +title: Create an Ethash network +sidebar_position: 5 +description: Create a private network using the Ethash consensus protocol. +tags: + - private networks --- # Create a private network using Ethash -A private network provides a configurable network for testing. By configuring a low difficulty and -enabling mining, this allows for fast block creation. +A private network provides a configurable network for testing. By configuring a low difficulty and enabling mining, this allows for fast block creation. -You can test multi-block and multi-user scenarios on a private network before moving to one of the -public testnets. +You can test multi-block and multi-user scenarios on a private network before moving to one of the public testnets. -!!!important +:::danger - The steps in this tutorial create an isolated, but not protected or secure, Ethereum private - network. We recommend running the private network behind a properly configured firewall. +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +::: ## Prerequisites -* [Hyperledger Besu](../get-started/install/binary-distribution.md) -* [Curl (or similar webservice client)](https://curl.haxx.se/download.html). +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). ## Steps @@ -26,11 +29,9 @@ Listed on the right-hand side of the page are the steps to create a private netw ### 1. Create directories -Each node requires a data directory for the blockchain data. When the node starts, Besu saves the -[node key](../../public-networks/concepts/node-keys.md) in this directory. +Each node requires a data directory for the blockchain data. When the node starts, Besu saves the [node key](../../public-networks/concepts/node-keys.md) in this directory. -Create directories for your private network, each of the three nodes, and a data directory for each -node: +Create directories for your private network, each of the three nodes, and a data directory for each node: ```bash Private-Network/ @@ -44,16 +45,11 @@ Private-Network/ ### 2. Create a genesis file -The genesis file defines the genesis block of the blockchain (that is, the start of the -blockchain). The genesis file includes entries for configuring the blockchain, such as the mining -difficulty and initial accounts and balances. +The genesis file defines the genesis block of the blockchain (that is, the start of the blockchain). The genesis file includes entries for configuring the blockchain, such as the mining difficulty and initial accounts and balances. -All nodes in a network must use the same genesis file. The -[network ID](../../public-networks/concepts/network-and-chain-id.md) defaults to the `chainID` in the genesis -file. The `fixeddifficulty` enables fast block mining. +All nodes in a network must use the same genesis file. The [network ID](../../public-networks/concepts/network-and-chain-id.md) defaults to the `chainID` in the genesis file. The `fixeddifficulty` enables fast block mining. -Copy the following genesis definition to a file called `privateNetworkGenesis.json` and save it in -the `Private-Network` directory: +Copy the following genesis definition to a file called `privateNetworkGenesis.json` and save it in the `Private-Network` directory: ```json { @@ -62,7 +58,7 @@ the `Private-Network` directory: "ethash": { "fixeddifficulty": 1000 }, - "chainID": 1337 + "chainID": 1337 }, "nonce": "0x42", "gasLimit": "0x1000000", @@ -82,148 +78,148 @@ the `Private-Network` directory: } ``` -!!! note +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: - We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating - the genesis file for a private network. - This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. +:::warning -!!! warning +Don't use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. - Don't use the accounts in `alloc` in the genesis file on Mainnet or any public network except - for testing. The private keys display, which means the accounts are not secure. +::: ### 3. Start the first node as a bootnode Start Node-1: -=== "MacOS" + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" +``` - ```bash - besu --data-path=data --genesis-file=../privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" +``` - ```bash - besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" - ``` + The command line enables: -* Mining and specifies the account to pay mining rewards to using the - [`--miner-enabled`](../../public-networks/reference/cli/options.md#miner-enabled) and - [`--miner-coinbase`](../../public-networks/reference/cli/options.md#miner-coinbase) options. -* JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) - option. -* All-host access to the HTTP JSON-RPC API using the - [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. -* All-domain access to the node through the HTTP JSON-RPC API using the - [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. +- Mining and specifies the account to pay mining rewards to using the [`--miner-enabled`](../../public-networks/reference/cli/options.md#miner-enabled) and [`--miner-coinbase`](../../public-networks/reference/cli/options.md#miner-coinbase) options. +- JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- All-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. +- All-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. -!!! info +:::info - The miner coinbase account is one of the accounts defined in the genesis file. +The miner coinbase account is one of the accounts defined in the genesis file. -When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the -enode URL to specify Node-1 as the bootnode in the following steps. +::: + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. ![Node 1 Enode URL](../../assets/images/EnodeStartup.png) ### 4. Start Node-2 -Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS -=== "MacOS" +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30304 +``` - ```bash - besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30304 - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30304 +``` - ```bash - besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30304 - ``` + The command line specifies: -* A different port to Node-1 for P2P discovery using the - [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. -* The enode URL of Node-1 using the - [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. -* A data directory for Node-2 using the - [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. -* A genesis file as for Node-1. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- A data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A genesis file as for Node-1. ### 5. Start Node-3 -Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS -=== "MacOS" +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30305 +``` - ```bash - besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30305 - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30305 +``` - ```bash - besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30305 - ``` + The command line specifies: -* A different port to Node-1 and Node-2 for P2P discovery. -* A data directory for Node-3 using the - [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. -* A bootnode and genesis file as for Node-2. +- A different port to Node-1 and Node-2 for P2P discovery. +- A data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A bootnode and genesis file as for Node-2. ### 6. Confirm the private network is working -Start another terminal, use curl to call the JSON-RPC API -[`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are -functioning as peers: +Start another terminal, use curl to call the JSON-RPC API [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: ```bash curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 ``` -The result confirms Node-1 (the node running the JSON-RPC service) has two peers (Node-2 and -Node-3): +The result confirms Node-1 (the node running the JSON-RPC service) has two peers (Node-2 and Node-3): ```json { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x2" + "jsonrpc": "2.0", + "id": 1, + "result": "0x2" } ``` ## Next steps -Import accounts to MetaMask and send transactions as described in the -[Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). +Import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::info -!!! info +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). - Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). +::: -Send transactions using `eth_sendRawTransaction` to -[send ether or, deploy or invoke contracts](../how-to/send-transactions/index.md). +Send transactions using `eth_sendRawTransaction` to [send ether or, deploy or invoke contracts](../how-to/send-transactions/index.md). Use the [JSON-RPC API](../../public-networks/how-to/use-besu-api/json-rpc.md). -Start a node with the [`--rpc-ws-enabled`](../../public-networks/reference/cli/options.md#rpc-ws-enabled) option -and use the [RPC Pub/Sub API](../../public-networks/how-to/use-besu-api/rpc-pubsub.md). +Start a node with the [`--rpc-ws-enabled`](../../public-networks/reference/cli/options.md#rpc-ws-enabled) option and use the [RPC Pub/Sub API](../../public-networks/how-to/use-besu-api/rpc-pubsub.md). ## Stop the nodes When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. -!!!tip +:::tip + +To restart the private network in the future, start from [3. Start the first node as a bootnode](#3-start-the-first-node-as-a-bootnode). - To restart the private network in the future, start from - [3. Start the first node as a bootnode](#3-start-the-first-node-as-a-bootnode). +::: diff --git a/docs/private-networks/tutorials/ibft/_category_.json b/docs/private-networks/tutorials/ibft/_category_.json new file mode 100644 index 00000000000..c90421ed03c --- /dev/null +++ b/docs/private-networks/tutorials/ibft/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create an IBFT 2.0 network", + "position": 3 +} diff --git a/docs/private-networks/tutorials/ibft/index.md b/docs/private-networks/tutorials/ibft/index.md index 0e9480cb072..c93d9fc271c 100644 --- a/docs/private-networks/tutorials/ibft/index.md +++ b/docs/private-networks/tutorials/ibft/index.md @@ -1,36 +1,35 @@ --- description: Hyperledger Besu private network using the IBFT 2.0 (Proof of Authority) consensus protocol +tags: + - private networks --- # Create a private network using IBFT 2.0 -A private network provides a configurable network for testing. This private network uses the -[IBFT 2.0 (proof of authority) consensus protocol](../../how-to/configure/consensus/ibft.md). +A private network provides a configurable network for testing. This private network uses the [IBFT 2.0 (proof of authority) consensus protocol](../../how-to/configure/consensus/ibft.md). -!!!important +:::danger - The steps in this tutorial create an isolated, but not protected or secure, Ethereum private - network. We recommend running the private network behind a properly configured firewall. +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. - This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT - 2.0 requires 4 validators to be Byzantine fault tolerant. +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires 4 validators to be Byzantine fault tolerant. + +::: ## Prerequisites -* [Hyperledger Besu](../../get-started/install/binary-distribution.md) -* [Curl (or similar webservice client)](https://curl.haxx.se/download.html). +- [Hyperledger Besu](../../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). ## Steps -Listed on the right-hand side of the page are the steps to create a private network using IBFT 2.0 -with four nodes. The four nodes are all validators. +Listed on the right-hand side of the page are the steps to create a private network using IBFT 2.0 with four nodes. The four nodes are all validators. ### 1. Create directories Each node requires a data directory for the blockchain data. -Create directories for your private network, each of the four nodes, and a data directory for each -node: +Create directories for your private network, each of the four nodes, and a data directory for each node: ```bash IBFT-Network/ @@ -46,17 +45,11 @@ IBFT-Network/ ### 2. Create a configuration file -The configuration file defines the -[IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the -number of node key pairs to generate. +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. -The configuration file has two nested JSON nodes. The first is the `genesis` property defining -the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in -the resulting genesis file. The second is the `blockchain` property defining the number of key -pairs to generate. +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. -Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it -in the `IBFT-Network` directory: +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `IBFT-Network` directory: ```json { @@ -103,33 +96,30 @@ in the `IBFT-Network` directory: } ``` -!!! note +:::note + +We recommend specifying the latest [milestone](../../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the configuration file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. - We recommend specifying the latest [milestone](../../../public-networks/reference/genesis-items.md#milestone-blocks) - when creating the configuration file for a private network. - This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. +::: -!!! warning +:::warning - Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except - for testing. The private keys display, which means the accounts are not secure. +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: ### 3. Generate node keys and a genesis file In the `IBFT-Network` directory, generate the node key and genesis file: -=== "MacOS" - - ```bash - besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key - ``` +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` Besu creates the following in the `networkFiles` directory: -* `genesis.json` - The genesis file including the `extraData` property specifying the four nodes - are validators. -* A directory for each node named using the node address and containing the public and private key - for each node. +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. ```bash networkFiles/ @@ -182,126 +172,121 @@ IBFT-Network/ In the `Node-1` directory, start Node-1: -=== "MacOS" + - ```bash - besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" - ``` +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + The command line: -* Specifies the data directory for Node-1 using the - [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. -* Enables the JSON-RPC API using the - [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. -* Enables the ETH, NET, and IBFT APIs using the - [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) option. -* Enables all-host access to the HTTP JSON-RPC API using the - [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist) option. -* Enables all-domain access to the node through the HTTP JSON-RPC API using the - [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. +- Specifies the data directory for Node-1 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- Enables the JSON-RPC API using the [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables the ETH, NET, and IBFT APIs using the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) option. +- Enables all-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist) option. +- Enables all-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. -When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the -enode URL to specify Node-1 as the bootnode in the following steps. +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. ![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) ### 7. Start Node-2 -Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: -=== "MacOS" + - ```bash - besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 - ``` +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + The command line specifies: -* The data directory for Node-2 using the - [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. -* A different port to Node-1 for P2P discovery using the - [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. -* A different port to Node-1 for HTTP JSON-RPC using the - [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. -* The enode URL of Node-1 using the - [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. -* Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). +- The data directory for Node-2 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). ### 8. Start Node-3 -Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: -=== "MacOS" + - ```bash - besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 - ``` +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + The command line specifies: -* The data directory for Node-3 using the - [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. -* A different port to Node-1 and Node-2 for P2P discovery using the - [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. -* A different port to Node-1 and Node-2 for HTTP JSON-RPC using the - [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. -* The bootnode as for [Node-2](#7-start-node-2). -* Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). +- The data directory for Node-3 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). ### 9. Start Node-4 -Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: -=== "MacOS" + + +# MacOS ```bash besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 ``` -=== "Windows" +# Windows ```bash besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 ``` + + The command line specifies: -* The data directory for Node-4 using the - [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. -* A different port to Node-1, Node-2, and Node-3 for P2P discovery using the - [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. -* A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the - [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. -* The bootnode as for [Node-2](#7-start-node-2). -* Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). +- The data directory for Node-4 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). ### 10. Confirm the private network is working -Start another terminal, use curl to call the JSON-RPC API -[`ibft_getvalidatorsbyblocknumber`](../../reference/api/index.md#ibft_getvalidatorsbyblocknumber) -method and confirm the network has four validators: +Start another terminal, use curl to call the JSON-RPC API [`ibft_getvalidatorsbyblocknumber`](../../reference/api/index.md#ibft_getvalidatorsbyblocknumber) method and confirm the network has four validators: ```bash curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' localhost:8545 @@ -311,9 +296,14 @@ The result displays the four validators: ```json { - "jsonrpc" : "2.0", - "id" : 1, - "result" : [ "0x1e326b6da177ede2d3eb6d7247bd9f6901d40234", "0x4aaac297fefe4466ebcb0b23ab90c5f466b11556", "0xa267ead2e91e1673e0943b925176b51d9cd4f6d2", "0xe3e680bc0ff485d1d415a384721f19e0db65fea7" ] + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x1e326b6da177ede2d3eb6d7247bd9f6901d40234", + "0x4aaac297fefe4466ebcb0b23ab90c5f466b11556", + "0xa267ead2e91e1673e0943b925176b51d9cd4f6d2", + "0xe3e680bc0ff485d1d415a384721f19e0db65fea7" + ] } ``` @@ -327,57 +317,60 @@ Look at the logs to confirm Besu is producing blocks: 2020-12-21 07:22:25.060+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=5, Round=0}, hash=0x82b2069961d9185f7857cad1123de72d715729e122441335db486ea436834d6e ``` -!!! important +:::info - If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), - the network will not start producing blocks. +If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), the network will not start producing blocks. - The logs for each node should indicate the public key was loaded from the `data/key` directory: +The logs for each node should indicate the public key was loaded from the `data/key` directory: - ```bash - 2020-12-21 07:16:18.360+10:00 | main | INFO | KeyPairUtil | Loaded public key 0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc from /IBFT-Network/Node-1/data/key - ``` +```bash +2020-12-21 07:16:18.360+10:00 | main | INFO | KeyPairUtil | Loaded public key 0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc from /IBFT-Network/Node-1/data/key +``` - If the keys were not copied to the correct directory, Besu creates a key when starting up: +If the keys were not copied to the correct directory, Besu creates a key when starting up: - ```bash - 2020-12-21 07:33:11.458+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /IBFT-Network/Node-1/data/key - ``` +```bash +2020-12-21 07:33:11.458+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /IBFT-Network/Node-1/data/key +``` - If a new key was created, the validator key specified in the configuration does not match - the created key and the node cannot participate in creating blocks. +If a new key was created, the validator key specified in the configuration does not match the created key and the node cannot participate in creating blocks. + +::: ## Next steps Use the [IBFT API](../../reference/api/index.md#ibft-20-methods) to remove or add validators. -!!! note +:::note + +To add or remove nodes as validators you need the node address. The directory [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the name. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires four validators to be Byzantine fault tolerant. - To add or remove nodes as validators you need the node address. The directory - [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the - name. +::: - This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT - 2.0 requires four validators to be Byzantine fault tolerant. +Import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](../quickstart.md#create-a-transaction-using-metamask). -Import accounts to MetaMask and send transactions as described in the -[Quickstart tutorial](../quickstart.md#create-a-transaction-using-metamask). +:::info -!!! info +Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). - Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). +::: ## Stop the nodes When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. -!!!tip +:::tip - To restart the IBFT 2.0 network in the future, start from - [6. Start First Node as Bootnode](#6-start-the-first-node-as-the-bootnode). +To restart the IBFT 2.0 network in the future, start from [6. Start First Node as Bootnode](#6-start-the-first-node-as-the-bootnode). + +::: + [IBFT 2.0 (proof of authority)consensus protocol]: ../../how-to/configure/consensus/ibft.md -*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +\*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. diff --git a/docs/private-networks/tutorials/ibft/validators.md b/docs/private-networks/tutorials/ibft/validators.md index 31d80d98ce7..1e74b04d01d 100644 --- a/docs/private-networks/tutorials/ibft/validators.md +++ b/docs/private-networks/tutorials/ibft/validators.md @@ -1,15 +1,18 @@ --- +title: Add and removing IBFT 2.0 validators +sidebar_position: 1 description: Adding and removing IBFT 2.0 validators +tags: + - private networks --- # Add and remove IBFT 2.0 validators -This example walks through -[adding and removing an IBFT 2.0 validator](../../how-to/configure/consensus/ibft.md#add-and-remove-validators). +This example walks through [adding and removing an IBFT 2.0 validator](../../how-to/configure/consensus/ibft.md#add-and-remove-validators). ## Prerequisites -* [IBFT 2.0 network as configured in the IBFT 2.0 tutorial](index.md) +- [IBFT 2.0 network as configured in the IBFT 2.0 tutorial](index.md) ## Add a validator @@ -23,8 +26,7 @@ mkdir -p Node-5/data ### 2. Start the node -Change into the working directory for the new Node-5 and start the node, specifying the -[Node-1 enode URL](index.md#6-start-the-first-node-as-the-bootnode) as the bootnode: +Change into the working directory for the new Node-5 and start the node, specifying the [Node-1 enode URL](index.md#6-start-the-first-node-as-the-bootnode) as the bootnode: ```bash besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30307 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8549 @@ -32,92 +34,92 @@ besu --data-path=data --genesis-file=../genesis.json --bootnodes= + +# Subcommand - === "Subcommand" +```bash +besu --data-path=IBFT-Network/Node-5/data public-key export-address +``` - ```bash - besu --data-path=IBFT-Network/Node-5/data public-key export-address - ``` +# Output - === "Output" +```bash +0x90626e6a67445aabf1c0615410d108d4733aa90b +``` - ```bash - 0x90626e6a67445aabf1c0615410d108d4733aa90b - ``` + ### 4. Propose adding the new validator -Propose adding the new validator from more than half the number of current validators, using -[`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the -proposed validator and `true`: +Propose adding the new validator from more than half the number of current validators, using [`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the proposed validator and `true`: -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0x90626e6a67445aabf1c0615410d108d4733aa90b", true], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0x90626e6a67445aabf1c0615410d108d4733aa90b", true], "id":1}' http://127.0.0.1:8545 +``` - === "JSON result" +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` - ```json - { - "jsonrpc":"2.0", - "id":1, - "result":true - } - ``` + Repeat the proposal process for this candidate node from at least two of the other nodes. ### 5. Verify the addition of the new validator -Verify that the new validator is now in the list of validators using -[`ibft_getValidatorsByBlockNumber`](../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber): +Verify that the new validator is now in the list of validators using [`ibft_getValidatorsByBlockNumber`](../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber): -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` - === "JSON result" +# JSON result + +```json +[ + "0x189d23d201b03ae1cf9113672df29a5d672aefa3", + "0x2aabbc1bb9bacef60a09764d1a1f4f04a47885c1", + "0x44b07d2c28b8ed8f02b45bd84ac7d9051b3349e6", + "0x4c1ccd426833b9782729a212c857f2f03b7b4c0d", + "0x90626e6a67445aabf1c0615410d108d4733aa90b" +] +``` - ```json - ["0x189d23d201b03ae1cf9113672df29a5d672aefa3", "0x2aabbc1bb9bacef60a09764d1a1f4f04a47885c1", "0x44b07d2c28b8ed8f02b45bd84ac7d9051b3349e6", "0x4c1ccd426833b9782729a212c857f2f03b7b4c0d", "0x90626e6a67445aabf1c0615410d108d4733aa90b"] - ``` + The list of validators contains 5 addresses now. ## Remove a validator -The process for removing a validator is similar to [adding a validator](#add-a-validator) starting from step 2, -except you specify `false` as the second parameter of -[`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote). +The process for removing a validator is similar to [adding a validator](#add-a-validator) starting from step 2, except you specify `false` as the second parameter of [`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote). diff --git a/docs/private-networks/tutorials/kubernetes/_category_.json b/docs/private-networks/tutorials/kubernetes/_category_.json new file mode 100644 index 00000000000..5a498fa215c --- /dev/null +++ b/docs/private-networks/tutorials/kubernetes/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy using Kubernetes", + "position": 9 +} diff --git a/docs/private-networks/tutorials/kubernetes/charts.md b/docs/private-networks/tutorials/kubernetes/charts.md index 640e73bcbd0..8172d66e5c7 100644 --- a/docs/private-networks/tutorials/kubernetes/charts.md +++ b/docs/private-networks/tutorials/kubernetes/charts.md @@ -1,6 +1,9 @@ --- -title: Besu Kubernetes - Deploying Charts +title: Deploying Charts +sidebar_position: 3 description: Deploying Besu Helm Charts for a Kubernetes cluster +tags: + - private networks --- # Deploy charts @@ -9,25 +12,20 @@ You can deploy Besu Helm charts for a Kubernetes cluster. ## Prerequisites -* Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository -* A [running Kubernetes cluster](cluster.md) -* Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) -* Install [Helm3](https://helm.sh/docs/intro/install/) +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) ## Provision with Helm charts -Helm is a method of packaging a collection of objects into a chart which can then be deployed to the cluster. -After you have cloned the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change -the directory to `helm` for the rest of this tutorial. +Helm is a method of packaging a collection of objects into a chart which can then be deployed to the cluster. After you have cloned the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change the directory to `helm` for the rest of this tutorial. ```bash cd helm ``` -Each helm chart has the following key-map values which you will need to set depending on your needs. The `cluster.provider` is used -as a key for the various cloud features enabled. Please specify only one cloud provider, not both. At present, the -charts have full support for cloud native services in both AWS and Azure. Please note that if you use -GCP, IBM etc please set `cluster.provider: local` and set `cluster.cloudNativeServices: false`. +Each helm chart has the following key-map values which you will need to set depending on your needs. The `cluster.provider` is used as a key for the various cloud features enabled. Please specify only one cloud provider, not both. At present, the charts have full support for cloud native services in both AWS and Azure. Please note that if you use GCP, IBM etc please set `cluster.provider: local` and set `cluster.cloudNativeServices: false`. Please update the `aws` or `azure` map as shown below if you deploy to either cloud provider. @@ -61,13 +59,14 @@ azure: Setting the `cluster.cloudNativeServices: true`: -* Stores keys in Azure Key Vault or AWS Secrets Manager. -* Uses Azure Managed Identities or AWS Identity and Access Management for pod identity access. +- Stores keys in Azure Key Vault or AWS Secrets Manager. +- Uses Azure Managed Identities or AWS Identity and Access Management for pod identity access. -!!! note +:::note - You can customize any of the charts in this repository to suit your requirements, and make pull requests to - extend functionality. +You can customize any of the charts in this repository to suit your requirements, and make pull requests to extend functionality. + +::: ### 1. Check that you can connect to the cluster with `kubectl` @@ -88,11 +87,11 @@ Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCom This tutorial isolates groups of resources (for example, StatefulSets and Services) within a single cluster. -!!! note +:::note + +The rest of this tutorial uses `besu` as the namespace, but you're free to pick any name when deploying, as long as it's consistent across the [infrastructure scripts](cluster.md) and charts. - The rest of this tutorial uses `besu` as the namespace, - but you're free to pick any name when deploying, as long as it's consistent across the - [infrastructure scripts](cluster.md) and charts. +::: Run the following in a terminal window: @@ -113,11 +112,7 @@ helm install monitoring prometheus-community/kube-prometheus-stack --version 34. kubectl --namespace besu apply -f ./values/monitoring/ ``` -Metrics are collected via a -[ServiceMonitor](https://github.com/prometheus-operator/prometheus-operator/blob/7c77626e5e270a2530e187b185d45eeed8a773bf/Documentation/user-guides/getting-started.md) -that scrapes each Besu pod, using given -[`annotations`](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) which specify the -port and path to use. For example: +Metrics are collected via a [ServiceMonitor](https://github.com/prometheus-operator/prometheus-operator/blob/7c77626e5e270a2530e187b185d45eeed8a773bf/Documentation/user-guides/getting-started.md) that scrapes each Besu pod, using given [`annotations`](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) which specify the port and path to use. For example: ```bash template: @@ -128,10 +123,11 @@ port and path to use. For example: prometheus.io/path: "/metrics" ``` -!!! warning +:::warning - For production use cases, configure Grafana with one of the supported - [native auth mechanisms](https://grafana.com/docs/grafana/latest/auth/). +For production use cases, configure Grafana with one of the supported [native auth mechanisms](https://grafana.com/docs/grafana/latest/auth/). + +::: ![k8s-metrics](../../../assets/images/kubernetes-grafana.png) @@ -148,14 +144,11 @@ helm install kibana --version 7.17.1 elastic/kibana --namespace quorum --values helm install filebeat --version 7.17.1 elastic/filebeat --namespace quorum --values ./values/filebeat.yml ``` -If you install `filebeat`, please create a `filebeat-*` index pattern in `kibana`. All the logs from the nodes are sent to the `filebeat` index. -If you use The Elastic stack for logs and metrics, please deploy `metricbeat` in a similar manner to `filebeat` and create an index pattern in -Kibana. +If you install `filebeat`, please create a `filebeat-*` index pattern in `kibana`. All the logs from the nodes are sent to the `filebeat` index. If you use The Elastic stack for logs and metrics, please deploy `metricbeat` in a similar manner to `filebeat` and create an index pattern in Kibana. ![k8s-elastic](../../../assets/images/kubernetes-elastic.png) -To connect to Kibana or Grafana, we also need to deploy an ingress so you can access your monitoring endpoints -publicly. We use Nginx as our ingress here, and you are free to configure any ingress per your requirements. +To connect to Kibana or Grafana, we also need to deploy an ingress so you can access your monitoring endpoints publicly. We use Nginx as our ingress here, and you are free to configure any ingress per your requirements. ```bash helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx @@ -173,13 +166,13 @@ helm install quorum-monitoring-ingress ingress-nginx/ingress-nginx \ kubectl apply -f ../ingress/ingress-rules-monitoring.yml ``` -Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard -or on the command line `kubectl -n quorum get services quorum-monitoring-ingress-ingress-nginx-controller`. +Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard or on the command line `kubectl -n quorum get services quorum-monitoring-ingress-ingress-nginx-controller`. + +:::note -!!! note +We refer to the ingress here as `external-nginx` because it deals with monitoring endpoints specifically. We also deploy a second ingress called `network-ingress` which is for the blockchain nodes only in [step 8](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) - We refer to the ingress here as `external-nginx` because it deals with monitoring endpoints specifically. We - also deploy a second ingress called `network-ingress` which is for the blockchain nodes only in [step 8](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) +::: ![`k8s-ingress-external`](../../../assets/images/kubernetes-ingress-ip.png) @@ -199,14 +192,13 @@ http:///kibana The genesis chart creates the genesis file and keys for the validators. -!!! warning +:::warning - It's important to keep the release names of the initial validator pool as per this tutorial, that is - `validator-n`, where `n` is the node number. Any validators created after the initial pool can be named - to anything you like. +It's important to keep the release names of the initial validator pool as per this tutorial, that is `validator-n`, where `n` is the node number. Any validators created after the initial pool can be named to anything you like. -The override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) -looks like below: +::: + +The override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) looks like below: ```bash --- @@ -255,17 +247,11 @@ rawGenesisConfig: accountPassword: 'password' ``` -Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. -`quorumFlags.removeGenesisOnDelete: true` tells the chart to delete the genesis file when the chart is deleted. -If you may wish to retain the genesis on deletion, please set that value to `false`. +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeGenesisOnDelete: true` tells the chart to delete the genesis file when the chart is deleted. If you may wish to retain the genesis on deletion, please set that value to `false`. -The last config item is `rawGenesisConfig` which has details of the chain you are creating, please edit any of the -parameters in there to match your requirements. To set the number of initial validators set the -`rawGenesisConfig.blockchain.nodes` to the number that you'd like. We recommend using the Byzantine formula of `N=3F+1` -when setting the number of validators. +The last config item is `rawGenesisConfig` which has details of the chain you are creating, please edit any of the parameters in there to match your requirements. To set the number of initial validators set the `rawGenesisConfig.blockchain.nodes` to the number that you'd like. We recommend using the Byzantine formula of `N=3F+1` when setting the number of validators. -One more thing to note is that when `cluster.cloudNativeServices: true` is set, the genesis job will -not add the [Quickstart](../quickstart.md) test accounts into the genesis file. +One more thing to note is that when `cluster.cloudNativeServices: true` is set, the genesis job will not add the [Quickstart](../quickstart.md) test accounts into the genesis file. When you are ready deploy the chart with : @@ -274,8 +260,7 @@ cd helm helm install genesis ./charts/besu-genesis --namespace besu --create-namespace --values ./values/genesis-besu.yml ``` -Once completed, view the genesis and enodes (the list of static nodes) configuration maps that every Besu node uses, -and the validator and bootnode node keys as secrets. +Once completed, view the genesis and enodes (the list of static nodes) configuration maps that every Besu node uses, and the validator and bootnode node keys as secrets. ![k8s-genesis-configmaps](../../../assets/images/kubernetes-genesis-configmaps.png) @@ -283,10 +268,7 @@ and the validator and bootnode node keys as secrets. ### 5. Deploy the bootnodes -This is an optional but recommended step. In a production setup we recommend the use of two ore more bootnodes -for best practices. Each Besu node has a map that tells the StatefulSet what to deploy and how to clean up. -The default `values.yml` for the StatefulSet define the following flags which are present in all the -override values files. +This is an optional but recommended step. In a production setup we recommend the use of two ore more bootnodes for best practices. Each Besu node has a map that tells the StatefulSet what to deploy and how to clean up. The default `values.yml` for the StatefulSet define the following flags which are present in all the override values files. ```bash --- @@ -329,37 +311,30 @@ node: memRequest: "1G" ``` -Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. -`quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. -If you may wish to retain the keys on deletion, please set that value to `false`. +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. If you may wish to retain the keys on deletion, please set that value to `false`. + +For the bootnodes only, set the `quorumFlags.isBootnode: true`. When using bootnodes you have to also set `quorumFlags.usesBootnodes: true` to indicate that all nodes on the network will use these bootnodes. -For the bootnodes only, set the `quorumFlags.isBootnode: true`. When using bootnodes you have to also set -`quorumFlags.usesBootnodes: true` to indicate that all nodes on the network will use these bootnodes. +:::note -!!! note +If you use bootnodes, you must set `quorumFlags.usesBootnodes: true` in the override values.yaml for every other node type, that is validators.yaml, txnode.yaml and reader.yaml - If you use bootnodes, you must set `quorumFlags.usesBootnodes: true` in the override values.yaml for - every other node type, that is validators.yaml, txnode.yaml and reader.yaml +::: ```bash helm install bootnode-1 ./charts/besu-node --namespace besu --values ./values/bootnode.yml helm install bootnode-2 ./charts/besu-node --namespace besu --values ./values/bootnode.yml ``` -Once complete, you see two StatefulSets, and the two bootnodes discover themselves and peer. -Because there are no validators present yet, there are no blocks created, as seen in the following logs. +Once complete, you see two StatefulSets, and the two bootnodes discover themselves and peer. Because there are no validators present yet, there are no blocks created, as seen in the following logs. ![k8s-bootnode-logs](../../../assets/images/kubernetes-bootnode-logs.png) ### 6. Deploy the validators -The validators peer with the bootnodes and themselves, and when a majority of the validators have peered, blocks -are proposed and created on the chain. +The validators peer with the bootnodes and themselves, and when a majority of the validators have peered, blocks are proposed and created on the chain. -These are the next set of nodes that we will deploy. The charts use four validators (default) to replicate best practices -for a network. The override -[values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/validator.yml) for the -StatefulSet looks like below: +These are the next set of nodes that we will deploy. The charts use four validators (default) to replicate best practices for a network. The override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/validator.yml) for the StatefulSet looks like below: ```bash --- @@ -370,18 +345,15 @@ quorumFlags: usesBootnodes: true # set this to true if the network you are connecting to use a bootnode/s that are deployed in the cluster ``` -Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. -`quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. -If you may wish to retain the keys on deletion, please set that value to `false`. +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. If you may wish to retain the keys on deletion, please set that value to `false`. -!!! warning +:::warning - Please note that if you delete a majority of the validators, the network will halt. Additionally, if the - validator keys are deleted you may not be able to recover as you need a majority of the validators up to vote to - add new validators into the pool +Please note that if you delete a majority of the validators, the network will halt. Additionally, if the validator keys are deleted you may not be able to recover as you need a majority of the validators up to vote to add new validators into the pool -When using bootnodes (if deployed in the previous step) you have to also set `quorumFlags.usesBootnodes: true` -to indicate that all nodes on the network will use these bootnodes. +::: + +When using bootnodes (if deployed in the previous step) you have to also set `quorumFlags.usesBootnodes: true` to indicate that all nodes on the network will use these bootnodes. For the initial validator pool we set all the node flags to `false` and then deploy. @@ -392,33 +364,27 @@ helm install validator-3 ./charts/besu-node --namespace besu --values ./values/v helm install validator-4 ./charts/besu-node --namespace besu --values ./values/validator.yml ``` -!!! warning +:::warning + +It's important to keep the release names of the validators the same as it is tied to the keys that the genesis chart creates. So we use `validator-1`, `validator-2`, etc. in the following command. - It's important to keep the release names of the validators the same as it is tied to the keys that the genesis chart - creates. So we use `validator-1`, `validator-2`, etc. in the following command. +::: -Once completed, you may need to give the validators a few minutes to peer and for round changes, depending on when the -first validator was spun up, before the logs display blocks being created. +Once completed, you may need to give the validators a few minutes to peer and for round changes, depending on when the first validator was spun up, before the logs display blocks being created. ![k8s-validator-logs](../../../assets/images/kubernetes-validator-logs.png) ### 7. Add/Remove additional validators to the validator pool -To add (or remove) more validators to the initial validator pool, you need to deploy a node such as an RPC node (step 8) -and then [vote](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) that node in. The vote API -call must be made on a majority of the existing pool and the new node will then become a validator. +To add (or remove) more validators to the initial validator pool, you need to deploy a node such as an RPC node (step 8) and then [vote](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) that node in. The vote API call must be made on a majority of the existing pool and the new node will then become a validator. -Please refer to the [Ingress Section](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) for details on -making the API calls from your local machine or equivalent. +Please refer to the [Ingress Section](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) for details on making the API calls from your local machine or equivalent. ### 8. Deploy RPC or Transaction nodes -An RPC node is simply a node that can be used to make public transactions or perform read heavy operations such -as when connected to a chain explorer like [BlockScout](https://github.com/blockscout/blockscout). +An RPC node is simply a node that can be used to make public transactions or perform read heavy operations such as when connected to a chain explorer like [BlockScout](https://github.com/blockscout/blockscout). -The RPC override -[values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/reader.yml) for the -StatefulSet looks identical to that of the validators above, and will create it's own node keys before the node starts. +The RPC override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/reader.yml) for the StatefulSet looks identical to that of the validators above, and will create it's own node keys before the node starts. To deploy an RPC node: @@ -426,13 +392,9 @@ To deploy an RPC node: helm install rpc-1 ./charts/besu-node --namespace besu --values ./values/reader.yml ``` -A Transaction or Member node in turn is one which has an accompanying Private Transaction Manager, such as Tessera; -which allow you to make private transactions between nodes. +A Transaction or Member node in turn is one which has an accompanying Private Transaction Manager, such as Tessera; which allow you to make private transactions between nodes. -The Transaction override -[values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) for the -StatefulSet looks identical to that of the validators above and only has `quorumFlags.privacy: true` to indicate that -it is deploying a pair of GoQuorum and Tessera nodes. +The Transaction override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) for the StatefulSet looks identical to that of the validators above and only has `quorumFlags.privacy: true` to indicate that it is deploying a pair of GoQuorum and Tessera nodes. To deploy a Transaction or Member node: @@ -448,15 +410,15 @@ Logs for Besu resemble the following: ![`k8s-tx-Besu-logs`](../../../assets/images/kubernetes-tx-Besu-logs.png) -!!! note +:::note - In these examples we use `member-1` and `rpc-1` as release names for the deployments. You can pick any release - name that you'd like to use in place of those as per your requirements. +In these examples we use `member-1` and `rpc-1` as release names for the deployments. You can pick any release name that you'd like to use in place of those as per your requirements. + +::: ### 9. Connect to the node from your local machine via an ingress -In order to view the Grafana dashboards or connect to the nodes to make transactions from your local machine you can -deploy an ingress controller with rules. We use the `ingress-nginx` ingress controller which can be deployed as follows: +In order to view the Grafana dashboards or connect to the nodes to make transactions from your local machine you can deploy an ingress controller with rules. We use the `ingress-nginx` ingress controller which can be deployed as follows: ```bash helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx @@ -472,50 +434,49 @@ helm install quorum-network-ingress ingress-nginx/ingress-nginx \ --set controller.service.externalTrafficPolicy=Local ``` -Use [pre-defined rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) -to test functionality, and alter to suit your requirements (for example, restrict access for API calls to trusted CIDR blocks). +Use [pre-defined rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) to test functionality, and alter to suit your requirements (for example, restrict access for API calls to trusted CIDR blocks). -Edit the [rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) file so that the -service names match your release name. In the example, we deployed a transaction node with the release name `member-1` -so the corresponding service is called `besu-node-member-1`. Once you have settings -that match your deployments, deploy the rules as follows: +Edit the [rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) file so that the service names match your release name. In the example, we deployed a transaction node with the release name `member-1` so the corresponding service is called `besu-node-member-1`. Once you have settings that match your deployments, deploy the rules as follows: ```bash kubectl apply -f ../ingress/ingress-rules-besu.yml ``` -Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard -or on the command line `kubectl -n quorum get services quorum-network-ingress-ingress-nginx-controller`. +Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard or on the command line `kubectl -n quorum get services quorum-network-ingress-ingress-nginx-controller`. ![`k8s-ingress`](../../../assets/images/kubernetes-ingress-ip.png) The following is an example RPC call, which confirms that the node running the JSON-RPC service is syncing: -=== "curl HTTP request" + + +# curl HTTP request + +```bash +curl -v -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http:///rpc +``` - ```bash - curl -v -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http:///rpc - ``` +# JSON result -=== "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4e9" +} +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x4e9" - } - ``` + ### 10. Blockchain explorer -You can deploy [BlockScout](https://github.com/blockscout/blockscout) to aid with monitoring the blockchain. -To do this, update the [BlockScout values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/blockscout-besu.yml) -and set the `database` and `secret_key_base` values. +You can deploy [BlockScout](https://github.com/blockscout/blockscout) to aid with monitoring the blockchain. To do this, update the [BlockScout values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/blockscout-besu.yml) and set the `database` and `secret_key_base` values. -!!! important +:::important - Changes to the database requires changes to both the `database` and the `blockscout` dictionaries. +Changes to the database requires changes to both the `database` and the `blockscout` dictionaries. + +::: Once completed, deploy the chart using: @@ -524,27 +485,20 @@ helm dependency update ./charts/blockscout helm install blockscout ./charts/blockscout --namespace quorum --values ./values/blockscout-goquorum.yaml ``` -You can optionally deploy the [Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight -blockchain explorer. The Quorum Explorer is not recommended for use in production and is intended for -demonstration or Development purposes only. The Explorer can give an overview over the whole network, such as -querying each node on the network for node or block information, voting (add/remove) validators from the -network, demonstrating a SimpleStorage smart contract with privacy enabled, and sending transactions between -wallets as you would do in MetaMask. Please see the [Explorer](quorum-explorer.md) page for details on how -to use the application. +You can optionally deploy the [Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight blockchain explorer. The Quorum Explorer is not recommended for use in production and is intended for demonstration or Development purposes only. The Explorer can give an overview over the whole network, such as querying each node on the network for node or block information, voting (add/remove) validators from the network, demonstrating a SimpleStorage smart contract with privacy enabled, and sending transactions between wallets as you would do in MetaMask. Please see the [Explorer](quorum-explorer.md) page for details on how to use the application. + +:::warning -!!! warning +The accounts listed in the file below are for test purposes only and should not be used on a production network. - The accounts listed in the file below are for test purposes only and should not be used on a production network. +::: -To deploy the application, update the -[Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) -with details of your nodes and endpoints and then deploy. +To deploy the application, update the [Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) with details of your nodes and endpoints and then deploy. ```bash helm install quorum-explorer ./charts/explorer --namespace besu --values ./values/explorer-besu.yaml ``` -You will also need deploy the ingress (if not already done in [Monitoring](#3-deploy-the-monitoring-chart) to -access the endpoint on `http:///explorer` +You will also need deploy the ingress (if not already done in [Monitoring](#3-deploy-the-monitoring-chart) to access the endpoint on `http:///explorer` ![`k8s-explorer`](../../../assets/images/kubernetes-explorer.png) diff --git a/docs/private-networks/tutorials/kubernetes/cluster.md b/docs/private-networks/tutorials/kubernetes/cluster.md index 9c08efb10b0..ba2772510b6 100644 --- a/docs/private-networks/tutorials/kubernetes/cluster.md +++ b/docs/private-networks/tutorials/kubernetes/cluster.md @@ -1,21 +1,23 @@ --- title: Create a cluster +sidebar_position: 2 description: Create a cluster for deployment +tags: + - private networks --- # Create a cluster -You can create a [local](#local-clusters) or [cloud](#cloud-clusters) cluster to deploy a Besu network using -Kubernetes. +You can create a [local](#local-clusters) or [cloud](#cloud-clusters) cluster to deploy a Besu network using Kubernetes. ## Prerequisites -* Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository -* Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) -* Install [Helm3](https://helm.sh/docs/intro/install/) -* Install [AWS CLI](https://aws.amazon.com/cli/) and [`eksctl`](https://eksctl.io/) for AWS EKS clusters -* Install [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) for Azure AKS clusters -* Install the cloud-specific CLI +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) +- Install [AWS CLI](https://aws.amazon.com/cli/) and [`eksctl`](https://eksctl.io/) for AWS EKS clusters +- Install [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) for Azure AKS clusters +- Install the cloud-specific CLI ## Local Clusters @@ -23,12 +25,13 @@ Use one of several options to create a local cluster. Select one listed below, o ### Minikube -[Minikube](https://minikube.sigs.k8s.io/docs/start/) is one of the most popular options to spin up a -local Kubernetes cluster for development. You can [install a version](https://minikube.sigs.k8s.io/docs/start/) -based on your architecture. +[Minikube](https://minikube.sigs.k8s.io/docs/start/) is one of the most popular options to spin up a local Kubernetes cluster for development. You can [install a version](https://minikube.sigs.k8s.io/docs/start/) based on your architecture. -!!! note - We recommend at least 2 CPUs and 16GB of RAM. +:::note + +We recommend at least 2 CPUs and 16GB of RAM. + +::: To start the cluster, run the following command: @@ -38,8 +41,7 @@ minikube start --cpus 2 --memory 16384 --cni auto ### kind -[kind (Kubernetes in Docker)](https://kind.sigs.k8s.io) is a lightweight tool for running local Kubernetes clusters. The -[installation](https://kind.sigs.k8s.io/docs/user/quick-start#installation) is similar to [Minikube](#minikube). +[kind (Kubernetes in Docker)](https://kind.sigs.k8s.io) is a lightweight tool for running local Kubernetes clusters. The [installation](https://kind.sigs.k8s.io/docs/user/quick-start#installation) is similar to [Minikube](#minikube). To start the cluster, run the following command: @@ -49,89 +51,71 @@ kind create cluster ### Rancher -[Rancher](https://github.com/rancher-sandbox/rancher-desktop/) is a lightweight open source desktop application -for Mac, Windows, and Linux. It provides Kubernetes and container management, and allows you to choose the -version of Kubernetes to run. +[Rancher](https://github.com/rancher-sandbox/rancher-desktop/) is a lightweight open source desktop application for Mac, Windows, and Linux. It provides Kubernetes and container management, and allows you to choose the version of Kubernetes to run. It can build, push, pull, and run container images. Built container images can be run without needing a registry. -!!!note - The official Docker-CLI is not supported but rather uses [nerdctl](https://github.com/containerd/nerdctl) which is - a Docker-CLI compatible tool for containerd, and is automatically installed with Rancher Desktop. +:::note + +The official Docker-CLI is not supported but rather uses [nerdctl](https://github.com/containerd/nerdctl) which is a Docker-CLI compatible tool for containerd, and is automatically installed with Rancher Desktop. + +::: -!!!note - For Windows, you must [install Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install) - to install Rancher Desktop. +:::note -Refer to the [official Rancher Desktop documentation](https://docs.rancherdesktop.io/) for system -requirements and installation instructions. +For Windows, you must [install Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install) to install Rancher Desktop. + +Refer to the [official Rancher Desktop documentation](https://docs.rancherdesktop.io/) for system requirements and installation instructions. + +::: ## Cloud clusters ### AWS EKS -[AWS Elastic Kubernetes Service (AWS EKS)](https://aws.amazon.com/eks/) is one of the most popular platforms -to deploy Hyperledger Besu. +[AWS Elastic Kubernetes Service (AWS EKS)](https://aws.amazon.com/eks/) is one of the most popular platforms to deploy Hyperledger Besu. + +To create a cluster in AWS, you must install the [AWS CLI](https://aws.amazon.com/cli/) and [`eksctl`](https://eksctl.io/). + +The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) comprises the base infrastructure used to build the cluster and other resources in AWS. We also use some native services with the cluster for performance and best practices, these include: -To create a cluster in AWS, you must install the [AWS CLI](https://aws.amazon.com/cli/) and -[`eksctl`](https://eksctl.io/). +- [Pod identities](https://github.com/aws/amazon-eks-pod-identity-webhook). +- [Secrets Store CSI drivers](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html). +- Dynamic storage classes backed by AWS EBS. The [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) are fixed sizes and can be updated as you grow via helm updates, and won't need to re-provision the underlying storage class. +- [CNI](https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html) networking mode for EKS. By default, EKS clusters use `kubenet` to create a virtual network and subnet. Nodes get an IP address from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods receive an IP address "hidden" behind the node IP. -The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) comprises the base -infrastructure used to build the cluster and other resources in AWS. We also use some native -services with the cluster for performance and best practices, these include: + :::note -* [Pod identities](https://github.com/aws/amazon-eks-pod-identity-webhook). -* [Secrets Store CSI drivers](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html). -* Dynamic storage classes backed by AWS EBS. The - [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) are fixed - sizes and can be updated as you grow via helm updates, and won't need to re-provision the underlying storage - class. -* [CNI](https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html) networking mode for EKS. By default, - EKS clusters use `kubenet` to create a virtual network and subnet. Nodes get an IP - address from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods - receive an IP address "hidden" behind the node IP. + This approach reduces the number of IP addresses that you must reserve in your network space for pods, but constrains what can connect to the nodes from outside the cluster (for example, on-premise nodes or those on another cloud provider). - !!! note - This approach reduces the number of IP addresses that you must reserve in your network space for pods, but - constrains what can connect to the nodes from - outside the cluster (for example, on-premise nodes or those on another cloud provider). + ::: -AWS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed -directly. The IP addresses must be unique across your network space, and must be planned in advance. Each node has -a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses -per node are then reserved up front for that node. This approach requires more planning, and can lead to IP address -exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. +AWS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed directly. The IP addresses must be unique across your network space, and must be planned in advance. Each node has a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses per node are then reserved up front for that node. This approach requires more planning, and can lead to IP address exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. -!!!warning +:::warning - EKS clusters must not use 169.254.0.0/16, 172.30.0.0/16, 172.31.0.0/16, or 192.0.2.0/24 for the Kubernetes - service address range. +EKS clusters must not use 169.254.0.0/16, 172.30.0.0/16, 172.31.0.0/16, or 192.0.2.0/24 for the Kubernetes service address range. + +::: To provision the cluster: -1. Update [cluster.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/aws/templates/cluster.yml) +1. Update [cluster.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/aws/templates/cluster.yml) -1. Deploy the template: +2. Deploy the template: ```bash eksctl create cluster -f ./templates/cluster.yml ``` -1. Your `.kube/config` should be connected to the cluster automatically, but if not, run the commands below -and replace `AWS_REGION` and `CLUSTER_NAME` with details that are specific to your deployment. +3. Your `.kube/config` should be connected to the cluster automatically, but if not, run the commands below and replace `AWS_REGION` and `CLUSTER_NAME` with details that are specific to your deployment. ```bash aws sts get-caller-identity aws eks --region AWS_REGION update-kubeconfig --name CLUSTER_NAME ``` -1. After the deployment completes, provision the EBS drivers for the volumes. While it is possible to use the -in-tree `aws-ebs` driver that's natively supported by Kubernetes, it is no longer being updated and does not support -newer EBS features such as the [cheaper and better gp3 volumes](https://stackoverflow.com/questions/68359043/whats-the-difference-between-ebs-csi-aws-com-vs-kubernetes-io-aws-ebs-for-provi). -The `cluster.yml` file (from the steps above) that is included in this folder automatically deploys the -cluster with the EBS IAM policies, but you need to install the EBS CSI drivers. This can be done through -the AWS Management Console for simplicity, or via a CLI command as below. Replace `CLUSTER_NAME`, -`AWS_REGION` and `AWS_ACCOUNT` with details that are specific to your deployment. +4. After the deployment completes, provision the EBS drivers for the volumes. While it is possible to use the in-tree `aws-ebs` driver that's natively supported by Kubernetes, it is no longer being updated and does not support newer EBS features such as the [cheaper and better gp3 volumes](https://stackoverflow.com/questions/68359043/whats-the-difference-between-ebs-csi-aws-com-vs-kubernetes-io-aws-ebs-for-provi). The `cluster.yml` file (from the steps above) that is included in this folder automatically deploys the cluster with the EBS IAM policies, but you need to install the EBS CSI drivers. This can be done through the AWS Management Console for simplicity, or via a CLI command as below. Replace `CLUSTER_NAME`, `AWS_REGION` and `AWS_ACCOUNT` with details that are specific to your deployment. ```bash eksctl create iamserviceaccount --name ebs-csi-controller-sa --namespace kube-system --cluster CLUSTER_NAME --region AWS_REGION --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --approve --role-only --role-name AmazonEKS_EBS_CSI_DriverRole @@ -139,9 +123,7 @@ the AWS Management Console for simplicity, or via a CLI command as below. Replac eksctl create addon --name aws-ebs-csi-driver --cluster CLUSTER_NAME --region AWS_REGION --service-account-role-arn arn:aws:iam::AWS_ACCOUNT:role/AmazonEKS_EBS_CSI_DriverRole --force ``` -1. Once the deployment is completed, provision the Secrets Manager IAM and CSI driver. -Use `besu` (or equivalent) for `NAMESPACE` and replace `CLUSTER_NAME`, `AWS_REGION` and `AWS_ACCOUNT` with details -that are specific to your deployment. +5. Once the deployment is completed, provision the Secrets Manager IAM and CSI driver. Use `besu` (or equivalent) for `NAMESPACE` and replace `CLUSTER_NAME`, `AWS_REGION` and `AWS_ACCOUNT` with details that are specific to your deployment. ```bash helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts @@ -157,8 +139,7 @@ that are specific to your deployment. } ] }') - - #If you have deployed the above policy before, you can acquire its ARN: + # If you have deployed the above policy before, you can acquire its ARN: POLICY_ARN=$(aws iam list-policies --scope Local \ --query 'Policies[?PolicyName==`quorum-node-secrets-mgr-policy`].Arn' \ --output text) @@ -166,100 +147,84 @@ that are specific to your deployment. eksctl create iamserviceaccount --name quorum-node-secrets-sa --namespace NAMESPACE --region=AWS_REGION --cluster CLUSTER_NAME --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts ``` - !!!warning + :::warning - The above command creates a service account called `quorum-node-secrets-sa` and is - preconfigured in the helm charts override `values.yml` files, for ease of use. + The above command creates a service account called `quorum-node-secrets-sa` and is preconfigured in the helm charts override `values.yml` files, for ease of use. -1. Optionally, deploy the -[kubernetes dashboard](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws/templates/k8s-dashboard). + ::: -1. You can now use your cluster and you can deploy [Helm charts](charts.md) to it. +6. Optionally, deploy the [kubernetes dashboard](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws/templates/k8s-dashboard). + +7. You can now use your cluster and you can deploy [Helm charts](charts.md) to it. ### Azure Kubernetes Service -[Azure Kubernetes Service (AKS)](https://azure.microsoft.com/en-us/services/kubernetes-service/) is another popular cloud -platform that you can use to deploy Besu. To create a cluster in -Azure, you must install the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) and have admin -rights on your Azure subscription to enable some preview features on AKS. - -The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) comprises the base -infrastructure used to build the cluster and other resources in Azure. We also make use Azure native -services and features after the cluster is created. These include: - -* [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity). -* [Secrets Store CSI drivers](https://docs.microsoft.com/en-us/azure/key-vault/general/key-vault-integrate-kubernetes). -* Dynamic storage classes backed by Azure Files. The - [volume claims](https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv) are fixed sizes and can be updated - as you grow via helm updates, and won't need to re-provision the underlying storage class. -* [CNI](https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni) networking mode for AKS. By default, AKS - clusters use `kubenet`, to create a virtual network and subnet. Nodes get an IP address - from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods receive - an IP address "hidden" behind the node IP. - - !!! note - This approach reduces the number of IP addresses you must reserve - in your network space for pods to use, but constrains what can connect to the nodes from outside the - cluster (for example, on-premise nodes or other cloud providers). - -AKS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed -directly. These IP addresses must be unique across your network space, and must be planned in advance. Each node has -a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses -per node are then reserved up front for that node. This approach requires more planning, and can leads to IP address -exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. - -!!!warning - - Please do not create more than one AKS cluster in the same subnet. AKS clusters may not use `169.254.0.0/16`, - `172.30.0.0/16`, `172.31.0.0/16`, or `192.0.2.0/24` for the Kubernetes service address range. +[Azure Kubernetes Service (AKS)](https://azure.microsoft.com/en-us/services/kubernetes-service/) is another popular cloud platform that you can use to deploy Besu. To create a cluster in Azure, you must install the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) and have admin rights on your Azure subscription to enable some preview features on AKS. + +The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) comprises the base infrastructure used to build the cluster and other resources in Azure. We also make use Azure native services and features after the cluster is created. These include: + +- [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity). +- [Secrets Store CSI drivers](https://docs.microsoft.com/en-us/azure/key-vault/general/key-vault-integrate-kubernetes). +- Dynamic storage classes backed by Azure Files. The [volume claims](https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv) are fixed sizes and can be updated as you grow via helm updates, and won't need to re-provision the underlying storage class. +- [CNI](https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni) networking mode for AKS. By default, AKS clusters use `kubenet`, to create a virtual network and subnet. Nodes get an IP address from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods receive an IP address "hidden" behind the node IP. + + :::note + + This approach reduces the number of IP addresses you must reserve in your network space for pods to use, but constrains what can connect to the nodes from outside the cluster (for example, on-premise nodes or other cloud providers). + + ::: + +AKS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed directly. These IP addresses must be unique across your network space, and must be planned in advance. Each node has a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses per node are then reserved up front for that node. This approach requires more planning, and can leads to IP address exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. + +:::warning + +Please do not create more than one AKS cluster in the same subnet. AKS clusters may not use `169.254.0.0/16`, `172.30.0.0/16`, `172.31.0.0/16`, or `192.0.2.0/24` for the Kubernetes service address range. + +::: To provision the cluster: -1. Enable the preview features that allow you to use AKS with CNI, and a managed identity to authenticate and - run cluster operations with other services. We also enable - [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity) which use the managed - identity. This is in preview, so you must enable this feature by registering the `EnablePodIdentityPreview` feature: +1. Enable the preview features that allow you to use AKS with CNI, and a managed identity to authenticate and run cluster operations with other services. We also enable [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity) which use the managed identity. This is in preview, so you must enable this feature by registering the `EnablePodIdentityPreview` feature: - ```bash - az feature register --name EnablePodIdentityPreview --namespace Microsoft.ContainerService - ``` + ```bash + az feature register --name EnablePodIdentityPreview --namespace Microsoft.ContainerService + ``` - This takes a little while and you can check on progress by running: + This takes a little while and you can check on progress by running: - ```bash - az feature list --namespace Microsoft.ContainerService -o table - ``` + ```bash + az feature list --namespace Microsoft.ContainerService -o table + ``` - Install or update your local Azure CLI with preview features: + Install or update your local Azure CLI with preview features: - ```bash - az extension add --name aks-preview - az extension update --name aks-preview - ``` + ```bash + az extension add --name aks-preview + az extension update --name aks-preview + ``` 1. Create a resource group if you don't already have one: - ```bash - az group create --name BesuGroup --location "East US" - ``` + ```bash + az group create --name BesuGroup --location "East US" + ``` 1. Deploy the template: - 1. Navigate to the [Azure portal](https://portal.azure.com), select **+ Create a resource** in the upper left corner. - 1. Search for `Template deployment (deploy using custom templates)` and select **Create**. - 1. Select **Build your own template in the editor**. - 1. Remove the contents (JSON) in the editor and paste in the contents of - [`azuredeploy.json`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/arm/azuredeploy.json) - 1. Select **Save**. - 1. Input provisioning parameters in the displayed user interface. + 1. Navigate to the [Azure portal](https://portal.azure.com), select **+ Create a resource** in the upper left corner. + 1. Search for `Template deployment (deploy using custom templates)` and select **Create**. + 1. Select **Build your own template in the editor**. + 1. Remove the contents (JSON) in the editor and paste in the contents of [`azuredeploy.json`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/arm/azuredeploy.json) + 1. Select **Save**. + 1. Input provisioning parameters in the displayed user interface. 1. Provision the drivers: - 1. Run the [bootstrap](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/scripts/bootstrap.sh) script. - 1. Use `besu` for `AKS_NAMESPACE`, and update `AKS_RESOURCE_GROUP`, `AKS_CLUSTER_NAME`, and `AKS_MANAGED_IDENTITY` - in the commands below to match your settings and deployed resources from step 3. - ```bash - ./scripts/bootstrap.sh "AKS_RESOURCE_GROUP" "AKS_CLUSTER_NAME" "AKS_MANAGED_IDENTITY" "AKS_NAMESPACE" - ``` + 1. Run the [bootstrap](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/scripts/bootstrap.sh) script. + 1. Use `besu` for `AKS_NAMESPACE`, and update `AKS_RESOURCE_GROUP`, `AKS_CLUSTER_NAME`, and `AKS_MANAGED_IDENTITY` in the commands below to match your settings and deployed resources from step 3. + + ```bash + ./scripts/bootstrap.sh "AKS_RESOURCE_GROUP" "AKS_CLUSTER_NAME" "AKS_MANAGED_IDENTITY" "AKS_NAMESPACE" + ``` 1. You can now use your cluster and you can deploy [Helm charts](charts.md) to it. diff --git a/docs/private-networks/tutorials/kubernetes/index.md b/docs/private-networks/tutorials/kubernetes/index.md index 12e803b5796..bd1dea65869 100644 --- a/docs/private-networks/tutorials/kubernetes/index.md +++ b/docs/private-networks/tutorials/kubernetes/index.md @@ -1,32 +1,31 @@ --- title: Deploy a Hyperledger Besu private network with Kubernetes description: Deploying Hyperledger Besu with Kubernetes +tags: + - private networks --- # Deploy Besu using Kubernetes -Use the [reference implementations](https://github.com/ConsenSys/besu-kubernetes) to install -private networks using Kubernetes (K8s). Reference implementations are available using: +Use the [reference implementations](https://github.com/ConsenSys/besu-kubernetes) to install private networks using Kubernetes (K8s). Reference implementations are available using: -* [Helm](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm). -* [Helmfile](https://github.com/roboll/helmfile). -* [`kubectl`](https://github.com/ConsenSys/besu-kubernetes/tree/master/playground/kubectl). +- [Helm](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm). +- [Helmfile](https://github.com/roboll/helmfile). +- [`kubectl`](https://github.com/ConsenSys/besu-kubernetes/tree/master/playground/kubectl). Familiarize yourself with the reference implementations and customize them for your requirements. ## Quorum-Kubernetes -[Quorum-Kubernetes](https://github.com/ConsenSys/quorum-Kubernetes) is a repository containing Kubernetes manifests and -Helm charts that you can customize and deploy on a local cluster or in the cloud. +[Quorum-Kubernetes](https://github.com/ConsenSys/quorum-Kubernetes) is a repository containing Kubernetes manifests and Helm charts that you can customize and deploy on a local cluster or in the cloud. -!!! important +:::important - We recommend starting with the [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) - directory and working through the example setups before moving to the - [`Helm charts`](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm/) directory. +We recommend starting with the [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) directory and working through the example setups before moving to the [`Helm charts`](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm/) directory. -The `helm` directory contains charts for the various components, and each chart has a `cluster` map with features that -you can toggle. +::: + +The `helm` directory contains charts for the various components, and each chart has a `cluster` map with features that you can toggle. ```bash cluster: @@ -34,55 +33,36 @@ cluster: cloudNativeServices: false # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) ``` -Setting `cluster.cloudNativeServices: true` stores keys in AWS Secrets Manager or Azure Key Vault instead of Kubernetes -Secrets, and will also make use of AWS IAM or Azure Managed Identities for the pods. +Setting `cluster.cloudNativeServices: true` stores keys in AWS Secrets Manager or Azure Key Vault instead of Kubernetes Secrets, and will also make use of AWS IAM or Azure Managed Identities for the pods. ### Cloud support -The repository's `helm` charts support on-premise and cloud providers such as AWS, Azure, GCP, IBM etc. You can -configure the provider in the -[values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) file of -the respective charts by setting `cluster.provider` to `local`, `aws`, or `azure`. If you use -GCP, IBM etc., please set `cluster.provider: local` and `cluster.cloudNativeServices: false`. +The repository's `helm` charts support on-premise and cloud providers such as AWS, Azure, GCP, IBM etc. You can configure the provider in the [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) file of the respective charts by setting `cluster.provider` to `local`, `aws`, or `azure`. If you use GCP, IBM etc., please set `cluster.provider: local` and `cluster.cloudNativeServices: false`. -The repository also contains [Azure ARM templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) -and [AWS `eksctl` templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) to deploy the -required base infrastructure. +The repository also contains [Azure ARM templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) and [AWS `eksctl` templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) to deploy the required base infrastructure. ## Limitations -When using multi-clusters, Kubernetes load balancers disallow TCP and UDP traffic on the same port, which inhibits -discovery working natively for each pod. -Use the following solutions to mitigate this limitation: +When using multi-clusters, Kubernetes load balancers disallow TCP and UDP traffic on the same port, which inhibits discovery working natively for each pod. Use the following solutions to mitigate this limitation: -* Disallow discovery and use static nodes to allow only TCP traffic. - This isn't an issue for load balancers or exposing nodes publicly. -* If you need to use discovery, use something such as [CNI](#cni) which is supported by all major - cloud providers, and the cloud templates already have CNI implemented. +- Disallow discovery and use static nodes to allow only TCP traffic. This isn't an issue for load balancers or exposing nodes publicly. +- If you need to use discovery, use something such as [CNI](#cni) which is supported by all major cloud providers, and the cloud templates already have CNI implemented. ### CNI -With the traditional `kubenet` networking mode, nodes get an IP from the virtual network subnet. -Each node in turn uses NAT to configure the pods so that they reach other pods on the virtual network. -This limits where they can reach but also more specifically what can reach them. -For example, an external VM which must have custom routes does not scale well. +With the traditional `kubenet` networking mode, nodes get an IP from the virtual network subnet. Each node in turn uses NAT to configure the pods so that they reach other pods on the virtual network. This limits where they can reach but also more specifically what can reach them. For example, an external VM which must have custom routes does not scale well. ![without-CNI](../../../assets/images/kubernetes-1.jpeg) -CNI, on the other hand, allows every pod to get a unique IP directly from the virtual subnet which removes this restriction. -Therefore, it has a limit on the maximum number of pods that can be spun up, so you must plan ahead to avoid IP exhaustion. +CNI, on the other hand, allows every pod to get a unique IP directly from the virtual subnet which removes this restriction. Therefore, it has a limit on the maximum number of pods that can be spun up, so you must plan ahead to avoid IP exhaustion. ![with-CNI](../../../assets/images/kubernetes-2.jpeg) ## Multi-cluster -You must enable [CNI](#cni) to use multi-cluster, or to connect external nodes to an existing Kubernetes cluster. -To connect multiple clusters, they must each have different CIDR blocks to ensure no conflicts, and the first step is to -peer the VPCs or VNets together and update the route tables. -From that point on you can use static nodes and pods to communicate across the cluster. +You must enable [CNI](#cni) to use multi-cluster, or to connect external nodes to an existing Kubernetes cluster. To connect multiple clusters, they must each have different CIDR blocks to ensure no conflicts, and the first step is to peer the VPCs or VNets together and update the route tables. From that point on you can use static nodes and pods to communicate across the cluster. -The same setup also works to connect external nodes and business applications from other infrastructure, either in the -cloud or on premise. +The same setup also works to connect external nodes and business applications from other infrastructure, either in the cloud or on premise. ![multi-cluster](../../../assets/images/kubernetes-3.png) @@ -90,57 +70,46 @@ cloud or on premise. ### Namespaces -In Kubernetes, [namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) provide a -mechanism for isolating groups of resources within a single cluster. -Both namespaces and resources (for example, Stateful Sets or Services) within a namespace must be unique, but resources -across namespaces don't need to be. +In Kubernetes, [namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) provide a mechanism for isolating groups of resources within a single cluster. Both namespaces and resources (for example, Stateful Sets or Services) within a namespace must be unique, but resources across namespaces don't need to be. + +:::note -!!! note +Namespace-based scoping is not applicable for cluster-wide objects (for example, Storage Class or Persistent Volumes). - Namespace-based scoping is not applicable for cluster-wide objects (for example, Storage Class - or Persistent Volumes). +::: ### Nodes -Consider using Stateful Sets instead of Deployments for Besu. The term 'client node' refers to bootnode, validator -and member/RPC nodes. For Besu nodes, we only use CLI arguments to keep things consistent. +Consider using Stateful Sets instead of Deployments for Besu. The term 'client node' refers to bootnode, validator and member/RPC nodes. For Besu nodes, we only use CLI arguments to keep things consistent. ### Role-based access controls -We encourage using role-based access controls (RBACs) for access to the private key of each node, that is, only a specific pod or statefulset is -allowed to access a specific secret. +We encourage using role-based access controls (RBACs) for access to the private key of each node, that is, only a specific pod or statefulset is allowed to access a specific secret. If you need to specify a Kube configuration file for each pod, use the `KUBE_CONFIG_PATH` variable. ### Storage -We use separate data volumes to store the blockchain data. This is similar to using separate volumes -to store data when using docker containers natively or docker-compose. This is done for -a few reasons: +We use separate data volumes to store the blockchain data. This is similar to using separate volumes to store data when using docker containers natively or docker-compose. This is done for a few reasons: -* Containers are mortal and we do not want to store data on them. -* Kubernetes host nodes can fail and we want the chain data to persist. +- Containers are mortal and we do not want to store data on them. +- Kubernetes host nodes can fail and we want the chain data to persist. -Ensure that you provide enough data storage capacity for all nodes on the cluster. -Select the appropriate type of [Storage Class](https://kubernetes.io/docs/concepts/storage/storage-classes/) based -on your cloud provider. In the templates, the size of the [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) -is set to 20Gb by default; you can change this depending on your needs. If you have a different storage -account than the one in the charts, you may edit those -[Storage Classes](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/charts/besu-node/templates/node-storage.yaml). +Ensure that you provide enough data storage capacity for all nodes on the cluster. Select the appropriate type of [Storage Class](https://kubernetes.io/docs/concepts/storage/storage-classes/) based on your cloud provider. In the templates, the size of the [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) is set to 20Gb by default; you can change this depending on your needs. If you have a different storage account than the one in the charts, you may edit those [Storage Classes](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/charts/besu-node/templates/node-storage.yaml). -When using Persistent Volume Claims, set the `allowVolumeExpansion` to `true`. This helps keep costs low and enables growing the volume -over time rather than creating new volumes and copying data across. +When using Persistent Volume Claims, set the `allowVolumeExpansion` to `true`. This helps keep costs low and enables growing the volume over time rather than creating new volumes and copying data across. ### Monitoring We recommend deploying metrics to get an overview of the network, nodes, and volumes. You can also create alerts. -Besu publishes metrics to Prometheus, and you can configure metrics using the kubernetes scraper configuration. We -also have custom Grafana dashboards to monitor the blockchain. +Besu publishes metrics to Prometheus, and you can configure metrics using the kubernetes scraper configuration. We also have custom Grafana dashboards to monitor the blockchain. + +:::note -!!! note +Refer to `values/monitoring.yml` to configure the alerts per your requirements (for example slack or email). - Refer to `values/monitoring.yml` to configure the alerts per your requirements (for example slack or email). +::: ```bash cd helm @@ -150,8 +119,7 @@ helm install monitoring prometheus-community/kube-prometheus-stack --version 34. kubectl --namespace besu apply -f ./values/monitoring/ ``` -You can configure Besu to suit your environment. For example, use the Elastic charts to log to a file -that you can parse using Logstash into an ELK cluster. +You can configure Besu to suit your environment. For example, use the Elastic charts to log to a file that you can parse using Logstash into an ELK cluster. ```bash cd helm @@ -167,7 +135,4 @@ helm install filebeat --version 7.17.1 elastic/filebeat --namespace besu --valu ### Ingress Controllers -If you require the ingress controllers for the RPC calls or the monitoring dashboards, we have provided example -[rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) that -are pre-configured for common use cases. Use these as a reference and develop solutions to match your network -topology and requirements. +If you require the ingress controllers for the RPC calls or the monitoring dashboards, we have provided example [rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) that are pre-configured for common use cases. Use these as a reference and develop solutions to match your network topology and requirements. diff --git a/docs/private-networks/tutorials/kubernetes/maintenance.md b/docs/private-networks/tutorials/kubernetes/maintenance.md index a67718d77ee..a32bf1a15b2 100644 --- a/docs/private-networks/tutorials/kubernetes/maintenance.md +++ b/docs/private-networks/tutorials/kubernetes/maintenance.md @@ -1,6 +1,9 @@ --- -title: Besu Kubernetes Maintenance +title: Maintenance +sidebar_position: 5 description: Maintenance for Besu on a Kubernetes cluster +tags: + - private networks --- # Maintenance @@ -9,22 +12,16 @@ You can perform maintenance for Besu on a Kubernetes cluster. ## Prerequisites -* Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository -* A [running Kubernetes cluster](cluster.md) with a [network](charts.md) -* Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) -* Install [Helm3](https://helm.sh/docs/intro/install/) +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) with a [network](charts.md) +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) ## Update a persistent volume claim size -Over time, as the chain grows, so will the amount of space used by the persistent volume claim (PVC). -As of Kubernetes v1.11, [certain types of Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/#allow-volume-expansion) -allow volume resizing. -Production charts for Azure use Azure Files, and on AWS use EBS Block Store which allow for volume expansion. +Over time, as the chain grows, so will the amount of space used by the persistent volume claim (PVC). As of Kubernetes v1.11, [certain types of Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/#allow-volume-expansion) allow volume resizing. Production charts for Azure use Azure Files, and on AWS use EBS Block Store which allow for volume expansion. -To update the volume size, you must update the override values file. -For example, to increase the size on the transaction nodes volumes, add the following snippet to the -[`txnode values.yml`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) file, with -the new size limit (the following example uses 50Gi). +To update the volume size, you must update the override values file. For example, to increase the size on the transaction nodes volumes, add the following snippet to the [`txnode values.yml`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) file, with the new size limit (the following example uses 50Gi). ```bash storage: @@ -40,29 +37,28 @@ helm upgrade tx-1 ./charts/besu-node --namespace besu --values ./values/txnode.y ## Update Besu versions -!!! important +:::important - When updating Besu nodes across a cluster, perform the updates as a rolling update and not all at once, - especially for the validator pool. If all the validators are taken offline, the - chain halts, and you must wait for round changes to expire before blocks are created again. +When updating Besu nodes across a cluster, perform the updates as a rolling update and not all at once, especially for the validator pool. If all the validators are taken offline, the chain halts, and you must wait for round changes to expire before blocks are created again. -Updates for Besu can be done via Helm in exactly the same manner as other applications. Alternatively, this can be done -via `kubectl`. This example updates a node called `besu-validator-3`: +::: + +Updates for Besu can be done via Helm in exactly the same manner as other applications. Alternatively, this can be done via `kubectl`. This example updates a node called `besu-validator-3`: 1. Set the update policy to use rolling updates (if not done already): - ```bash - kubectl patch statefulset besu-validator-3 --namespace besu -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}' - ``` + ```bash + kubectl patch statefulset besu-validator-3 --namespace besu -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}' + ``` 2. Update the Besu version via Helm: - ```bash - helm upgrade bootnode-1 ./charts/besu-node --namespace besu --values ./values/bootnode.yml --set image.besu.tag=21.10.0 - ``` + ```bash + helm upgrade bootnode-1 ./charts/besu-node --namespace besu --values ./values/bootnode.yml --set image.besu.tag=21.10.0 + ``` - Or via `kubectl`: + Or via `kubectl`: - ```bash - kubectl patch statefulset besu-validator-3 --namespace besu --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"hyperledger/besu:21.10.0"}]' - ``` + ```bash + kubectl patch statefulset besu-validator-3 --namespace besu --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"hyperledger/besu:21.10.0"}]' + ``` diff --git a/docs/private-networks/tutorials/kubernetes/nat-manager.md b/docs/private-networks/tutorials/kubernetes/nat-manager.md index 7c31f8cbf59..5a66ede1f48 100644 --- a/docs/private-networks/tutorials/kubernetes/nat-manager.md +++ b/docs/private-networks/tutorials/kubernetes/nat-manager.md @@ -1,23 +1,20 @@ --- +title: Configure Kubernetes mode in NAT manager +sidebar_position: 9 description: Tutorial to configure Kubernetes mode for Hyperledger Besu Nat Manager +tags: + - private networks --- # Configure Kubernetes mode in NAT Manager -Use [`--nat-method=AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) or -[`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) -CLI options to let the Besu node automatically configure its IP address and ports. +Use [`--nat-method=AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) or [`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) CLI options to let the Besu node automatically configure its IP address and ports. -Use mode [`--nat-method=NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) to be able to -set your Besu ports and IP address manually. +Use mode [`--nat-method=NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) to be able to set your Besu ports and IP address manually. -Default mode is [`AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) but Besu will -fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) -mode if automatic configuration fails. +Default mode is [`AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) but Besu will fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode if automatic configuration fails. -!!!example - The following log shows fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) - mode after an automatic detection failure. +:::info The following log shows fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode after an automatic detection failure. ``` INFO | KubernetesNatManager | Starting kubernetes NAT manager. @@ -26,6 +23,8 @@ mode if automatic configuration fails. INFO | NetworkRunner | Starting Network. ``` +::: + ## Automatic configuration Follow 3 steps to configure Besu for automatic IP address and ports detection on Kubernetes: @@ -38,35 +37,32 @@ Follow 3 steps to configure Besu for automatic IP address and ports detection on Deploy a `LoadBalancer` service for Besu to recover IP address and ports. -!!!example - - Here is an example that you can customize with your own ports and routing rules. - - ```yaml - --- - apiVersion: v1 - kind: Service - metadata: - labels: - app.kubernetes.io/name: besu - app.kubernetes.io/release: "1.0.0" - name: besu - spec: - ports: - - name: "json-rpc" - port: 8545 - targetPort: 8545 - - name: "rlpx" - port: 30303 - targetPort: 30303 - selector: - app.kubernetes.io/name: besu - app.kubernetes.io/release: "1.0.0" - type: LoadBalancer - ``` +Here is an example that you can customize with your own ports and routing rules. - This service example lists the rules for the different ports used by Besu (`json-rpc` and` rlpx`). - The default value is used for `discovery`. +```yaml +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + name: besu +spec: + ports: + - name: "json-rpc" + port: 8545 + targetPort: 8545 + - name: "rlpx" + port: 30303 + targetPort: 30303 + selector: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + type: LoadBalancer +``` + +This service example lists the rules for the different ports used by Besu (`json-rpc` and` rlpx`). The default value is used for `discovery`. ### 2. Check if the load balancer is properly deployed @@ -74,22 +70,22 @@ Verify the load balancer readiness before launching Besu. Run `kubectl describe services besu` to check the service status. -!!! example "The command should display the following information:" +The command should display the following information: - ``` - Name: besu - Namespace: default - Labels: app.kubernetes.io/name=besu - app.kubernetes.io/release=1.0.0 - Annotations: kubectl.kubernetes.io/last-applied-configuration: - {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"besu","app.kubernetes.io/release":"1.... - Selector: app.kubernetes.io/name=besu,app.kubernetes.io/release=1.0.0 - Type: LoadBalancer - IP: -------- - LoadBalancer Ingress: ****** - ``` +```bash +Name: besu +Namespace: default +Labels: app.kubernetes.io/name=besu + app.kubernetes.io/release=1.0.0 +Annotations: kubectl.kubernetes.io/last-applied-configuration: + {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"besu","app.kubernetes.io/release":"1.... +Selector: app.kubernetes.io/name=besu,app.kubernetes.io/release=1.0.0 +Type: LoadBalancer +IP: -------- +LoadBalancer Ingress: ****** +``` - The load balancer must have an IP address displayed in place of `******` on the `LoadBalancer Ingress` line to be ready. +The load balancer must have an IP address displayed in place of `******` on the `LoadBalancer Ingress` line to be ready. Run the `kubectl describe services besu` command again until the load balancer IP address appears in the output. @@ -97,64 +93,63 @@ Run the `kubectl describe services besu` command again until the load balancer I When steps 1 and 2 are completed, deploy Besu using the following YAML example: -!!!example - - ```yaml - --- - apiVersion: v1 - kind: ConfigMap - metadata: - name: besu-config - labels: - app.kubernetes.io/name: besu - app.kubernetes.io/release: 1.0.0 - data: - BESU_LOGGING: "INFO" - BESU_NETWORK: "dev" - BESU_P2P_ENABLED: "true" - BESU_RPC_HTTP_ENABLED: "true" - BESU_RPC_HTTP_APIS: "eth,net,web3,debug,admin" - KUBE_CONFIG_PATH: "/opt/besu/shared/kube-config" - --- - apiVersion: extensions/v1beta1 - kind: Deployment +```yaml +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: besu-config + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: 1.0.0 +data: + BESU_LOGGING: "INFO" + BESU_NETWORK: "dev" + BESU_P2P_ENABLED: "true" + BESU_RPC_HTTP_ENABLED: "true" + BESU_RPC_HTTP_APIS: "eth,net,web3,debug,admin" + KUBE_CONFIG_PATH: "/opt/besu/shared/kube-config" +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: besu + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" +spec: + replicas: 1 + strategy: {} + template: metadata: - name: besu + creationTimestamp: null labels: app.kubernetes.io/name: besu app.kubernetes.io/release: "1.0.0" spec: - replicas: 1 - strategy: {} - template: - metadata: - creationTimestamp: null - labels: - app.kubernetes.io/name: besu - app.kubernetes.io/release: "1.0.0" - spec: - containers: - - name: besu - image: "hyperledger/besu:latest" - imagePullPolicy: Always - ports: - - containerPort: 8545 - - containerPort: 30303 - envFrom: + containers: + - name: besu + image: "hyperledger/besu:latest" + imagePullPolicy: Always + ports: + - containerPort: 8545 + - containerPort: 30303 + envFrom: - configMapRef: name: besu-config - restartPolicy: Always - status: {} - ``` + restartPolicy: Always +status: {} +``` ## Automatic detection errors -!!!important +:::danger - Automatic detection error messages do not prevent you to use Besu. +Automatic detection error messages do not prevent you to use Besu. - Try the fix indicated for each error or use [`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) CLI option - and [set IP address and port manually](../../../public-networks/how-to/connect/configure-ports.md). +Try the fix indicated for each error or use [`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) CLI option and [set IP address and port manually](../../../public-networks/how-to/connect/configure-ports.md). + +::: Possible errors messages for Kubernetes automatic detection failure: @@ -168,7 +163,7 @@ Possible errors messages for Kubernetes automatic detection failure: - **Cause:** load balancer did start correctly or has the incorrect name. - **Fix:** check and modify load balancer YAML configuration and restart service. -!!!example "Example error log" +:::info Example error log ``` INFO | KubernetesNatManager | Starting kubernetes NAT manager. @@ -177,16 +172,17 @@ Possible errors messages for Kubernetes automatic detection failure: INFO | NetworkRunner | Starting Network. ``` +::: + ### `Forbidden` error message - **Error message:** `Nat manager failed to configure itself automatically due to the following reason Forbidden. NONE mode will be used` -- **Cause:** Besu don't have permission to list the services via the Kubernetes API - to retrieve IP address and ports from the load balancer. +- **Cause:** Besu don't have permission to list the services via the Kubernetes API to retrieve IP address and ports from the load balancer. - **Fix:** Give it the required permissions using [Role-based access control](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). - If you can't manage permissions, define the IP address and ports manually with [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode + If you can't manage permissions, define the IP address and ports manually with [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode -!!!example "Example error log" +:::info Example error log ``` INFO | KubernetesNatManager | Starting kubernetes NAT manager. @@ -195,13 +191,17 @@ Possible errors messages for Kubernetes automatic detection failure: INFO | NetworkRunner | Starting Network. ``` -!!!tip - For development environment, the permission issue can be fixed by running `kubectl create clusterrolebinding myapp-view-binding --clusterrole=admin --serviceaccount=default:default` +::: + +:::tip - This command should only be used on developement environment and not in production environment. +For development environment, the permission issue can be fixed by running `kubectl create clusterrolebinding myapp-view-binding --clusterrole=admin --serviceaccount=default:default` - In production environment, require a finer management of permissions using Kubernetes - [Role-based access control](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). +This command should only be used on development environment and not in production environment. + +In production environment, require a finer management of permissions using Kubernetes [Role-based access control](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). + +::: ### `Ingress not found` error message @@ -209,7 +209,7 @@ Possible errors messages for Kubernetes automatic detection failure: - **Cause:** Load balancer did not finish to recover an IP address. - **Fix:** [Check that the load balancer is properly deployed](#2-check-if-the-load-balancer-is-properly-deployed) before launching Besu. -!!!example "Example error log" +:::info Example error log ``` INFO | KubernetesNatManager | Starting kubernetes NAT manager. @@ -217,3 +217,5 @@ Possible errors messages for Kubernetes automatic detection failure: DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Ingress not found. NONE mode will be used INFO | NetworkRunner | Starting Network. ``` + +::: diff --git a/docs/private-networks/tutorials/kubernetes/playground.md b/docs/private-networks/tutorials/kubernetes/playground.md index e11eff289b0..67962456a62 100644 --- a/docs/private-networks/tutorials/kubernetes/playground.md +++ b/docs/private-networks/tutorials/kubernetes/playground.md @@ -1,37 +1,28 @@ --- -title: Deploy a Hyperledger Besu private network locally with Kubernetes +title: Local playground +sidebar_position: 1 description: Deploying a Hyperledger Besu private network locally with Kubernetes +tags: + - private networks --- # Deploy in a local environment -The [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) was created to provide an -opportunity to deploy [quorum-kubernetes](https://github.com/ConsenSys/quorum-kubernetes/) in a local environment before -attempting in a live environment (such as in the cloud or on-premise). -Local deployment can be done with any local Kubernetes tool. -Minikube and Rancher Desktop have been tested to work, but any complete Kubernetes solution with support for `kubectl` -should suffice. +The [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) was created to provide an opportunity to deploy [quorum-kubernetes](https://github.com/ConsenSys/quorum-kubernetes/) in a local environment before attempting in a live environment (such as in the cloud or on-premise). Local deployment can be done with any local Kubernetes tool. Minikube and Rancher Desktop have been tested to work, but any complete Kubernetes solution with support for `kubectl` should suffice. ## Steps 1. Navigate to the playground [`README`](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground). 1. Ensure that your system meets the requirements specified. 1. Choose your Ethereum client (Hyperledger Besu or GoQuorum): `quorum-besu` or `quorum-go`. -1. Choose your consensus algorithm. - The playground supports Clique, Ethash (PoW), and IBFT2 for Besu, and IBFT for GoQuorum. +1. Choose your consensus algorithm. The playground supports Clique, Ethash (PoW), and IBFT2 for Besu, and IBFT for GoQuorum. 1. Follow the instructions from the `README` for the chosen client and consensus algorithm folder. ## Important notes Consider the following when deploying and developing with the playground: -* The playground is created specifically for developers and operators to become familiar with the deployment of Besu in - a Kubernetes environment in preparation for going into a cloud or on-premise environment. - Thus, it should **not** be deployed into a production environment. -* The playground is not a complete reflection of the `helm` charts as it does not use `Helm`, but rather - static or non-templated code that is deployed through `kubectl apply -f`. - This means that without `Helm` there's a significant amount of repeated code. - This is fine for development but not ideal for a production environment. -* The playground uses static/hard-coded keys. - Automatic key generation is only supported in `helm` charts. -* As the playground is for local development, no cloud integration or lifecycle support is offered. +- The playground is created specifically for developers and operators to become familiar with the deployment of Besu in a Kubernetes environment in preparation for going into a cloud or on-premise environment. Thus, it should **not** be deployed into a production environment. +- The playground is not a complete reflection of the `helm` charts as it does not use `Helm`, but rather static or non-templated code that is deployed through `kubectl apply -f`. This means that without `Helm` there's a significant amount of repeated code. This is fine for development but not ideal for a production environment. +- The playground uses static/hard-coded keys. Automatic key generation is only supported in `helm` charts. +- As the playground is for local development, no cloud integration or lifecycle support is offered. diff --git a/docs/private-networks/tutorials/kubernetes/production.md b/docs/private-networks/tutorials/kubernetes/production.md index 51d79c6ca77..a9cd60d9da3 100644 --- a/docs/private-networks/tutorials/kubernetes/production.md +++ b/docs/private-networks/tutorials/kubernetes/production.md @@ -1,6 +1,9 @@ --- -title: Besu Kubernetes - Getting ready for production +title: Production +sidebar_position: 6 description: Deploying Besu Helm Charts for production on a Kubernetes cluster +tags: + - private networks --- # Deploy for production @@ -9,25 +12,26 @@ You can deploy Besu for production on a Kubernetes cluster. ## Prerequisites -* Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository -* A [running Kubernetes cluster](cluster.md) -* [Kubectl](https://kubernetes.io/docs/tasks/tools/) -* [Helm3](https://helm.sh/docs/intro/install/) +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- [Helm3](https://helm.sh/docs/intro/install/) ## Overview -To get things production-ready, we'll use the same charts, and set a few of -the values in the `cluster` map as in the [Deploy](#deploy-the-network) section. +To get things production-ready, we'll use the same charts, and set a few of the values in the `cluster` map as in the [Deploy](#deploy-the-network) section. -!!!warning +:::warning - The following tutorial ONLY supports AWS and Azure currently. Other cloud providers will be added in time. +The following tutorial ONLY supports AWS and Azure currently. Other cloud providers will be added in time. -!!!warning +::: - We recommend using AWS RDS or Azure PostgreSQL in High Availability mode for any Tessera nodes that you use. - The templates don't include that functionality. They can be provisioned with CloudFormation or Azure Resource Manager, - respectively. Once created, please specify the connection details to the `values.yml`. +:::warning + +We recommend using AWS RDS or Azure PostgreSQL in High Availability mode for any Tessera nodes that you use. The templates don't include that functionality. They can be provisioned with CloudFormation or Azure Resource Manager, respectively. Once created, please specify the connection details to the `values.yml`. + +::: ## Deploy @@ -43,9 +47,7 @@ Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCom ### Deploy the network -For the rest of this tutorial we use Helm charts. After you have cloned the -[Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change the directory to `helm` for -the rest of this tutorial. +For the rest of this tutorial we use Helm charts. After you have cloned the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change the directory to `helm` for the rest of this tutorial. ```bash cd helm @@ -53,8 +55,7 @@ cd helm Each helm chart has the following keys that must be set. -Specify either `aws` or `azure` for the `cluster.provider`. Additionally, set `cloudNativeServices: true` and -`reclaimPolicy: Retain` so that it looks like the following for AWS: +Specify either `aws` or `azure` for the `cluster.provider`. Additionally, set `cloudNativeServices: true` and `reclaimPolicy: Retain` so that it looks like the following for AWS: ```bash cluster: @@ -67,45 +68,22 @@ Follow the steps outlined in the [deploy charts](charts.md) tutorial to deploy t ## Best practices -The most important thing is to plan your network out on paper first and then test it in a Dev cluster to make sure -connectivity works with your applications and you get the required throughput in transactions per second (TPS). -We also recommend you test the entire process, from provisioning infrastructure to updating nodes on a -Dev cluster, prior to launching your production network. +The most important thing is to plan your network out on paper first and then test it in a Dev cluster to make sure connectivity works with your applications and you get the required throughput in transactions per second (TPS). We also recommend you test the entire process, from provisioning infrastructure to updating nodes on a Dev cluster, prior to launching your production network. -By default, the cloud Kubernetes clusters take care of availability and do multi-zones within a region. -The scheduler also ensures that deployments are spread out across zones. -Where possible, we recommend you use multiple bootnodes and static nodes to speed up peering. +By default, the cloud Kubernetes clusters take care of availability and do multi-zones within a region. The scheduler also ensures that deployments are spread out across zones. Where possible, we recommend you use multiple bootnodes and static nodes to speed up peering. -You can connect to APIs and services outside the cluster normally, but connecting into your network (such as -adding an on-premise node to the network) might require more configuration. -Please check the [limitations](index.md#limitations) and use CNI where possible. -To connect an external node to your cluster, the easiest way is to use a VPN as seen in the -following [multi-cluster](#multi-cluster-support) setup. +You can connect to APIs and services outside the cluster normally, but connecting into your network (such as adding an on-premise node to the network) might require more configuration. Please check the [limitations](index.md#limitations) and use CNI where possible. To connect an external node to your cluster, the easiest way is to use a VPN as seen in the following [multi-cluster](#multi-cluster-support) setup. -Finally, we recommend setting up monitoring and alerting from the beginning, so you can get early warnings of issues -rather than after failure. -We have a monitoring chart which uses Grafana and you can use it with Alertmanager to create alerts or -alternatively alert via Cloudwatch or Azure Monitoring. +Finally, we recommend setting up monitoring and alerting from the beginning, so you can get early warnings of issues rather than after failure. We have a monitoring chart which uses Grafana and you can use it with Alertmanager to create alerts or alternatively alert via Cloudwatch or Azure Monitoring. ## Multi-cluster support -When CNI is used, multi-cluster support is simple, but you have to cater for cross-cluster DNS names. -Ideally, you want to create two separate VPCs (or VNets) and make sure they have different base CIDR -blocks so that IP addresses don't conflict. -Once done, peer the VPCs together and update the subnet route table, so they are effectively a giant single network. +When CNI is used, multi-cluster support is simple, but you have to cater for cross-cluster DNS names. Ideally, you want to create two separate VPCs (or VNets) and make sure they have different base CIDR blocks so that IP addresses don't conflict. Once done, peer the VPCs together and update the subnet route table, so they are effectively a giant single network. ![multi-cluster](../../../assets/images/kubernetes-3.png) -When you [spin up clusters](cluster.md), use [CNI](index.md#limitations) and CIDR blocks to match the -subnet's CIDR settings. -Then deploy the genesis chart on one cluster and copy across the genesis file and static nodes config maps. -Depending on your DNS settings, they might be fine as is, or they might need to be actual IP addresses. -That is, you can provision cluster B only after cluster A has Besu nodes up and running. +When you [spin up clusters](cluster.md), use [CNI](index.md#limitations) and CIDR blocks to match the subnet's CIDR settings. Then deploy the genesis chart on one cluster and copy across the genesis file and static nodes config maps. Depending on your DNS settings, they might be fine as is, or they might need to be actual IP addresses. That is, you can provision cluster B only after cluster A has Besu nodes up and running. -Deploy the network on cluster A, and then on cluster B. -Besu nodes on cluster A should work as expected, and Besu nodes on cluster B should use the list of peers provided to -communicate with the nodes on cluster A. +Deploy the network on cluster A, and then on cluster B. Besu nodes on cluster A should work as expected, and Besu nodes on cluster B should use the list of peers provided to communicate with the nodes on cluster A. -Keeping the list of peers on the clusters live and up to date can be challenging, so we recommend using the cloud -service provider's DNS service such as Route 53 or Azure DNS and adapting the charts to create entries for each node -when it comes up. +Keeping the list of peers on the clusters live and up to date can be challenging, so we recommend using the cloud service provider's DNS service such as Route 53 or Azure DNS and adapting the charts to create entries for each node when it comes up. diff --git a/docs/private-networks/tutorials/kubernetes/quorum-explorer.md b/docs/private-networks/tutorials/kubernetes/quorum-explorer.md index 62ed0f0826f..cd69831c806 100644 --- a/docs/private-networks/tutorials/kubernetes/quorum-explorer.md +++ b/docs/private-networks/tutorials/kubernetes/quorum-explorer.md @@ -1,6 +1,9 @@ --- -title: Besu Kubernetes - Quorum Explorer +title: Using the Quorum Explorer +sidebar_position: 4 description: Using the Quorum Explorer on a Kubernetes cluster +tags: + - private networks --- # Use the Quorum Explorer @@ -9,42 +12,31 @@ You can use the Quorum Explorer on a Kubernetes cluster. ## Prerequisites -* Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository -* A [running Kubernetes cluster](cluster.md) -* [Kubectl](https://kubernetes.io/docs/tasks/tools/) -* [Helm3](https://helm.sh/docs/intro/install/) -* [Existing network](charts.md) +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- [Helm3](https://helm.sh/docs/intro/install/) +- [Existing network](charts.md) ## Deploy the Quorum Explorer helm chart -[Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight -blockchain explorer. The Quorum Explorer is **not** recommended for use in production and is intended for -demonstration or development purposes only. +[Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight blockchain explorer. The Quorum Explorer is **not** recommended for use in production and is intended for demonstration or development purposes only. -The explorer can provide an overview over the whole network, such as block information, voting or removing -validators from the network, and demonstrates using the `SimpleStorage` smart contract with privacy enabled, and sending -transactions between wallets in one interface. +The explorer can provide an overview over the whole network, such as block information, voting or removing validators from the network, and demonstrates using the `SimpleStorage` smart contract with privacy enabled, and sending transactions between wallets in one interface. -To use the explorer, update the [Quorum-Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) -with your node details and endpoints, and then [deploy](charts.md). +To use the explorer, update the [Quorum-Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) with your node details and endpoints, and then [deploy](charts.md). ## Nodes -The **Nodes** page provides an overview of the nodes on the network. Select the node you would like to interact -with from the drop-down on the top right, and you'll get details of the node, block height, peers, queued -transactions etc. +The **Nodes** page provides an overview of the nodes on the network. Select the node you would like to interact with from the drop-down on the top right, and you'll get details of the node, block height, peers, queued transactions etc. ![`k8s-explorer`](../../../assets/images/kubernetes-explorer.png) ## Validators -The **Validators** page simulates a production environment or consortium where each node individually -runs API calls to vote to add a validator or remove an existing validator. +The **Validators** page simulates a production environment or consortium where each node individually runs API calls to vote to add a validator or remove an existing validator. -When using the buttons to remove, discard pending validators, or proposing a validator, the app sends an API request -to the selected node in the drop-down only. To add or remove a validator you need to select a -majority of the existing validator pool individually, and perform the vote API call by clicking the button. -Each node can call a discard on the voting process during or after the validator has been added. +When using the buttons to remove, discard pending validators, or proposing a validator, the app sends an API request to the selected node in the drop-down only. To add or remove a validator you need to select a majority of the existing validator pool individually, and perform the vote API call by clicking the button. Each node can call a discard on the voting process during or after the validator has been added. The vote calls made from non-validator nodes have no effect on overall consensus. @@ -52,36 +44,26 @@ The vote calls made from non-validator nodes have no effect on overall consensus ## Explorer -The **Explorer** page gives you the latest blocks from the chain and the latest transactions as they -occur on the network. In addition, you can search by block number or transaction hash using the respective -search bar. +The **Explorer** page gives you the latest blocks from the chain and the latest transactions as they occur on the network. In addition, you can search by block number or transaction hash using the respective search bar. ![`k8s-explorer-explorer`](../../../assets/images/kubernetes-explorer-explorer.png) ## Contracts -Use the **Contracts** page to compile and deploy a smart contract. Currently, the only contract available -for deployment through the app is the `SimpleStorage` contract. However, in time, we plan -to add more contracts to that view. +Use the **Contracts** page to compile and deploy a smart contract. Currently, the only contract available for deployment through the app is the `SimpleStorage` contract. However, in time, we plan to add more contracts to that view. -In this example, we deploy from `member-1` and select `member-1` and `member-3` in -the **Private For** multi-select. Then click on `Compile` and `Deploy` +In this example, we deploy from `member-1` and select `member-1` and `member-3` in the **Private For** multi-select. Then click on `Compile` and `Deploy` ![`k8s-explorer-contracts-1`](../../../assets/images/kubernetes-explorer-contracts-1.png) -Once deployed, you can interact with the contract. As this is a new transaction, select `member-1` -and `member-3` in **Interact** multi-select, and then click on the appropriate method call to `get` -or `set` the value at the deployed contract address. +Once deployed, you can interact with the contract. As this is a new transaction, select `member-1` and `member-3` in **Interact** multi-select, and then click on the appropriate method call to `get` or `set` the value at the deployed contract address. ![`k8s-explorer-contracts-set`](../../../assets/images/kubernetes-explorer-contracts-set.png) -To test the private transaction functionality, select `member-2` from the drop-down on -the top right, you'll notice that you are unable to interact with the contract because `member-2` was not part -of the transaction. Only `members-1` and `member-3` responds correctly. +To test the private transaction functionality, select `member-2` from the drop-down on the top right, you'll notice that you are unable to interact with the contract because `member-2` was not part of the transaction. Only `members-1` and `member-3` responds correctly. ## Wallet -The **Wallet** page gives you the functionality to send simple ETH transactions between accounts by providing -the account's private key, the recipient's address, and transfer amount in Wei. +The **Wallet** page gives you the functionality to send simple ETH transactions between accounts by providing the account's private key, the recipient's address, and transfer amount in Wei. ![`k8s-explorer-wallet`](../../../assets/images/kubernetes-explorer-wallet.png) diff --git a/docs/private-networks/tutorials/permissioning/_category_.json b/docs/private-networks/tutorials/permissioning/_category_.json new file mode 100644 index 00000000000..da14c12d4b3 --- /dev/null +++ b/docs/private-networks/tutorials/permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create a permissioned network", + "position": 7 +} diff --git a/docs/private-networks/tutorials/permissioning/index.md b/docs/private-networks/tutorials/permissioning/index.md index 09d189c4a40..054469e436d 100644 --- a/docs/private-networks/tutorials/permissioning/index.md +++ b/docs/private-networks/tutorials/permissioning/index.md @@ -1,16 +1,20 @@ --- +title: Create a permissioned network +sidebar_position: 1 description: Hyperledger Besu create a permissioned network +tags: + - private networks --- # Create a permissioned network -The following steps set up a permissioned network with local node and account permissions. The network -uses the [IBFT 2.0 proof of authority consensus protocol]. +The following steps set up a permissioned network with local node and account permissions. The network uses the [IBFT 2.0 proof of authority consensus protocol]. -!!!important +:::danger - A permissioned Ethereum network as described here is not protected against all attack vectors. - We recommend applying defense in depth to protect your infrastructure. +A permissioned Ethereum network as described here is not protected against all attack vectors. We recommend applying defense in depth to protect your infrastructure. + +::: ## Prerequisites @@ -23,8 +27,7 @@ uses the [IBFT 2.0 proof of authority consensus protocol]. Each node requires a data directory for the blockchain data. -Create directories for your permissioned network and each of the three nodes, and a data directory for -each node: +Create directories for your permissioned network and each of the three nodes, and a data directory for each node: ```bash Permissioned-Network/ @@ -40,17 +43,11 @@ Permissioned-Network/ ### 2. Create the configuration file -The configuration file defines the -[IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the -number of node key pairs to generate. +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. -The configuration file has two nested JSON nodes. The first is the `genesis` property defining -the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in -the resulting genesis file. The second is the `blockchain` property defining the number of key -pairs to generate. +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. -Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it -in the `Permissioned-Network` directory: +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `Permissioned-Network` directory: ```json { @@ -97,27 +94,24 @@ in the `Permissioned-Network` directory: } ``` -!!! critical "Security warning" +:::danger Security warning + +Don't use the accounts in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. - Don't use the accounts in the genesis file on Mainnet or any public network except for - testing. The private keys display, which means the accounts are not secure. +::: ### 3. Generate node keys and a genesis file In the `Permissioned-Network` directory, generate the node key and genesis file: -=== "MacOS/Windows" - - ```bash - besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key - ``` +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` Besu creates the following in the `networkFiles` directory: -- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes - are validators. -- A directory for each node named using the node address and containing the public and private key - for each node. +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. ```bash networkFiles/ @@ -168,19 +162,15 @@ Permissioned-Network/ ### 6. Create the permissions configuration file -The [permissions configuration file](../../how-to/use-permissioning/local.md#permissions-configuration-file) -defines the nodes and accounts allowlists. +The [permissions configuration file](../../how-to/use-permissioning/local.md#permissions-configuration-file) defines the nodes and accounts allowlists. -Copy the following permissions configuration to a file called `permissions_config.toml` and save a copy in the -`Node-1/data`, `Node-2/data`, `Node-3/data`, and `Node-4/data` directories: +Copy the following permissions configuration to a file called `permissions_config.toml` and save a copy in the `Node-1/data`, `Node-2/data`, `Node-3/data`, and `Node-4/data` directories: -!!! example "`permissions_config.toml`" +```toml title="permissions_config.toml" +accounts-allowlist=["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "0x627306090abaB3A6e1400e9345bC60c78a8BEf57"] - ```toml - accounts-allowlist=["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "0x627306090abaB3A6e1400e9345bC60c78a8BEf57"] - - nodes-allowlist=[] - ``` +nodes-allowlist=[] +``` The permissions configuration file includes the first two accounts from the genesis file. @@ -190,33 +180,31 @@ Use the [`perm_addNodesToAllowlist`](../../reference/api/index.md#perm_addnodest Use the following command: -=== "MacOS" + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" +``` - ```bash - besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" - ``` + The command line allows you to enable: -- Nodes and accounts permissions using [`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) - and [`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled). +- Nodes and accounts permissions using [`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) and [`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled). - The JSON-RPC API using [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled). -- The `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using - [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). -- All-host access to the HTTP JSON-RPC API using - [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). -- All-domain access to the node through the HTTP JSON-RPC API using - [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). +- The `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). +- All-host access to the HTTP JSON-RPC API using [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). +- All-domain access to the node through the HTTP JSON-RPC API using [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). -When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the -enode URL to specify Node-1 as a peer and update the permissions configuration file in the -following steps. +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to specify Node-1 as a peer and update the permissions configuration file in the following steps. ![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) @@ -224,17 +212,21 @@ following steps. Start another terminal, change to the `Node-2` directory, and start Node-2: -=== "MacOS" + - ```bash - besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 - ``` + The command line specifies: @@ -243,24 +235,27 @@ The command line specifies: - A data directory for Node-2 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). - Other options as for [Node-1](#7-start-node-1). -When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need -the enode URL to update the permissions configuration file in the following steps. +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. ### 9. Start Node-3 Start another terminal, change to the `Node-3` directory, and start Node-3: -=== "MacOS" + - ```bash - besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 - ``` +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 +``` + + The command line specifies: @@ -269,24 +264,27 @@ The command line specifies: - A data directory for Node-3 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). - Other options as for [Node-1](#7-start-node-1). -When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need -the enode URL to update the permissions configuration file in the following steps. +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. ### 10. Start Node-4 Start another terminal, change to the `Node-4` directory, and start Node-4: -=== "MacOS" + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 +``` - ```bash - besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 - ``` + The command line specifies: @@ -295,103 +293,111 @@ The command line specifies: - A data directory for Node-4 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). - Other options as for [Node-1](#7-start-node-1). -When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need -the enode URL to update the permissions configuration file in the following steps. +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. ### 11. Add enode URLs for nodes to permissions configuration file -Start another terminal and use the -[`perm_addNodesToAllowlist`](../../reference/api/index.md#perm_addnodestoallowlist) JSON-RPC API -method to add the nodes to the permissions configuration file for each node. +Start another terminal and use the [`perm_addNodesToAllowlist`](../../reference/api/index.md#perm_addnodestoallowlist) JSON-RPC API method to add the nodes to the permissions configuration file for each node. -Replace ``, ``, ``, and `` with the enode URL displayed when -starting each node. +Replace ``, ``, ``, and `` with the enode URL displayed when starting each node. -=== "Node-1" + - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8545 - ``` +# Node-1 -=== "Node-2" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8545 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8546 - ``` +# Node-2 -=== "Node-3" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8546 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8547 - ``` +# Node-3 -=== "Node-4" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8548 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8548 - ``` + -!!! tip +:::tip - The curl call is the same for each node except for the JSON-RPC endpoint. +The curl call is the same for each node except for the JSON-RPC endpoint. + +::: ### 12. Add nodes as peers -Use the [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer) JSON-RPC API method to add -Node-1 as a peer for Node-2, Node-3, and Node-4. +Use the [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer) JSON-RPC API method to add Node-1 as a peer for Node-2, Node-3, and Node-4. Replace `` with the enode URL displayed when starting Node-1. -=== "Node-2" + + +# Node-2 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8546 +``` + +# Node-3 - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8546 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 +``` -=== "Node-3" +# Node-4 - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` -=== "Node-4" + - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 - ``` +:::tip -!!! tip +The curl call is the same for each node except for the JSON-RPC endpoint. - The curl call is the same for each node except for the JSON-RPC endpoint. +::: Replace `` with the enode URL displayed when starting Node-2. -=== "Node-3" + - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 - ``` +# Node-3 -=== "Node-4" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 +``` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 - ``` +# Node-4 -Replace `` with the enode URL displayed when starting Node-3. +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` -=== "Node-4" + - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 - ``` +Replace `` with the enode URL displayed when starting Node-3. + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` ### 13. Confirm permissioned network is working #### Check peer count -Use curl to call the JSON-RPC API [`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method and confirm the -nodes are functioning as peers: +Use curl to call the JSON-RPC API [`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: ```bash curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 @@ -401,59 +407,65 @@ The result confirms Node-1 (the node running the JSON-RPC service) has three pee ```json { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x3" + "jsonrpc": "2.0", + "id": 1, + "result": "0x3" } ``` #### Send a transaction from an account in the allowlist -Import the first account from the genesis file into MetaMask and send transactions, as described in -[Quickstart tutorial]: +Import the first account from the genesis file into MetaMask and send transactions, as described in [Quickstart tutorial]: + +:::info Account 1 -!!! example "Account 1" +- Address: `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73` +- Private key : `0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63` +- Initial balance : `0xad78ebc5ac6200000` (200000000000000000000 in decimal) - * Address: `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73` - * Private key : `0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63` - * Initial balance : `0xad78ebc5ac6200000` (200000000000000000000 in decimal) +::: -!!! info +:::info - Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). +Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). + +::: ### Try sending a transaction from an account not in the accounts allowlist -Import the third account from the genesis file into MetaMask and try to send a transaction, as -described in [Quickstart tutorial]: +Import the third account from the genesis file into MetaMask and try to send a transaction, as described in [Quickstart tutorial]: + +:::info Account 3 -!!! example "Account 3" +- Address: `0xf17f52151EbEF6C7334FAD080c5704D77216b732` +- Private key: `0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f` +- Initial balance: `0x90000000000000000000000` (2785365088392105618523029504 in decimal) - * Address: `0xf17f52151EbEF6C7334FAD080c5704D77216b732` - * Private key: `0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f` - * Initial balance: `0x90000000000000000000000` (2785365088392105618523029504 in decimal) +::: ### Start a node not on the nodes allowlist -In your `Permissioned-Network` directory, create a `Node-5` directory and `data` directory inside -it. +In your `Permissioned-Network` directory, create a `Node-5` directory and `data` directory inside it. Change to the `Node-5` directory and start Node-5 specifying the Node-1 enode URL as the bootnode: -=== "MacOS" + - ```bash - besu --data-path=data --bootnodes="" --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data --bootnodes="" --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 +``` + +# Windows + +```bash +besu --data-path=data --bootnodes="" --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 +``` - ```bash - besu --data-path=data --bootnodes="" --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 - ``` + -Start another terminal and use curl to call the JSON-RPC API -[`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method: +Start another terminal and use curl to call the JSON-RPC API [`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method: ```bash curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8549 @@ -463,21 +475,23 @@ The result confirms Node-5 has no peers even though it specifies Node-1 as a boo ```json { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x0" + "jsonrpc": "2.0", + "id": 1, + "result": "0x0" } ``` ## Stop nodes -When finished using the permissioned network, stop all nodes using ++ctrl+c++ in each terminal -window. +When finished using the permissioned network, stop all nodes using ++ctrl+c++ in each terminal window. -!!!tip +:::tip - To restart the permissioned network in the future, start from [step 7](#7-start-node-1). +To restart the permissioned network in the future, start from [step 7](#7-start-node-1). + +::: + [IBFT 2.0 proof of authority consensus protocol]: ../../how-to/configure/consensus/ibft.md [Private network example tutorial]: ../quickstart.md#create-a-transaction-using-metamask diff --git a/docs/private-networks/tutorials/permissioning/onchain.md b/docs/private-networks/tutorials/permissioning/onchain.md index 190a9a5224c..e9d2353a0cd 100644 --- a/docs/private-networks/tutorials/permissioning/onchain.md +++ b/docs/private-networks/tutorials/permissioning/onchain.md @@ -1,19 +1,22 @@ --- +title: Get started with onchain permissioning +sidebar_position: 1 description: Setting up and using Hyperledger Besu onchain permissioning +tags: + - private networks --- # Get started with onchain permissioning -The following steps describe bootstrapping a permissioned network using a Hyperledger Besu -node. +The following steps describe bootstrapping a permissioned network using a Hyperledger Besu node. This tutorial configures permissioning on a [IBFT 2.0 proof of authority (PoA)] network. ## Prerequisites -* [Node.js](https://nodejs.org/en/) v10.16.0 or later -* [Yarn](https://yarnpkg.com/en/) v1.15 or later -* Browser with [MetaMask installed](https://metamask.io/) +- [Node.js](https://nodejs.org/en/) v10.16.0 or later +- [Yarn](https://yarnpkg.com/en/) v1.15 or later +- Browser with [MetaMask installed](https://metamask.io/) ## Steps @@ -21,8 +24,7 @@ This tutorial configures permissioning on a [IBFT 2.0 proof of authority (PoA)] Each node requires a data directory for the blockchain data. -Create directories for your permissioned network and each of the three nodes, and a data directory for -each node: +Create directories for your permissioned network and each of the three nodes, and a data directory for each node: ```bash Permissioned-Network/ @@ -38,17 +40,11 @@ Permissioned-Network/ ### 2. Create the configuration file -The configuration file defines the -[IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the -number of node key pairs to generate. +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. -The configuration file has two nested JSON nodes. The first is the `genesis` property defining -the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in -the resulting genesis file. The second is the `blockchain` property defining the number of key -pairs to generate. +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. -Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it -in the `Permissioned-Network` directory: +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `Permissioned-Network` directory: ```json { @@ -95,10 +91,11 @@ in the `Permissioned-Network` directory: } ``` -!!! critical "Security warning" +:::critical Security warning - Don't use the accounts in the genesis file on Mainnet or any public network except for - testing. The private keys display, which means the accounts are not secure. +Don't use the accounts in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: ### 3. Generate node keys and a genesis file @@ -110,10 +107,8 @@ besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to= Besu creates the following in the `networkFiles` directory: -* `genesis.json` - The genesis file including the `extraData` property specifying the four nodes - are validators. -* A directory for each node named using the node address and containing the public and private key - for each node. +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. ```bash networkFiles/ @@ -139,15 +134,13 @@ Copy the `genesis.json` file to the `Permisssioned-Network` directory. ### 5. Add the Ingress contracts to the genesis file -!!! tip +:::tip + +If the network is using only account or node permissioning, add only the relevant Ingress contract to the genesis file. - If the network is using only account or node permissioning, add only the relevant Ingress - contract to the genesis file. +::: -Add the Ingress contracts to the genesis file for your network by copying them from -[`genesis.json`](https://github.com/ConsenSys/permissioning-smart-contracts/blob/e6c2d4d5a728c11cdb8e97a07ddda3c0bfb57b5d/genesis.json) -in the [`permissioning-smart-contracts` repository](https://github.com/ConsenSys/permissioning-smart-contracts) to -the `alloc` section of the contract: +Add the Ingress contracts to the genesis file for your network by copying them from [`genesis.json`](https://github.com/ConsenSys/permissioning-smart-contracts/blob/e6c2d4d5a728c11cdb8e97a07ddda3c0bfb57b5d/genesis.json) in the [`permissioning-smart-contracts` repository](https://github.com/ConsenSys/permissioning-smart-contracts) to the `alloc` section of the contract: ```json "0x0000000000000000000000000000000000008888": { @@ -169,15 +162,13 @@ the `alloc` section of the contract: } ``` -!!! important +:::info + +To support the permissioning contracts, ensure your genesis file includes at least the `constantinopleFixBlock` milestone. - To support the permissioning contracts, ensure your genesis file includes at least the - `constantinopleFixBlock` milestone. +The permissioning contract has multiple interfaces, and each interface maps to a specific version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). Ensure that you specify the [permissioning contract interface](../../how-to/use-permissioning/onchain.md) being used when starting Besu. - The permissioning contract has multiple interfaces, and each interface maps to a specific - version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). - Ensure that you specify the [permissioning contract interface](../../how-to/use-permissioning/onchain.md) - being used when starting Besu. +::: ### 6. Copy the node private keys to the node directories @@ -206,17 +197,17 @@ Permissioned-Network/ ### 7. Start Node-1 -!!! important +:::info - The specified node must be producing blocks, that is, be a miner (PoW networks) or validator (PoA networks). +The specified node must be producing blocks, that is, be a miner (PoW networks) or validator (PoA networks). - To allow MetaMask to connect, the node must have JSON-RPC HTTP enabled, and have `--rpc-http-cors-origins` set to allow MetaMask. +To allow MetaMask to connect, the node must have JSON-RPC HTTP enabled, and have `--rpc-http-cors-origins` set to allow MetaMask. - If your network is not a [free gas network](../../how-to/configure/free-gas.md), the account used - to interact with the permissioning contracts must have a balance. +If your network is not a [free gas network](../../how-to/configure/free-gas.md), the account used to interact with the permissioning contracts must have a balance. -Start the first node with command line options to enable onchain permissioning and the location of -the **data** folder and genesis file: +::: + +Start the first node with command line options to enable onchain permissioning and the location of the **data** folder and genesis file: ```cmd besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" @@ -224,27 +215,17 @@ besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-cont On the command line: -* Enable onchain accounts permissioning using - [`--permissions-accounts-contract-enabled`](../../reference/cli/options.md#permissions-accounts-contract-enabled). -* Set the address of the Account Ingress contract in the genesis file using - [`--permissions-accounts-contract-address`](../../reference/cli/options.md#permissions-accounts-contract-address). -* Enable onchain nodes permissioning using - [`--permissions-nodes-contract-enabled`](../../reference/cli/options.md#permissions-nodes-contract-enabled). -* Set the address of the Node Ingress contract in the genesis file using - [`--permissions-nodes-contract-address`](../../reference/cli/options.md#permissions-nodes-contract-address). -* Set the version of the [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) - using [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version). -* Enable the JSON-RPC API using - [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled). -* Enable the `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using - [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). -* Allow all-host access to the HTTP JSON-RPC API using - [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). -* Allow all-domain access to the node through the HTTP JSON-RPC API using - [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). - -When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the -enode URL to use when starting Node-2, Node-3, and Node-4. +- Enable onchain accounts permissioning using [`--permissions-accounts-contract-enabled`](../../reference/cli/options.md#permissions-accounts-contract-enabled). +- Set the address of the Account Ingress contract in the genesis file using [`--permissions-accounts-contract-address`](../../reference/cli/options.md#permissions-accounts-contract-address). +- Enable onchain nodes permissioning using [`--permissions-nodes-contract-enabled`](../../reference/cli/options.md#permissions-nodes-contract-enabled). +- Set the address of the Node Ingress contract in the genesis file using [`--permissions-nodes-contract-address`](../../reference/cli/options.md#permissions-nodes-contract-address). +- Set the version of the [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) using [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version). +- Enable the JSON-RPC API using [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled). +- Enable the `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). +- Allow all-host access to the HTTP JSON-RPC API using [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). +- Allow all-domain access to the node through the HTTP JSON-RPC API using [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to use when starting Node-2, Node-3, and Node-4. ### 8. Start Node-2 @@ -256,10 +237,10 @@ besu --data-path=data --genesis-file=../genesis.json --bootnodes= + [Node-1, Node-2, Node-3, and Node-4 to the allowlist]: ../../how-to/use-permissioning/onchain.md#update-nodes-allowlist [IBFT 2.0 proof of authority (PoA)]: ../../how-to/configure/consensus/ibft.md diff --git a/docs/private-networks/tutorials/permissioning/upgrade-contracts.md b/docs/private-networks/tutorials/permissioning/upgrade-contracts.md index 853c7371c3a..00078d551b2 100644 --- a/docs/private-networks/tutorials/permissioning/upgrade-contracts.md +++ b/docs/private-networks/tutorials/permissioning/upgrade-contracts.md @@ -1,127 +1,142 @@ --- +title: Upgrade permissioning contracts +sidebar_position: 2 description: Upgrade the permissioning contracts for onchain permissioning +tags: + - private networks --- # Upgrade permissioning contracts -The following tutorial describes the steps to upgrade the onchain permissioning contracts to the latest -version. +The following tutorial describes the steps to upgrade the onchain permissioning contracts to the latest version. ## Prerequisites -* [Node.js](https://nodejs.org/en/) v10.16.0 or later + +- [Node.js](https://nodejs.org/en/) v10.16.0 or later -* [Yarn](https://yarnpkg.com/en/) v1.15 or later -* Browser with [MetaMask installed](https://metamask.io/). +- [Yarn](https://yarnpkg.com/en/) v1.15 or later +- Browser with [MetaMask installed](https://metamask.io/). ## Steps ### 1. Get the latest contracts and install dependencies -!!! note +:::note + +Pull the latest changes if you already have a cloned repository using the `git pull` command inside the `permissioning-smart-contracts` directory. - Pull the latest changes if you already have a cloned repository using the `git pull` command - inside the `permissioning-smart-contracts` directory. +::: 1. Clone the `permissioning-smart-contracts` repository: - ```bash - git clone https://github.com/ConsenSys/permissioning-smart-contracts.git - ``` + ```bash + git clone https://github.com/ConsenSys/permissioning-smart-contracts.git + ``` ### 3. Update environment variables -If using a `.env` file to configure environment variables, then -the file must be in the `permissioning-smart-contracts` directory. +If using a `.env` file to configure environment variables, then the file must be in the `permissioning-smart-contracts` directory. + +:::tip + +You can use environment variables to retain existing contracts if required. For example: + +- `RETAIN_ADMIN_CONTRACT=true` to retain the current admin list +- `RETAIN_NODE_RULES_CONTRACT=true` to retain the current Node rules contract +- `RETAIN_ACCOUNT_RULES_CONTRACT=true` to retain the current Account rules contract -!!! tip +::: - You can use environment variables to retain existing contracts if required. For example: +1. Legacy: If they exist, rename the following environment variables: - * `RETAIN_ADMIN_CONTRACT=true` to retain the current admin list - * `RETAIN_NODE_RULES_CONTRACT=true` to retain the current Node rules contract - * `RETAIN_ACCOUNT_RULES_CONTRACT=true` to retain the current Account rules contract + - `PANTHEON_NODE_PERM_ACCOUNT` to `BESU_NODE_PERM_ACCOUNT` + - `PANTHEON_NODE_PERM_KEY` to `BESU_NODE_PERM_KEY` + - `PANTHEON_NODE_PERM_ENDPOINT` to `BESU_NODE_PERM_ENDPOINT` -1. Legacy: If they exist, rename the following environment variables: - * `PANTHEON_NODE_PERM_ACCOUNT` to `BESU_NODE_PERM_ACCOUNT` - * `PANTHEON_NODE_PERM_KEY` to `BESU_NODE_PERM_KEY` - * `PANTHEON_NODE_PERM_ENDPOINT` to `BESU_NODE_PERM_ENDPOINT` +2. If updating from v1 to v2, you need to re-deploy the `NodeIngress` contract. In order to do this, first delete the `NODE_INGRESS_CONTRACT_ADDRESS` environment variable. -2. If updating from v1 to v2, you need to re-deploy the `NodeIngress` contract. In order to do this, first delete the `NODE_INGRESS_CONTRACT_ADDRESS` environment variable. + :::important - !!! important + This step is only required if upgrading from v1 of the node permissioning contract to v2 (because the interface changed, a new `NodeIngress` contract must be deployed). - This step is only required if upgrading from v1 of the node permissioning contract - to v2 (because the interface changed, a new `NodeIngress` contract must be deployed). + ::: ### 4. Optional: Export current allowlists -!!! note +:::note - This step enables you to export the current allowlists to assist in updating. +This step enables you to export the current allowlists to assist in updating. + +::: 1. Export the current allowlists by setting the following environment variables: - ```bash - RETAIN_ADMIN_CONTRACT=true - RETAIN_NODE_RULES_CONTRACT=true - RETAIN_ACCOUNT_RULES_CONTRACT=true - ``` + ```bash + RETAIN_ADMIN_CONTRACT=true + RETAIN_NODE_RULES_CONTRACT=true + RETAIN_ACCOUNT_RULES_CONTRACT=true + ``` -1. Log the current allowlists to console: +2. Log the current allowlists to console: - ```bash - truffle migrate --reset - ``` + ```bash + truffle migrate --reset + ``` - The migration scripts will log the existing allowlists to the console, but no contracts will be deployed. + The migration scripts will log the existing allowlists to the console, but no contracts will be deployed. -1. Set initial values for updated deployment using the values logged in the previous step: +3. Set initial values for updated deployment using the values logged in the previous step: - ```bash - INITIAL_ADMIN_ACCOUNTS= - INITIAL_ALLOWLISTED_ACCOUNTS= - INITIAL_ALLOWLISTED_NODES= - ``` + ```bash + INITIAL_ADMIN_ACCOUNTS= + INITIAL_ALLOWLISTED_ACCOUNTS= + INITIAL_ALLOWLISTED_NODES= + ``` -1. Update environment variables for contracts that are to be deployed. For example: +4. Update environment variables for contracts that are to be deployed. For example: - ```bash - RETAIN_ADMIN_CONTRACT=true - RETAIN_NODE_RULES_CONTRACT=false - RETAIN_ACCOUNT_RULES_CONTRACT=false - ``` + ```bash + RETAIN_ADMIN_CONTRACT=true + RETAIN_NODE_RULES_CONTRACT=false + RETAIN_ACCOUNT_RULES_CONTRACT=false + ``` ### 5. Deploy the contracts -1. In the `permissioning-smart-contracts` directory, deploy the contracts: +1. In the `permissioning-smart-contracts` directory, deploy the contracts: ```bash truffle migrate --reset ``` - !!! important + :::important - - If updating from v1 to v2, the new `NodeIngress` contract address must be specified when restarting the Besu nodes. Copy this address from the migration output. For example: - ```bash - > Deployed NodeIngress contract to address = 0x12B1f953395080A13AeED0dC4d0bb14e787A91cF - ``` - - If upgrading from v2 (using separate storage contracts) copy the `Storage` contract addresses displayed in the output. For example: - ``` - > Deployed NodeStorage contract to address = 0x4F3e35A3Be3C1b77Ade39969D175C743ad3484Ee - ... - > Deployed AccountStorage contract to address = 0x2362187023D738034B516438Af187356b31E8Fb8 - ``` + - If updating from v1 to v2, the new `NodeIngress` contract address must be specified when restarting the Besu nodes. Copy this address from the migration output. For example: -1. Set the storage contract address environment variables to ensure that the storage contracts are not re-deployed. For example: + ```bash + > Deployed NodeIngress contract to address = 0x12B1f953395080A13AeED0dC4d0bb14e787A91cF + ``` + + - If upgrading from v2 (using separate storage contracts) copy the `Storage` contract addresses displayed in the output. For example: + + ``` + > Deployed NodeStorage contract to address = 0x4F3e35A3Be3C1b77Ade39969D175C743ad3484Ee + ... + > Deployed AccountStorage contract to address = 0x2362187023D738034B516438Af187356b31E8Fb8 + ``` + + ::: + +1. Set the storage contract address environment variables to ensure that the storage contracts are not re-deployed. For example: ```bash NODE_STORAGE_CONTRACT_ADDRESS=0xE0bF6021e023a197DBb3fABE64efA880E13D3f4b ACCOUNT_STORAGE_CONTRACT_ADDRESS=0x7153CCD1a20Bbb2f6dc89c1024de368326EC6b4F ``` -1. Deploy the updated contracts: +1. Deploy the updated contracts: ```bash truffle migrate --reset @@ -129,14 +144,12 @@ the file must be in the `permissioning-smart-contracts` directory. ### 6. Restart Besu nodes -Restart the Besu nodes with the updated [`NodeIngress`](#5-deploy-the-contracts) -contract address and [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) -version 2. +Restart the Besu nodes with the updated [`NodeIngress`](#5-deploy-the-contracts) contract address and [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) version 2. -!!! example - ```cmd - besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x4E72770760c011647D4873f60A3CF6cDeA896CD8" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" - ``` +```besu +cmd besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x4E72770760c011647D4873f60A3CF6cDeA896CD8" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" +``` + [nodes to the allowlist]: ../../how-to/use-permissioning/onchain.md#update-nodes-allowlist diff --git a/docs/private-networks/tutorials/privacy/_category_.json b/docs/private-networks/tutorials/privacy/_category_.json new file mode 100644 index 00000000000..c6e33f3bea4 --- /dev/null +++ b/docs/private-networks/tutorials/privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create a privacy enabled network", + "position": 6 +} diff --git a/docs/private-networks/tutorials/privacy/index.md b/docs/private-networks/tutorials/privacy/index.md index cb87bf8ffa3..f3991a18afd 100644 --- a/docs/private-networks/tutorials/privacy/index.md +++ b/docs/private-networks/tutorials/privacy/index.md @@ -1,30 +1,30 @@ --- +title: Create a privacy enabled network using the Quickstart +sidebar_position: 1 description: Configure Hyperledger Besu privacy +tags: + - private networks --- # Create a privacy-enabled network -Configuring a network that supports private transactions requires starting a [Tessera] node for each -Hyperledger Besu node. Besu command line options associate the Besu node with the Tessera node. +Configuring a network that supports private transactions requires starting a [Tessera] node for each Hyperledger Besu node. Besu command line options associate the Besu node with the Tessera node. -This tutorial assumes you have completed setting up an IBFT 2.0 network to the point where you have -[created the genesis file and copied the private keys](../ibft/index.md#5-copy-the-node-private-keys-to-the-node-directories). -If not, complete steps 1 to 5 of the -[Create an IBFT 2.0](../ibft/index.md) tutorial before continuing. +This tutorial assumes you have completed setting up an IBFT 2.0 network to the point where you have [created the genesis file and copied the private keys](../ibft/index.md#5-copy-the-node-private-keys-to-the-node-directories). If not, complete steps 1 to 5 of the [Create an IBFT 2.0](../ibft/index.md) tutorial before continuing. -!!! important +:::important - To support privacy, ensure your genesis file includes at least the `byzantium` milestone. +To support privacy, ensure your genesis file includes at least the `byzantium` milestone. - This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT - 2.0 requires 4 validators to be Byzantine fault tolerant. +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires 4 validators to be Byzantine fault tolerant. -In this tutorial we start Tessera nodes for the four Besu nodes and associate each Besu node with -a Tessera node. +::: + +In this tutorial we start Tessera nodes for the four Besu nodes and associate each Besu node with a Tessera node. ## Prerequisites -* [Install Tessera](https://docs.tessera.consensys.net/category/install). +- [Install Tessera](https://docs.tessera.consensys.net/category/install). ## 1. Create Tessera directories @@ -48,384 +48,386 @@ IBFT-Network/ ## 2. Generate Tessera keys -This example creates an unlocked private key, meaning you do not need a password to decrypt the -private key file. +This example creates an unlocked private key, meaning you do not need a password to decrypt the private key file. In each `Tessera` directory, generate a public/private key pair for the Tessera node: -``` bash +```bash tessera -keygen -filename nodeKey ``` At the prompt, press **Enter** to create an unlocked key. -Tessera generates the public/private key pair and saves the keys in the `nodeKey.pub` and -`nodeKey.key` files. +Tessera generates the public/private key pair and saves the keys in the `nodeKey.pub` and `nodeKey.key` files. ## 3. Create Tessera configuration files -In the `Tessera` directory for each node, create a file called `tessera.conf`, with the following -configuration: +In the `Tessera` directory for each node, create a file called `tessera.conf`, with the following configuration: + +:::important -!!! important +In production environments, only specify [`tls`](https://docs.tessera.consensys.net/HowTo/Configure/TLS/) as `OFF` if another transport security mechanism, such as WireGuard, is in place. - In production environments, only specify - [`tls`](https://docs.tessera.consensys.net/HowTo/Configure/TLS/) as `OFF` if another - transport security mechanism, such as WireGuard, is in place. +::: -=== "Node-1" + - ```json +# Node-1 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ { - "mode": "orion", - "useWhiteList": false, - "jdbc": { - "username": "sa", - "password": "", - "url": "jdbc:h2:./target/h2/tessera1", - "autoCreateTables": true - }, - "serverConfigs":[ - { - "app":"ThirdParty", - "serverAddress": "http://localhost:9101", - "communicationType" : "REST" - }, - { - "app":"Q2T", - "serverAddress": "http://localhost:9102", - "communicationType" : "REST" - }, - { - "app":"P2P", - "serverAddress":"http://localhost:9103", - "sslConfig": { - "tls": "OFF" - }, - "communicationType" : "REST" - } - ], - "peer": [ - { - "url": "http://localhost:9203" - }, - { - "url": "http://localhost:9303" - }, - { - "url": "http://localhost:9403" - } - ], - "keys": { - "passwords": [], - "keyData": [ - { - "privateKeyPath": "nodeKey.key", - "publicKeyPath": "nodeKey.pub" - } - ] + "app": "ThirdParty", + "serverAddress": "http://localhost:9101", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9102", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9103", + "sslConfig": { + "tls": "OFF" }, - "alwaysSendTo": [] + "communicationType": "REST" } - ``` - -=== "Node-2" + ], + "peer": [ + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` - ```json +# Node-2 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ { - "mode": "orion", - "useWhiteList": false, - "jdbc": { - "username": "sa", - "password": "", - "url": "jdbc:h2:./target/h2/tessera1", - "autoCreateTables": true - }, - "serverConfigs":[ - { - "app":"ThirdParty", - "serverAddress": "http://localhost:9201", - "communicationType" : "REST" - }, - { - "app":"Q2T", - "serverAddress": "http://localhost:9202", - "communicationType" : "REST" - }, - { - "app":"P2P", - "serverAddress":"http://localhost:9203", - "sslConfig": { - "tls": "OFF" - }, - "communicationType" : "REST" - } - ], - "peer": [ - { - "url": "http://localhost:9103" - }, - { - "url": "http://localhost:9303" - }, - { - "url": "http://localhost:9403" - } - ], - "keys": { - "passwords": [], - "keyData": [ - { - "privateKeyPath": "nodeKey.key", - "publicKeyPath": "nodeKey.pub" - } - ] + "app": "ThirdParty", + "serverAddress": "http://localhost:9201", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9202", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9203", + "sslConfig": { + "tls": "OFF" }, - "alwaysSendTo": [] + "communicationType": "REST" } - ``` - -=== "Node-3" + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` - ```json +# Node-3 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ { - "mode": "orion", - "useWhiteList": false, - "jdbc": { - "username": "sa", - "password": "", - "url": "jdbc:h2:./target/h2/tessera1", - "autoCreateTables": true - }, - "serverConfigs":[ - { - "app":"ThirdParty", - "serverAddress": "http://localhost:9301", - "communicationType" : "REST" - }, - { - "app":"Q2T", - "serverAddress": "http://localhost:9302", - "communicationType" : "REST" - }, - { - "app":"P2P", - "serverAddress":"http://localhost:9303", - "sslConfig": { - "tls": "OFF" - }, - "communicationType" : "REST" - } - ], - "peer": [ - { - "url": "http://localhost:9103" - }, - { - "url": "http://localhost:9203" - }, - { - "url": "http://localhost:9403" - } - ], - "keys": { - "passwords": [], - "keyData": [ - { - "privateKeyPath": "nodeKey.key", - "publicKeyPath": "nodeKey.pub" - } - ] + "app": "ThirdParty", + "serverAddress": "http://localhost:9301", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9302", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9303", + "sslConfig": { + "tls": "OFF" }, - "alwaysSendTo": [] + "communicationType": "REST" } - ``` - -=== "Node-4" + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` - ```json +# Node-4 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ { - "mode": "orion", - "useWhiteList": false, - "jdbc": { - "username": "sa", - "password": "", - "url": "jdbc:h2:./target/h2/tessera1", - "autoCreateTables": true - }, - "serverConfigs":[ - { - "app":"ThirdParty", - "serverAddress": "http://localhost:9401", - "communicationType" : "REST" - }, - { - "app":"Q2T", - "serverAddress": "http://localhost:9402", - "communicationType" : "REST" - }, - { - "app":"P2P", - "serverAddress":"http://localhost:9403", - "sslConfig": { - "tls": "OFF" - }, - "communicationType" : "REST" - } - ], - "peer": [ - { - "url": "http://localhost:9103" - }, - { - "url": "http://localhost:9203" - }, - { - "url": "http://localhost:9303" - } - ], - "keys": { - "passwords": [], - "keyData": [ - { - "privateKeyPath": "nodeKey.key", - "publicKeyPath": "nodeKey.pub" - } - ] + "app": "ThirdParty", + "serverAddress": "http://localhost:9401", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9402", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9403", + "sslConfig": { + "tls": "OFF" }, - "alwaysSendTo": [] + "communicationType": "REST" } - ``` + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + + In the configuration file, specify: -* Different port numbers for the various servers in the - [`serverConfigs`](https://docs.tessera.consensys.net/HowTo/Configure/TesseraAPI/) section. -* The address of the Tessera nodes to discover, in the - [`peer`](https://docs.tessera.consensys.net/HowTo/Configure/Peer-discovery/#specify-peers) section. -* The location of the public/private key pair. +- Different port numbers for the various servers in the [`serverConfigs`](https://docs.tessera.consensys.net/HowTo/Configure/TesseraAPI/) section. +- The address of the Tessera nodes to discover, in the [`peer`](https://docs.tessera.consensys.net/HowTo/Configure/Peer-discovery/#specify-peers) section. +- The location of the public/private key pair. ## 4. Start the Tessera nodes -In each `Tessera` directory, start Tessera specifying the -[configuration file](#3-create-tessera-configuration-files) created in the previous step: +In each `Tessera` directory, start Tessera specifying the [configuration file](#3-create-tessera-configuration-files) created in the previous step: ```bash tessera -configfile tessera.conf ``` -!!! note +:::info + +After starting the first Tessera node and before starting the other nodes, the log message `failed to connect to node` displays. This is normal behavior. Until you start the other peer nodes, your node is not connected and displays this warning. You can continue to start the other nodes. - After starting the first Tessera node and before starting the other nodes, the log message `failed to connect to node` displays. - This is normal behavior. Until you start the other peer nodes, your node is not connected and displays this warning. - You can continue to start the other nodes. +::: ## 5. Start Besu Node-1 In the `Node-1` directory, start Besu Node-1: -=== "MacOS" + - ```bash - besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 - ``` +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + The command line specifies privacy options: -* [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy -* [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the Q2T server address - of the Tessera node (`Q2T` in `tessera.conf`) -* [`--privacy-public-key-file`](../../reference/cli/options.md#privacy-public-key-file) - specifies the file containing Tessera node public key (created in - [3. Generate Tessera Keys](#2-generate-tessera-keys)) -* [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) includes `EEA` and `PRIV` in - the list of JSON-RPC APIs to enable privacy JSON-RPC API methods. -* [`--min-gas-price`](../../../public-networks/reference/cli/options.md#min-gas-price) is 0 for a - [free gas network](../../how-to/configure/free-gas.md). +- [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy +- [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the Q2T server address of the Tessera node (`Q2T` in `tessera.conf`) +- [`--privacy-public-key-file`](../../reference/cli/options.md#privacy-public-key-file) specifies the file containing Tessera node public key (created in [3. Generate Tessera Keys](#2-generate-tessera-keys)) +- [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) includes `EEA` and `PRIV` in the list of JSON-RPC APIs to enable privacy JSON-RPC API methods. +- [`--min-gas-price`](../../../public-networks/reference/cli/options.md#min-gas-price) is 0 for a [free gas network](../../how-to/configure/free-gas.md). -!!! note +:::note - Use the - [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) - command line option to sign - [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md) using a - supplied key. The command line option is mandatory in privacy-enabled paid gas networks. +Use the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option to sign [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md) using a supplied key. The command line option is mandatory in privacy-enabled paid gas networks. -When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the -enode URL to specify Node-1 as the bootnode in the following steps. +::: + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. ![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) ## 6. Start Besu Node-2 -In the `Node-2` directory, start Besu Node-2 specifying the Node-1 enode URL copied when starting -Node-1 as the bootnode: +In the `Node-2` directory, start Besu Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` -=== "MacOS" +# Windows - ```bash - besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 - ``` +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` -=== "Windows" + - ```bash - besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 - ``` +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. -The command line specifies the same options as for Node-1 with different ports and Tessera node URL. -The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. +:::note -!!! note +When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), [expose ports](../../get-started/install/run-docker-image.md#expose-ports). - When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), - [expose ports](../../get-started/install/run-docker-image.md#expose-ports). +::: ## 7. Start Besu Node-3 -In the `Node-3` directory, start Besu Node-3 specifying the Node-1 enode URL copied when starting -Node-1 as the bootnode: +In the `Node-3` directory, start Besu Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: -=== "MacOS" + - ```bash - besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 - ``` +# MacOS -=== "Windows" +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows - ```bash - besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 - ``` +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` -The command line specifies the same options as for Node-1 with different ports and Tessera node URL. -The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. ## 8. Start Besu Node-4 -In the `Node-4` directory, start Besu Node-4 specifying the Node-1 enode URL copied when starting -Node-1 as the bootnode: +In the `Node-4` directory, start Besu Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + -=== "MacOS" +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` - ```bash - besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 - ``` + -The command line specifies the same options as for Node-1 with different ports and Tessera node URL. -The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + [Tessera]: https://docs.tessera.consensys.net/ diff --git a/docs/private-networks/tutorials/privacy/multi-tenancy.md b/docs/private-networks/tutorials/privacy/multi-tenancy.md index 92ba440af8e..c077e8910e5 100644 --- a/docs/private-networks/tutorials/privacy/multi-tenancy.md +++ b/docs/private-networks/tutorials/privacy/multi-tenancy.md @@ -1,14 +1,16 @@ --- +title: Create a multi-tenant network +sidebar_position: 2 description: Configure multi-tenancy +tags: + - private networks --- # Configure a multi-tenant node -You can configure Besu and associated Tessera node in a privacy-enabled network to host -[multiple tenants](../../concepts/privacy/multi-tenancy.md). +You can configure Besu and associated Tessera node in a privacy-enabled network to host [multiple tenants](../../concepts/privacy/multi-tenancy.md). -In this tutorial we'll add tenants to the `Node-1` Besu and Tessera node in a -[privacy-enabled network](index.md). +In this tutorial we'll add tenants to the `Node-1` Besu and Tessera node in a [privacy-enabled network](index.md). ```bash IBFT-Network/ @@ -26,35 +28,35 @@ IBFT-Network/ ├── Tessera ``` -!!! note +:::info - This tutorial uses [JWT public key authentication] to create the tenant's JWT, - but you can also use [username and password authentication]. +This tutorial uses [JWT public key authentication] to create the tenant's JWT, but you can also use [username and password authentication]. + +::: ## Prerequisites -* A [Privacy-enabled network](index.md). +- A [Privacy-enabled network](index.md). ## 1. Generate a private and public key pair -In the `Node-1` directory, [generate the private and public key pair]. The key pair, which must be -in `.pem` format, belongs to the operator who uses the key pair to authenticate the -[tenant JWTs](#6-generate-the-tenant-jwts). +In the `Node-1` directory, [generate the private and public key pair]. The key pair, which must be in `.pem` format, belongs to the operator who uses the key pair to authenticate the [tenant JWTs](#6-generate-the-tenant-jwts). + +:::info -!!! note +This step is not required when using [username and password authentication] to create the required JWTs. - This step is not required when using [username and password authentication] to create the - required JWTs. +::: ## 2. Generate Tessera keys -In the `Node-1/Tessera` directory, -[generate a public/private key pair for each tenant](index.md#2-generate-tessera-keys). +In the `Node-1/Tessera` directory, [generate a public/private key pair for each tenant](index.md#2-generate-tessera-keys). -!!! note +:::note - The instructions creates an unlocked private key, meaning you do not need a password to decrypt - the private key file. +The instructions creates an unlocked private key, meaning you do not need a password to decrypt the private key file. + +::: Name the key pair `nodeKey2` and `nodeKey3`. @@ -72,24 +74,24 @@ In the `Node-1/Tessera` directory, update the `tessera.conf` file by adding the "url": "jdbc:h2:./target/h2/tessera1", "autoCreateTables": true }, - "serverConfigs":[ + "serverConfigs": [ { - "app":"ThirdParty", + "app": "ThirdParty", "serverAddress": "http://localhost:9101", - "communicationType" : "REST" + "communicationType": "REST" }, { - "app":"Q2T", + "app": "Q2T", "serverAddress": "http://localhost:9102", - "communicationType" : "REST" + "communicationType": "REST" }, { - "app":"P2P", - "serverAddress":"http://localhost:9103", + "app": "P2P", + "serverAddress": "http://localhost:9103", "sslConfig": { "tls": "OFF" }, - "communicationType" : "REST" + "communicationType": "REST" } ], "peer": [ @@ -124,71 +126,62 @@ In the `Node-1/Tessera` directory, update the `tessera.conf` file by adding the } ``` -!!! note +:::info + +Besu requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode). Add the line `"mode": "orion",` to the Tessera configuration file. - Besu requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode). Add the line - `"mode": "orion",` to the Tessera configuration file. +::: ## 4. Start Tessera -[Start the Tessera nodes](index.md#4-start-the-tessera-nodes) and specify -the configuration file. +[Start the Tessera nodes](index.md#4-start-the-tessera-nodes) and specify the configuration file. ## 5. Start Besu Node-1 In the `Node-1` directory, start Besu Node-1: -=== "MacOS" - - ```bash - besu --data-path=data --genesis-file=../genesis.json --rpc-http-authentication-enabled --rpc-http-authentication-jwt-public-key-file=publicKey.pem --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-multi-tenancy-enabled --min-gas-price=0 - ``` +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-authentication-enabled --rpc-http-authentication-jwt-public-key-file=publicKey.pem --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-multi-tenancy-enabled --min-gas-price=0 +``` The command line specifies privacy options: -* [`--rpc-http-authentication-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-enabled) - enables authentication for JSON-RPC APIs. -* [`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) - specifies the Operator's [public key file](#1-generate-a-private-and-public-key-pair). Used to - authenticate the [tenant JWTs](#6-generate-the-tenant-jwts). -* [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy. -* [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the - [Quorum to Tessera (Q2T)] server address of the Tessera node (`Q2T` in `tessera.conf`). -* [`--privacy-multi-tenancy-enabled`](../../reference/cli/options.md#privacy-multi-tenancy-enabled) - enables multi-tenancy. - -!!! note - - [`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) - is only required when using [JWT public key authentication]. If using - [username and password authentication], use - [`--rpc-http-authentication-credentials-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-credentials-file) - instead. +- [`--rpc-http-authentication-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-enabled) enables authentication for JSON-RPC APIs. +- [`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) specifies the Operator's [public key file](#1-generate-a-private-and-public-key-pair). Used to authenticate the [tenant JWTs](#6-generate-the-tenant-jwts). +- [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy. +- [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the [Quorum to Tessera (Q2T)] server address of the Tessera node (`Q2T` in `tessera.conf`). +- [`--privacy-multi-tenancy-enabled`](../../reference/cli/options.md#privacy-multi-tenancy-enabled) enables multi-tenancy. + +:::note + +[`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) is only required when using [JWT public key authentication]. If using [username and password authentication], use [`--rpc-http-authentication-credentials-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-credentials-file) instead. + +::: [Start the remaining Besu nodes](index.md#6-start-besu-node-2). ## 6. Generate the tenant JWTs -[Generate the JWT](../../../public-networks/how-to/use-besu-api/authenticate.md#2-create-the-jwt) for each tenant -and specify the [tenant's Tessera public key](#2-generate-tessera-keys) in the `privacyPublicKey` -field. +[Generate the JWT](../../../public-networks/how-to/use-besu-api/authenticate.md#2-create-the-jwt) for each tenant and specify the [tenant's Tessera public key](#2-generate-tessera-keys) in the `privacyPublicKey` field. + +Ensure you apply the appropriate [JSON-RPC API permissions](../../../public-networks/how-to/use-besu-api/authenticate.md#json-rpc-permissions) to the token. For example, ensure you enable the `PRIV` and `EEA` APIs for privacy. -Ensure you apply the appropriate -[JSON-RPC API permissions](../../../public-networks/how-to/use-besu-api/authenticate.md#json-rpc-permissions) to the -token. For example, ensure you enable the `PRIV` and `EEA` APIs for privacy. +:::note -!!! note +This step is not required when using [username and password authentication] to create the required JWTs. - This step is not required when using [username and password authentication] to create the - required JWTs. +::: [Use the authentication token to make requests]. + [JWT public key authentication]: ../../../public-networks/how-to/use-besu-api/authenticate.md#jwt-public-key-authentication [username and password authentication]: ../../../public-networks/how-to/use-besu-api/authenticate.md#username-and-password-authentication [generate the private and public key pair]: ../../../public-networks/how-to/use-besu-api/authenticate.md#1-generate-a-private-and-public-key-pair [Use the authentication token to make requests]: ../../../public-networks/how-to/use-besu-api/authenticate.md#using-an-authentication-token-to-make-requests [Quorum to Tessera (Q2T)]: https://docs.tessera.consensys.net/Reference/TesseraAPI + -*[JWT]: JSON Web Token + +\*[JWT]: JSON Web Token diff --git a/docs/private-networks/tutorials/privacy/quickstart.md b/docs/private-networks/tutorials/privacy/quickstart.md index c32356bc807..147c617dcb9 100644 --- a/docs/private-networks/tutorials/privacy/quickstart.md +++ b/docs/private-networks/tutorials/privacy/quickstart.md @@ -1,40 +1,36 @@ --- description: Hyperledger Besu privacy-enabled private network tutorial +tags: + - private networks --- # Create a privacy-enabled network using the Quorum Developer Quickstart -You can create a privacy-enabled network using the -[Quorum Developer Quickstart](../quickstart.md). -It runs a private Hyperledger Besu network that -uses [Tessera](https://docs.tessera.consensys.net/en/stable/) as its private transaction manager. +You can create a privacy-enabled network using the [Quorum Developer Quickstart](../quickstart.md). It runs a private Hyperledger Besu network that uses [Tessera](https://docs.tessera.consensys.net/en/stable/) as its private transaction manager. -You can use the [Block Explorer](../quickstart.md#block-explorer), make -[JSON-RPC requests](../quickstart.md#run-json-rpc-requests), and -[create transactions using MetaMask](../quickstart.md#create-a-transaction-using-metamask). -This tutorial describes how to make private transactions between nodes, and perform read and write operations on private -contracts. +You can use the [Block Explorer](../quickstart.md#block-explorer), make [JSON-RPC requests](../quickstart.md#run-json-rpc-requests), and [create transactions using MetaMask](../quickstart.md#create-a-transaction-using-metamask). This tutorial describes how to make private transactions between nodes, and perform read and write operations on private contracts. -!!! important +:::important - This tutorial runs a private network suitable for education or demonstration purposes and is - not intended for running production networks. +This tutorial runs a private network suitable for education or demonstration purposes and is not intended for running production networks. + +::: ## Prerequisites To run this tutorial, you must have the following installed: -* [Docker and Docker-compose](https://docs.docker.com/compose/install/) +- [Docker and Docker-compose](https://docs.docker.com/compose/install/) + + :::important - !!! important + If using [MacOS](https://docs.docker.com/docker-for-mac/) or [Windows](https://docs.docker.com/docker-for-windows/), enable Docker to use up to 6GB of memory on the _Advanced_ tab in _Preferences_. - If using [MacOS](https://docs.docker.com/docker-for-mac/) or - [Windows](https://docs.docker.com/docker-for-windows/), enable Docker to use up to 6GB of - memory on the _Advanced_ tab in _Preferences_. + ::: -* [Nodejs](https://nodejs.org/en/download/) -* [Git command line](https://git-scm.com/) -* [Curl command line](https://curl.haxx.se/download.html). +- [Nodejs](https://nodejs.org/en/download/) +- [Git command line](https://git-scm.com/) +- [Curl command line](https://curl.haxx.se/download.html). ## Create Docker-compose file @@ -46,14 +42,15 @@ To create the docker-compose file and artifacts, run: npx quorum-dev-quickstart ``` -Follow the prompts displayed to run Hyperledger Besu, private transactions, and [logging with ELK](../../how-to/monitor/elastic-stack.md). -Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/). +Follow the prompts displayed to run Hyperledger Besu, private transactions, and [logging with ELK](../../how-to/monitor/elastic-stack.md). Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/). ## Start the network -!!!important +:::caution + +If running in Windows, please run commands from the GitBash shell - If running in Windows, please run commands from the GitBash shell +::: In the installation directory, start the network: @@ -61,8 +58,7 @@ In the installation directory, start the network: ./run.sh ``` -The script pulls the Docker images starts the network. Pulling the images takes a few minutes the -first time. The network details display. +The script pulls the Docker images starts the network. Pulling the images takes a few minutes the first time. The network details display. ```bash ************************************* @@ -85,15 +81,9 @@ For more information on the endpoints and services, refer to README.md in the in ## Deploy the private contract and interact with the nodes -To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the -[web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and -the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. -You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu -keeps account management separate for stronger security. +To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. -This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls, the example -creates three Besu nodes, with each node having a corresponding Tessera node for privacy. You can access the Besu -member nodes for API calls on the following ports: +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls, the example creates three Besu nodes, with each node having a corresponding Tessera node for privacy. You can access the Besu member nodes for API calls on the following ports: ```bash Member1Besu RPC: http://localhost:20000 @@ -114,10 +104,7 @@ npm install node scripts/private_tx.js ``` -The script deploys the contract and sends an arbitrary value (47) from `Member1` to `Member3`. Once done, it queries -all three members (Tessera) to check the value at an address. Only `Member1` & `Member3` has -this information as they were involved in the transaction, `Member2` responds with a `0x` to indicate it is -unaware of the transaction. +The script deploys the contract and sends an arbitrary value (47) from `Member1` to `Member3`. Once done, it queries all three members (Tessera) to check the value at an address. Only `Member1` & `Member3` has this information as they were involved in the transaction, `Member2` responds with a `0x` to indicate it is unaware of the transaction. ```bash node scripts/private_tx.js @@ -146,16 +133,13 @@ The general contract deployment flow is: 1. Obtain the privacy transaction receipt from the transaction hash. -1. Use the contract address in the privacy transaction receipt to - [interact with the contract](../contracts/interact.md) from that point on. +1. Use the contract address in the privacy transaction receipt to [interact with the contract](../contracts/interact.md) from that point on. ## Further examples -View the [web3js-quorum client library example](web3js-quorum.md) and view the -[sample code examples](https://github.com/ConsenSys/web3js-quorum/tree/master/example). +View the [web3js-quorum client library example](web3js-quorum.md) and view the [sample code examples](https://github.com/ConsenSys/web3js-quorum/tree/master/example). -You can also test the erc20 token example by executing `erc20.js` which deploys -a `HumanStandardToken` contract and transfers 1 token to Node2. +You can also test the erc20 token example by executing `erc20.js` which deploys a `HumanStandardToken` contract and transfers 1 token to Node2. This can be verified from the `data` field of the `logs` which is `1`. @@ -163,14 +147,14 @@ This can be verified from the `data` field of the `logs` which is `1`. Do one of the following to stop the network: -* Stop the network: +- Stop the network: - ```bash - ./stop.sh - ``` + ```bash + ./stop.sh + ``` -* Stop the network and remove the containers and volumes: +- Stop the network and remove the containers and volumes: - ```bash - ./remove.sh - ``` + ```bash + ./remove.sh + ``` diff --git a/docs/private-networks/tutorials/privacy/web3js-quorum.md b/docs/private-networks/tutorials/privacy/web3js-quorum.md index a1839a510a4..c4c7fd0f92d 100644 --- a/docs/private-networks/tutorials/privacy/web3js-quorum.md +++ b/docs/private-networks/tutorials/privacy/web3js-quorum.md @@ -1,35 +1,41 @@ --- +title: Use the web3js-quorum multi-node example +sidebar_position: 3 description: web3js-quorum client library multi-node example +tags: + - private networks --- # Use the multi-node example in the web3js-quorum client library -To use the examples provided in the web3js-quorum library with -[your privacy network](index.md): +To use the examples provided in the web3js-quorum library with [your privacy network](index.md): -!!! note +:::note - This example uses 3 of the 4 nodes configured in the [privacy tutorial](index.md). +This example uses 3 of the 4 nodes configured in the [privacy tutorial](index.md). -1. Clone the **ConsenSys/web3js-quorum** repository: +::: + +1. Clone the **ConsenSys/web3js-quorum** repository: ```bash git clone https://github.com/ConsenSys/web3js-quorum ``` -1. In the `web3js-quorum` directory: +2. In the `web3js-quorum` directory: ```bash npm install ``` -1. In the `example` directory, update the `keys.js` file to include: - * chain ID - * Tessera node public keys - * Hyperledger Besu node RPC URLs - * [Hyperledger Besu node private keys](../../../public-networks/concepts/node-keys.md#node-private-key). +3. In the `example` directory, update the `keys.js` file to include: + + - chain ID + - Tessera node public keys + - Hyperledger Besu node RPC URLs + - [Hyperledger Besu node private keys](../../../public-networks/concepts/node-keys.md#node-private-key). -1. In the `example/multiNodeExample` directory, deploy the contract: +4. In the `example/multiNodeExample` directory, deploy the contract: ```bash node deployContract.js @@ -49,25 +55,25 @@ To use the examples provided in the web3js-quorum library with logs: [] } ``` - !!! note + :::note - If you receive a `Method not enabled` error, ensure you enabled the appropriate APIs - using the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) + If you receive a `Method not enabled` error, ensure you enabled the appropriate APIs using the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) -1. Copy the contract address from the private transaction receipt and set the `CONTRACT_ADDRESS` - environment variable: + ::: + +5. Copy the contract address from the private transaction receipt and set the `CONTRACT_ADDRESS` environment variable: ```bash export CONTRACT_ADDRESS= ``` - !!! example - - ```bash - export CONTRACT_ADDRESS=0xfee84481da8f4b9a998dfacb38091b3145bb01ab - ``` + :::tip example + ```bash + export CONTRACT_ADDRESS=0xfee84481da8f4b9a998dfacb38091b3145bb01ab + ``` + ::: -1. Store a value in the contract from Node 1: +6. Store a value in the contract from Node 1: ```bash node storeValueFromNode1.js @@ -87,7 +93,7 @@ To use the examples provided in the web3js-quorum library with Get Value from http://localhost:8547: 0x ``` -1. Store a value in the contract from Node 2: +7. Store a value in the contract from Node 2: ```bash node storeValueFromNode2.js @@ -107,7 +113,8 @@ To use the examples provided in the web3js-quorum library with Get Value from http://localhost:8547: 0x ``` - !!! note + :::note + + As expected, log messages indicate that Node 3 Tessera cannot find payloads because Node 3 does not have access to the private transactions between Node 1 and Node 2. - As expected, log messages indicate that Node 3 Tessera cannot find payloads because Node 3 - does not have access to the private transactions between Node 1 and Node 2. + ::: diff --git a/docs/private-networks/tutorials/qbft.md b/docs/private-networks/tutorials/qbft.md index dd0936c6188..a8c2234ee1a 100644 --- a/docs/private-networks/tutorials/qbft.md +++ b/docs/private-networks/tutorials/qbft.md @@ -1,40 +1,39 @@ --- -description: Hyperledger Besu private network using the QBFT (proof of authority) consensus protocol +title: Create a QBFT network +sidebar_position: 2 +description: Create a private network using the QBFT consensus protocol. +tags: + - private networks --- # Create a private network using QBFT -A private network provides a configurable network for testing. This private network uses the -[QBFT (proof of authority) consensus protocol](../how-to/configure/consensus/qbft.md). +A private network provides a configurable network for testing. This private network uses the [QBFT (proof of authority) consensus protocol](../how-to/configure/consensus/qbft.md). -The QBFT network in this tutorial implements the [block header validator selection method] to manage -validators. For a tutorial on how to implement the [contract validator selection method], follow the -steps in the [example smart contract repository]. +The QBFT network in this tutorial implements the [block header validator selection method] to manage validators. For a tutorial on how to implement the [contract validator selection method], follow the steps in the [example smart contract repository]. -!!! important +:::important - The steps in this tutorial create an isolated, but not protected or secure, Ethereum private - network. We recommend running the private network behind a properly configured firewall. +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. - This tutorial configures a private network using QBFT for educational purposes only. QBFT - requires 4 validators to be Byzantine fault tolerant. +This tutorial configures a private network using QBFT for educational purposes only. QBFT requires 4 validators to be Byzantine fault tolerant. + +::: ## Prerequisites -* [Hyperledger Besu](../get-started/install/binary-distribution.md) -* [Curl (or similar webservice client)](https://curl.haxx.se/download.html). +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). ## Steps -Listed on the right-hand side of the page are the steps to create a private network using QBFT -with four nodes. The four nodes are all validators. +Listed on the right-hand side of the page are the steps to create a private network using QBFT with four nodes. The four nodes are all validators. ### 1. Create directories Each node requires a data directory for the blockchain data. -Create directories for your private network, each of the four nodes, and a data directory for each -node: +Create directories for your private network, each of the four nodes, and a data directory for each node: ```bash QBFT-Network/ @@ -50,17 +49,11 @@ QBFT-Network/ ### 2. Create a configuration file -The configuration file defines the -[QBFT genesis file](../how-to/configure/consensus/qbft.md#genesis-file) and the -number of node key pairs to generate. +The configuration file defines the [QBFT genesis file](../how-to/configure/consensus/qbft.md#genesis-file) and the number of node key pairs to generate. -The configuration file has two nested JSON nodes. The first is the `genesis` property defining -the QBFT genesis file, except for the `extraData` string, which Besu generates automatically in -the resulting genesis file. The second is the `blockchain` property defining the number of key -pairs to generate. +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the QBFT genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. -Copy the following configuration file definition to a file called `qbftConfigFile.json` and save it -in the `QBFT-Network` directory: +Copy the following configuration file definition to a file called `qbftConfigFile.json` and save it in the `QBFT-Network` directory: ```json { @@ -101,39 +94,36 @@ in the `QBFT-Network` directory: "blockchain": { "nodes": { "generate": true, - "count": 4 + "count": 4 } } } ``` -!!! note +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: - We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) - when creating the genesis file for a private network. - This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. +:::warning -!!! warning +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. - Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except - for testing. The private keys display, which means the accounts are not secure. +::: ### 3. Generate node keys and a genesis file In the `QBFT-Network` directory, generate the node key and genesis file: -=== "MacOS" - - ```bash - besu operator generate-blockchain-config --config-file=qbftConfigFile.json --to=networkFiles --private-key-file-name=key - ``` +```bash +besu operator generate-blockchain-config --config-file=qbftConfigFile.json --to=networkFiles --private-key-file-name=key +``` Besu creates the following in the `networkFiles` directory: -* `genesis.json` - The genesis file including the `extraData` property specifying the four nodes - are validators. -* A directory for each node named using the node address and containing the public and private key - for each node. +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. ```text networkFiles/ @@ -186,126 +176,121 @@ QBFT-Network/ In the `Node-1` directory, start Node-1: -=== "MacOS" + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` - ```bash - besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" - ``` + The command line: -* Specifies the data directory for Node-1 using the - [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. -* Enables the JSON-RPC API using the - [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option. -* Enables the ETH, NET, and QBFT APIs using the - [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option. -* Enables all-host access to the HTTP JSON-RPC API using the - [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. -* Enables all-domain access to the node through the HTTP JSON-RPC API using the - [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. +- Specifies the data directory for Node-1 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- Enables the JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables the ETH, NET, and QBFT APIs using the [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option. +- Enables all-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. +- Enables all-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. -When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the -enode URL to specify Node-1 as the bootnode in the following steps. +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. ![Node 1 Enode URL](../../assets/images/EnodeStartup.png) ### 7. Start Node-2 -Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + -=== "MacOS" +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` - ```bash - besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 - ``` + The command line specifies: -* The data directory for Node-2 using the - [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. -* A different port to Node-1 for P2P discovery using the - [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. -* A different port to Node-1 for HTTP JSON-RPC using the - [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. -* The enode URL of Node-1 using the - [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. -* Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). +- The data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). ### 8. Start Node-3 -Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS -=== "MacOS" +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` - ```bash - besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 - ``` +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 - ``` + The command line specifies: -* The data directory for Node-3 using the - [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. -* A different port to Node-1 and Node-2 for P2P discovery using the - [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. -* A different port to Node-1 and Node-2 for HTTP JSON-RPC using the - [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. -* The bootnode as for [Node-2](#7-start-node-2). -* Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). +- The data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). ### 9. Start Node-4 -Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 -enode URL copied when starting Node-1 as the bootnode: +Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + -=== "MacOS" +# MacOS - ```bash - besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 - ``` +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 +``` + +# Windows -=== "Windows" +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 +``` - ```bash - besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 - ``` + The command line specifies: -* The data directory for Node-4 using the - [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. -* A different port to Node-1, Node-2, and Node-3 for P2P discovery using the - [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. -* A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the - [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. -* The bootnode as for [Node-2](#7-start-node-2). -* Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). +- The data directory for Node-4 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). ### 10. Confirm the private network is working -Start another terminal, use curl to call the JSON-RPC API -[`qbft_getvalidatorsbyblocknumber`](../reference/api/index.md#qbft_getvalidatorsbyblocknumber) -method and confirm the network has four validators: +Start another terminal, use curl to call the JSON-RPC API [`qbft_getvalidatorsbyblocknumber`](../reference/api/index.md#qbft_getvalidatorsbyblocknumber) method and confirm the network has four validators: ```bash curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' localhost:8545 @@ -315,9 +300,14 @@ The result displays the four validators: ```json { - "jsonrpc" : "2.0", - "id" : 1, - "result" : [ "0x73ced0bd3def2e2d9859e3bd0882683a2e6835fb", "0x7a175f3542ceb60bf80fb536b3f42e7a30c0a6d7", "0x7f6efa6e34f8c9b591a9ad4763e21b3fca31bcd6", "0xc64140f1c9d5bb82e54976e568ad39958c3e94be" ] + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x73ced0bd3def2e2d9859e3bd0882683a2e6835fb", + "0x7a175f3542ceb60bf80fb536b3f42e7a30c0a6d7", + "0x7f6efa6e34f8c9b591a9ad4763e21b3fca31bcd6", + "0xc64140f1c9d5bb82e54976e568ad39958c3e94be" + ] } ``` @@ -331,56 +321,57 @@ Look at the logs to confirm Besu is producing blocks: 2021-05-26 08:47:08.058+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #5 / 0 tx / 0 pending / 0 (0.0%) gas / (0xba63471d62c936733add9b884f5213c3842af9f52460268e39e0666ab82f02a5) ``` -!!! important +:::important - If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), - the network will not start producing blocks. +If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), the network will not start producing blocks. - The logs for each node should indicate the public key was loaded from the `data/key` directory: +The logs for each node should indicate the public key was loaded from the `data/key` directory: - ```bash - 2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Loaded public key 0x931d32f1aec4e45b150ee38f3c74157a750fc53f523e63fe2b07bf3fce43a3de64587fc9aaf3736444f2e3eef0eea90be3b67d18be7b5b2b7cb2fcd670416a7e from /QBFT-Network/Node-1/data/key - ``` +```bash +2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Loaded public key 0x931d32f1aec4e45b150ee38f3c74157a750fc53f523e63fe2b07bf3fce43a3de64587fc9aaf3736444f2e3eef0eea90be3b67d18be7b5b2b7cb2fcd670416a7e from /QBFT-Network/Node-1/data/key +``` + +If the keys were not copied to the correct directory, Besu creates a key when starting up: - If the keys were not copied to the correct directory, Besu creates a key when starting up: +```bash +2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /QBFT-Network/Node-1/data/key +``` - ```bash - 2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /QBFT-Network/Node-1/data/key - ``` +If a new key was created, the validator key specified in the configuration does not match the created key and the node cannot participate in creating blocks. - If a new key was created, the validator key specified in the configuration does not match - the created key and the node cannot participate in creating blocks. +::: ## Next steps -Use the [QBFT API](../reference/api/index.md#qbft-methods) to remove or add validators, or import accounts -to MetaMask and send transactions as described in the -[Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). +Use the [QBFT API](../reference/api/index.md#qbft-methods) to remove or add validators, or import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). -!!! note +:::note - To add or remove nodes as validators you need the node address. The directory - [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the - name. +To add or remove nodes as validators you need the node address. The directory [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the name. - Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). -You can switch from the [block header validator selection method] configured here, to the [contract validator selection method] -by updating the genesis file and [configuring a transition]. +::: + +You can switch from the [block header validator selection method] configured here, to the [contract validator selection method] by updating the genesis file and [configuring a transition]. ## Stop the nodes When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. -!!!tip +:::tip + +To restart the QBFT network in the future, start from [step 6](#6-start-the-first-node-as-the-bootnode). - To restart the QBFT network in the future, start from - [step 6](#6-start-the-first-node-as-the-bootnode). +::: + [block header validator selection method]: ../how-to/configure/consensus/qbft.md#add-and-remove-validators-using-block-headers [contract validator selection method]: ../how-to/configure/consensus/qbft.md#add-and-remove-validators-using-a-smart-contract [example smart contract repository]: https://github.com/ConsenSys/validator-smart-contracts [configuring a transition]: ../how-to/configure/consensus/qbft.md#transitions + -*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +\*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. diff --git a/docs/private-networks/tutorials/quickstart.md b/docs/private-networks/tutorials/quickstart.md index b23b74002a7..54760801e41 100644 --- a/docs/private-networks/tutorials/quickstart.md +++ b/docs/private-networks/tutorials/quickstart.md @@ -1,37 +1,44 @@ --- -title: Developer Quickstart -description: Rapidly generate local blockchain networks. +title: Quorum Developer Quickstart +sidebar_position: 1 +description: Rapidly generate a local blockchain network using the Quickstart. +tags: + - private networks --- +import TestAccounts from '../../global/test_accounts.md'; + +import Postman from '../../global/postman.md'; + # Developer Quickstart -The Quorum Developer Quickstart uses the Hyperledger Besu Docker image to run a private -[IBFT 2.0](../how-to/configure/consensus/ibft.md) network of Besu nodes managed by Docker Compose. +The Quorum Developer Quickstart uses the Hyperledger Besu Docker image to run a private [IBFT 2.0](../how-to/configure/consensus/ibft.md) network of Besu nodes managed by Docker Compose. -!!! warning +:::danger - This tutorial runs a private network suitable for education or demonstration purposes and is not intended for - running production networks. +This tutorial runs a private network suitable for education or demonstration purposes and is not intended for running production networks. + +::: ## Prerequisites - One of the following operating systems: - - Linux on x86_64 architecture - - macOS on an Intel processor (M1 processor not supported yet) - - Windows 64-bit edition, with: - - Windows Subsystem for Linux 2 - - Docker desktop configured to use the WSL2-based engine + - Linux on x86_64 architecture + - macOS on an Intel processor (M1 processor not supported yet) + - Windows 64-bit edition, with: + - Windows Subsystem for Linux 2 + - Docker desktop configured to use the WSL2-based engine - [Docker and Docker Compose](https://docs.docker.com/compose/install/) - [Node.js](https://nodejs.org/en/download/) version 12 or higher - [Truffle](https://www.trufflesuite.com/truffle) - [cURL command line](https://curl.haxx.se/download.html) - [MetaMask](https://metamask.io/) -!!! important +:::info + +Allow Docker up to 4G of memory or 6G if running the privacy examples. Refer to the **Resources** section in [Docker for Mac](https://docs.docker.com/docker-for-mac/) and [Docker Desktop](https://docs.docker.com/docker-for-windows/) for details. - Allow Docker up to 4G of memory or 6G if running the privacy examples. - Refer to the **Resources** section in [Docker for Mac](https://docs.docker.com/docker-for-mac/) and - [Docker Desktop](https://docs.docker.com/docker-for-windows/) for details. +::: ## Generate the tutorial blockchain configuration files @@ -41,15 +48,13 @@ To create the tutorial `docker-compose` files and artifacts, run: npx quorum-dev-quickstart ``` -Follow the prompts displayed to run Hyperledger Besu and [logging with ELK](../how-to/monitor/elastic-stack.md). -Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) and -[private transactions](../concepts/privacy/index.md). +Follow the prompts displayed to run Hyperledger Besu and [logging with ELK](../how-to/monitor/elastic-stack.md). Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) and [private transactions](../concepts/privacy/index.md). -!!! note +:::note - If you enter `y` for private transactions, you get three Besu nodes with corresponding Tessera nodes for privacy. - You can follow the [privacy walk-through](privacy/index.md), which details how to send private - transactions and interact with deployed private contracts. +If you enter `y` for private transactions, you get three Besu nodes with corresponding Tessera nodes for privacy. You can follow the [privacy walk-through](privacy/index.md), which details how to send private transactions and interact with deployed private contracts. + +::: ## Start the network @@ -65,44 +70,32 @@ Four Besu IBFT 2.0 validator nodes and a non-validator node are created to simul When execution is successfully finished, the process lists the available services: -!!! example "Services list" - - ```log - ************************************* - Quorum Dev Quickstart - ************************************* - ---------------------------------- - List endpoints and services - ---------------------------------- - JSON-RPC HTTP service endpoint : http://localhost:8545 - JSON-RPC WebSocket service endpoint : ws://localhost:8546 - Web block explorer address : http://localhost:25000/ - Prometheus address : http://localhost:9090/graph - Grafana address : http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All - Kibana logs address : http://localhost:5601/app/kibana#/discover - Collated logs using Grafana Loki : http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search= - - For more information on the endpoints and services, refer to README.md in the installation directory. - **************************************************************** - ``` - -- Use the **JSON-RPC HTTP service endpoint** to access the RPC node service from your dapp or from - cryptocurrency wallets such as MetaMask. -- Use the **JSON-RPC WebSocket service endpoint** to access the Web socket node service from your - dapp. +```log title="Services list" +************************************* +Quorum Dev Quickstart +************************************* +---------------------------------- +List endpoints and services +---------------------------------- +JSON-RPC HTTP service endpoint : http://localhost:8545 +JSON-RPC WebSocket service endpoint : ws://localhost:8546 +Web block explorer address : http://localhost:25000/ +Prometheus address : http://localhost:9090/graph +Grafana address : http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All +Kibana logs address : http://localhost:5601/app/kibana#/discover +Collated logs using Grafana Loki : http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search= + +For more information on the endpoints and services, refer to README.md in the installation directory. +**************************************************************** +``` + +- Use the **JSON-RPC HTTP service endpoint** to access the RPC node service from your dapp or from cryptocurrency wallets such as MetaMask. +- Use the **JSON-RPC WebSocket service endpoint** to access the Web socket node service from your dapp. - Use the **Web block explorer address** to display the [block explorer Web application](http://localhost:25000). -- Use the **Prometheus address** to access the - [Prometheus dashboard](http://localhost:9090/graph). - [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). -- Use the **Grafana address** to access the - [Grafana dashboard](http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All). - [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). -- Use the **Kibana logs address** to access the - [logs in Kibana](http://localhost:5601/app/kibana#/discover). - [Read more about log management](../how-to/monitor/elastic-stack.md). -- Use the **Grafana Loki logs address** to access the - [logs in Grafana](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=). - [Read more about log management](../how-to/monitor/loki.md). +- Use the **Prometheus address** to access the [Prometheus dashboard](http://localhost:9090/graph). [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). +- Use the **Grafana address** to access the [Grafana dashboard](http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All). [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). +- Use the **Kibana logs address** to access the [logs in Kibana](http://localhost:5601/app/kibana#/discover). [Read more about log management](../how-to/monitor/elastic-stack.md). +- Use the **Grafana Loki logs address** to access the [logs in Grafana](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=). [Read more about log management](../how-to/monitor/loki.md). To display the list of endpoints again, run: @@ -112,15 +105,13 @@ To display the list of endpoints again, run: ## Use a block explorer -You can [use Sirato Blockchain Explorer](../how-to/monitor/sirato-explorer.md) to analyze block -information, contract metadata, transaction searches, and more. -Sirato has built-in support for privacy-enabled Besu networks. +You can [use Sirato Blockchain Explorer](../how-to/monitor/sirato-explorer.md) to analyze block information, contract metadata, transaction searches, and more. Sirato has built-in support for privacy-enabled Besu networks. -!!! note - You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, - in order to allow access for Besu [privacy API methods](../reference/api/index.md#priv-methods). - In production networks, you must - [secure access](../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. +:::note + +You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, in order to allow access for Besu [privacy API methods](../reference/api/index.md#priv-methods). In production networks, you must [secure access](../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. + +::: Clone the [Sirato GitHub repository](https://github.com/web3labs/sirato-free): @@ -135,9 +126,7 @@ cd docker-compose NODE_ENDPOINT=member1besu PORT=26000 docker-compose -f docker-compose.yml -f sirato-extensions/docker-compose-quorum-dev-quickstart.yml up ``` -Open `http://localhost/` on your browser. -You’ll see the new initialization page while it boots up. -This may take 5–10 minutes for the all services to start and the ingestion sync to complete. +Open `http://localhost/` on your browser. You’ll see the new initialization page while it boots up. This may take 5–10 minutes for the all services to start and the ingestion sync to complete. To stop all the services from running, run the following script from the `docker-compose` directory: @@ -147,17 +136,13 @@ docker-compose down -v ## Monitor nodes with Prometheus and Grafana -The sample network also includes Prometheus and Grafana monitoring tools to let you visualize node health and usage. -You can directly access these tools from your browser at the addresses displayed in the endpoint list. +The sample network also includes Prometheus and Grafana monitoring tools to let you visualize node health and usage. You can directly access these tools from your browser at the addresses displayed in the endpoint list. - [Prometheus dashboard](http://localhost:9090/graph) - [Grafana dashboard](http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All) - [Grafana Loki logs dashboard](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=quorum&var-search=) -For more details on how to configure and use these tools for your own nodes, see the -[performance monitoring documentation](../../public-networks/how-to/monitor/metrics.md), -[Prometheus documentation](https://prometheus.io/docs/introduction/overview/) -and [Grafana documentation](https://grafana.com/docs/). +For more details on how to configure and use these tools for your own nodes, see the [performance monitoring documentation](../../public-networks/how-to/monitor/metrics.md), [Prometheus documentation](https://prometheus.io/docs/introduction/overview/) and [Grafana documentation](https://grafana.com/docs/). ![Grafana dashboard screenshot](../../assets/images/grafana.png) @@ -180,7 +165,7 @@ This tutorial uses [cURL](https://curl.haxx.se/download.html) to send JSON-RPC r You can also run all the requests with the Besu Postman collection. ---8<-- "global/postman.md" + ### Request the node version @@ -192,32 +177,32 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[], The result displays the client version of the running node: -=== "Result example" + + +# Result example + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "besu/v21.1.2/linux-x86_64/oracle_openjdk-java-11" +} +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "besu/v21.1.2/linux-x86_64/oracle_openjdk-java-11" - } - ``` +# Result explanation -=== "Result explanation" +- `"jsonrpc" : "2.0"` indicates that the JSON-RPC 2.0 spec format is used. +- `"id" : 1` is the request identifier used to match the request and the response. This tutorial always uses 1. +- `"result"` contains the running Besu information: + - `v21.1.2` is the running Besu version number. This may be different when you run this tutorial. + - `linux-x86_64` is the architecture used to build this version. + - `oracle_openjdk-java-11` is the JVM type and version used to build this version. This may be different when you run this tutorial. - - `"jsonrpc" : "2.0"` indicates that the JSON-RPC 2.0 spec format is used. - - `"id" : 1` is the request identifier used to match the request and the response. - This tutorial always uses 1. - - `"result"` contains the running Besu information: - - `v21.1.2` is the running Besu version number. - This may be different when you run this tutorial. - - `linux-x86_64` is the architecture used to build this version. - - `oracle_openjdk-java-11` is the JVM type and version used to build this version. - This may be different when you run this tutorial. + Successfully calling this method shows that you can connect to the nodes using JSON-RPC over HTTP. -From here, you can walk through more interesting requests demonstrated in the rest of this section, -or skip ahead to [Create a transaction using MetaMask](#create-a-transaction-using-metamask). +From here, you can walk through more interesting requests demonstrated in the rest of this section, or skip ahead to [Create a transaction using MetaMask](#create-a-transaction-using-metamask). ### Count the peers @@ -233,16 +218,15 @@ The result indicates that there are four peers (the validators): ```json { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x4" + "jsonrpc": "2.0", + "id": 1, + "result": "0x4" } ``` ### Request the most recent block number -Call [`eth_blockNumber`](../../public-networks/reference/api/index.md#eth_blockNumber) to retrieve the number of the most recently -synchronized block: +Call [`eth_blockNumber`](../../public-networks/reference/api/index.md#eth_blockNumber) to retrieve the number of the most recently synchronized block: ```bash curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http://localhost:8545 @@ -252,50 +236,46 @@ The result indicates the highest block number synchronized on this node. ```json { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x2a" + "jsonrpc": "2.0", + "id": 1, + "result": "0x2a" } ``` -Here the hexadecimal value `0x2a` translates to decimal as `42`, the number of blocks received by the node so far, -about two minutes after the new network started. +Here the hexadecimal value `0x2a` translates to decimal as `42`, the number of blocks received by the node so far, about two minutes after the new network started. ## Create a transaction using MetaMask You can use [MetaMask](https://metamask.io/) to send a transaction on your private network. 1. Open MetaMask and connect it to your private network RPC endpoint by selecting `Localhost 8545` in the network list. -1. Choose one of the following test accounts and - [import it into MetaMask by copying the corresponding private key](https://metamask.zendesk.com/hc/en-us/articles/360015489331-How-to-import-an-Account). +1. Choose one of the following test accounts and [import it into MetaMask by copying the corresponding private key](https://metamask.zendesk.com/hc/en-us/articles/360015489331-How-to-import-an-Account). ---8<-- "global/test_accounts.md" + -!!! note +:::note - Besu doesn't incorporate [account management](../../public-networks/how-to/send-transactions.md). - To create your own account, you have to use a third-party tool, such as MetaMask. +Besu doesn't incorporate [account management](../../public-networks/how-to/send-transactions.md). To create your own account, you have to use a third-party tool, such as MetaMask. -1. After importing an existing test account, [create another test account from scratch] to use as the recipient for a - test Ether transaction. +::: -1. In MetaMask, select the new test account and - [copy its address](https://metamask.zendesk.com/hc/en-us/articles/360015289512-How-to-copy-your-MetaMask-Account-Public-Address). +1. After importing an existing test account, [create another test account from scratch] to use as the recipient for a test Ether transaction. -1. In the [Block Explorer](http://localhost:25000), search for the new test account by selecting the :mag: and pasting - the test account address into the search box. +1. In MetaMask, select the new test account and [copy its address](https://metamask.zendesk.com/hc/en-us/articles/360015289512-How-to-copy-your-MetaMask-Account-Public-Address). + +1. In the [Block Explorer](http://localhost:25000), search for the new test account by selecting the :mag: and pasting the test account address into the search box. The new test account displays with a zero balance. -1. [Send test Ether](https://metamask.zendesk.com/hc/en-us/articles/360015488931-How-to-send-ETH-and-ERC-20-tokens-from-your-MetaMask-Wallet) - from the first test account (containing test Ether) to the new test account (which has a zero balance). +1. [Send test Ether](https://metamask.zendesk.com/hc/en-us/articles/360015488931-How-to-send-ETH-and-ERC-20-tokens-from-your-MetaMask-Wallet) from the first test account (containing test Ether) to the new test account (which has a zero balance). + + :::tip - !!! tip + You can use a zero gas price here as this private test network is a [free gas network](../how-to/configure/free-gas.md), but the maximum amount of gas that can be used (the gas limit) for a value transaction must be at least 21000. - You can use a zero gas price here as this private test network is a [free gas network](../how-to/configure/free-gas.md), - but the maximum amount of gas that can be used (the gas limit) for a value transaction must be at least 21000. + ::: -1. Refresh the Block Explorer page in your browser displaying the target test account. +1. Refresh the Block Explorer page in your browser displaying the target test account. The updated balance reflects the transaction completed using MetaMask. @@ -305,11 +285,9 @@ You can use a demo dapp called Pet Shop, provided by [Truffle](https://www.truff The dapp runs a local website using Docker, and uses smart contracts deployed on the network. -The directory created by `quorum-dev-quickstart` includes a `dapps` directory with a `pet-shop` subdirectory, -which contains the source code for the dapp, including the smart contracts, website, and configurations to run this tutorial. +The directory created by `quorum-dev-quickstart` includes a `dapps` directory with a `pet-shop` subdirectory, which contains the source code for the dapp, including the smart contracts, website, and configurations to run this tutorial. -With the blockchain running and MetaMask connected to `Localhost 8545` via the browser, -run the following command to start the Pet Shop dapp: +With the blockchain running and MetaMask connected to `Localhost 8545` via the browser, run the following command to start the Pet Shop dapp: ```bash cd dapps/pet-shop @@ -324,115 +302,111 @@ The script: 1. Runs tests. 1. Builds and runs a Docker image to serve the dapp website. -!!! example "`./run_dapp.sh` example output" - - ```text - Compiling your contracts... - =========================== - > Compiling ./contracts/Adoption.sol - > Compiling ./contracts/Migrations.sol - > Artifacts written to /Users/demo/quorum-test-network/dapps/pet-shop/pet-shop-box/build/contracts - > Compiled successfully using: - - solc: 0.5.16+commit.9c3226ce.Emscripten.clang - - Starting migrations... - ====================== - > Network name: 'quickstartWallet' - > Network id: 1337 - > Block gas limit: 16234336 (0xf7b760) - - 1_initial_migration.js - ====================== - - Deploying 'Migrations' - ---------------------- - > transaction hash: 0xdd27f5bc5b0c4a42bb4f4d9ba00b4d33742de10ba8f03484cbf095ee824ba11a - > Blocks: 0 Seconds: 0 - > contract address: 0xFB88dE099e13c3ED21F80a7a1E49f8CAEcF10df6 - > block number: 2747 - > block timestamp: 1618000437 - > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 - > balance: 89999.97435026 - > gas used: 221555 (0x36173) - > gas price: 20 gwei - > value sent: 0 ETH - > total cost: 0.0044311 ETH - - - > Saving migration to chain. - > Saving artifacts - ------------------------------------- - > Total cost: 0.0044311 ETH - - 2_deploy_contracts.js - ===================== - - Deploying 'Adoption' - -------------------- - > transaction hash: 0xd6f5b11807a0727a92b6063c95b9101769d310592b0d3cf35d6df233d05d50e6 - > Blocks: 0 Seconds: 0 - > contract address: 0xf204a4Ef082f5c04bB89F7D5E6568B796096735a - > block number: 2749 - > block timestamp: 1618000441 - > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 - > balance: 89999.968712 - > gas used: 239915 (0x3a92b) - > gas price: 20 gwei - > value sent: 0 ETH - > total cost: 0.0047983 ETH - - - > Saving migration to chain. - > Saving artifacts - ------------------------------------- - > Total cost: 0.0047983 ETH - - Summary - ======= - > Total deployments: 2 - > Final cost: 0.0092294 ETH - - - Using network 'quickstartWallet'. - - Compiling your contracts... - =========================== - > Compiling ./test/TestAdoption.sol - - TestAdoption - ✓ testUserCanAdoptPet (2071ms) - ✓ testGetAdopterAddressByPetId (6070ms) - ✓ testGetAdopterAddressByPetIdInArray (6077ms) - - 3 passing (37s) - ``` - - After these tests are successful, the script builds a container for the Pet Shop dapp and deploys it, - binding it to port 3001 on your system. - - ```text - Sending build context to Docker daemon 489.4MB - Step 1/5 : FROM node:12.14.1-stretch-slim - ---> 2f7e25ad14ea - Step 2/5 : EXPOSE 3001 - ---> Using cache - ---> 2ef0665a040a - Step 3/5 : WORKDIR /app - ---> Using cache - ---> e8e97cedb575 - Step 4/5 : COPY . /app - ---> f70e4265e598 - Step 5/5 : CMD npm run dev - ---> Running in 3c6e8bdb3f3b - Removing intermediate container 3c6e8bdb3f3b - ---> ce2588e47ab0 - Successfully built ce2588e47ab0 - Successfully tagged quorum-dev-quickstart_pet_shop:latest - b1615ab765656bc027f63fc60019dba1ca572305766c820f41eaf113b7e14cf8 - ``` - -In the browser where you have MetaMask enabled and one of the test accounts loaded, open a new tab and navigate -to [the Pet Shop dapp](http://localhost:3001) where you can adopt lovely pets (sorry, not for real, it's a demo). +```text './run_dapp.sh' example output +Compiling your contracts... +=========================== +> Compiling ./contracts/Adoption.sol +> Compiling ./contracts/Migrations.sol +> Artifacts written to /Users/demo/quorum-test-network/dapps/pet-shop/pet-shop-box/build/contracts +> Compiled successfully using: + - solc: 0.5.16+commit.9c3226ce.Emscripten.clang + +Starting migrations... +====================== +> Network name: 'quickstartWallet' +> Network id: 1337 +> Block gas limit: 16234336 (0xf7b760) + +1_initial_migration.js +====================== + + Deploying 'Migrations' + ---------------------- + > transaction hash: 0xdd27f5bc5b0c4a42bb4f4d9ba00b4d33742de10ba8f03484cbf095ee824ba11a + > Blocks: 0 Seconds: 0 + > contract address: 0xFB88dE099e13c3ED21F80a7a1E49f8CAEcF10df6 + > block number: 2747 + > block timestamp: 1618000437 + > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 + > balance: 89999.97435026 + > gas used: 221555 (0x36173) + > gas price: 20 gwei + > value sent: 0 ETH + > total cost: 0.0044311 ETH + + + > Saving migration to chain. + > Saving artifacts + ------------------------------------- + > Total cost: 0.0044311 ETH + +2_deploy_contracts.js +===================== + + Deploying 'Adoption' + -------------------- + > transaction hash: 0xd6f5b11807a0727a92b6063c95b9101769d310592b0d3cf35d6df233d05d50e6 + > Blocks: 0 Seconds: 0 + > contract address: 0xf204a4Ef082f5c04bB89F7D5E6568B796096735a + > block number: 2749 + > block timestamp: 1618000441 + > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 + > balance: 89999.968712 + > gas used: 239915 (0x3a92b) + > gas price: 20 gwei + > value sent: 0 ETH + > total cost: 0.0047983 ETH + + + > Saving migration to chain. + > Saving artifacts + ------------------------------------- + > Total cost: 0.0047983 ETH + +Summary +======= +> Total deployments: 2 +> Final cost: 0.0092294 ETH + + +Using network 'quickstartWallet'. + +Compiling your contracts... +=========================== +> Compiling ./test/TestAdoption.sol + +TestAdoption +✓ testUserCanAdoptPet (2071ms) +✓ testGetAdopterAddressByPetId (6070ms) +✓ testGetAdopterAddressByPetIdInArray (6077ms) + +3 passing (37s) +``` + +After these tests are successful, the script builds a container for the Pet Shop dapp and deploys it, binding it to port 3001 on your system. + +```text +Sending build context to Docker daemon 489.4MB +Step 1/5 : FROM node:12.14.1-stretch-slim +---> 2f7e25ad14ea +Step 2/5 : EXPOSE 3001 +---> Using cache +---> 2ef0665a040a +Step 3/5 : WORKDIR /app +---> Using cache +---> e8e97cedb575 +Step 4/5 : COPY . /app +---> f70e4265e598 +Step 5/5 : CMD npm run dev +---> Running in 3c6e8bdb3f3b +Removing intermediate container 3c6e8bdb3f3b +---> ce2588e47ab0 +Successfully built ce2588e47ab0 +Successfully tagged quorum-dev-quickstart_pet_shop:latest +b1615ab765656bc027f63fc60019dba1ca572305766c820f41eaf113b7e14cf8 +``` + +In the browser where you have MetaMask enabled and one of the test accounts loaded, open a new tab and navigate to [the Pet Shop dapp](http://localhost:3001) where you can adopt lovely pets (sorry, not for real, it's a demo). When you select **Adopt**, a MetaMask window pops up and requests your permission to continue with the transaction. @@ -450,13 +424,9 @@ The MetMask UI also keeps a record of the transaction. ### Deploy your own dapp -You can deploy your own dapp to the Quorum Developer Quickstart, by configuring your dapp to point to the Quickstart -network. +You can deploy your own dapp to the Quorum Developer Quickstart, by configuring your dapp to point to the Quickstart network. -If you're using [Truffle](https://trufflesuite.com/truffle/), update the `networks` object in the -[Truffle configuration file](https://trufflesuite.com/docs/truffle/reference/configuration#networks) to specify which -networks to connect to for deployments and testing. -The Quickstart RPC service endpoint is `http://localhost:8545`. +If you're using [Truffle](https://trufflesuite.com/truffle/), update the `networks` object in the [Truffle configuration file](https://trufflesuite.com/docs/truffle/reference/configuration#networks) to specify which networks to connect to for deployments and testing. The Quickstart RPC service endpoint is `http://localhost:8545`. For example, the following is the Truffle configuration file for the Pet Shop dapp used in the Quickstart Besu network: @@ -464,23 +434,25 @@ For example, the following is the Truffle configuration file for the Pet Shop da const PrivateKeyProvider = require("@truffle/hdwallet-provider"); // insert the private key of the account used in MetaMask, e.g. Account 1 (Miner Coinbase Account) -const privateKey = "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; +const privateKey = + "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; module.exports = { networks: { development: { host: "127.0.0.1", port: 7545, - network_id: "*" // Match any network id + network_id: "*", // Match any network id }, develop: { - port: 8545 + port: 8545, }, quickstartWallet: { - provider: () => new PrivateKeyProvider(privateKey, "http://localhost:8545"), + provider: () => + new PrivateKeyProvider(privateKey, "http://localhost:8545"), network_id: "*", - } - } + }, + }, }; ``` @@ -508,8 +480,7 @@ To restart the private network: ## Stop the private network and remove containers -To shut down the private network and delete all containers and images created from running the sample network and the -Pet Shop dapp: +To shut down the private network and delete all containers and images created from running the sample network and the Pet Shop dapp: ```bash ./remove.sh @@ -521,9 +492,7 @@ New nodes joining an existing network require the following: - The same genesis file used by all other nodes on the running network. - A list of nodes to connect to; this is done by specifying [bootnodes], or by providing a list of [static nodes]. -- A node key pair and optionally an account. If the running network is using permissions, then you need - to add the new node's enode details to the [permissions file] used by existing nodes, or update - the onchain permissioning contract. +- A node key pair and optionally an account. If the running network is using permissions, then you need to add the new node's enode details to the [permissions file] used by existing nodes, or update the onchain permissioning contract. The following steps describe the process to add a new node to the Developer Quickstart. @@ -537,21 +506,23 @@ npm install node generate_node_keys.js --password "Password" ``` -!!! note +:::note + +The `--password` parameter is optional. - The `--password` parameter is optional. +::: ### 2. Create new node directory Navigate to the directory where the configuration files for the network were created. -!!! note +:::note - The directory was specified in an earlier step when running `npx quorum-dev-quickstart`. The default - location is `./quorum-test-network`. +The directory was specified in an earlier step when running `npx quorum-dev-quickstart`. The default location is `./quorum-test-network`. -In the `config/nodes` directory, create a subdirectory for the new node (for example, `newnode`), and move the -`nodekey`, `nodekey.pub`, `address` and `accountkey` files from the previous step into this directory. +::: + +In the `config/nodes` directory, create a subdirectory for the new node (for example, `newnode`), and move the `nodekey`, `nodekey.pub`, `address` and `accountkey` files from the previous step into this directory. ### 3. Update docker-compose @@ -573,18 +544,17 @@ newnode: ipv4_address: 172.16.239.41 ``` -!!! important - - Select an IP address and port map not being used for the other containers. - Mount the newly created folder `./config/nodes/newnode` to the `/opt/besu/keys` directory of the new node, as seen - in this example. +:::caution important +Select an IP address and port map not being used for the other containers. +Mount the newly created folder `./config/nodes/newnode` to the `/opt/besu/keys` directory of the new node, as seen +in this example. +::: ### 4. Update Prometheus configuration Update `prometheus.yml` in the `./config/prometheus/` directory to configure metrics to display in Grafana. -Insert the following under `scrape_configs` section in the file. -Change `job_name` and `targets` appropriately if you've updated them. +Insert the following under `scrape_configs` section in the file. Change `job_name` and `targets` appropriately if you've updated them. ```yaml - job_name: newnode @@ -598,27 +568,21 @@ Change `job_name` and `targets` appropriately if you've updated them. ### 5. Update files with the enode address -Add the new node's enode address to the [static nodes] file and [permissions file]. -The enode uses the format `enode://pubkey@ip_address:30303`. -If the `nodekey.pub` is `4540ea...9c1d78` and the IP address is `172.16.239.41`, then the enode address is -`"enode://4540ea...9c1d78@172.16.239.41:30303"`, which must be added to both files. +Add the new node's enode address to the [static nodes] file and [permissions file]. The enode uses the format `enode://pubkey@ip_address:30303`. If the `nodekey.pub` is `4540ea...9c1d78` and the IP address is `172.16.239.41`, then the enode address is `"enode://4540ea...9c1d78@172.16.239.41:30303"`, which must be added to both files. + +Alternatively, call the [`perm_addNodesToAllowlist`](../../public-networks/reference/api/index.md#perm_addnodestoallowlist) API method on existing nodes to add the new node without restarting. -Alternatively, call the -[`perm_addNodesToAllowlist`](../../public-networks/reference/api/index.md#perm_addnodestoallowlist) API method on existing nodes to add -the new node without restarting. +:::note -!!! note +Calling the API method by itself only persists for as long as the nodes remain online and is lost on the next restart. - Calling the API method by itself only persists for as long as the nodes remain online and is lost on the next restart. +On a live network, the new node must be added to the [permissions file] so that subsequent restarts of the nodes are aware of the change. - On a live network, the new node must be added to the [permissions file] so that subsequent restarts of the nodes are - aware of the change. +::: ### 6. Start the network -Once complete, start the network up with `./run.sh`. -When using the smart contract you can either make changes via a [dapp](https://github.com/ConsenSys/permissioning-smart-contracts) -or via [RPC API calls](../../public-networks/reference/api/index.md#perm_addnodestoallowlist). +Once complete, start the network up with `./run.sh`. When using the smart contract you can either make changes via a [dapp](https://github.com/ConsenSys/permissioning-smart-contracts) or via [RPC API calls](../../public-networks/reference/api/index.md#perm_addnodestoallowlist). diff --git a/docs/public-networks/concepts/_category_.json b/docs/public-networks/concepts/_category_.json new file mode 100644 index 00000000000..0eb56feedb7 --- /dev/null +++ b/docs/public-networks/concepts/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Concepts", + "position": 4, + "link": { + "type": "generated-index", + "slug": "public-networks/concepts" + } +} diff --git a/docs/public-networks/concepts/data-storage-formats.md b/docs/public-networks/concepts/data-storage-formats.md index ab08f9cfd3f..30802b9a080 100644 --- a/docs/public-networks/concepts/data-storage-formats.md +++ b/docs/public-networks/concepts/data-storage-formats.md @@ -1,5 +1,9 @@ --- -description: Data storage formats +title: Data storage formats +sidebar_position: 3 +description: Learn about storing data using Forest of Tries and Bonsai Tries. +tags: + - public networks --- # Data storage formats @@ -10,84 +14,80 @@ Besu offers two formats for storing the world state, [Forest of Tries](#forest-o Forest of Tries, also called forest mode, is the default storage format. -In forest mode, each node in the trie is saved in a key-value store by hash. For each block, the world state is updated -with new nodes, leaf nodes, and a new state root. Old leaf nodes remain in the underlying data store. Data is accessed -and stored by hash, which increases the size of the database and increases the resources and time needed to access account data. +In forest mode, each node in the trie is saved in a key-value store by hash. For each block, the world state is updated with new nodes, leaf nodes, and a new state root. Old leaf nodes remain in the underlying data store. Data is accessed and stored by hash, which increases the size of the database and increases the resources and time needed to access account data. + +

![forest_of_tries](../../assets/images/forest_of_tries.png) +

+ ### Pruning -Pruning reduces the storage required by removing state trie nodes unreachable -from [recent blocks](../../public-networks/reference/cli/options.md#pruning-blocks-retained). +Pruning reduces the storage required by removing state trie nodes unreachable from [recent blocks](../../public-networks/reference/cli/options.md#pruning-blocks-retained). -Pruning is disabled by default, and can be enabled with the -[`--pruning-enabled`](../../public-networks/reference/cli/options.md#pruning-enabled) command line option. +Pruning is disabled by default, and can be enabled with the [`--pruning-enabled`](../../public-networks/reference/cli/options.md#pruning-enabled) command line option. -!!! Important +:::info - Using pruning with [private transactions](../../private-networks/concepts/privacy/private-transactions)\ - isn't supported. +Using pruning with [private transactions](../../private-networks/concepts/privacy/private-transactions)\ +isn't supported. + +::: Pruning might increase block import times, but it doesn't affect the ability of nodes to stay in sync. -!!! Important +:::caution + +Pruning is being deprecated for [Bonsai Tries](#bonsai-tries) and is currently not being updated. - Pruning is being deprecated for [Bonsai Tries](#bonsai-tries) and is currently not being updated. +::: ## Bonsai Tries -Bonsai Tries is a data storage layout policy designed to reduce storage requirements and increase -read performance. +Bonsai Tries is a data storage layout policy designed to reduce storage requirements and increase read performance. -Bonsai stores leaf values in a trie log, separate from the branches of the trie. Bonsai stores nodes by the -location of the node instead of the hash of the node. Bonsai can access the leaf from the underlying storage directly using the -account key. This greatly reduces the disk space needed for storage and allows for less resource-demanding -and faster read performance. Bonsai inherently prunes orphaned nodes and old branches. +Bonsai stores leaf values in a trie log, separate from the branches of the trie. Bonsai stores nodes by the location of the node instead of the hash of the node. Bonsai can access the leaf from the underlying storage directly using the account key. This greatly reduces the disk space needed for storage and allows for less resource-demanding and faster read performance. Bonsai inherently prunes orphaned nodes and old branches. -To run a node with Bonsai Tries data storage format, use the command line option -[`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). +To run a node with Bonsai Tries data storage format, use the command line option [`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). + +

![Bonsai_tries](../../assets/images/Bonsai_tries.png) +

+ ## Forest of Tries vs. Bonsai Tries ### Storage requirements -Forest mode uses significantly more memory than Bonsai. -With an [archive node](../get-started/connect/sync-node.md#run-an-archive-node), forest mode uses an estimated 12 TB of -storage, while Bonsai uses an estimated 1100 GB of storage. -With a [full node](../get-started/connect/sync-node.md#run-a-full-node), forest mode uses an estimated 750 GB of storage, -while Bonsai uses an estimated 650 GB of storage. +Forest mode uses significantly more memory than Bonsai. With an [archive node](../get-started/connect/sync-node.md#run-an-archive-node), forest mode uses an estimated 12 TB of storage, while Bonsai uses an estimated 1100 GB of storage. With a [full node](../get-started/connect/sync-node.md#run-a-full-node), forest mode uses an estimated 750 GB of storage, while Bonsai uses an estimated 650 GB of storage. ### Accessing data -Forest mode must go through all the branches by hash to read a leaf value. Bonsai can access the leaf from the -underlying storage directly using the account key. Bonsai will generally read faster than forest mode, -particularly if the blocks are more recent. +Forest mode must go through all the branches by hash to read a leaf value. Bonsai can access the leaf from the underlying storage directly using the account key. Bonsai will generally read faster than forest mode, particularly if the blocks are more recent. -However, Bonsai becomes increasingly more resource-intensive the further in history you try to read data. -To prevent this, you can limit how far Bonsai looks back while reconstructing data. -The default limit Bonsai looks back is 512. To change the parameter, use the -[`--bonsai-historical-block-limit`](../reference/cli/options.md#bonsai-historical-block-limit) option. +However, Bonsai becomes increasingly more resource-intensive the further in history you try to read data. To prevent this, you can limit how far Bonsai looks back while reconstructing data. The default limit Bonsai looks back is 512. To change the parameter, use the [`--bonsai-historical-block-limit`](../reference/cli/options.md#bonsai-historical-block-limit) option. -!!! note +:::note - Using `--bonsai-historical-block-limit` doesn't affect the size of the database being stored, only how far back to load. - This means there is no "safe minimum" value to use with this option. +Using `--bonsai-historical-block-limit` doesn't affect the size of the database being stored, only how far back to load. This means there is no "safe minimum" value to use with this option. + +::: ### Syncing nodes -The following table shows the ways you can [sync a full node](../get-started/connect/sync-node.md#run-a-full-node) with the different data -storage formats using [fast](../get-started/connect/sync-node.md#fast-synchronization) and [snap](../get-started/connect/sync-node.md#snap-synchronization) sync. +The following table shows the ways you can [sync a full node](../get-started/connect/sync-node.md#run-a-full-node) with the different data storage formats using [fast](../get-started/connect/sync-node.md#fast-synchronization) and [snap](../get-started/connect/sync-node.md#snap-synchronization) sync. | Data storage format | Sync mode | Storage estimate | Can other nodes sync to your node? | -|---------------------|-----------|------------------|------------------------------------| -| Bonsai | Fast | 650 GB | No | -| Bonsai | Snap | 650 GB | To be implemented | -| Forest | Fast | 750 GB | Yes | -| Forest | Snap | 750 GB | No | +| --- | --- | --- | --- | +| Bonsai | Fast | 650 GB | No | +| Bonsai | Snap | 650 GB | To be implemented | +| Forest | Fast | 750 GB | Yes | +| Forest | Snap | 750 GB | No | + +:::tip -!!! important +We recommend using snap sync with Bonsai for the fastest sync and lowest storage requirements. - We recommend using snap sync with Bonsai for the fastest sync and lowest storage requirements. +::: diff --git a/docs/public-networks/concepts/events-and-logs.md b/docs/public-networks/concepts/events-and-logs.md index e8520e36320..c5b78fe2bbb 100644 --- a/docs/public-networks/concepts/events-and-logs.md +++ b/docs/public-networks/concepts/events-and-logs.md @@ -1,6 +1,9 @@ --- -description: Hyperledger Besu events and logs +title: Events and logs +sidebar_position: 6 +description: Learn about events and logs in Besu. tags: + - public networks - private networks --- @@ -8,207 +11,176 @@ tags: Transaction mining causes smart contracts to emit events and write logs to the blockchain. -The smart contract address is the link to the logs and the blockchain includes the logs, but -contracts cannot access logs. Log storage is cheaper than contract storage (that is, it costs less -gas) so storing and accessing the required data in logs reduces the cost. For example, use logs to -display all transfers made using a specific contract, but not the current state of the contract. +The smart contract address is the link to the logs and the blockchain includes the logs, but contracts cannot access logs. Log storage is cheaper than contract storage (that is, it costs less gas) so storing and accessing the required data in logs reduces the cost. For example, use logs to display all transfers made using a specific contract, but not the current state of the contract. -A Dapp front end can either access logs using the -[JSON-RPC API filter methods](../how-to/use-besu-api/access-logs.md) or -subscribe to logs using the [RPC Pub/Sub API](../how-to/use-besu-api/rpc-pubsub.md#logs). +A Dapp front end can either access logs using the [JSON-RPC API filter methods](../how-to/use-besu-api/access-logs.md) or subscribe to logs using the [RPC Pub/Sub API](../how-to/use-besu-api/rpc-pubsub.md#logs). -Use [`admin_generateLogBloomCache`](../reference/api/index.md#admin_generatelogbloomcache) to -improve log retrieval performance. +Use [`admin_generateLogBloomCache`](../reference/api/index.md#admin_generatelogbloomcache) to improve log retrieval performance. ## Topics -Log entries contain up to four topics. The first topic is the -[event signature hash](#event-signature-hash) and up to three topics are the indexed -[event parameters](#event-parameters). - -!!! example - - A log entry for an event with one indexed parameter: - - ```json - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x84", - "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", - "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", - "transactionIndex": "0x0", - "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", - "data": "0x", - "topics": [ - "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", - "0x0000000000000000000000000000000000000000000000000000000000000001" - ] - } - ``` +Log entries contain up to four topics. The first topic is the [event signature hash](#event-signature-hash) and up to three topics are the indexed [event parameters](#event-parameters). + +```json title="A log entry for an event with one indexed parameter" +{ + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x84", + "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", + "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] +} +``` ## Event parameters -Up to three event parameters can have the `indexed` attribute. Logs store these indexed parameters -as `topics`. Indexed parameters are searchable and filterable. +Up to three event parameters can have the `indexed` attribute. Logs store these indexed parameters as `topics`. Indexed parameters are searchable and filterable. -Topics are 32 bytes. If an indexed argument is an array (including `string` and `byte` datatypes), -the log stores the keccak-256 hash of the parameter as a topic. +Topics are 32 bytes. If an indexed argument is an array (including `string` and `byte` datatypes), the log stores the keccak-256 hash of the parameter as a topic. Log `data` includes non-indexed parameters but is difficult to search or filter. -!!! example - - A Solidity contract storing one indexed and one non-indexed parameter and has an event emitting - the value of each parameter: - - ```solidity - pragma solidity ^0.5.1; - contract Storage { - uint256 public valueIndexed; - uint256 public valueNotIndexed; - - event Event1(uint256 indexed valueIndexed, uint256 valueNotIndexed); - - function setValue(uint256 _valueIndexed, uint256 _valueNotIndexed) public { - valueIndexed = _valueIndexed; - valueNotIndexed = _valueNotIndexed; - emit Event1(_valueIndexed, _valueNotIndexed); - } - } - ``` - -!!! example - - A log entry created by invoking the contract in the previous example with `valueIndexed` set to - 5 and `valueNotIndexed` set to 7: - - ```json - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x4d6", - "blockHash": "0x7d0ac7c12ac9f622d346d444c7e0fa4dda8d4ed90de80d6a28814613a4884a67", - "transactionHash": "0xe994022ada94371ace00c4e1e20663a01437846ced02f18b3f3afec827002781", - "transactionIndex": "0x0", - "address": "0x43d1f9096674b5722d359b6402381816d5b22f28", - "data": "0x0000000000000000000000000000000000000000000000000000000000000007", - "topics": [ - "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", - "0x0000000000000000000000000000000000000000000000000000000000000005" - ] - } - ``` +A Solidity contract storing one indexed and one non-indexed parameter and has an event emitting the value of each parameter: + +```solidity +pragma solidity ^0.5.1; +contract Storage { + uint256 public valueIndexed; + uint256 public valueNotIndexed; + + event Event1(uint256 indexed valueIndexed, uint256 valueNotIndexed); + + function setValue(uint256 _valueIndexed, uint256 _valueNotIndexed) public { + valueIndexed = _valueIndexed; + valueNotIndexed = _valueNotIndexed; + emit Event1(_valueIndexed, _valueNotIndexed); + } +} +``` + +A log entry created by invoking the contract in the previous example with `valueIndexed` set to 5 and `valueNotIndexed` set to 7: + +```json +{ + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d6", + "blockHash": "0x7d0ac7c12ac9f622d346d444c7e0fa4dda8d4ed90de80d6a28814613a4884a67", + "transactionHash": "0xe994022ada94371ace00c4e1e20663a01437846ced02f18b3f3afec827002781", + "transactionIndex": "0x0", + "address": "0x43d1f9096674b5722d359b6402381816d5b22f28", + "data": "0x0000000000000000000000000000000000000000000000000000000000000007", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] +} +``` ## Event signature hash -The first topic in a log entry is always the event signature hash. The event signature hash is -a keccak-256 hash of the event name and input argument types, with argument names ignored. For -example, the event `Hello(uint256 worldId)` has the signature hash `keccak('Hello(uint256)')`. The -signature identifies to which event log topics belong. +The first topic in a log entry is always the event signature hash. The event signature hash is a keccak-256 hash of the event name and input argument types, with argument names ignored. For example, the event `Hello(uint256 worldId)` has the signature hash `keccak('Hello(uint256)')`. The signature identifies to which event log topics belong. -!!! example +A Solidity contract with two different events: - A Solidity contract with two different events: +```solidity +pragma solidity ^0.5.1; +contract Storage { + uint256 public valueA; + uint256 public valueB; - ```solidity - pragma solidity ^0.5.1; - contract Storage { - uint256 public valueA; - uint256 public valueB; + event Event1(uint256 indexed valueA); + event Event2(uint256 indexed valueB); - event Event1(uint256 indexed valueA); - event Event2(uint256 indexed valueB); + function setValue(uint256 _valueA) public { + valueA = _valueA; + emit Event1(_valueA); + } - function setValue(uint256 _valueA) public { - valueA = _valueA; - emit Event1(_valueA); - } + function setValueAgain(uint256 _valueB) public { + valueB = _valueB; + emit Event2(_valueB); + } +} +``` - function setValueAgain(uint256 _valueB) public { - valueB = _valueB; - emit Event2(_valueB); - } - } - ``` +The event signature hash for event 1 is `keccak('Event1(uint256)')` and the event signature hash for event 2 is `keccak('Event2(uint256)')`. The hashes are: -The event signature hash for event 1 is `keccak('Event1(uint256)')` and the event signature hash -for event 2 is `keccak('Event2(uint256)')`. The hashes are: +- `04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3` for event 1 +- `06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e` for event 2. -* `04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3` for event 1 -* `06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e` for event 2. +:::tip -!!! tip +You can use a library keccak (sha3) hash function, such as provided in [Web3.js](https://web3js.readthedocs.io/en/v1.2.11/web3-utils.html?highlight=sha3#sha3), or an online tool, such as https://emn178.github.io/online-tools/keccak_256.html, to generate event signature hashes. - You can use a library keccak (sha3) hash function, such as provided in - [Web3.js](https://web3js.readthedocs.io/en/v1.2.11/web3-utils.html?highlight=sha3#sha3), or an online tool, - such as https://emn178.github.io/online-tools/keccak_256.html, to generate event signature - hashes. +::: -!!! example +Log entries from invoking the Solidity contract in the previous example: - Log entries from invoking the Solidity contract in the previous example: - - ```json - [ - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x84", - "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", - "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", - "transactionIndex": "0x0", - "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", - "data": "0x", - "topics": [ - "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", - "0x0000000000000000000000000000000000000000000000000000000000000001" - ] - }, - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x87", - "blockHash": "0x6643a1e58ad857f727552e4572b837a85b3ca64c4799d085170c707e4dad5255", - "transactionHash": "0xa95295fcea7df3b9e47ab95d2dadeb868145719ed9cc0e6c757c8a174e1fcb11", - "transactionIndex": "0x0", - "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", - "data": "0x", - "topics": [ - "0x06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e", - "0x0000000000000000000000000000000000000000000000000000000000000002" - ] - } +```json +[ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x84", + "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", + "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x87", + "blockHash": "0x6643a1e58ad857f727552e4572b837a85b3ca64c4799d085170c707e4dad5255", + "transactionHash": "0xa95295fcea7df3b9e47ab95d2dadeb868145719ed9cc0e6c757c8a174e1fcb11", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e", + "0x0000000000000000000000000000000000000000000000000000000000000002" ] - ``` + } +] +``` ## Topic filters -[Filter options objects](../reference/api/objects.md#filter-options-object) have a `topics` key to -filter logs by topics. - -Topics are order-dependent. A transaction with a log containing topics `[A, B]` matches with the -following topic filters: - -* `[]` - Match any topic -* `[A]` - Match A in first position -* `[[null], [B]]` - Match any topic in first position AND B in second position -* `[[A],[B]]` - Match A in first position AND B in second position -* `[[A, C], [B, D]]` - Match (A OR C) in first position AND (B OR D) in second position. - -!!! example - - The following filter option object returns log entries for the - [Event Parameters example contract](#event-parameters) with `valueIndexed` set to 5 or 9: - - ```json - { - "fromBlock":"earliest", - "toBlock":"latest", - "address":"0x43d1f9096674b5722d359b6402381816d5b22f28", - "topics":[ - ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], - ["0x0000000000000000000000000000000000000000000000000000000000000005", "0x0000000000000000000000000000000000000000000000000000000000000009"] - ] - } - ``` +[Filter options objects](../reference/api/objects.md#filter-options-object) have a `topics` key to filter logs by topics. + +Topics are order-dependent. A transaction with a log containing topics `[A, B]` matches with the following topic filters: + +- `[]` - Match any topic +- `[A]` - Match A in first position +- `[[null], [B]]` - Match any topic in first position AND B in second position +- `[[A],[B]]` - Match A in first position AND B in second position +- `[[A, C], [B, D]]` - Match (A OR C) in first position AND (B OR D) in second position. + +The following filter option object returns log entries for the [Event Parameters example contract](#event-parameters) with `valueIndexed` set to 5 or 9: + +```json +{ + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x43d1f9096674b5722d359b6402381816d5b22f28", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + [ + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000009" + ] + ] +} +``` diff --git a/docs/public-networks/concepts/genesis-file.md b/docs/public-networks/concepts/genesis-file.md index 575f7b7c71d..d91a237e096 100644 --- a/docs/public-networks/concepts/genesis-file.md +++ b/docs/public-networks/concepts/genesis-file.md @@ -1,55 +1,50 @@ --- -description: Configuring a network using the genesis file +title: Genesis file +sidebar_position: 7 +description: Learn about configuring a network using the genesis file. tags: + - public networks - private networks --- # Genesis file -The genesis file defines the first block in the chain, and the first block defines which chain you -want to join. - -For Ethereum Mainnet and public testnets (for example, Goerli) the genesis configuration -definition is in Besu and used when specifying a public network using the -[`--network`](../reference/cli/options.md#network) command line option. - -For private networks, [create a JSON genesis file](https://consensys.net/blog/quorum/hyperledger-besu-how-to-create-an-ethereum-genesis-file/), -then specify the genesis file using the -[`--genesis-file`](../reference/cli/options.md#genesis-file) command line option. - -The genesis file specifies the [network-wide settings](../reference/genesis-items.md), such as -those for a [free gas network](../../private-networks/how-to/configure/free-gas.md), so all nodes in -a network must use the same genesis file. - -!!! note - - You can specify node-level settings on the command line or in the - [node configuration file](../how-to/configuration-file.md). - -!!! example "Example IBFT 2.0 genesis file" - - ```json - { - "config": { - "chainId": 2018, - "berlinBlock": 0, - "ibft2": { - "blockperiodseconds": 2, - "epochlength": 30000, - "requesttimeoutseconds": 4 - } - }, - "nonce": "0x0", - "timestamp": "0x58ee40ba", - "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000c0", - "gasLimit": "0x1fffffffffffff", - "difficulty": "0x1", - "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb": { - "balance": "0xad78ebc5ac6200000" - } - } +The genesis file defines the first block in the chain, and the first block defines which chain you want to join. + +For Ethereum Mainnet and public testnets (for example, Goerli) the genesis configuration definition is in Besu and used when specifying a public network using the [`--network`](../reference/cli/options.md#network) command line option. + +For private networks, [create a JSON genesis file](https://consensys.net/blog/quorum/hyperledger-besu-how-to-create-an-ethereum-genesis-file/), then specify the genesis file using the [`--genesis-file`](../reference/cli/options.md#genesis-file) command line option. + +The genesis file specifies the [network-wide settings](../reference/genesis-items.md), such as those for a [free gas network](../../private-networks/how-to/configure/free-gas.md), so all nodes in a network must use the same genesis file. + +:::note + +You can specify node-level settings on the command line or in the [node configuration file](../how-to/configuration-file.md). + +::: + +```json title="Example IBFT 2.0 genesis file" +{ + "config": { + "chainId": 2018, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000c0", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb": { + "balance": "0xad78ebc5ac6200000" } - ``` + } +} +``` diff --git a/docs/public-networks/concepts/network-and-chain-id.md b/docs/public-networks/concepts/network-and-chain-id.md index 2f09be44638..85db0c4b7da 100644 --- a/docs/public-networks/concepts/network-and-chain-id.md +++ b/docs/public-networks/concepts/network-and-chain-id.md @@ -1,46 +1,41 @@ --- -description: Besu network ID and chain ID implementation +title: Network ID and chain ID +sidebar_position: 5 +description: Learn about network ID and chain ID in Besu. tags: + - public networks - private networks --- # Network ID and chain ID -Ethereum networks have two identifiers, a network ID and a chain ID. Although they often have the -same value, they have different uses. +Ethereum networks have two identifiers, a network ID and a chain ID. Although they often have the same value, they have different uses. -Peer-to-peer communication between nodes uses the _network ID_, while the transaction signature -process uses the _chain ID_. +Peer-to-peer communication between nodes uses the _network ID_, while the transaction signature process uses the _chain ID_. -!!! note +:::note - [EIP-155](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md) introduced using - the chain ID as part of the transaction signing process to protect against transaction - replay attacks. +[EIP-155](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md) introduced using the chain ID as part of the transaction signing process to protect against transaction replay attacks. -For most networks, including Mainnet and the public testnets, the network ID and the chain ID are -the same, with the network ID defaulting to the chain ID, as specified in the genesis file. +::: -!!! example "Chain ID in the genesis file" +For most networks, including Mainnet and the public testnets, the network ID and the chain ID are the same, with the network ID defaulting to the chain ID, as specified in the genesis file. - ```json - { - "config": { - "ethash": { - }, - "chainID": 1981 - }, - ... - } - ``` +```json title="Chain ID in the genesis file" +{ + "config": { + "ethash": { + }, + "chainID": 1981 + }, + ... +} +``` -Besu sets the chain ID (and by default the network ID) automatically, using either the -[`--genesis-file`](../reference/cli/options.md#genesis-file) option or when specifying a -network using the [`--network`](../reference/cli/options.md#network) option. The following -table lists the available networks and their chain and network IDs. +Besu sets the chain ID (and by default the network ID) automatically, using either the [`--genesis-file`](../reference/cli/options.md#genesis-file) option or when specifying a network using the [`--network`](../reference/cli/options.md#network) option. The following table lists the available networks and their chain and network IDs. | Network | Chain | Chain ID | Network ID | Type | -|-----------|-------|----------|------------|-------------| +| --------- | ----- | -------- | ---------- | ----------- | | `mainnet` | ETH | 1 | 1 | Production | | `goerli` | ETH | 5 | 5 | Test | | `sepolia` | ETH | 11155111 | 11155111 | Test | @@ -50,32 +45,32 @@ table lists the available networks and their chain and network IDs. | `kotti` | ETC | 6 | 6 | Test | | `astor` | ETC | 212 | 212 | Test | -!!! important +:::info - The Ropsten, Rinkeby, and Kiln testnets are deprecated. +The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: ## Specify a different network ID -Usually the network ID is the same as the chain ID, but if you want to separate specific nodes from -the rest of the network so they can't connect or synchronize with other nodes, you can override the -default network ID for those nodes using the -[`--network-id`](../reference/cli/options.md#network-id) option. +Usually the network ID is the same as the chain ID, but if you want to separate specific nodes from the rest of the network so they can't connect or synchronize with other nodes, you can override the default network ID for those nodes using the [`--network-id`](../reference/cli/options.md#network-id) option. ## Start a new chain with a new chain ID -If you update the chain ID (or network ID) of existing nodes, they can no longer peer with other nodes in the network. -Nodes need to have a matching [genesis file](genesis-file.md), including the chain ID, in order to peer. -In this case, you're effectively running two chains that can't communicate with each other. +If you update the chain ID (or network ID) of existing nodes, they can no longer peer with other nodes in the network. Nodes need to have a matching [genesis file](genesis-file.md), including the chain ID, in order to peer. In this case, you're effectively running two chains that can't communicate with each other. To change a chain ID and start a new chain: -1. Stop all your nodes using ++ctrl+c++ in each terminal window. +1. Stop all your nodes using ctrl+c in each terminal window. 2. Update the [genesis file](genesis-file.md) with the new chain ID. 3. Make sure all nodes have the same genesis file. 4. Delete the old data directory or point to a new location for each node. 5. [Restart the nodes](../../private-networks/tutorials/ibft/index.md#6-start-the-first-node-as-the-bootnode). -!!! important +:::danger Warning + +Starting a new chain is starting from block zero. + +This means when you start a new chain with a new chain ID, you lose all previous data. - Starting a new chain is starting from block zero. - This means when you start a new chain with a new chain ID, you lose all previous data. +::: diff --git a/docs/public-networks/concepts/node-keys.md b/docs/public-networks/concepts/node-keys.md index b7ae155e6c3..01f1c98a31a 100644 --- a/docs/public-networks/concepts/node-keys.md +++ b/docs/public-networks/concepts/node-keys.md @@ -1,129 +1,104 @@ --- -description: Private and public key, and node address used to identify nodes +title: Node keys +sidebar_position: 8 +description: Learn about node public and private keys, and the node address. tags: + - public networks - private networks --- # Node keys and node address -Each node has a private and public key pair, and a node address. Hyperledger Besu uses the private and public key -pair to sign and verify transactions, and the node address as an identifier for the node. +Each node has a private and public key pair, and a node address. Hyperledger Besu uses the private and public key pair to sign and verify transactions, and the node address as an identifier for the node. ## Node private key -When starting Hyperledger Besu, if the -[`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option is not -specified and a `key` file does not exist in the data directory for the node, Besu generates a node -private key and writes it to the `key` file. +When starting Hyperledger Besu, if the [`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option is not specified and a `key` file does not exist in the data directory for the node, Besu generates a node private key and writes it to the `key` file. -If a `key` file does exist in the data directory when starting Besu, the node starts using the -private key in the `key` file. +If a `key` file does exist in the data directory when starting Besu, the node starts using the private key in the `key` file. -!!!info +:::info - The private key is not encrypted. +The private key is not encrypted. + +::: ## Node public key -The node public key displays in the log after starting Besu. Also referred to as the node ID, the -node public key forms part of the enode URL of a node. +The node public key displays in the log after starting Besu. Also referred to as the node ID, the node public key forms part of the enode URL of a node. -You can export the node public key, either to standard output or to a specified file, using the -[`public-key export`](../reference/cli/subcommands.md#public-key) subcommand. +You can export the node public key, either to standard output or to a specified file, using the [`public-key export`](../reference/cli/subcommands.md#public-key) subcommand. ## Node address -Besu generates the node address by creating a hash of the node public key and using the last 20 -bytes of the hash as the node address. It is also displayed in the logs after starting Besu. +Besu generates the node address by creating a hash of the node public key and using the last 20 bytes of the hash as the node address. It is also displayed in the logs after starting Besu. -You can export the node address, either to standard output or to a specified file, using the -[`public-key export-address`](../reference/cli/subcommands.md#public-key) subcommand. +You can export the node address, either to standard output or to a specified file, using the [`public-key export-address`](../reference/cli/subcommands.md#public-key) subcommand. ## Specify a custom node private key file -Use the [`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option to -specify a custom `key` file in any location. - -If the `key` file exists, the node starts with the private key in the `key` file. If the `key` file -does not exist, Besu generates a node private key and writes it to the `key` file. +Use the [`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option to specify a custom `key` file in any location. -For example, the following command either reads the node private key from `privatekeyfile` or -writes a generated private key to `privatekeyfile`. +If the `key` file exists, the node starts with the private key in the `key` file. If the `key` file does not exist, Besu generates a node private key and writes it to the `key` file. -!!! example +For example, the following command either reads the node private key from `privatekeyfile` or writes a generated private key to `privatekeyfile`. - ```bash - besu --node-private-key-file="/Users/username/privatekeyfile" - ``` +```bash +besu --node-private-key-file="/Users/username/privatekeyfile" +``` ## Enode URL -The enode URL identifies a node. For example, the [`--bootnodes`](../reference/cli/options.md#bootnodes) option and -the [`perm_addNodesToAllowlist`](../reference/api/index.md#perm_addnodestoallowlist) method specify nodes by -enode URL. +The enode URL identifies a node. For example, the [`--bootnodes`](../reference/cli/options.md#bootnodes) option and the [`perm_addNodesToAllowlist`](../reference/api/index.md#perm_addnodestoallowlist) method specify nodes by enode URL. The enode URL format is `enode://@[?discport=]` where: -* `` is the node public key, excluding the initial 0x. -* `` is the host and TCP port the bootnode is listening on for P2P discovery. Specify - the host and TCP port using the [`--p2p-host`](../reference/cli/options.md#p2p-host) and - [`--p2p-port`](../reference/cli/options.md#p2p-port) options. The default host is `127.0.0.1` - and the default port is `30303`. +- `` is the node public key, excluding the initial 0x. +- `` is the host and TCP port the bootnode is listening on for P2P discovery. Specify the host and TCP port using the [`--p2p-host`](../reference/cli/options.md#p2p-host) and [`--p2p-port`](../reference/cli/options.md#p2p-port) options. The default host is `127.0.0.1` and the default port is `30303`. + + :::note - !!! note + Standard Ethereum enode URLs allow hostnames as IP addresses only, however Besu provides [domain name support](#domain-name-support) in private permissioned networks. - Standard Ethereum enode URLs allow hostnames as IP addresses only, however Besu provides [domain name support](#domain-name-support) in - private permissioned networks. + ::: -* If the TCP listening and UDP discovery ports differ, the UDP port is specified as query parameter `discport`. +- If the TCP listening and UDP discovery ports differ, the UDP port is specified as query parameter `discport`. -!!! example +:::info - If the node public key is - `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, - the host is `10.3.58.6`, the TCP listening port is `30303`, and the UDP discovery port is `30301`, then the - enode URL is - `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@10.3.58.6:30303?discport=30301` +If the node public key is `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, the host is `10.3.58.6`, the TCP listening port is `30303`, and the UDP discovery port is `30301`, then the enode URL is `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@10.3.58.6:30303?discport=30301` - If the [`--p2p-host`](../reference/cli/options.md#p2p-host) or - [`--p2p-port`](../reference/cli/options.md#p2p-port) options are not specified and the node - public key is `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, - then the enode URL is - `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303` +If the [`--p2p-host`](../reference/cli/options.md#p2p-host) or [`--p2p-port`](../reference/cli/options.md#p2p-port) options are not specified and the node public key is `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, then the enode URL is `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303` -The enode URL displays when starting a Besu node. Use the -[`net_enode`](../reference/api/index.md#net_enode) JSON-RPC API method to get the enode URL of -the node. +::: -The enode advertised to other nodes during discovery is the external IP address and port, as -defined by [`--nat-method`](../how-to/connect/specify-nat.md). +The enode URL displays when starting a Besu node. Use the [`net_enode`](../reference/api/index.md#net_enode) JSON-RPC API method to get the enode URL of the node. + +The enode advertised to other nodes during discovery is the external IP address and port, as defined by [`--nat-method`](../how-to/connect/specify-nat.md). ### Domain name support -!!! warning +:::caution + +Enode URL domain name support is an early access feature that you can use in private [permissioned networks](../../private-networks/concepts/permissioning/index.md) only. - Enode URL domain name support is an early access feature that you can use in private - [permissioned networks](../../private-networks/concepts/permissioning/index.md) only. +::: To use domain names in enode URLs: -* Configure DNS reverse lookup. -* Enable DNS support using the early access option `--Xdns-enabled`. +- Configure DNS reverse lookup. +- Enable DNS support using the early access option `--Xdns-enabled`. -!!! example "Example enode URL using a domain name" +```bash title="Example enode URL using a domain name" +enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@mydomain.dev.example.net:30301 +``` - ```bash - enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@mydomain.dev.example.net:30301 - ``` +:::tip -!!! tip +If deploying Besu using Kubernetes in private permissioned networks, use the `--Xdns-enabled` and `--Xdns-update-enabled` options to ensure that Besu can connect to a container after restarting even if the IP address of the container changes. - If deploying Besu using Kubernetes in private permissioned networks, use the - `--Xdns-enabled` and `--Xdns-update-enabled` options to ensure that Besu can connect to a container after - restarting even if the IP address of the container changes. +Use the [`--Xhelp`](../reference/cli/options.md#xhelp) command line option to view early access options and their descriptions. - Use the [`--Xhelp`](../reference/cli/options.md#xhelp) command line option to view early access options and their - descriptions. +::: -If nodes are not connecting as expected, set the [log level to TRACE](../reference/api/index.md#admin_changeloglevel) to -help troubleshoot the issue. +If nodes are not connecting as expected, set the [log level to TRACE](../reference/api/index.md#admin_changeloglevel) to help troubleshoot the issue. diff --git a/docs/public-networks/concepts/proof-of-stake/_category_.json b/docs/public-networks/concepts/proof-of-stake/_category_.json new file mode 100644 index 00000000000..47b2323cd5d --- /dev/null +++ b/docs/public-networks/concepts/proof-of-stake/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Proof of stake consensus", + "position": 2 +} diff --git a/docs/public-networks/concepts/proof-of-stake/attestations.md b/docs/public-networks/concepts/proof-of-stake/attestations.md index 6ed94d4230e..765320567b6 100644 --- a/docs/public-networks/concepts/proof-of-stake/attestations.md +++ b/docs/public-networks/concepts/proof-of-stake/attestations.md @@ -1,58 +1,37 @@ --- +title: Attestations +sidebar_position: 1 description: Proof of stake attestations +tags: + - public networks --- # Attestations -Ethereum's move to [proof of stake consensus](./index.md) has brought many changes to the way the -network operates. -An important aspect of proof of stake is the need for validators to provide attestations in a timely -and accurate manner. -However, missed attestations have become a common occurrence among validators, leading to a loss of -rewards and earnings. -This page explores the context behind missing attestations. +Ethereum's move to [proof of stake consensus](./index.md) has brought many changes to the way the network operates. An important aspect of proof of stake is the need for validators to provide attestations in a timely and accurate manner. However, missed attestations have become a common occurrence among validators, leading to a loss of rewards and earnings. This page explores the context behind missing attestations. ## What are attestations? -Every epoch (6.4 minutes), a validator proposes an attestation to the network. -The attestation is for a specific slot (every 12 seconds) in the epoch. -The attestation votes in favor of the validator's view of the chain, in particular, the most recent -justified block and the first block in the current epoch (known as *source* and *target* checkpoints). -This information is collected for all participating validators, enabling the network to reach -consensus about the state of the blockchain. +Every epoch (6.4 minutes), a validator proposes an attestation to the network. The attestation is for a specific slot (every 12 seconds) in the epoch. The attestation votes in favor of the validator's view of the chain, in particular, the most recent justified block and the first block in the current epoch (known as _source_ and _target_ checkpoints). This information is collected for all participating validators, enabling the network to reach consensus about the state of the blockchain. -Honest nodes have 1/3 * `SECONDS_PER_SLOT` (4 seconds) from the start of the slot to either receive -the block or decide there was no block produced and attest to an “empty” or “skip” slot. -Once this time has elapsed, attesters should broadcast their attestation reflecting their local view -of the chain. +Honest nodes have 1/3 \* `SECONDS_PER_SLOT` (4 seconds) from the start of the slot to either receive the block or decide there was no block produced and attest to an “empty” or “skip” slot. Once this time has elapsed, attesters should broadcast their attestation reflecting their local view of the chain. -See the [official specification](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) -for more information about attestations. +See the [official specification](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) for more information about attestations. ## Attestation rewards -Around 85% of validators' rewards come from making attestations. -Although committee and slot assignments for attesting are randomized, every active validator will be -selected to make exactly one attestation each epoch. +Around 85% of validators' rewards come from making attestations. Although committee and slot assignments for attesting are randomized, every active validator will be selected to make exactly one attestation each epoch. -Attestations receive rewards only if they're included in Beacon Chain blocks. -An attestation contains three votes. -Each vote is eligible for a reward, subject to the following conditions: +Attestations receive rewards only if they're included in Beacon Chain blocks. An attestation contains three votes. Each vote is eligible for a reward, subject to the following conditions: -* Getting attestations included with the correct source checkpoint within 5 slots -* Getting attestations included with the correct target checkpoint within 32 slots -* Getting attestations included with the correct head within 1 slot immediately +- Getting attestations included with the correct source checkpoint within 5 slots +- Getting attestations included with the correct target checkpoint within 32 slots +- Getting attestations included with the correct head within 1 slot immediately -Each of these duties carries a reward rate, a portion of the entire "weight denominator," or the sum -of weighted rewards for each attestation. -The remaining weights relate to participating in sync committees and proposing blocks (excluding any -tips/MEV, the bulk of block rewards). -The following table (from -[Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/)) breaks down these -weights for cumulative rewards: +Each of these duties carries a reward rate, a portion of the entire "weight denominator," or the sum of weighted rewards for each attestation. The remaining weights relate to participating in sync committees and proposing blocks (excluding any tips/MEV, the bulk of block rewards). The following table (from [Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/)) breaks down these weights for cumulative rewards: | Name | Percentage | Value | -|------------------------|------------|--------------| +| ---------------------- | ---------- | ------------ | | `TIMELY_SOURCE_WEIGHT` | 21.9% | `uint64(14)` | | `TIMELY_TARGET_WEIGHT` | 40.6% | `uint64(26)` | | `TIMELY_HEAD_WEIGHT` | 21.9% | `uint64(14)` | @@ -62,51 +41,36 @@ weights for cumulative rewards: ## Incorrect attestations -If you have attestations with incorrect head votes, your node might be experiencing slow block imports. -However, block producers can also be slow to publish blocks, resulting in a majority of validators -getting the head vote wrong. -A <100% head vote doesn't necessarily imply a problem with your node. +If you have attestations with incorrect head votes, your node might be experiencing slow block imports. However, block producers can also be slow to publish blocks, resulting in a majority of validators getting the head vote wrong. A <100% head vote doesn't necessarily imply a problem with your node. -In case of a slowdown, identify whether the issue is with the beacon node or the execution client. -Block timing logs can be helpful in determining this. +In case of a slowdown, identify whether the issue is with the beacon node or the execution client. Block timing logs can be helpful in determining this. -If you're using [Teku](https://docs.teku.consensys.net/) as a consensus layer client, identify late -blocks (the block didn't get to Teku in time) with the following kind of log: +If you're using [Teku](https://docs.teku.consensys.net/) as a consensus layer client, identify late blocks (the block didn't get to Teku in time) with the following kind of log: ```bash Late Block Import *** Block: c2b911533a8f8d5e699d1a334e0576d2b9aa4caa726bde8b827548b579b47c68 (4765916) proposer 6230 arrival 3475ms, pre-state_retrieved +5ms, processed +185ms, execution_payload_result_received +1436ms, begin_importing +0ms, transaction_prepared +0ms, transaction_committed +0ms, completed +21ms ``` -The time of arrival indicates how much time elapsed after the start of the slot before your node -received the block. -In this example, the block arrived after 3475ms, which is slower than optimal, but still enough time -for Teku to create an attestation 4 seconds into the slot. +The time of arrival indicates how much time elapsed after the start of the slot before your node received the block. In this example, the block arrived after 3475ms, which is slower than optimal, but still enough time for Teku to create an attestation 4 seconds into the slot. -Typically, delayed arrivals occur when the block producer is slow in generating the block. -It's also possible that the block was published on time but took longer to propagate to your node -through peer-to-peer gossip. -If delayed arrivals are a recurring issue, it might be a problem with your node, such as an -incorrect system clock, network issues, or a reduction in the number of peers. +Typically, delayed arrivals occur when the block producer is slow in generating the block. It's also possible that the block was published on time but took longer to propagate to your node through peer-to-peer gossip. If delayed arrivals are a recurring issue, it might be a problem with your node, such as an incorrect system clock, network issues, or a reduction in the number of peers. ## Conclusion -Attestations are complicated. -Rewards can be impacted by: +Attestations are complicated. Rewards can be impacted by: -* The contents of a block (how long it takes to compute). -* The hardware processing that block (execution speed). -* How long it takes for the block to arrive to Besu from the consensus layer. -* The arrival time of the block from other consensus layer peers. - Besu and your consensus layer client have no control over how late into a slot they receive blocks. -* General network latency. -* The status of either Besu or the consensus layer client. +- The contents of a block (how long it takes to compute). +- The hardware processing that block (execution speed). +- How long it takes for the block to arrive to Besu from the consensus layer. +- The arrival time of the block from other consensus layer peers. Besu and your consensus layer client have no control over how late into a slot they receive blocks. +- General network latency. +- The status of either Besu or the consensus layer client. -[Monitoring](../../how-to/monitor/index.md) your validator carefully for uptime, execution speed, -and a valid consensus layer connection will help you explore attestation performance for your node. +[Monitoring](../../how-to/monitor/index.md) your validator carefully for uptime, execution speed, and a valid consensus layer connection will help you explore attestation performance for your node. ## References -* [Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/) -* [Understanding Attestation Misses](https://www.symphonious.net/2022/09/25/understanding-attestation-misses/) -* [Block production in Ethereum after the Merge](https://notes.ethereum.org/DaWh-02HQ4qftum1xdphkg?view#Broadcast-attestation) -* [Ethereum Consensus Specs](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) +- [Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/) +- [Understanding Attestation Misses](https://www.symphonious.net/2022/09/25/understanding-attestation-misses/) +- [Block production in Ethereum after the Merge](https://notes.ethereum.org/DaWh-02HQ4qftum1xdphkg?view#Broadcast-attestation) +- [Ethereum Consensus Specs](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) diff --git a/docs/public-networks/concepts/proof-of-stake/index.md b/docs/public-networks/concepts/proof-of-stake/index.md index 3991c6e16cc..8fad0be6237 100644 --- a/docs/public-networks/concepts/proof-of-stake/index.md +++ b/docs/public-networks/concepts/proof-of-stake/index.md @@ -1,48 +1,47 @@ --- description: Ethereum proof of stake consensus +tags: + - public networks --- # Proof of stake consensus -[The Merge](../the-merge.md) transitioned Ethereum Mainnet to -[proof of stake (PoS)](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/) consensus. +[The Merge](../the-merge.md) transitioned Ethereum Mainnet to [proof of stake +(PoS)](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/) consensus. In Ethereum's PoS, you must run a [full node](../the-merge.md#execution-and-consensus-clients) and [stake 32 ETH](https://ethereum.org/en/staking/) to become a validator. -!!! note +:::note +You must run a beacon node and an execution client to operate a full node on Mainnet. +To become a validator, you must also run a validator client (either [in the same process as the +beacon node](https://docs.teku.consensys.net/get-started/start-teku#start-the-clients-in-a-single-process) +or [separately](https://docs.teku.consensys.net/get-started/start-teku#run-the-clients-separately)). +::: - You must run a beacon node and an execution client to operate a full node on Mainnet. - To become a validator, you must also run a validator client (either - [in the same process as the beacon node](https://docs.teku.consensys.net/en/stable/HowTo/Get-Started/Run-Teku/#start-the-clients-in-a-single-process) or - [separately](https://docs.teku.consensys.net/en/stable/HowTo/Get-Started/Run-Teku/#run-the-clients-separately)). +PoS is preferred over proof of work and proof of authority as a consensus mechanism because it is +more secure, requires less energy, and lowers the barrier to entry. -PoS is preferred over proof of work and proof of authority as a consensus mechanism -because it is more secure, requires less energy, and lowers the barrier to entry. +The PoS mechanism randomly chooses validators to propose or validate blocks on the [Beacon +Chain](https://ethereum.org/en/upgrades/beacon-chain/) in defined time frames. -The PoS mechanism randomly chooses validators to propose or validate blocks on the -[Beacon Chain](https://ethereum.org/en/upgrades/beacon-chain/) in defined time frames. +Proposers are responsible for proposing new consensus blocks, and non-proposing validators are +responsible for validating (attesting to) proposed blocks. +Validators earn [rewards](https://www.blocknative.com/ethereum-staking-calculator) for proposing and +attesting to consensus blocks eventually included in the Beacon Chain, and penalized for malicious behavior. +[Attestations](./attestations.md) make up the bulk of validator rewards (~85%). +Validators also receive transaction fees for included blocks. -Proposers are responsible for proposing new consensus blocks, and non-proposing validators are responsible for -validating (attesting to) proposed blocks. -[Validators are rewarded](https://www.blocknative.com/ethereum-staking-calculator) for proposing and attesting to consensus blocks eventually included in the Beacon Chain, and -penalized for malicious behavior. [Attestations](./attestations.md) make up the bulk of validator rewards (~85%). -Validators also receive [transaction fees](https://docs.teku.consensys.net/concepts/proof-of-stake) for included -blocks. +Each consensus block contains an execution payload, which contains a list of transactions and other data required to execute and validate the payload. -Each consensus block contains an execution payload, which contains a list of transactions and other data required to -execute and validate the payload. - -When a node validates a consensus block, its [consensus client](../the-merge.md#consensus-clients) processes -the block and sends the execution payload to the [execution client](../the-merge.md#execution-clients), which: +When a node validates a consensus block, its [consensus client](../the-merge.md#consensus-clients) processes the block and sends the execution payload to the [execution client](../the-merge.md#execution-clients), which: 1. Assembles a block on the execution layer. -1. Verifies pre-conditions. -1. Executes transactions. -1. Verifies post-conditions. -1. Sends the validity result back to the consensus client. +2. Verifies pre-conditions. +3. Executes transactions. +4. Verifies post-conditions. +5. Sends the validity result back to the consensus client. -If the block is valid, the execution client includes it in the execution chain and stores the new state in execution -state storage. +If the block is valid, the execution client includes it in the execution chain and stores the new state in execution state storage. If a consensus block receives attestations backed by enough staked ETH, the block is included in the Beacon Chain. diff --git a/docs/public-networks/concepts/the-merge.md b/docs/public-networks/concepts/the-merge.md index c8fc4687925..a84e7f428ae 100644 --- a/docs/public-networks/concepts/the-merge.md +++ b/docs/public-networks/concepts/the-merge.md @@ -1,16 +1,22 @@ --- -description: What is the Merge? +title: The Merge +sidebar_position: 1 +description: Learn about The Merge, and execution and consensus clients. +tags: + - public networks --- # The Merge -!!! important +:::info - The Merge was executed on **September 15, 2022**. +The Merge was executed on **September 15, 2022**. + +::: [The Merge](https://ethereum.org/en/upgrades/merge/) was an Ethereum upgrade that merged the -[Beacon Chain] into Ethereum Mainnet, turning Mainnet into a combination of an -[execution layer and consensus layer](#execution-and-consensus-clients). +[Beacon Chain] into Ethereum Mainnet, turning Mainnet into a combination of an [execution layer and +consensus layer](#execution-and-consensus-clients). The Merge transitioned Mainnet from proof of work to [proof of stake consensus](proof-of-stake/index.md). You can run Besu as an execution client with: @@ -24,11 +30,10 @@ You can run Besu as an execution client with: After The Merge, a full Ethereum Mainnet node is a combination of an execution client (previously called an [Ethereum 1.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client) and -a consensus client (previously called an -[Ethereum 2.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client). +a consensus client (previously called an [Ethereum +2.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client). -Execution and consensus clients communicate with each other using the -[Engine API](../how-to/use-engine-api.md). +Execution and consensus clients communicate with each other using the [Engine API](../how-to/use-engine-api.md). ![Ethereum Merge node](../../assets/images/Execution-Consensus-Clients.png) @@ -44,36 +49,37 @@ with each other in a peer-to-peer network. Consensus clients, such as [Teku], contain beacon node and validator client implementations. The beacon node is the primary link to the [Beacon Chain] (consensus layer). The validator client performs [validator duties](proof-of-stake/index.md) on the consensus layer. -Consensus clients serve [REST API](https://docs.teku.consensys.net/reference/rest) -requests and communicate with each other in a peer-to-peer network. +Consensus clients serve [REST API](https://docs.teku.consensys.net/reference/rest) requests and +communicate with each other in a peer-to-peer network. ## What happened during The Merge Before The Merge, the execution and consensus clients' configurations were updated to listen for a certain total terminal difficulty (TTD) to be reached. -!!! info - - The TTD is a specific value for the total difficulty, which is the sum of the proof-of-work - mining difficulty for all blocks up to some point in the blockchain. +:::info +The TTD is a specific value for the total difficulty, which is the sum of the proof-of-work mining +difficulty for all blocks up to some point in the blockchain. +::: The consensus layer enabled the Merge configuration (Bellatrix) before reaching the TTD. Once the execution layer blocks reached the TTD, the Beacon Chain merged into Ethereum Mainnet, and Ethereum transitioned to a proof of stake network. -!!! important - - After The Merge, a Mainnet node operator must run both an execution client and a beacon node at - the same time. - To become a validator, you must also run a validator client (either - [in the same process as the beacon node](https://docs.teku.consensys.net/en/stable/HowTo/Get-Started/Run-Teku/#start-the-clients-in-a-single-process) - or [separately](https://docs.teku.consensys.net/en/stable/HowTo/Get-Started/Run-Teku/#run-the-clients-separately). - -After The Merge, validators earn rewards for performing -[validator duties](proof-of-stake/index.md), and -[fee recipients](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax#validators-proposer-default-fee-recipient) +:::tip +After The Merge, a Mainnet node operator must run both an execution client and a beacon node at the +same time. +To become a validator, you must also run a validator client (either [in the same process as the +beacon node](https://docs.teku.consensys.net/get-started/start-teku#start-the-clients-in-a-single-process) +or [separately](https://docs.teku.consensys.net/get-started/start-teku#run-the-clients-separately). +::: + +After The Merge, validators earn [rewards](https://www.blocknative.com/ethereum-staking-calculator) +for performing [validator duties](proof-of-stake/index.md), and [fee +recipients](https://docs.teku.consensys.net/reference/cli#validators-proposer-default-fee-recipient) also earn rewards for the inclusion of execution layer transactions. + [Beacon Chain]: https://ethereum.org/en/upgrades/beacon-chain/ [Teku]: https://docs.teku.consensys.net/en/stable/ diff --git a/docs/public-networks/concepts/transactions/_category_.json b/docs/public-networks/concepts/transactions/_category_.json new file mode 100644 index 00000000000..e82ef121922 --- /dev/null +++ b/docs/public-networks/concepts/transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Transactions", + "position": 4 +} diff --git a/docs/public-networks/concepts/transactions/pool.md b/docs/public-networks/concepts/transactions/pool.md index 23395acf265..87f2e499e8c 100644 --- a/docs/public-networks/concepts/transactions/pool.md +++ b/docs/public-networks/concepts/transactions/pool.md @@ -1,6 +1,9 @@ --- +title: Transaction pool +sidebar_position: 2 description: Transaction pool overview tags: + - public networks - private networks --- @@ -10,55 +13,36 @@ All nodes maintain a transaction pool to store pending transactions before proce Options and methods for configuring and monitoring the transaction pool include: -* [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions) JSON-RPC API - method to list transactions in the transaction pool. -* [`--tx-pool-max-size`](../../reference/cli/options.md#tx-pool-max-size) command line option to - specify the maximum number of transactions in the transaction pool. -* [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) command line - option to specify the price bump percentage to replace an existing transaction. -* [`--tx-pool-retention-hours`](../../reference/cli/options.md#tx-pool-retention-hours) command - line option to specify the maximum number of hours to keep pending transactions in the transaction - pool. -* [`newPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#pending-transactions) and - [`droppedPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#dropped-transactions) - RPC subscriptions to notify of transactions added to and dropped from the transaction pool. - -!!! important - When submitting [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md#nonce-validation), the - [privacy marker transaction](../../../private-networks/concepts/privacy/private-transactions/processing.md) is submitted to the - transaction pool, not the private transaction itself. +- [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions) JSON-RPC API method to list transactions in the transaction pool. +- [`--tx-pool-max-size`](../../reference/cli/options.md#tx-pool-max-size) command line option to specify the maximum number of transactions in the transaction pool. +- [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) command line option to specify the price bump percentage to replace an existing transaction. +- [`--tx-pool-retention-hours`](../../reference/cli/options.md#tx-pool-retention-hours) command line option to specify the maximum number of hours to keep pending transactions in the transaction pool. +- [`newPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#pending-transactions) and [`droppedPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#dropped-transactions) RPC subscriptions to notify of transactions added to and dropped from the transaction pool. + +:::tip + +When submitting [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md#nonce-validation), the [privacy marker transaction](../../../private-networks/concepts/privacy/private-transactions/processing.md) is submitted to the transaction pool, not the private transaction itself. + +::: ## Dropping transactions when the transaction pool is full -When the transaction pool is full, it accepts and retains local transactions in preference to -remote transactions. If the transaction pool is full of local transactions, Besu drops the oldest -local transactions first. That is, a full transaction pool continues to accept new local -transactions by first dropping remote transactions and then by dropping the oldest local -transactions. +When the transaction pool is full, it accepts and retains local transactions in preference to remote transactions. If the transaction pool is full of local transactions, Besu drops the oldest local transactions first. That is, a full transaction pool continues to accept new local transactions by first dropping remote transactions and then by dropping the oldest local transactions. ## Replacing transactions with the same sender and nonce You can replace a pending transaction with a transaction that has the same sender and nonce but a higher gas price. -If sending a [legacy transaction](types.md#frontier-transactions), the old transaction is replaced if the -new transaction has a gas price higher than the existing gas price by the percentage specified by -[`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). +If sending a [legacy transaction](types.md#frontier-transactions), the old transaction is replaced if the new transaction has a gas price higher than the existing gas price by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). -If sending an [`EIP1559` transaction](types.md#eip1559-transactions), the old transaction is replaced if -one of the following is true: +If sending an [`EIP1559` transaction](types.md#eip1559-transactions), the old transaction is replaced if one of the following is true: -* The new transaction's effective gas price is higher than the existing gas price by the percentage specified by - [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) AND the new effective priority fee is - greater than or equal to the existing priority fee. +- The new transaction's effective gas price is higher than the existing gas price by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) AND the new effective priority fee is greater than or equal to the existing priority fee. -* The new transaction's effective gas price is the equal to the existing gas price AND the new effective priority fee is - higher than the existing priority fee by the percentage specified by - [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). +- The new transaction's effective gas price is the equal to the existing gas price AND the new effective priority fee is higher than the existing priority fee by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). The default value for [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) is 10%. ## Size of the transaction pool -Decreasing the maximum size of the transaction pool reduces memory use. If the network is busy and -there is a backlog of transactions, increasing the size of the transaction pool reduces the risk of -removing transactions from the transaction pool. +Decreasing the maximum size of the transaction pool reduces memory use. If the network is busy and there is a backlog of transactions, increasing the size of the transaction pool reduces the risk of removing transactions from the transaction pool. diff --git a/docs/public-networks/concepts/transactions/types.md b/docs/public-networks/concepts/transactions/types.md index 3260c39cd9c..91306fa3d4d 100644 --- a/docs/public-networks/concepts/transactions/types.md +++ b/docs/public-networks/concepts/transactions/types.md @@ -1,13 +1,15 @@ --- +title: Transaction types +sidebar_position: 1 description: Description of the different transaction types tags: + - public networks - private networks --- # Transaction types -You can interact with the Hyperledger Besu JSON-RPC API using different transaction types (specified by -the `transactionType` parameter). +You can interact with the Hyperledger Besu JSON-RPC API using different transaction types (specified by the `transactionType` parameter). The following API objects use a unique format for each `transactionType`: @@ -18,48 +20,22 @@ The following API objects use a unique format for each `transactionType`: ## `FRONTIER` transactions -Transactions with type `FRONTIER` are *legacy transactions* that use the transaction format existing before typed -transactions were introduced in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). -They contain the parameters `chainId`, `nonce`, `gasPrice`, `gasLimit`, `to`, `value`, `data`, `v`, `r`, and `s`. -Legacy transactions don't use [access lists](#access_list-transactions) or incorporate -[EIP-1559 fee market changes](#eip1559-transactions). +Transactions with type `FRONTIER` are _legacy transactions_ that use the transaction format existing before typed transactions were introduced in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). They contain the parameters `chainId`, `nonce`, `gasPrice`, `gasLimit`, `to`, `value`, `data`, `v`, `r`, and `s`. Legacy transactions don't use [access lists](#access_list-transactions) or incorporate [EIP-1559 fee market changes](#eip1559-transactions). ## `ACCESS_LIST` transactions -Transactions with type `ACCESS_LIST` are transactions introduced in -[EIP-2930](https://eips.ethereum.org/EIPS/eip-2930). -They contain, along with the [legacy parameters](#frontier-transactions), an `accessList` parameter, which specifies an -array of addresses and storage keys that the transaction plans to access (an *access list*). -`ACCESS_LIST` transactions must specify an access list, and they don't incorporate -[EIP-1559 fee market changes](#eip1559-transactions). +Transactions with type `ACCESS_LIST` are transactions introduced in [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930). They contain, along with the [legacy parameters](#frontier-transactions), an `accessList` parameter, which specifies an array of addresses and storage keys that the transaction plans to access (an _access list_). `ACCESS_LIST` transactions must specify an access list, and they don't incorporate [EIP-1559 fee market changes](#eip1559-transactions). -Use the [`eth_createAccessList`](../../reference/api/index.md#eth_createaccesslist) API to simulate a -transaction which returns the addresses and storage keys that may be used to send the -real transaction, and the approximate gas cost. +Use the [`eth_createAccessList`](../../reference/api/index.md#eth_createaccesslist) API to simulate a transaction which returns the addresses and storage keys that may be used to send the real transaction, and the approximate gas cost. ## `EIP1559` transactions -Transactions with type `EIP1559` are transactions introduced in -[EIP-1559](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md). -EIP-1559 addresses the network congestion and overpricing of transaction fees caused by the historical fee market, -in which users send transactions specifying a gas price bid using the `gasPrice` parameter, and miners choose -transactions with the highest bids. +Transactions with type `EIP1559` are transactions introduced in [EIP-1559](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md). EIP-1559 addresses the network congestion and overpricing of transaction fees caused by the historical fee market, in which users send transactions specifying a gas price bid using the `gasPrice` parameter, and miners choose transactions with the highest bids. -`EIP1559` transactions don't specify `gasPrice`, and instead use an in-protocol, dynamically changing *base fee* per gas. -At each block, the base fee per gas is adjusted to address network congestion as measured by a gas target. +`EIP1559` transactions don't specify `gasPrice`, and instead use an in-protocol, dynamically changing _base fee_ per gas. At each block, the base fee per gas is adjusted to address network congestion as measured by a gas target. -`EIP1559` transactions contain, along with the [`accessList`](#access_list-transactions) parameter and -[legacy parameters](#frontier-transactions) except for `gasPrice`, a `maxPriorityFeePerGas` parameter, which specifies -the maximum fee the sender is willing to pay per gas above the base fee (the maximum *priority fee* per gas), and a -`maxFeePerGas` parameter, which specifies the maximum total fee (base fee + priority fee) the sender is willing to pay -per gas. +`EIP1559` transactions contain, along with the [`accessList`](#access_list-transactions) parameter and [legacy parameters](#frontier-transactions) except for `gasPrice`, a `maxPriorityFeePerGas` parameter, which specifies the maximum fee the sender is willing to pay per gas above the base fee (the maximum _priority fee_ per gas), and a `maxFeePerGas` parameter, which specifies the maximum total fee (base fee + priority fee) the sender is willing to pay per gas. -An `EIP1559` transaction always pays the base fee of the block it's included in, and it pays a priority fee as priced by -`maxPriorityFeePerGas` or, if the base fee per gas + `maxPriorityFeePerGas` exceeds `maxFeePerGas`, it pays a priority -fee as priced by `maxFeePerGas` minus the base fee per gas. -The base fee is burned, and the priority fee is paid to the miner that included the transaction. -A transaction's priority fee per gas incentivizes miners to include the transaction over other transactions with lower -priority fees per gas. +An `EIP1559` transaction always pays the base fee of the block it's included in, and it pays a priority fee as priced by `maxPriorityFeePerGas` or, if the base fee per gas + `maxPriorityFeePerGas` exceeds `maxFeePerGas`, it pays a priority fee as priced by `maxFeePerGas` minus the base fee per gas. The base fee is burned, and the priority fee is paid to the miner that included the transaction. A transaction's priority fee per gas incentivizes miners to include the transaction over other transactions with lower priority fees per gas. -`EIP1559` transactions must specify both `maxPriorityFeePerGas` and `maxFeePerGas`. -They must not specify `gasPrice`. +`EIP1559` transactions must specify both `maxPriorityFeePerGas` and `maxFeePerGas`. They must not specify `gasPrice`. diff --git a/docs/public-networks/concepts/transactions/validation.md b/docs/public-networks/concepts/transactions/validation.md index a0f45a9650f..39368ee1927 100644 --- a/docs/public-networks/concepts/transactions/validation.md +++ b/docs/public-networks/concepts/transactions/validation.md @@ -1,33 +1,30 @@ --- +title: Transaction validation +sidebar_position: 3 description: What transaction validation and when tags: + - public networks - private networks --- # Transaction validation -For transactions submitted and added to a block, Besu validates the transactions, as illustrated in -the following diagram. +For transactions submitted and added to a block, Besu validates the transactions, as illustrated in the following diagram. ![Transaction Validation](../../../assets/images/transaction-validation.png) -Besu repeats the set of transaction pool validations after propagating the transaction. Besu -repeats the same set of validations when importing the block that includes the transaction, except -the nonce must be exactly right when importing the block. +Besu repeats the set of transaction pool validations after propagating the transaction. Besu repeats the same set of validations when importing the block that includes the transaction, except the nonce must be exactly right when importing the block. -!!! important +:::tip - Private transactions are not added to the transaction pool. The privacy marker transaction is - submitted to the transaction pool but the private transaction itself is directly distributed - to the transaction participants. +Private transactions are not added to the transaction pool. The privacy marker transaction is submitted to the transaction pool but the private transaction itself is directly distributed to the transaction participants. -When adding the transaction to a block, Besu performs an additional validation to check that the -transaction gas limit is less than the remaining block gas limit. After creating a block, the node -imports the block and then repeats the transaction pool validations. +::: -!!! important +When adding the transaction to a block, Besu performs an additional validation to check that the transaction gas limit is less than the remaining block gas limit. After creating a block, the node imports the block and then repeats the transaction pool validations. - The transaction is only added if the entire transaction gas limit is less than the remaining - gas for the block. The total gas used by the transaction is not relevant to this validation. - That is, if the total gas used by the transaction is less than the remaining block gas, but the - transaction gas limit is more than the remaining block gas, the transaction is not added. +:::info + +The transaction is only added if the entire transaction gas limit is less than the remaining gas for the block. The total gas used by the transaction is not relevant to this validation. That is, if the total gas used by the transaction is less than the remaining block gas, but the transaction gas limit is more than the remaining block gas, the transaction is not added. + +::: diff --git a/docs/public-networks/get-started/_category_.json b/docs/public-networks/get-started/_category_.json new file mode 100644 index 00000000000..25ee51d48e5 --- /dev/null +++ b/docs/public-networks/get-started/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Get started", + "position": 2, + "collapsed": false, + "link": { + "type": "generated-index", + "slug": "/public-networks/get-started" + } +} diff --git a/docs/public-networks/get-started/connect/_category_.json b/docs/public-networks/get-started/connect/_category_.json new file mode 100644 index 00000000000..f326ba7b151 --- /dev/null +++ b/docs/public-networks/get-started/connect/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Connect to a network", + "position": 4 +} diff --git a/docs/public-networks/get-started/connect/index.md b/docs/public-networks/get-started/connect/index.md index abf914826c9..0ce16f25aba 100644 --- a/docs/public-networks/get-started/connect/index.md +++ b/docs/public-networks/get-started/connect/index.md @@ -1,5 +1,7 @@ --- title: Connect to a network overview +tags: + - public networks hide: - feedback --- diff --git a/docs/public-networks/get-started/connect/mainnet.md b/docs/public-networks/get-started/connect/mainnet.md index 8d007980da1..00722030e74 100644 --- a/docs/public-networks/get-started/connect/mainnet.md +++ b/docs/public-networks/get-started/connect/mainnet.md @@ -1,26 +1,27 @@ --- +title: Connect to Mainnet +sidebar_position: 2 description: How to connect to Mainnet +tags: + - public networks --- # Connect to Mainnet -!!! important - [The Merge](../../concepts/the-merge.md) was executed on **September 15, 2022**. - Ethereum is now a [proof of stake](../../concepts/proof-of-stake/index.md) network, and a full - Ethereum node requires both - [an execution client and a consensus client](../../concepts/the-merge.md#execution-and-consensus-clients). +:::info -Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus -client on Ethereum Mainnet. +[The Merge](../../concepts/the-merge.md) was executed on **September 15, 2022**. Ethereum is now a [proof of stake](../../concepts/proof-of-stake/index.md) network, and a full Ethereum node requires both [an execution client and a consensus client](../../concepts/the-merge.md#execution-and-consensus-clients). -If you're using [Teku] as a consensus client, you can follow the -[Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md). +::: + +Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus client on Ethereum Mainnet. + +If you're using [Teku] as a consensus client, you can follow the [Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md). ## Prerequisites - [Besu installed](../install/binary-distribution.md). -- A consensus client installed. - For example, [Teku](https://docs.teku.consensys.net/en/latest/). +- A consensus client installed. For example, [Teku](https://docs.teku.consensys.net/en/latest/). ## Steps @@ -32,29 +33,25 @@ Run the following command: openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex ``` -You will specify `jwtsecret.hex` when starting Besu and the consensus client. -This is a shared JWT secret the clients use to authenticate each other when using the -[Engine API](../../how-to/use-engine-api.md). +You will specify `jwtsecret.hex` when starting Besu and the consensus client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../../how-to/use-engine-api.md). ### 2. Generate validator keys If you're running the consensus client as a beacon node only, skip to the [next step](#3-start-besu). -If you're also running the consensus client as a validator client, have a funded Ethereum address -ready (32 ETH and gas fees for each validator). +If you're also running the consensus client as a validator client, have a funded Ethereum address ready (32 ETH and gas fees for each validator). -Generate validator keys for one or more validators using the -[Staking Launchpad](https://launchpad.ethereum.org/en/). +Generate validator keys for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). -!!! important +:::info - Save the password you use to generate each key pair in a `.txt` file. - You should also have a `.json` file for each validator key pair. +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: ### 3. Start Besu -Run the following command or specify the options in a -[configuration file](../../how-to/configuration-file.md): +Run the following command or specify the options in a [configuration file](../../how-to/configuration-file.md): ```bash besu \ @@ -72,87 +69,76 @@ besu \ Specify: -- The path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) - using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. -- The IP address of your Besu node using the [`--host-allowlist`](../../reference/cli/options.md#host-allowlist) - and [`--engine-host-allowlist`](../../reference/cli/options.md#engine-host-allowlist) options. +- The path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. +- The IP address of your Besu node using the [`--host-allowlist`](../../reference/cli/options.md#host-allowlist) and [`--engine-host-allowlist`](../../reference/cli/options.md#engine-host-allowlist) options. Also, in the command: - [`--sync-mode`](../../reference/cli/options.md#sync-mode) specifies using [snap sync](sync-node.md#snap-synchronization). -- [`--data-storage-format`](../../reference/cli/options.md#data-storage-format) specifies using - [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). -- [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC - service. -- [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow - remote RPC connections. -- [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC - service. -- [`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote - RPC connections. -- [`--engine-rpc-enabled`](../../reference/cli/options.md#engine-rpc-enabled) enables the - [Engine API](../../reference/engine-api/index.md). - -You can modify the option values and add other [command line options](../../reference/cli/options.md) -as needed. +- [`--data-storage-format`](../../reference/cli/options.md#data-storage-format) specifies using [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). +- [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC service. +- [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC service. +- [`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--engine-rpc-enabled`](../../reference/cli/options.md#engine-rpc-enabled) enables the [Engine API](../../reference/engine-api/index.md). + +You can modify the option values and add other [command line options](../../reference/cli/options.md) as needed. ### 4. Start the consensus client Refer to your consensus client documentation to configure and start the consensus client. -!!! important +:::info - If you're running a validator client, make sure you set a fee recipient address. +If you're running a validator client, make sure you set a fee recipient address. -If you're using Teku, follow the -[Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md#5-start-teku). +::: + +If you're using Teku, follow the [Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md#5-start-teku). ### 5. Wait for the clients to sync After starting Besu and the consensus client, your node starts syncing and connecting to peers. -!!! example - - === "Besu logs" - - ```bash - {"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} - {"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} - {"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} - {"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} - {"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 - cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} - {"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} - {"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} - {"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} - {"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} - {"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} - {"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} - ``` - - === "Teku logs" - - ```bash - 2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 - 2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 - 2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 - 2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 - 2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 - ``` - -If you're running the consensus client as a beacon node only, you're all set. -If you're also running the consensus client as a validator client, ensure your clients are fully -synced before submitting your staking deposit in the next step. -Syncing Besu can take several days. + + +# Besu logs + +```bash +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running the consensus client as a beacon node only, you're all set. If you're also running the consensus client as a validator client, ensure your clients are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. ### 6. Stake ETH -Stake your ETH for one or more validators using the -[Staking Launchpad](https://launchpad.ethereum.org/en/). +Stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). -You can check your validator status by searching your Ethereum address on the -[Beacon Chain explorer](https://beaconcha.in/). -It may take up to multiple days for your validator to be activated and start proposing blocks. +You can check your validator status by searching your Ethereum address on the [Beacon Chain explorer](https://beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + [Teku]: https://docs.teku.consensys.net/en/stable/ diff --git a/docs/public-networks/get-started/connect/sync-node.md b/docs/public-networks/get-started/connect/sync-node.md index 761d7fb5f48..5a6fd8ddfca 100644 --- a/docs/public-networks/get-started/connect/sync-node.md +++ b/docs/public-networks/get-started/connect/sync-node.md @@ -1,204 +1,163 @@ --- +title: Sync Besu +sidebar_position: 1 description: Full and archive node types +tags: + - public networks --- # Sync Besu -Besu supports two node types, commonly referred to as [full nodes](#run-a-full-node) and -[archive nodes](#run-an-archive-node). +Besu supports two node types, commonly referred to as [full nodes](#run-a-full-node) and [archive nodes](#run-an-archive-node). -Full nodes have the current state of the blockchain. -They can't serve the network with all data requests (for example, the balance of an account at an -old block). -Full nodes can guarantee the latest state for the blockchain (and some older states, but not all). -You can check current balances, sign and send transactions, and look at current dapp data. +Full nodes have the current state of the blockchain. They can't serve the network with all data requests (for example, the balance of an account at an old block). Full nodes can guarantee the latest state for the blockchain (and some older states, but not all). You can check current balances, sign and send transactions, and look at current dapp data. -Archive nodes also store the intermediary state of every account and contract for every block since -the genesis block. -Archive nodes can do everything full nodes do, and they can access historical state data. -Archive nodes require more disk space than full nodes. +Archive nodes also store the intermediary state of every account and contract for every block since the genesis block. Archive nodes can do everything full nodes do, and they can access historical state data. Archive nodes require more disk space than full nodes. -Besu must connect with other peers to sync with the network. -If your node is having trouble peering, try [troubleshooting peering](../../how-to/troubleshoot/peering.md). +Besu must connect with other peers to sync with the network. If your node is having trouble peering, try [troubleshooting peering](../../how-to/troubleshoot/peering.md). ## Sync times -To sync with a public network, Besu runs two processes in parallel: the world state sync and the -blockchain download. +To sync with a public network, Besu runs two processes in parallel: the world state sync and the blockchain download. -The following table shows the average world state sync time for each sync mode on Mainnet. -All times are hardware dependent; this table is based on running AWS instances m6gd.2xlarge. -Each sync mode also has its own world state database size. +The following table shows the average world state sync time for each sync mode on Mainnet. All times are hardware dependent; this table is based on running AWS instances m6gd.2xlarge. Each sync mode also has its own world state database size. -| Sync mode | Time to sync world state | Disk usage | -| ----------- | ------------------------ | ------------- | -| Snap | ~6 hours | Average disk | -| Checkpoint | ~5 hours | Smallest disk | -| Fast | ~1.5 days | Average disk | -| Full | ~weeks | Largest disk | +| Sync mode | Time to sync world state | Disk usage | +| ---------- | ------------------------ | ------------- | +| Snap | ~6 hours | Average disk | +| Checkpoint | ~5 hours | Smallest disk | +| Fast | ~1.5 days | Average disk | +| Full | ~weeks | Largest disk | -!!! note +:::note - - As of late 2022, an average Mainnet snap sync consumes around 750 GB using Bonsai Tries. - Read more about [storage requirements](../../concepts/data-storage-formats.md#storage-requirements) - across data storage formats and sync modes. +- As of late 2022, an average Mainnet snap sync consumes around 750 GB using Bonsai Tries. Read more about [storage requirements](../../concepts/data-storage-formats.md#storage-requirements) across data storage formats and sync modes. - - Testnets take significantly less time and space to sync. +- Testnets take significantly less time and space to sync. -While the world state syncs, Besu downloads and imports the blockchain in the background. -The blockchain download time depends on CPU, the network, Besu's peers, and disk speed. -It generally takes longer than the world state sync. +::: + +While the world state syncs, Besu downloads and imports the blockchain in the background. The blockchain download time depends on CPU, the network, Besu's peers, and disk speed. It generally takes longer than the world state sync. Besu must catch up to the current chain head and sync the world state to participate on Mainnet. ## Storage -You can store the world state using [Forest of Tries](../../concepts/data-storage-formats.md#forest-of-tries) -or [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). -We recommend using Bonsai Tries for the lowest storage requirements. +You can store the world state using [Forest of Tries](../../concepts/data-storage-formats.md#forest-of-tries) or [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). We recommend using Bonsai Tries for the lowest storage requirements. ## Run a full node -You can run a full node using [snap synchronization (snap sync)](#snap-synchronization), -[checkpoint synchronization (checkpoint sync)](#checkpoint-synchronization), or -[fast synchronization (fast sync)](#fast-synchronization). +You can run a full node using [snap synchronization (snap sync)](#snap-synchronization), [checkpoint synchronization (checkpoint sync)](#checkpoint-synchronization), or [fast synchronization (fast sync)](#fast-synchronization). ### Snap synchronization -!!! important +:::tip + +We recommend using snap sync over fast sync because snap sync can be faster by several days. - We recommend using snap sync over fast sync because snap sync can be faster by several days. - We recommend using snap sync with the [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries) - data storage format for the fastest sync and lowest storage requirements. +We recommend using snap sync with the [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries) data storage format for the fastest sync and lowest storage requirements. -Enable snap sync using [`--sync-mode=X_SNAP`](../../reference/cli/options.md#sync-mode). -You need Besu version 22.4.0 or later to use snap sync. +::: -Instead of downloading the [state trie](../../concepts/data-storage-formats.md) node by node, snap sync downloads as many leaves of the -trie as possible, and reconstructs the trie locally. +Enable snap sync using [`--sync-mode=X_SNAP`](../../reference/cli/options.md#sync-mode). You need Besu version 22.4.0 or later to use snap sync. -You can't switch from fast sync to snap sync. -If your node is blocked in the middle of a fast sync, you can start over using snap sync instead by stopping the node, -deleting the data directory, and starting over using `--sync-mode=X_SNAP`. +Instead of downloading the [state trie](../../concepts/data-storage-formats.md) node by node, snap sync downloads as many leaves of the trie as possible, and reconstructs the trie locally. -You can restart Besu during a snap sync in case of hardware or software problems. -The sync resumes from the last valid world state and continues to download blocks starting from the -last downloaded block. +You can't switch from fast sync to snap sync. If your node is blocked in the middle of a fast sync, you can start over using snap sync instead by stopping the node, deleting the data directory, and starting over using `--sync-mode=X_SNAP`. + +You can restart Besu during a snap sync in case of hardware or software problems. The sync resumes from the last valid world state and continues to download blocks starting from the last downloaded block. See [how to read the Besu metrics charts](../../how-to/monitor/understand-metrics.md) when using snap sync. ### Checkpoint synchronization -!!! important +:::caution + +Checkpoint sync is an early access feature. - Checkpoint sync is an early access feature. +::: -Enable checkpoint sync using [`--sync-mode=X_CHECKPOINT`](../../reference/cli/options.md#sync-mode). -You need Besu version 22.4.3 or later to use checkpoint sync. +Enable checkpoint sync using [`--sync-mode=X_CHECKPOINT`](../../reference/cli/options.md#sync-mode). You need Besu version 22.4.3 or later to use checkpoint sync. -Checkpoint sync behaves like [snap sync](#snap-synchronization), but instead of syncing from the -genesis block, it syncs from a specific checkpoint block configured in the [Besu genesis -file](../../concepts/genesis-file.md). +Checkpoint sync behaves like [snap sync](#snap-synchronization), but instead of syncing from the genesis block, it syncs from a specific checkpoint block configured in the [Besu genesis file](../../concepts/genesis-file.md). -Ethereum Mainnet and the Goerli testnet configurations already define default checkpoints, so you -don't have to add this yourself. +Ethereum Mainnet and the Goerli testnet configurations already define default checkpoints, so you don't have to add this yourself. -For other networks, you can configure a checkpoint in the genesis file by specifying the block hash, -number, and total difficulty as in the following example. +For other networks, you can configure a checkpoint in the genesis file by specifying the block hash, number, and total difficulty as in the following example. -!!! example "Checkpoint configuration example" +```json title="Checkpoint configuration example" +"checkpoint": { + "hash": "0x844d581cb00058d19f0584fb582fa2de208876ee56bbae27446a679baf4633f4", + "number": 14700000, + "totalDifficulty": "0xA2539264C62BF98CFC6" +} +``` - ```json - "checkpoint": { - "hash": "0x844d581cb00058d19f0584fb582fa2de208876ee56bbae27446a679baf4633f4", - "number": 14700000, - "totalDifficulty": "0xA2539264C62BF98CFC6" - } - ``` +:::note -!!! note +If using [Clique](../../../private-networks/how-to/configure/consensus/clique.md) consensus, the checkpoint must be the beginning of an epoch. - If using [Clique](../../../private-networks/how-to/configure/consensus/clique.md) consensus, the - checkpoint must be the beginning of an epoch. +::: -If you enable checkpoint sync without a checkpoint configuration in the genesis file, Besu snap -syncs from the genesis block. +If you enable checkpoint sync without a checkpoint configuration in the genesis file, Besu snap syncs from the genesis block. -You can restart Besu during a checkpoint sync in case of hardware or software problems. -The sync resumes from the last valid world state and continues to download blocks starting from the -last downloaded block. +You can restart Besu during a checkpoint sync in case of hardware or software problems. The sync resumes from the last valid world state and continues to download blocks starting from the last downloaded block. ### Fast synchronization -!!! important +:::caution - It might become impossible to sync Ethereum Mainnet using fast sync in the future. - If you sync for the first time or ever need to re-sync, update Besu to a version that supports - newer sync methods. +It might become impossible to sync Ethereum Mainnet using fast sync in the future. If you sync for the first time or ever need to re-sync, update Besu to a version that supports newer sync methods. + +::: Enable fast sync using [`--sync-mode=FAST`](../../reference/cli/options.md#sync-mode). -Fast sync downloads the block headers and transaction receipts, and verifies the chain of block headers from the genesis -block. +Fast sync downloads the block headers and transaction receipts, and verifies the chain of block headers from the genesis block. -When starting fast sync, Besu first downloads the world state for a recent block verified by its peers (referred to as a -pivot block), and then begins fast sync from the genesis block. +When starting fast sync, Besu first downloads the world state for a recent block verified by its peers (referred to as a pivot block), and then begins fast sync from the genesis block. -Fast sync is the default for named networks specified using the [`--network`](../../reference/cli/options.md#network) -option, except for the `dev` development network. -It's also the default if connecting to Ethereum Mainnet by not specifying the -[`--network`](../../reference/cli/options.md#network) or [`--genesis-file`](../../reference/cli/options.md#genesis-file) -options. +Fast sync is the default for named networks specified using the [`--network`](../../reference/cli/options.md#network) option, except for the `dev` development network. It's also the default if connecting to Ethereum Mainnet by not specifying the [`--network`](../../reference/cli/options.md#network) or [`--genesis-file`](../../reference/cli/options.md#genesis-file) options. Using fast sync with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. -You can observe the `besu_synchronizer_fast_sync_*` and `besu_synchronizer_world_state_*` -[metrics](../../how-to/monitor/metrics.md#metrics-list) to monitor fast sync. +You can observe the `besu_synchronizer_fast_sync_*` and `besu_synchronizer_world_state_*` [metrics](../../how-to/monitor/metrics.md#metrics-list) to monitor fast sync. + +:::note + +When fast syncing, block numbers increase until close to the head block, then the process pauses while the world state download completes. This may take a significant amount of time depending on world state size, during which the current head block doesn't increase. For example, Mainnet may take several days or more to fast sync. Fast sync time may increase because Besu picks new pivot blocks, or because peers prune the world state before it completes downloading. + +::: -!!! note +:::caution RocksDB error on AWS - When fast syncing, block numbers increase until close to the head block, then the process pauses - while the world state download completes. - This may take a significant amount of time depending on world state size, during which the - current head block doesn't increase. - For example, Mainnet may take several days or more to fast sync. - Fast sync time may increase because Besu picks new pivot blocks, or because peers prune the - world state before it completes downloading. +When running Besu on some cloud providers, a known [RocksDB](https://github.com/facebook/rocksdb/issues/6435) issue causes fast sync to fail occasionally. The following error is displayed repeatedly: -!!! caution "RocksDB error on AWS" +``` +EthScheduler-Services-1 (importBlock) | ERROR | PipelineChainDownloader | Chain download failed. Restarting after short delay. +java.util.concurrent.CompletionException: org.hyperledger.besu.plugin.services.exception.StorageException: org.rocksdb.RocksDBException: block checksum mismatch: +``` - When running Besu on some cloud providers, a known [RocksDB](https://github.com/facebook/rocksdb/issues/6435) issue - causes fast sync to fail occasionally. - The following error is displayed repeatedly: +The failure has been seen on AWS and Digital Ocean. On AWS, A full restart of the VM is required to restart the fast sync. Fast sync isn't [currently supported on Digital Ocean](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/CHANGELOG.md#143). - ``` - EthScheduler-Services-1 (importBlock) | ERROR | PipelineChainDownloader | Chain download failed. Restarting after short delay. - java.util.concurrent.CompletionException: org.hyperledger.besu.plugin.services.exception.StorageException: org.rocksdb.RocksDBException: block checksum mismatch: - ``` +::: - The failure has been seen on AWS and Digital Ocean. - On AWS, A full restart of the VM is required to restart the fast sync. - Fast sync isn't [currently supported on Digital Ocean](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/CHANGELOG.md#143). +:::caution Pending state nodes stays constant -!!! caution "Pending state nodes stays constant" +When fast syncing, the pending state nodes count is the number of nodes yet to be downloaded, and it should change constantly. Pending state nodes trend to 0 during fast sync and then goes to 0. - When fast syncing, the pending state nodes count is the number of nodes yet to be downloaded, and - it should change constantly. - Pending state nodes trend to 0 during fast sync and then goes to 0. +If the number stays constant, this could mean your node isn't syncing against any peers. - If the number stays constant, this could mean your node isn't syncing against any peers. +In the following example, the pivot block is 0 and the pending state nodes value is constant. This means the node isn't syncing against any peers. The fact that state nodes have been downloaded means at some stage it was syncing. - In the following example, the pivot block is 0 and the pending state nodes value is constant. - This means the node isn't syncing against any peers. - The fact that state nodes have been downloaded means at some stage it was syncing. +![Fast synchronization](../../../assets/images/fastsync.png) - ![Fast synchronization](../../../assets/images/fastsync.png) +The easiest solution in this scenario is to restart fast sync to obtain a new pivot block. - The easiest solution in this scenario is to restart fast sync to obtain a new pivot block. +::: ## Run an archive node -To run an archive node, enable full synchronization (full sync) using -[`--sync-mode=FULL`](../../reference/cli/options.md#sync-mode). +To run an archive node, enable full synchronization (full sync) using [`--sync-mode=FULL`](../../reference/cli/options.md#sync-mode). Full sync starts from the genesis block and reprocesses all transactions. diff --git a/docs/public-networks/get-started/connect/testnet.md b/docs/public-networks/get-started/connect/testnet.md index cb3cf6fc004..ee8b4017f94 100644 --- a/docs/public-networks/get-started/connect/testnet.md +++ b/docs/public-networks/get-started/connect/testnet.md @@ -1,27 +1,27 @@ --- +title: Connect to a testnet +sidebar_position: 3 Description: How to connect to a testnet +tags: + - public networks --- # Connect to a testnet -Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus -client on the [Goerli](https://github.com/eth-clients/goerli) and -[Sepolia](https://github.com/eth-clients/sepolia) testnets. +Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus client on the [Goerli](https://github.com/eth-clients/goerli) and [Sepolia](https://github.com/eth-clients/sepolia) testnets. -If you're using [Teku](https://docs.teku.consensys.net/en/latest/) as a consensus client, you can -follow the [Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md). +If you're using [Teku](https://docs.teku.consensys.net/en/latest/) as a consensus client, you can follow the [Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md). -!!! note +:::note - Sepolia is a permissioned network and you can't run a validator client on it without - [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. - You can connect your consensus client using the beacon node only, without any validator duties. +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. You can connect your consensus client using the beacon node only, without any validator duties. + +::: ## Prerequisites - [Besu installed](../install/binary-distribution.md). -- A consensus client installed. - For example, [Teku](https://docs.teku.consensys.net/en/latest/). +- A consensus client installed. For example, [Teku](https://docs.teku.consensys.net/en/latest/). ## Steps @@ -33,132 +33,123 @@ Run the following command: openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex ``` -You will specify `jwtsecret.hex` when starting Besu and the consensus client. -This is a shared JWT secret the clients use to authenticate each other when using the -[Engine API](../../how-to/use-engine-api.md). +You will specify `jwtsecret.hex` when starting Besu and the consensus client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../../how-to/use-engine-api.md). ### 2. Generate validator keys If you're running the consensus client as a beacon node only, skip to the [next step](#3-start-besu). -If you're also running the consensus client as a validator client, create a test Ethereum address -(you can do this in -[MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). -Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. -See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and -[Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). +If you're also running the consensus client as a validator client, create a test Ethereum address (you can do this in [MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and [Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). + +:::note -!!! note +If you can't get ETH using the faucet, you can ask for help on the [EthStaker Discord](https://discord.io/ethstaker). - If you can't get ETH using the faucet, you can ask for help on the - [EthStaker Discord](https://discord.io/ethstaker). +::: -Generate validator keys for one or more validators using the -[Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or -[request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). +Generate validator keys for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or [request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). -!!! important +:::info - Save the password you use to generate each key pair in a `.txt` file. - You should also have a `.json` file for each validator key pair. +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: ### 3. Start Besu -Run the following command or specify the options in a -[configuration file](../../how-to/configuration-file.md): - -=== "Goerli" - - ```bash - besu \ - --network=goerli \ - --rpc-http-enabled=true \ - --rpc-http-host=0.0.0.0 \ - --rpc-http-cors-origins="*" \ - --rpc-ws-enabled=true \ - --rpc-ws-host=0.0.0.0 \ - --host-allowlist="*" \ - --engine-host-allowlist="*" \ - --engine-rpc-enabled \ - --engine-jwt-secret= - ``` - -=== "Sepolia" - - ```bash - besu \ - --network=sepolia \ - --rpc-http-enabled=true \ - --rpc-http-host=0.0.0.0 \ - --rpc-http-cors-origins="*" \ - --rpc-ws-enabled=true \ - --rpc-ws-host=0.0.0.0 \ - --host-allowlist="*" \ - --engine-host-allowlist="*" \ - --engine-rpc-enabled \ - --engine-jwt-secret= - ``` - -Specify the path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) -using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. - -You can modify the option values and add other [command line options](../../reference/cli/options.md) -as needed. +Run the following command or specify the options in a [configuration file](../../how-to/configuration-file.md): + + + +# Goerli + +```bash +besu \ + --network=goerli \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +# Sepolia + +```bash +besu \ + --network=sepolia \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. + +You can modify the option values and add other [command line options](../../reference/cli/options.md) as needed. ### 4. Start the consensus client Refer to your consensus client documentation to configure and start the consensus client. -!!! important +:::info - If you're running a validator client, make sure you set a fee recipient address. +If you're running a validator client, make sure you set a fee recipient address. -If you're using Teku, follow the -[Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md#5-start-teku). +::: + +If you're using Teku, follow the [Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md#5-start-teku). ### 5. Wait for the clients to sync After starting Besu and the consensus client, your node starts syncing and connecting to peers. -!!! example - - === "Besu logs" - - ```bash - {"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} - {"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} - {"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} - {"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} - {"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 - cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} - {"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} - {"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} - {"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} - {"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} - {"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} - {"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} - ``` - - === "Teku logs" - - ```bash - 2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 - 2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 - 2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 - 2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 - 2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 - ``` - -If you're running the consensus client as a beacon node only, you're all set. -If you're also running the consensus client as a validator client, ensure your clients are fully -synced before submitting your staking deposit in the next step. -This can take several days. + + +# Besu logs + +```bash +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running the consensus client as a beacon node only, you're all set. If you're also running the consensus client as a validator client, ensure your clients are fully synced before submitting your staking deposit in the next step. This can take several days. ### 6. Stake ETH -Stake your testnet ETH for one or more validators using the -[Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). +Stake your testnet ETH for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). -You can check your validator status by searching your Ethereum address on the -[Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). -It may take up to multiple days for your validator to be activated and start proposing blocks. +You can check your validator status by searching your Ethereum address on the [Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. diff --git a/docs/public-networks/get-started/install/_category_.json b/docs/public-networks/get-started/install/_category_.json new file mode 100644 index 00000000000..043580c1474 --- /dev/null +++ b/docs/public-networks/get-started/install/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Install Besu", + "position": 2 +} diff --git a/docs/public-networks/get-started/install/binary-distribution.md b/docs/public-networks/get-started/install/binary-distribution.md index 8e72cc26e05..ae1e28a5b6c 100644 --- a/docs/public-networks/get-started/install/binary-distribution.md +++ b/docs/public-networks/get-started/install/binary-distribution.md @@ -1,5 +1,9 @@ --- +title: Install binary distribution +sidebar_position: 2 description: Install or upgrade Hyperledger Besu from binary distribution +tags: + - public networks --- # Install binary distribution @@ -8,17 +12,17 @@ description: Install or upgrade Hyperledger Besu from binary distribution ### Prerequisites -* [Homebrew](https://brew.sh/) -* Java JDK +- [Homebrew](https://brew.sh/) +- Java JDK -!!!important +:::caution - Hyperledger Besu supports: +Hyperledger Besu supports: - * MacOS High Sierra 10.13 or later versions. - * Java 17+. - You can install Java using `brew install openjdk`. Alternatively, you can manually install the - [Java JDK](https://www.oracle.com/java/technologies/downloads). +- MacOS High Sierra 10.13 or later versions. +- Java 17+. You can install Java using `brew install openjdk`. Alternatively, you can manually install the [Java JDK](https://www.oracle.com/java/technologies/downloads). + +::: ### Install (or upgrade) using Homebrew @@ -35,15 +39,17 @@ To upgrade an existing Besu installation using Homebrew: brew upgrade hyperledger/besu/besu ``` -!!! note +:::note + +If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. + +::: - If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade - hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. +:::note -!!! note +When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command `brew tap --repair`. - When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command - `brew tap --repair`. +::: To display the Besu version and confirm installation: @@ -61,18 +67,19 @@ besu --help ### Prerequisites -* [Java JDK 17+](https://www.oracle.com/java/technologies/downloads/) +- [Java JDK 17+](https://www.oracle.com/java/technologies/downloads/) + +:::note Linux open file limit + +If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the maximum number of open files allowed using `ulimit`. If the open files limit is not high enough, a `Too many open files` RocksDB exception occurs. -!!! note "Linux open file limit" +::: - If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the - maximum number of open files allowed using `ulimit`. If the open files limit is not high - enough, a `Too many open files` RocksDB exception occurs. +:::tip -!!! tip +We recommend installing [jemalloc](https://jemalloc.net/) to reduce memory usage. If using Ubuntu, you can install it with the command: `apt install libjemalloc-dev`. - We recommend installing [jemalloc](https://jemalloc.net/) to reduce memory usage. - If using Ubuntu, you can install it with the command: `apt install libjemalloc-dev`. +::: ### Install from packaged binaries diff --git a/docs/public-networks/get-started/install/index.md b/docs/public-networks/get-started/install/index.md index 4d77c0d6f50..c4717c1fe65 100644 --- a/docs/public-networks/get-started/install/index.md +++ b/docs/public-networks/get-started/install/index.md @@ -1,22 +1,23 @@ --- title: Installation options description: Options for getting started with Hyperledger Besu +tags: + - public networks --- # Installation options -* [Docker image](run-docker-image.md) -* [Binaries](binary-distribution.md) +- [Docker image](run-docker-image.md) +- [Binaries](binary-distribution.md) ## Build from source -If you want to use the latest development version of Hyperledger Besu or a specific commit, -build from source. Otherwise, use the [binary] or [Docker image] for more stable -versions. +If you want to use the latest development version of Hyperledger Besu or a specific commit, build from source. Otherwise, use the [binary] or [Docker image] for more stable versions. View the [Hyperledger Wiki] for instructions to install Hyperledger Besu from source. + [Hyperledger Wiki]: https://wiki.hyperledger.org/display/BESU/Building+from+source [binary]: binary-distribution.md [Docker image]: run-docker-image.md diff --git a/docs/public-networks/get-started/install/run-docker-image.md b/docs/public-networks/get-started/install/run-docker-image.md index e154adbefff..a2561f40c08 100644 --- a/docs/public-networks/get-started/install/run-docker-image.md +++ b/docs/public-networks/get-started/install/run-docker-image.md @@ -1,5 +1,9 @@ --- +title: Run Besu from Docker image +sidebar_position: 1 description: Run Hyperledger Besu using the official docker image +tags: + - public networks --- # Run Besu from a Docker image @@ -10,13 +14,15 @@ Use this Docker image to run a single Besu node without installing Besu. ## Prerequisites -* [Docker](https://docs.docker.com/install/) +- [Docker](https://docs.docker.com/install/) -* MacOS or Linux +- MacOS or Linux - !!! important + :::info - The Docker image doesn't run on Windows. + The Docker image doesn't run on Windows. + + ::: ## Default node for Mainnet @@ -26,24 +32,19 @@ To run a Besu node in a container connected to the Ethereum Mainnet: docker run hyperledger/besu:latest ``` -!!! note +:::note + +https://hub.docker.com/r/hyperledger/besu/tags lists the available tags for the image. - https://hub.docker.com/r/hyperledger/besu/tags lists the available tags for the image. +If you previously pulled `latest`, Docker runs the cached version. - If you previously pulled `latest`, Docker runs the cached version. +To ensure your image is up to date, pull the `latest` version again using `docker pull hyperledger/besu:latest`. - To ensure your image is up to date, pull the `latest` version again using `docker pull hyperledger/besu:latest`. +::: ## Expose ports -Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need -to expose the ports to use the default ports or the ports specified using -[`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), -[`--p2p-port`](../../reference/cli/options.md#p2p-port), -[`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), -[`--metrics-port`](../../reference/cli/options.md#metrics-port), -[`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port), and -[`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. +Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need to expose the ports to use the default ports or the ports specified using [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), [`--p2p-port`](../../reference/cli/options.md#p2p-port), [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), [`--metrics-port`](../../reference/cli/options.md#metrics-port), [`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port), and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. To run Besu exposing local ports for access: @@ -51,64 +52,55 @@ To run Besu exposing local ports for access: docker run -p :8545 -p :8546 -p :30303 hyperledger/besu:latest --rpc-http-enabled --rpc-ws-enabled ``` -!!! note +:::note - The examples on this page expose TCP ports only. - To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: +The examples on this page expose TCP ports only. To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: - ```bash - docker run -p :/udp - ``` +```bash +docker run -p :/udp +``` - See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). +See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). -!!! example +::: - To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: +To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: - ```bash - docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled - ``` +```bash +docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled +``` ## Start Besu -!!! important +:::danger + +Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default data path interferes with the operation of Besu and prevents Besu from safely launching. - Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default - data path interferes with the operation of Besu and prevents Besu from safely launching. +To run a node that maintains the node state (key and database), [`--data-path`](../../reference/cli/options.md#data-path) must be set to a location other than `/opt/besu` and a storage volume mounted at that location. - To run a node that maintains the node state (key and database), - [`--data-path`](../../reference/cli/options.md#data-path) must be set to a location other - than `/opt/besu` and a storage volume mounted at that location. +When running in a Docker container, [`--nat-method`](../../how-to/connect/specify-nat.md) must be set to `DOCKER` or `AUTO` (default). Don't set [`--nat-method`](../../how-to/connect/specify-nat.md) to `NONE` or `UPNP`. - When running in a Docker container, [`--nat-method`](../../how-to/connect/specify-nat.md) - must be set to `DOCKER` or `AUTO` (default). Don't set - [`--nat-method`](../../how-to/connect/specify-nat.md) to `NONE` or `UPNP`. +::: -You can specify -[Besu environment variables](../../reference/cli/options.md#specify-options) with the -Docker image instead of the command line options. +You can specify [Besu environment variables](../../reference/cli/options.md#specify-options) with the Docker image instead of the command line options. -!!! example +```bash title="Example" +docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest +``` - ```bash - docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest - ``` +:::caution Unsupported address type exception -??? caution "Unsupported address type exception" +When running Besu from a Docker image, you might get the following exception: - When running Besu from a Docker image, you might get the following exception: +```bash +Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. +``` - ```bash - Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. - ``` +This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, preventing outbound communication. IPv6 is disabled by default in Docker. - This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, - preventing outbound communication. - IPv6 is disabled by default in Docker. +[Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound IPv6 traffic and allow connection with IPv6 peers. - [Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound - IPv6 traffic and allow connection with IPv6 peers. +::: ### Run a node for testing @@ -136,9 +128,7 @@ docker run -p 8545:8545 --mount type=bind,source=/,target ## Stop Besu and clean up resources -When done running nodes, you can shut down the node container without deleting resources or you can -delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the -container and volume names. +When done running nodes, you can shut down the node container without deleting resources or you can delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the container and volume names. To stop a container: diff --git a/docs/public-networks/get-started/migrate-to-besu.md b/docs/public-networks/get-started/migrate-to-besu.md index 1c06489b137..2693411ced0 100644 --- a/docs/public-networks/get-started/migrate-to-besu.md +++ b/docs/public-networks/get-started/migrate-to-besu.md @@ -1,19 +1,15 @@ --- -description: Migrate to Besu guide +description: Migrate to Besu from a different Ethereum execution client. +tags: + - public networks --- # Migrate to Besu -Migrate from a different Ethereum [execution client](../concepts/the-merge.md#execution-clients) -to Besu to contribute to [client diversity](https://clientdiversity.org/). +Migrate from a different Ethereum [execution client](../concepts/the-merge.md#execution-clients) to Besu to contribute to [client diversity](https://clientdiversity.org/). -To migrate from a different client, -[configure Besu as an execution client](connect/mainnet.md#2-start-besu) and connect your -[consensus client](../concepts/the-merge.md#consensus-clients) to Besu instead of your original -execution client. +To migrate from a different client, [configure Besu as an execution client](connect/mainnet.md#2-start-besu) and connect your [consensus client](../concepts/the-merge.md#consensus-clients) to Besu instead of your original execution client. -To minimize downtime while [Besu syncs](connect/sync-node.md) and avoid downtime penalties, -you can sync Besu with a new consensus layer instance. -Once Besu has fully synced you can connect it to your existing consensus client. +To minimize downtime while [Besu syncs](connect/sync-node.md) and avoid downtime penalties, you can sync Besu with a new consensus layer instance. Once Besu has fully synced you can connect it to your existing consensus client. Find guides to switch from specific clients on the [client diversity website](https://clientdiversity.org/#switch). diff --git a/docs/public-networks/get-started/start-node.md b/docs/public-networks/get-started/start-node.md index 5055a5b756b..803f9345c97 100644 --- a/docs/public-networks/get-started/start-node.md +++ b/docs/public-networks/get-started/start-node.md @@ -1,13 +1,16 @@ --- -description: Starting Hyperledger Besu +title: Start Besu +sidebar_position: 3 +description: Start Besu on a public Ethereum network. +tags: + - public networks --- # Start Besu Nodes can connect to Ethereum Mainnet and public testnets. -Use the [`besu`](../reference/cli/options.md) command with the required command line options -to start a node. +Use the [`besu`](../reference/cli/options.md) command with the required command line options to start a node. ## Prerequisites @@ -15,49 +18,36 @@ to start a node. ## Local block data -When connecting to a network other than the network previously connected to, you must either delete -the local block data or use the [`--data-path`](../reference/cli/options.md#data-path) option -to specify a different data directory. +When connecting to a network other than the network previously connected to, you must either delete the local block data or use the [`--data-path`](../reference/cli/options.md#data-path) option to specify a different data directory. -To delete the local block data, delete the `database` directory in the -`besu/build/distribution/besu-` directory. +To delete the local block data, delete the `database` directory in the `besu/build/distribution/besu-` directory. ## Genesis configuration -Besu specifies the genesis configuration, and sets the network ID and bootnodes when connecting to -[Goerli](#run-a-node-on-goerli-testnet), [Sepolia](#run-a-node-on-sepolia-testnet), and -[Mainnet](#run-a-node-on-ethereum-mainnet). +Besu specifies the genesis configuration, and sets the network ID and bootnodes when connecting to [Goerli](#run-a-node-on-goerli-testnet), [Sepolia](#run-a-node-on-sepolia-testnet), and [Mainnet](#run-a-node-on-ethereum-mainnet). -!!! important +:::info - The Ropsten, Rinkeby, and Kiln testnets are deprecated. +The Ropsten, Rinkeby, and Kiln testnets are deprecated. -When you specify [`--network=dev`](../reference/cli/options.md#network), Besu uses the -development mode genesis configuration with a fixed low difficulty. A node started with -[`--network=dev`](../reference/cli/options.md#network) has an empty bootnodes list by -default. +::: -The genesis files defining the genesis configurations are in the -[Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). +When you specify [`--network=dev`](../reference/cli/options.md#network), Besu uses the development mode genesis configuration with a fixed low difficulty. A node started with [`--network=dev`](../reference/cli/options.md#network) has an empty bootnodes list by default. -To define a genesis configuration, create a genesis file (for example, `genesis.json`) and specify -the file using the [`--genesis-file`](../reference/cli/options.md#genesis-file) option. +The genesis files defining the genesis configurations are in the [Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). + +To define a genesis configuration, create a genesis file (for example, `genesis.json`) and specify the file using the [`--genesis-file`](../reference/cli/options.md#genesis-file) option. ## Syncing and storage -By default, Besu syncs to the current state of the blockchain using -[fast sync](connect/sync-node.md#fast-synchronization) in: +By default, Besu syncs to the current state of the blockchain using [fast sync](connect/sync-node.md#fast-synchronization) in: -- Networks specified using [`--network`](../reference/cli/options.md#network) except for the `dev` - development network. +- Networks specified using [`--network`](../reference/cli/options.md#network) except for the `dev` development network. - Ethereum Mainnet. -We recommend using [snap sync](connect/sync-node.md#snap-synchronization) for a faster sync, by starting Besu -with [`--sync-mode=X_SNAP`](../reference/cli/options.md#sync-mode). +We recommend using [snap sync](connect/sync-node.md#snap-synchronization) for a faster sync, by starting Besu with [`--sync-mode=X_SNAP`](../reference/cli/options.md#sync-mode). -By default, Besu stores data in the [Forest of Tries](../concepts/data-storage-formats.md#forest-of-tries) format. -We recommend using [Bonsai Tries](../concepts/data-storage-formats.md#bonsai-tries) for lower storage requirements, -by starting Besu with [`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). +By default, Besu stores data in the [Forest of Tries](../concepts/data-storage-formats.md#forest-of-tries) format. We recommend using [Bonsai Tries](../concepts/data-storage-formats.md#bonsai-tries) for lower storage requirements, by starting Besu with [`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). ## Run a node for testing @@ -67,8 +57,7 @@ To run a node that mines blocks at a rate suitable for testing purposes: besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir ``` -You can also use the following [configuration file](../how-to/configuration-file.md) -on the command line to start a node with the same options as above: +You can also use the following [configuration file](../how-to/configuration-file.md) on the command line to start a node with the same options as above: ```toml network="dev" @@ -81,19 +70,15 @@ rpc-http-enabled=true data-path="/tmp/tmpdata-path" ``` -!!! caution +:::danger Warning + +The following settings are a security risk in production environments: - The following settings are a security risk in production environments: +- Enabling the HTTP JSON-RPC service ([`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled)) and setting [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the RPC connection on your node to any remote connection. +- Setting [`--host-allowlist`](../reference/cli/options.md#host-allowlist) to `"*"` allows JSON-RPC API access from any host. +- Setting [`--rpc-http-cors-origins`](../reference/cli/options.md#rpc-http-cors-origins) to `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. - * Enabling the HTTP JSON-RPC service - ([`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled)) and setting - [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the - RPC connection on your node to any remote connection. - * Setting [`--host-allowlist`](../reference/cli/options.md#host-allowlist) to `"*"` - allows JSON-RPC API access from any host. - * Setting - [`--rpc-http-cors-origins`](../reference/cli/options.md#rpc-http-cors-origins) to - `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. +::: ## Run a node on Goerli testnet @@ -115,8 +100,7 @@ To run a node on [Sepolia](https://github.com/goerli/sepolia) specifying a data besu --network=sepolia --data-path=/ ``` -Where `` and `` are the path and directory to save the Sepolia chain data -to. +Where `` and `` are the path and directory to save the Sepolia chain data to. See the [guide on connecting to a testnet](connect/testnet.md) for more information. @@ -138,35 +122,30 @@ See the [guide on connecting to Mainnet](connect/mainnet.md) for more informatio ## Confirm node is running -If you started Besu with the -[`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) option, use -[cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to -confirm the node is running. - -!!! example +If you started Besu with the [`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) option, use [cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to confirm the node is running. - * `eth_chainId` returns the chain ID of the network. +- `eth_chainId` returns the chain ID of the network. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 - ``` + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 + ``` - * `eth_syncing` returns the starting, current, and highest block. +- `eth_syncing` returns the starting, current, and highest block. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 - ``` + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 + ``` - For example, after connecting to Mainnet, `eth_syncing` will return something similar to: + For example, after connecting to Mainnet, `eth_syncing` will return something similar to: - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : { - "startingBlock" : "0x0", - "currentBlock" : "0x2d0", - "highestBlock" : "0x66c0" - } - } - ``` + ```json + { + "jsonrpc": "2.0", + "id": 1, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x2d0", + "highestBlock": "0x66c0" + } + } + ``` diff --git a/docs/public-networks/get-started/system-requirements.md b/docs/public-networks/get-started/system-requirements.md index b46d84bc85d..e0d9dfe7122 100644 --- a/docs/public-networks/get-started/system-requirements.md +++ b/docs/public-networks/get-started/system-requirements.md @@ -1,24 +1,26 @@ --- -title: Hyperledger Besu System Requirements -description: System requirements to sync and run Besu +title: System requirements +sidebar_position: 1 +description: Ensure you meet the system requirements to sync and run Besu. +tags: + - public networks --- # System requirements -Determine public network system requirements by checking CPU and disk space requirements using -[Prometheus](../how-to/monitor/metrics.md). -Grafana provides a [sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. +Determine public network system requirements by checking CPU and disk space requirements using [Prometheus](../how-to/monitor/metrics.md). Grafana provides a [sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. -!!! tip +:::tip - CPU requirements are highest when syncing to the network and typically reduce after the node is - synchronized to the chain head. +CPU requirements are highest when syncing to the network and typically reduce after the node is synchronized to the chain head. + +::: ## Java distribution and installation Besu requires an installation of Java 17+ to run. -We currently recommend two Java distributions, [OpenJDK 17](https://jdk.java.net/17/) -and [OpenJ9](https://www.eclipse.org/openj9/), though you can experiment based on your needs. +We currently recommend two Java distributions, [OpenJDK 17](https://jdk.java.net/17/) and +[OpenJ9](https://www.eclipse.org/openj9/), though you can experiment based on your needs. OpenJDK is the default for many Java users and is balanced in performance and garbage collection. OpenJ9 consumes less memory and system resources, but can have worse performance on some setups. @@ -33,92 +35,99 @@ If you have OpenJDK installed or need a fresh installation of OpenJ9, you can pi docker image, or install the OpenJ9 JDK using the following steps: 1. Get the [binaries](https://github.com/ibmruntimes/semeru17-binaries/releases) corresponding to - your OS architecture. - For example: + your OS architecture. + For example: ```bash wget https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.5%2B8_openj9-0.35.0/ibm-semeru-open-jdk_x64_linux_17.0.5_8_openj9-0.35.0.tar.gz ``` - 2. Uncompress the binaries: - === "Command" - - ```bash - tar -xvf YOUR_J9_IMAGE.tar.gz - ``` - - === "Example" - - ```bash - tar -xvf ibm-semeru-open-jdk_x64_linux_17.0.5_8_openj9-0.35.0.tar.gz - ``` - + + + # Command + + ```bash + tar -xvf YOUR_J9_IMAGE.tar.gz + ``` + # Example + + ```bash + tar -xvf ibm-semeru-open-jdk_x64_linux_17.0.5_8_openj9-0.35.0.tar.gz + ``` + + + 3. Move the binaries to `bin` directory: - === "Command" + + + # Command - ```bash - sudo cp -r YOUR_IMAGE/ /usr/bin/ - ``` + ```bash + sudo cp -r YOUR_IMAGE/ /usr/bin/ + ``` + # Example - === "Example" - - ```bash - sudo cp -r jdk-17.0.5+8/ /usr/bin/ - ``` + ```bash + sudo cp -r jdk-17.0.5+8/ /usr/bin/ + ``` + + 4. Specify OpenJ9 for Java on your machine: - === "Command" - - ```bash - sudo update-alternatives --install "/usr/bin/java" "java" "/usr/bin/YOUR_IMAGE" 1 - sudo update-alternatives --config java (and choose OpenJ9) - ``` - - === "Example" - - ```bash - sudo update-alternatives --install "/usr/bin/java" "java" "/usr/bin/jdk-17.0.5+8/bin/java" - ``` - - Change your `JAVA_HOME` to OpenJ9 (if using the JDK implementation), where `jdk-install-dir` is - the installation location you specified: - - === "Command" - - ```bash - export JAVA_HOME=jdk-install-dir` - ``` - - === "Example" - - ```bash - export JAVA_HOME=/usr/bin/jdk-17.0.5+8 - ``` + + + # Command + + ```bash + sudo update-alternatives --install "/usr/bin/java" "java" "/usr/bin/YOUR_IMAGE" 1 + sudo update-alternatives --config java (and choose OpenJ9) + ``` + + # Example + + ```bash + sudo update-alternatives --install "/usr/bin/java" "java" "/usr/bin/jdk-17.0.5+8/bin/java" + ``` + + + + Change your `JAVA_HOME` to OpenJ9 (if using the JDK implementation), where `jdk-install-dir` is + the installation location you specified: + + + + # Command + + ```bash + export JAVA_HOME=jdk-install-dir` + ``` + + # Example + + ```bash + export JAVA_HOME=/usr/bin/jdk-17.0.5+8 + ``` + + ## Java Virtual Machine size For Mainnet and testnets, the minimum [Java Virtual Machine (JVM) memory requirement is 8 GB](../how-to/configure-jvm/manage-memory.md). -JVM memory requirements are highest when syncing, but will reduce after the node is synchronized -to the chain head. Monitor your system to determine your actual JVM memory needs. +JVM memory requirements are highest when syncing, but will reduce after the node is synchronized to the chain head. Monitor your system to determine your actual JVM memory needs. ## Disk space -[Fast synchronization](../reference/cli/options.md#sync-mode) with -[pruning](../concepts/data-storage-formats.md) enabled requires approximately 750 GB of disk space. -[Full synchronization](../reference/cli/options.md#sync-mode) requires approximately 3 TB. +[Fast synchronization](../reference/cli/options.md#sync-mode) with [pruning](../concepts/data-storage-formats.md) enabled requires approximately 750 GB of disk space. [Full synchronization](../reference/cli/options.md#sync-mode) requires approximately 3 TB. ## Disk type -Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). -Read-only nodes can use a lower performance setup. +Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). Read-only nodes can use a lower performance setup. -You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). -For higher performance in production settings, we recommend upgrading to -[NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). +You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). For higher performance in production settings, we recommend upgrading to [NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). ## AWS requirements @@ -126,9 +135,10 @@ We are running 22.4.2 Mainnet nodes using `m6gd.2xlarge` boxes. We synchronized the 22.4.2 Mainnet nodes using `m6gd.2xlarge` boxes. -Using a larger box while synchronizing speeds up the sync process by giving it more resources. When the -sync is completed, the box size can be reduced. +Using a larger box while synchronizing speeds up the sync process by giving it more resources. When the sync is completed, the box size can be reduced. + +:::caution -!!! important +If you are using a more recent release than 22.4.2, resource requirements may have increased. - If you are using a more recent release than 22.4.2, resource requirements may have increased. +::: diff --git a/docs/public-networks/how-to/_category_.json b/docs/public-networks/how-to/_category_.json new file mode 100644 index 00000000000..6a19126f23e --- /dev/null +++ b/docs/public-networks/how-to/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "How to", + "position": 3, + "link": { + "type": "generated-index", + "slug": "public-networks/how-to" + } +} diff --git a/docs/public-networks/how-to/configuration-file.md b/docs/public-networks/how-to/configuration-file.md index 414fc6581e5..8a70c92c997 100644 --- a/docs/public-networks/how-to/configuration-file.md +++ b/docs/public-networks/how-to/configuration-file.md @@ -1,6 +1,9 @@ --- -description: Using the Hyperledger Besu configuration file +title: Use a configuration file +sidebar_position: 3 +description: Specify options in the Besu configuration file. tags: + - public networks - private networks --- @@ -8,65 +11,56 @@ tags: To specify command line options in a file, use a TOML configuration file. -Save the configuration file and reuse it across node startups. To specify the configuration file, -use the [`--config-file`](../reference/cli/options.md#config-file) option. +Save the configuration file and reuse it across node startups. To specify the configuration file, use the [`--config-file`](../reference/cli/options.md#config-file) option. -To override an option specified in the configuration file, either specify the same option on the -command line or as an -[environment variable](../reference/cli/options.md#specify-options). For options -specified in more than one place, the order of precedence is command line, environment variable, -configuration file. +To override an option specified in the configuration file, either specify the same option on the command line or as an [environment variable](../reference/cli/options.md#specify-options). For options specified in more than one place, the order of precedence is command line, environment variable, configuration file. -!!! note +:::note - The configuration file is used for node-level settings. - You can specify network-wide settings in the [genesis file](../concepts/genesis-file.md). +The configuration file is used for node-level settings. You can specify network-wide settings in the [genesis file](../concepts/genesis-file.md). -## TOML specification +::: -The configuration file must be a valid TOML file composed of key/value pairs. Each key is the same -as the corresponding command line option name without the leading dashes (`--`). +## TOML specification -Values must conform to TOML specifications for string, numbers, arrays, and booleans. Specific -differences between the command line and the TOML file format are: +The configuration file must be a valid TOML file composed of key/value pairs. Each key is the same as the corresponding command line option name without the leading dashes (`--`). -* Comma-separated lists on the command line are string arrays in the TOML file. -* Enclose file paths, hexadecimal numbers, URLs, and <host:port> values in quotes. +Values must conform to TOML specifications for string, numbers, arrays, and booleans. Specific differences between the command line and the TOML file format are: -!!!tip +- Comma-separated lists on the command line are string arrays in the TOML file. +- Enclose file paths, hexadecimal numbers, URLs, and <host:port> values in quotes. - The [command line reference](../reference/cli/options.md) includes configuration file - examples for each option. +:::tip -!!!example "Sample TOML configuration file" +The [command line reference](../reference/cli/options.md) includes configuration file examples for each option. - ```toml - # Valid TOML config file - data-path="~/besudata" # Path +::: - # Network - bootnodes=["enode://001@123:4567", "enode://002@123:4567", "enode://003@123:4567"] +```toml title="Sample TOML configuration file" +# Valid TOML config file +data-path="~/besudata" # Path - p2p-host="1.2.3.4" - p2p-port=1234 - max-peers=42 +# Network +bootnodes=["enode://001@123:4567", "enode://002@123:4567", "enode://003@123:4567"] - rpc-http-host="5.6.7.8" - rpc-http-port=5678 +p2p-host="1.2.3.4" +p2p-port=1234 +max-peers=42 - rpc-ws-host="9.10.11.12" - rpc-ws-port=9101 +rpc-http-host="5.6.7.8" +rpc-http-port=5678 - # Chain - genesis-file="~/genesis.json" # Path to the custom genesis file +rpc-ws-host="9.10.11.12" +rpc-ws-port=9101 - # Mining - miner-enabled=true - miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" - ``` +# Chain +genesis-file="~/genesis.json" # Path to the custom genesis file -!!!example "Starting Besu with a configuration file" +# Mining +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +``` - ```bash - besu --config-file=/home/me/me_node/config.toml - ``` +```bash title="Starting Besu with a configuration file" +besu --config-file=/home/me/me_node/config.toml +``` diff --git a/docs/public-networks/how-to/configure-ha/_category_.json b/docs/public-networks/how-to/configure-ha/_category_.json new file mode 100644 index 00000000000..450cbdb623f --- /dev/null +++ b/docs/public-networks/how-to/configure-ha/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure high availability", + "position": 7 +} diff --git a/docs/public-networks/how-to/configure-ha/index.md b/docs/public-networks/how-to/configure-ha/index.md index d9679f6dbf3..0f642295f0a 100644 --- a/docs/public-networks/how-to/configure-ha/index.md +++ b/docs/public-networks/how-to/configure-ha/index.md @@ -1,134 +1,107 @@ --- description: Hyperledger Besu high availability tags: + - public networks - private networks --- # High availability of JSON-RPC and RPC Pub/Sub APIs -To enable high availability to the -[RPC Pub/Sub API over WebSocket](../use-besu-api/rpc-pubsub.md) or the -[JSON-RPC API](../use-besu-api/json-rpc.md), run and synchronize more than one -Hyperledger Besu node to the network. -Use a load balancer to distribute requests across nodes in the cluster that are ready to receive requests. +To enable high availability to the [RPC Pub/Sub API over WebSocket](../use-besu-api/rpc-pubsub.md) or the [JSON-RPC API](../use-besu-api/json-rpc.md), run and synchronize more than one Hyperledger Besu node to the network. Use a load balancer to distribute requests across nodes in the cluster that are ready to receive requests. ![Load Balancer](../../../assets/images/LoadBalancer.png) -!!! important +:::tip - We don't recommend putting [bootnodes](../../../private-networks/how-to/configure/bootnodes.md) - behind a load balancer. +We don't recommend putting [bootnodes](../../../private-networks/how-to/configure/bootnodes.md) behind a load balancer. -!!! important +::: - We recommend using load balancers over WebSockets because WebSockets are persistent connections associated with - specific nodes. If you use load balancers configured in sticky mode over HTTP instead, the connection sticks to the - associated node even when the node is congested and there is a lower load node available. If you use load balancers - not configured in sticky mode over HTTP, the connections may switch from node to node, so some JSON-RPC requests may - not provide expected results (for example, [`admin` methods](../../reference/api/index.md#admin-methods), - [`net_enode`](../../reference/api/index.md#net_enode), - [`net_peerCount`](../../reference/api/index.md#net_peercount), and - [`eth_syncing`](../../reference/api/index.md#eth_syncing)). +:::info + +We recommend using load balancers over WebSockets because WebSockets are persistent connections associated with specific nodes. If you use load balancers configured in sticky mode over HTTP instead, the connection sticks to the associated node even when the node is congested and there is a lower load node available. If you use load balancers not configured in sticky mode over HTTP, the connections may switch from node to node, so some JSON-RPC requests may not provide expected results (for example, [`admin` methods](../../reference/api/index.md#admin-methods), [`net_enode`](../../reference/api/index.md#net_enode), [`net_peerCount`](../../reference/api/index.md#net_peercount), and [`eth_syncing`](../../reference/api/index.md#eth_syncing)). + +::: ## Determine when a node is ready -Use the -[readiness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) to -determine when a node is ready. +Use the [readiness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) to determine when a node is ready. -!!! note +:::note - The minimum number of peers and number of blocks from the best known block for determining if a - node considered ready is deployment specific. +The minimum number of peers and number of blocks from the best known block for determining if a node considered ready is deployment specific. + +::: ## Transaction nonces -Besu obtains the nonce for the next transaction using -[`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). The nonce -depends on the transactions in the -[transaction pool](../../concepts/transactions/pool.md). If sending -[`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) and -[`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction) requests for a -specific account to more than one node, the -[`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) results -might be incorrect. - -!!! note - - If using [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md), - retrieve the nonce using - [`priv_getTransactionCount`](../../../private-networks/reference/api/index.md#priv_gettransactioncount) or - [`priv_getEeaTransactionCount`](../../../private-networks/reference/api/index.md#priv_geteeatransactioncount) - and send the private transactions using - [`eea_sendRawTransaction`](../../../private-networks/reference/api/index.md#eea_sendrawtransaction). +Besu obtains the nonce for the next transaction using [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). The nonce depends on the transactions in the [transaction pool](../../concepts/transactions/pool.md). If sending [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) and [`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction) requests for a specific account to more than one node, the [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) results might be incorrect. + +:::note + +If using [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md), retrieve the nonce using [`priv_getTransactionCount`](../../../private-networks/reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../../private-networks/reference/api/index.md#priv_geteeatransactioncount) and send the private transactions using [`eea_sendRawTransaction`](../../../private-networks/reference/api/index.md#eea_sendrawtransaction). + +::: To get correct nonces when distributing requests across a cluster, either: -* Track the next nonce outside of the Besu node (as MetaMask does). -* Configure the load balancer in sticky mode to send requests from a specific account to a single - node, unless that node is unavailable. +- Track the next nonce outside of the Besu node (as MetaMask does). +- Configure the load balancer in sticky mode to send requests from a specific account to a single node, unless that node is unavailable. ## Subscriptions You can subscribe to events using: -* [RPC Pub/Sub over WebSockets](../use-besu-api/rpc-pubsub.md). -* [Filters over HTTP](../use-besu-api/access-logs.md). +- [RPC Pub/Sub over WebSockets](../use-besu-api/rpc-pubsub.md). +- [Filters over HTTP](../use-besu-api/access-logs.md). -We recommend using [RPC Pub/Sub over WebSocket](../use-besu-api/rpc-pubsub.md) because -WebSockets connections associate with a specific node and do not require using the load balancer in -sticky mode. +We recommend using [RPC Pub/Sub over WebSocket](../use-besu-api/rpc-pubsub.md) because WebSockets connections associate with a specific node and do not require using the load balancer in sticky mode. -If using [filters over HTTP](../use-besu-api/access-logs.md), configure -the load balancer in sticky mode to associate the subscription with a specific node. +If using [filters over HTTP](../use-besu-api/access-logs.md), configure the load balancer in sticky mode to associate the subscription with a specific node. ## Recover from dropped subscriptions Dropped subscriptions can occur because of: -* A disconnected WebSockets connection -* The removal of the node serving the subscription from the ready pool. +- A disconnected WebSockets connection +- The removal of the node serving the subscription from the ready pool. -If there is a dropped subscription, missed events might occur while reconnecting to a different -node. To recover dropped messages, create another subscription and follow the process for that -[subscription type](../use-besu-api/rpc-pubsub.md#subscribe): +If there is a dropped subscription, missed events might occur while reconnecting to a different node. To recover dropped messages, create another subscription and follow the process for that [subscription type](../use-besu-api/rpc-pubsub.md#subscribe): -* [`newHeads`](#new-headers) -* [`logs`](#logs) -* [`newPendingTransactions`](#new-pending-transactions) -* [`droppedPendingTransactions`](#dropped-pending-transactions) -* [`syncing`](#syncing). +- [`newHeads`](#new-headers) +- [`logs`](#logs) +- [`newPendingTransactions`](#new-pending-transactions) +- [`droppedPendingTransactions`](#dropped-pending-transactions) +- [`syncing`](#syncing). ### New headers -To request information on blocks from the last block before the subscription dropped to the first -block received from the new subscription, use -[`eth_getBlockByNumber`](../../reference/api/index.md#eth_getblockbynumber). +To request information on blocks from the last block before the subscription dropped to the first block received from the new subscription, use [`eth_getBlockByNumber`](../../reference/api/index.md#eth_getblockbynumber). ### Logs -To request logs from the block number of the last log received before the subscription dropped to -the current chain head, use [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). +To request logs from the block number of the last log received before the subscription dropped to the current chain head, use [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). ### New pending transactions -To request all pending transactions for the new node, use -[`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). +To request all pending transactions for the new node, use [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). -!!! note +:::note - Nodes do not all store the same pending transactions. +Nodes do not all store the same pending transactions. + +::: ### Dropped pending transactions -To request all pending transactions for the new node, use -[`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). +To request all pending transactions for the new node, use [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). + +:::note -!!! note +Nodes do not all store the same pending transactions. - Nodes do not all store the same pending transactions. +::: ### Syncing -The syncing state of each node is specific to that node. To retrieve the syncing state of the new -node, use [`eth_syncing`](../../reference/api/index.md#eth_syncing). +The syncing state of each node is specific to that node. To retrieve the syncing state of the new node, use [`eth_syncing`](../../reference/api/index.md#eth_syncing). diff --git a/docs/public-networks/how-to/configure-ha/sample-configuration.md b/docs/public-networks/how-to/configure-ha/sample-configuration.md index e6dc6852c02..b018ba2a75b 100644 --- a/docs/public-networks/how-to/configure-ha/sample-configuration.md +++ b/docs/public-networks/how-to/configure-ha/sample-configuration.md @@ -1,6 +1,9 @@ --- +title: Sample load balancer configurations +sidebar_position: 1 description: Sample load balancers tags: + - public networks - private networks --- @@ -8,106 +11,89 @@ tags: ## AWS -For AWS, we recommend the Classic Load Balancer. The Classic Load Balancer is the easiest to -configure and work with. Register the Hyperledger Besu instances to the load balancer and use the -[liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) for -health checks. +For AWS, we recommend the Classic Load Balancer. The Classic Load Balancer is the easiest to configure and work with. Register the Hyperledger Besu instances to the load balancer and use the [liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) for health checks. For finer grain control, use the Application Load Balancer: -* Configure one target group with n nodes. -* Configure multiple listeners with one per port (for example, `30303`, `8545`) you are using and - route to the target group. -* Use the - [liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) - for health checks. -* Register the Besu instances multiple times with different ports. This is like configuring - microservices on Elastic Container Service (ECS) or Elastic Kubernetes Service (EKS). +- Configure one target group with n nodes. +- Configure multiple listeners with one per port (for example, `30303`, `8545`) you are using and route to the target group. +- Use the [liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) for health checks. +- Register the Besu instances multiple times with different ports. This is like configuring microservices on Elastic Container Service (ECS) or Elastic Kubernetes Service (EKS). ### HTTPS redirection -With either AWS load balancer, you can add certificates using ACM (Amazon Certificate Manager), -add them to the load balancers, and redirect all HTTP calls to HTTPS. +With either AWS load balancer, you can add certificates using ACM (Amazon Certificate Manager), add them to the load balancers, and redirect all HTTP calls to HTTPS. ## Elastic Kubernetes Service -For Elastic Kubernetes Service (AWS Kubernetes service) use the same load balancer configuration as -when running nodes in Kubernetes. Use labels to specify nodes for the load balanced group. +For Elastic Kubernetes Service (AWS Kubernetes service) use the same load balancer configuration as when running nodes in Kubernetes. Use labels to specify nodes for the load balanced group. ## Manual configurations -Where applicable, we strongly recommend using service discovery. That is, pair your load balancer -configuration with something that dynamically detects new nodes and removed failed nodes. +Where applicable, we strongly recommend using service discovery. That is, pair your load balancer configuration with something that dynamically detects new nodes and removed failed nodes. -For Nginx, use multiple upstreams (one for each port). Pair each upstream with a separate server -block. +For Nginx, use multiple upstreams (one for each port). Pair each upstream with a separate server block. -!!! example "Upstreams paired with server blocks" +```conf title="Upstreams paired with server blocks" +upstream discovery_tcp_30303 { + server 10.0.1.1:30303; + server 10.0.1.2:30303; +} - ``` - upstream discovery_tcp_30303 { - server 10.0.1.1:30303; - server 10.0.1.2:30303; - } - - upstream rpc_tcp_8545 { - server 10.0.1.1:8545; - server 10.0.1.2:8545; - } +upstream rpc_tcp_8545 { + server 10.0.1.1:8545; + server 10.0.1.2:8545; +} - server { - listen 30303; - server_name some.host; - location / { - proxy_pass http://discovery_tcp_30303; - } +server { + listen 30303; + server_name some.host; + location / { + proxy_pass http://discovery_tcp_30303; } +} - server { - listen 8545; - server_name some.host; - location / { - proxy_pass http://rpc_tcp_8545; - } +server { + listen 8545; + server_name some.host; + location / { + proxy_pass http://rpc_tcp_8545; } - ... - ``` +} +... +``` For HAProxy, create multiple backend and frontend sets. -!!! example "Multiple backend and frontend sets" - - ``` - frontend discovery-tcp-30303 - bind *:30303 - acl ... - ... - default_backend back-discovery-tcp-30303 - - frontend rpc-tcp-8545 - bind *:8545 - acl ... - ... - default_backend back-rpc-tcp-8545 - - backend back-discovery-tcp-30303 - balance leastconn - server node-01 10.0.1.1:30303 weight 1 check - server node-02 10.0.1.2:30303 weight 1 check - option ... - timeout server 600s - - backend back-rpc-tcp-8545 - balance leastconn - server node-01 10.0.1.1:8545 weight 1 check - server node-02 10.0.1.2:8545 weight 1 check - option .... - timeout server 600s +```text title="Multiple backend and frontend sets" +frontend discovery-tcp-30303 + bind *:30303 + acl ... + ... + default_backend back-discovery-tcp-30303 + +frontend rpc-tcp-8545 + bind *:8545 + acl ... ... - ``` + default_backend back-rpc-tcp-8545 + +backend back-discovery-tcp-30303 + balance leastconn + server node-01 10.0.1.1:30303 weight 1 check + server node-02 10.0.1.2:30303 weight 1 check + option ... + timeout server 600s + +backend back-rpc-tcp-8545 + balance leastconn + server node-01 10.0.1.1:8545 weight 1 check + server node-02 10.0.1.2:8545 weight 1 check + option .... + timeout server 600s +... +``` ### HTTPS redirection -To add HTTPS capability, update the above server blocks to include the certificates and specific -ciphers. If you require an HTTP to HTTPS redirection, add separate blocks to return a 301 code with -the new URI. +To add HTTPS capability, update the above server blocks to include the certificates and specific ciphers. If you require an HTTP to HTTPS redirection, add separate blocks to return a 301 code with the new URI. diff --git a/docs/public-networks/how-to/configure-jvm/_category_.json b/docs/public-networks/how-to/configure-jvm/_category_.json new file mode 100644 index 00000000000..bb5cfebb77f --- /dev/null +++ b/docs/public-networks/how-to/configure-jvm/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure the Java Virtual Machine", + "position": 8 +} diff --git a/docs/public-networks/how-to/configure-jvm/index.md b/docs/public-networks/how-to/configure-jvm/index.md index 0cc9cfaacc6..95bf95bfac3 100644 --- a/docs/public-networks/how-to/configure-jvm/index.md +++ b/docs/public-networks/how-to/configure-jvm/index.md @@ -1,6 +1,7 @@ --- title: Configure Java and Besu tags: + - public networks - private networks hide: - feedback diff --git a/docs/public-networks/how-to/configure-jvm/java-flight-recorder.md b/docs/public-networks/how-to/configure-jvm/java-flight-recorder.md index 99dbe63c376..b1cd6e32fcd 100644 --- a/docs/public-networks/how-to/configure-jvm/java-flight-recorder.md +++ b/docs/public-networks/how-to/configure-jvm/java-flight-recorder.md @@ -1,14 +1,15 @@ --- +title: Use Java Flight Recorder +sidebar_position: 3 description: Using Java Flight Recorder with Hyperledger Besu tags: + - public networks - private networks --- # Use Java Flight Recorder -[Java Flight Recorder (JFR)](https://docs.oracle.com/javacomponents/jmc-5-4/jfr-runtime-guide/about.htm#JFRUH170) is a -monitoring tool that collects information about the Java Virtual Machine (JVM) when Hyperledger Besu is running. -Use the JFR as a tool to analyze Besu performance. +[Java Flight Recorder (JFR)](https://docs.oracle.com/javacomponents/jmc-5-4/jfr-runtime-guide/about.htm#JFRUH170) is a monitoring tool that collects information about the Java Virtual Machine (JVM) when Hyperledger Besu is running. Use the JFR as a tool to analyze Besu performance. ## Enable Java Flight Recorder @@ -20,16 +21,16 @@ filename=/tmp/recording.jfr,maxsize=1024m,maxage=1d,\ settings=profile,path-to-gc-roots=true ``` -!!! tip +:::tip - When recording, cleanly exiting Besu results in better data. - If not possible to cleanly exit, the file may be missing some information not flushed to disk. +When recording, cleanly exiting Besu results in better data. If not possible to cleanly exit, the file may be missing some information not flushed to disk. -Inspect the file written to `/tmp/recording.jfr` with tools such as -[Mission Control](https://docs.oracle.com/javacomponents/jmc-5-5/jmc-user-guide/intro.htm#JMCCI109). +::: -!!! warning +Inspect the file written to `/tmp/recording.jfr` with tools such as [Mission Control](https://docs.oracle.com/javacomponents/jmc-5-5/jmc-user-guide/intro.htm#JMCCI109). - If providing the output file to [ConsenSys Quorum support](https://consensys.net/quorum/support/), be aware that - while JFR files don't contain secrets such as private keys, some details about the user configuration can be - inferred from the JFR output. +:::danger + +If providing the output file to [ConsenSys Quorum support](https://consensys.net/quorum/support/), be aware that while JFR files don't contain secrets such as private keys, some details about the user configuration can be inferred from the JFR output. + +::: diff --git a/docs/public-networks/how-to/configure-jvm/manage-memory.md b/docs/public-networks/how-to/configure-jvm/manage-memory.md index bcfecdcb6ea..9605ce18cfe 100644 --- a/docs/public-networks/how-to/configure-jvm/manage-memory.md +++ b/docs/public-networks/how-to/configure-jvm/manage-memory.md @@ -1,6 +1,9 @@ --- +title: Manage JVM memory +sidebar_position: 2 description: Besu memory management tags: + - public networks - private networks --- @@ -8,8 +11,7 @@ tags: You can manage Java Virtual Machine (JVM) memory usage for Besu by modifying the maximum heap size. -By default, the JVM uses 25% of system RAM. -For example, if you have 16 GB RAM installed, the JVM uses 4 GB by default. +By default, the JVM uses 25% of system RAM. For example, if you have 16 GB RAM installed, the JVM uses 4 GB by default. On public networks, we recommend setting the maximum heap size to: @@ -17,57 +19,55 @@ On public networks, we recommend setting the maximum heap size to: - 5 GB on a 16 GB RAM system. - 8 GB on a system with at least 24 GB RAM. -!!! note +:::note - Setting a higher maximum heap size speeds up the sync period but doesn't have much impact - after sync. - Thus, we recommend setting it to 8 GB only when you have available RAM. +Setting a higher maximum heap size speeds up the sync period but doesn't have much impact after sync. Thus, we recommend setting it to 8 GB only when you have available RAM. -You can set the maximum heap size using the `BESU_OPTS` environment variable and the `-Xmx` option. -The following examples set the maximum heap size to 8 GB: +::: -=== "Exported environment variable example" +You can set the maximum heap size using the `BESU_OPTS` environment variable and the `-Xmx` option. The following examples set the maximum heap size to 8 GB: - Set the variable for the whole shell before running Besu. + - ```bash - export BESU_OPTS=-Xmx8g - ``` +# Exported environment variable example -=== "Inline environment variable example" +Set the variable for the whole shell before running Besu. - Set the variable only for the specific Besu command. +```bash +export BESU_OPTS=-Xmx8g +``` + +# Inline environment variable example - ```bash - BESU_OPTS=-Xmx8g besu [Besu options] - ``` +Set the variable only for the specific Besu command. -=== "`.service` file example" +```bash +BESU_OPTS=-Xmx8g besu [Besu options] +``` + +# `.service` file example + +```bash +[Service] +... +Environment="BESU_OPTS=-Xmx8g" +ExecStart=besu [Besu options] +... +``` - ```bash - [Service] - ... - Environment="BESU_OPTS=-Xmx8g" - ExecStart=besu [Besu options] - ... - ``` + ## Manage the heap dump -Heap dump file generation is disabled by default. -To enable it, set the `-XX:+HeapDumpOnOutOfMemoryError` Java option. +Heap dump file generation is disabled by default. To enable it, set the `-XX:+HeapDumpOnOutOfMemoryError` Java option. ```bash BESU_OPTS="-XX:+HeapDumpOnOutOfMemoryError" ``` -When heap dump file generation is enabled, and an out-of-memory error occurs, the heap dump file is -saved in the Besu runtime directory by default. +When heap dump file generation is enabled, and an out-of-memory error occurs, the heap dump file is saved in the Besu runtime directory by default. -The heap dump file might be large and can saturate your drive. -It can be up to the size of the allocated memory. -For example, for 8 GB heap memory, the file can be up to 8 GB. -Specify the directory where you want the dump to be saved using the `-XX:HeapDumpPath` Java option. +The heap dump file might be large and can saturate your drive. It can be up to the size of the allocated memory. For example, for 8 GB heap memory, the file can be up to 8 GB. Specify the directory where you want the dump to be saved using the `-XX:HeapDumpPath` Java option. ```bash BESU_OPTS="-XX:HeapDumpPath=///" diff --git a/docs/public-networks/how-to/configure-jvm/pass-jvm-options.md b/docs/public-networks/how-to/configure-jvm/pass-jvm-options.md index 475a0af00f3..39196ef84fb 100644 --- a/docs/public-networks/how-to/configure-jvm/pass-jvm-options.md +++ b/docs/public-networks/how-to/configure-jvm/pass-jvm-options.md @@ -1,23 +1,21 @@ --- +title: Pass JVM options +sidebar_position: 1 description: Passing Java virtual machine JVM options to Hyperledger Besu at runtime tags: + - public networks - private networks --- # Pass JVM options -To perform tasks such as attaching a debugger or configuring the garbage collector, pass Java -Virtual Machine (JVM) options to Hyperledger Besu. +To perform tasks such as attaching a debugger or configuring the garbage collector, pass Java Virtual Machine (JVM) options to Hyperledger Besu. -Besu passes the contents of the `BESU_OPTS` environment variable to the JVM. Set standard JVM -options in the `BESU_OPTS` variable. +Besu passes the contents of the `BESU_OPTS` environment variable to the JVM. Set standard JVM options in the `BESU_OPTS` variable. -For Bash-based executions, you can set the variable for only the scope of the program execution by -setting it before starting Besu. +For Bash-based executions, you can set the variable for only the scope of the program execution by setting it before starting Besu. -!!! example - - ```bash - BESU_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \ - besu --network=goerli - ``` +```bash +BESU_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \ +besu --network=goerli +``` diff --git a/docs/public-networks/how-to/connect/_category_.json b/docs/public-networks/how-to/connect/_category_.json new file mode 100644 index 00000000000..cce59e7c3f8 --- /dev/null +++ b/docs/public-networks/how-to/connect/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Find and connect to peers", + "position": 5 +} diff --git a/docs/public-networks/how-to/connect/configure-ports.md b/docs/public-networks/how-to/connect/configure-ports.md index 2ff14b2077b..55df8aa0fd8 100644 --- a/docs/public-networks/how-to/connect/configure-ports.md +++ b/docs/public-networks/how-to/connect/configure-ports.md @@ -1,63 +1,48 @@ --- +title: Configure ports +sidebar_position: 2 description: To enable communication you must expose Hyperledger Besu ports appropriately tags: + - public networks - private networks --- # Configure ports -To enable communication you must expose Hyperledger Besu ports appropriately. The following shows -an example port configuration for a Besu node on AWS. +To enable communication you must expose Hyperledger Besu ports appropriately. The following shows an example port configuration for a Besu node on AWS. ![Port Configuration](../../../assets/images/PortConfiguration.png) -When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), -[expose ports](../../get-started/install/run-docker-image.md#exposing-ports). +When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), [expose ports](../../get-started/install/run-docker-image.md#exposing-ports). -!!! tip +:::tip - Besu supports [UPnP](specify-nat.md) for home or small office environments where a wireless - router or modem provides NAT isolation. +Besu supports [UPnP](specify-nat.md) for home or small office environments where a wireless router or modem provides NAT isolation. + +::: ## P2P networking -To enable peer discovery, the P2P UDP port must be open for inbound connections. Specify the P2P -port using the [`--p2p-port`](../../reference/cli/options.md#p2p-port) option. The default is -`30303`. +To enable peer discovery, the P2P UDP port must be open for inbound connections. Specify the P2P port using the [`--p2p-port`](../../reference/cli/options.md#p2p-port) option. The default is `30303`. + +We also recommend opening the P2P TCP port for inbound connections. This is not strictly required because Besu attempts to open outbound TCP connections. But if no nodes on the network are accepting inbound TCP connections, nodes cannot communicate. -We also recommend opening the P2P TCP port for inbound connections. This is not strictly required -because Besu attempts to open outbound TCP connections. But if no nodes on the network are -accepting inbound TCP connections, nodes cannot communicate. +Combine the P2P port with the values for the [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-interface`](../../reference/cli/options.md#p2p-interface) options when specifying the [P2P host](../../reference/cli/options.md#p2p-host) and [P2P network interface](../../reference/cli/options.md#p2p-interface). -Combine the P2P port with the values for the -[`--p2p-host`](../../reference/cli/options.md#p2p-host) and -[`--p2p-interface`](../../reference/cli/options.md#p2p-interface) options when specifying the -[P2P host](../../reference/cli/options.md#p2p-host) and -[P2P network interface](../../reference/cli/options.md#p2p-interface). +:::info -!!! info +By default, peer discovery listens on `0.0.0.0:30303` (all interfaces). If the device Besu is running on must bind to a specific network interface, specify the interface using the [`--p2p-interface`](../../reference/cli/options.md#p2p-interface) option. - By default, peer discovery listens on `0.0.0.0:30303` (all interfaces). If the device Besu is - running on must bind to a specific network interface, specify the interface using the - [`--p2p-interface`](../../reference/cli/options.md#p2p-interface) option. +::: ## JSON-RPC API -To enable access to the [JSON-RPC API](../use-besu-api/json-rpc.md), open the HTTP -JSON-RPC and WebSockets JSON-RPC ports to the intended users of the JSON-RPC API on TCP. +To enable access to the [JSON-RPC API](../use-besu-api/json-rpc.md), open the HTTP JSON-RPC and WebSockets JSON-RPC ports to the intended users of the JSON-RPC API on TCP. -Specify the HTTP and WebSockets JSON-RPC ports using the -[`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) and -[`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port) options. The defaults are `8545` -and `8546`. +Specify the HTTP and WebSockets JSON-RPC ports using the [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) and [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port) options. The defaults are `8545` and `8546`. ## Metrics -To enable -[Prometheus to access Besu](../monitor/metrics.md), open -the metrics port or metrics push port to Prometheus or the Prometheus push gateway on TCP. +To enable [Prometheus to access Besu](../monitor/metrics.md), open the metrics port or metrics push port to Prometheus or the Prometheus push gateway on TCP. -Specify the ports for Prometheus and Prometheus push gateway using the -[`--metrics-port`](../../reference/cli/options.md#metrics-port) and -[`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. The defaults -are `9545` and `9001`. +Specify the ports for Prometheus and Prometheus push gateway using the [`--metrics-port`](../../reference/cli/options.md#metrics-port) and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. The defaults are `9545` and `9001`. diff --git a/docs/public-networks/how-to/connect/manage-peers.md b/docs/public-networks/how-to/connect/manage-peers.md index e5e1915c8b0..84e29fe2573 100644 --- a/docs/public-networks/how-to/connect/manage-peers.md +++ b/docs/public-networks/how-to/connect/manage-peers.md @@ -1,114 +1,88 @@ --- +title: Manage peers +sidebar_position: 3 description: Managing Hyperledger Besu peers tags: + - public networks - private networks --- # Manage peers -Hyperledger Besu peer-to-peer (P2P) discovery happens periodically based on the number of peers in a network and the -node's [peer limit](#limit-peers). +Hyperledger Besu peer-to-peer (P2P) discovery happens periodically based on the number of peers in a network and the node's [peer limit](#limit-peers). -The frequency of discovery isn't configurable, but you can [limit remote connections](#limit-remote-connections) in -public networks and [randomly prioritize connections](../../reference/cli/options.md#random-peer-priority-enabled) -in small, stable networks. +The frequency of discovery isn't configurable, but you can [limit remote connections](#limit-remote-connections) in public networks and [randomly prioritize connections](../../reference/cli/options.md#random-peer-priority-enabled) in small, stable networks. -!!! info +:::info - You can use [`admin_addPeer`](../../reference/cli/options.md#admin_addpeer) to attempt a specific connection, but - this isn't P2P discovery. +You can use [`admin_addPeer`](../../reference/cli/options.md#admin_addpeer) to attempt a specific connection, but this isn't P2P discovery. -In private networks, we recommend [using bootnodes](../../../private-networks/how-to/configure/bootnodes.md) -to initially discover peers. +::: + +In private networks, we recommend [using bootnodes](../../../private-networks/how-to/configure/bootnodes.md) to initially discover peers. ## Limit peers You can limit peers to reduce the bandwidth, CPU time, and disk access Besu uses to manage and respond to peers. -To reduce the maximum number of peers, use the -[`--max-peers`](../../reference/cli/options.md#max-peers) option. The default is 25. +To reduce the maximum number of peers, use the [`--max-peers`](../../reference/cli/options.md#max-peers) option. The default is 25. + +:::caution -!!! caution +The minimum number of peers is set by the `--Xp2p-peer-lower-bound` option, which also has a default of 25. If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` option to the same value or lower. For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. - The minimum number of peers is set by the `--Xp2p-peer-lower-bound` option, which also has a default of 25. - If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` - option to the same value or lower. - For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. +Note, `Xp2p-peer-lower-bound` is an early access option. - Note, `Xp2p-peer-lower-bound` is an early access option. +::: ## Limit remote connections -Prevent eclipse attacks when using [`--sync-mode`](../../reference/cli/options.md#sync-mode) and -[`--fast-sync-min-peers`](../../reference/cli/options.md#fast-sync-min-peers) on public networks by enabling the -[remote connection limits](../../reference/cli/options.md#remote-connections-limit-enabled). +Prevent eclipse attacks when using [`--sync-mode`](../../reference/cli/options.md#sync-mode) and [`--fast-sync-min-peers`](../../reference/cli/options.md#fast-sync-min-peers) on public networks by enabling the [remote connection limits](../../reference/cli/options.md#remote-connections-limit-enabled). -In private and permissioned networks with only trusted peers, enabling the remote connection limits is -unnecessary and might adversely affect the speed at which nodes can join the network. -Limiting remote connections can cause a closed group of peers to form when the number of nodes in the network is -slightly higher than [`--max-peers`](../../reference/cli/options.md#max-peers). -The nodes in this closed group are all connected to each other and can't accept more connections. +In private and permissioned networks with only trusted peers, enabling the remote connection limits is unnecessary and might adversely affect the speed at which nodes can join the network. Limiting remote connections can cause a closed group of peers to form when the number of nodes in the network is slightly higher than [`--max-peers`](../../reference/cli/options.md#max-peers). The nodes in this closed group are all connected to each other and can't accept more connections. -!!! tip +:::tip - You can use [`--random-peer-priority-enabled`](../../reference/cli/options.md#random-peer-priority-enabled) to - help prevent closed groups of peers in small, stable networks. +You can use [`--random-peer-priority-enabled`](../../reference/cli/options.md#random-peer-priority-enabled) to help prevent closed groups of peers in small, stable networks. + +::: ## Monitor peer connections JSON-RPC API methods to monitor peer connections include: -* [`net_peerCount`](../../reference/api/index.md#net_peercount). -* [`admin_peers`](../../reference/api/index.md#admin_peers). -* [`debug_metrics`](../../reference/api/index.md#debug_metrics). +- [`net_peerCount`](../../reference/api/index.md#net_peercount). +- [`admin_peers`](../../reference/api/index.md#admin_peers). +- [`debug_metrics`](../../reference/api/index.md#debug_metrics). -Each peer entry returned by [`admin_peers`](../../reference/api/index.md#admin_peers) includes a -`protocols` section. Use the information in the `protocols` section to: +Each peer entry returned by [`admin_peers`](../../reference/api/index.md#admin_peers) includes a `protocols` section. Use the information in the `protocols` section to: -* Determine the health of peers. - For example, an external process can use [`admin_peers`](../../reference/api/index.md#admin_peers) and - [`admin_removePeer`](../../reference/api/index.md#admin_removepeer) to disconnect from peers that are stalled at a - single difficulty for an extended period of time. +- Determine the health of peers. For example, an external process can use [`admin_peers`](../../reference/api/index.md#admin_peers) and [`admin_removePeer`](../../reference/api/index.md#admin_removepeer) to disconnect from peers that are stalled at a single difficulty for an extended period of time. -* Monitor node health. - For example, if peers report increasing difficulties but the node is stuck at the same block number, the node may be - on a different fork to most peers. +- Monitor node health. For example, if peers report increasing difficulties but the node is stuck at the same block number, the node may be on a different fork to most peers. -* Determine which protocol level peers are communicating with. - For example, you can see if `"version": 65` is being used to reduce transaction sharing traffic. +- Determine which protocol level peers are communicating with. For example, you can see if `"version": 65` is being used to reduce transaction sharing traffic. ## List node connections -The default logging configuration doesn't list node connection and disconnection messages. -To enable listing them, set the [`--logging`](../../reference/cli/options.md#logging) option to `DEBUG`. -For more verbosity, set the option to `TRACE`. - -The console logs connection and disconnection events when the log level is `DEBUG` or higher. -If the message `Successfully accepted connection from ...` displays, connections are getting through the firewalls. +The default logging configuration doesn't list node connection and disconnection messages. To enable listing them, set the [`--logging`](../../reference/cli/options.md#logging) option to `DEBUG`. For more verbosity, set the option to `TRACE`. -!!! example "Sample log output" +The console logs connection and disconnection events when the log level is `DEBUG` or higher. If the message `Successfully accepted connection from ...` displays, connections are getting through the firewalls. - ```bash - 2018-10-16 12:37:35.479-04:00 | nioEventLoopGroup-3-1 | INFO | NettyP2PNetwork | Successfully accepted connection from 0xa979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c - ``` +```bash title="Sample log output" +2018-10-16 12:37:35.479-04:00 | nioEventLoopGroup-3-1 | INFO | NettyP2PNetwork | Successfully accepted connection from 0xa979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c +``` ## Disable discovery -To disable P2P discovery, set the -[`--discovery-enabled`](../../reference/cli/options.md#discovery-enabled) option to `false`. +To disable P2P discovery, set the [`--discovery-enabled`](../../reference/cli/options.md#discovery-enabled) option to `false`. -With discovery disabled, peers can't open connections with the node unless they were previously discovered or manually -peered (for example, using [`admin_addPeer`](../../reference/api/index.md#admin_addpeer)). -[Static nodes](static-nodes.md) can also open connections. +With discovery disabled, peers can't open connections with the node unless they were previously discovered or manually peered (for example, using [`admin_addPeer`](../../reference/api/index.md#admin_addpeer)). [Static nodes](static-nodes.md) can also open connections. ## Troubleshoot -If your nodes fail to connect, ensure the -[required ports are open](configure-ports.md). +If your nodes fail to connect, ensure the [required ports are open](configure-ports.md). -If your nodes are running in AWS, check you have appropriate `SecurityGroups` to allow access to -the required ports. +If your nodes are running in AWS, check you have appropriate `SecurityGroups` to allow access to the required ports. -Check that the [enode URLs](../../concepts/node-keys.md#enode-url) specified for -[bootnodes](../../../private-networks/how-to/configure/bootnodes.md) or -[static nodes](static-nodes.md) match the enode URLs displayed when starting the remote nodes. +Check that the [enode URLs](../../concepts/node-keys.md#enode-url) specified for [bootnodes](../../../private-networks/how-to/configure/bootnodes.md) or [static nodes](static-nodes.md) match the enode URLs displayed when starting the remote nodes. diff --git a/docs/public-networks/how-to/connect/specify-nat.md b/docs/public-networks/how-to/connect/specify-nat.md index 5cf7f220f9a..6438ab2fc13 100644 --- a/docs/public-networks/how-to/connect/specify-nat.md +++ b/docs/public-networks/how-to/connect/specify-nat.md @@ -1,107 +1,93 @@ --- +title: Specify NAT method +sidebar_position: 4 description: Configuring NAT with Hyperledger Besu tags: + - public networks - private networks --- # Specify the NAT method -Use the [`--nat-method`](../../reference/cli/options.md#nat-method) option to specify the NAT -method. Options are: [`UPNP`](#upnp), [`KUBERNETES`](#kubernetes), [`DOCKER`](#docker), -[`AUTO`](#auto), and [`NONE`](#none). +Use the [`--nat-method`](../../reference/cli/options.md#nat-method) option to specify the NAT method. Options are: [`UPNP`](#upnp), [`KUBERNETES`](#kubernetes), [`DOCKER`](#docker), [`AUTO`](#auto), and [`NONE`](#none). -The [enode](../../concepts/node-keys.md#enode-url) advertised to other nodes during discovery is -the external IP address and port. The -[`admin_nodeInfo`](../../reference/api/index.md#admin_nodeinfo) JSON-RPC API method returns the -external address and port for the `enode` and `listenAddr` properties. +The [enode](../../concepts/node-keys.md#enode-url) advertised to other nodes during discovery is the external IP address and port. The [`admin_nodeInfo`](../../reference/api/index.md#admin_nodeinfo) JSON-RPC API method returns the external address and port for the `enode` and `listenAddr` properties. While Hyperledger Besu is running, the following are not supported: -* IP address changes -* Changing NAT methods. To change the NAT method, restart the node with the - [`--nat-method`](../../reference/cli/options.md#nat-method) option set. +- IP address changes +- Changing NAT methods. To change the NAT method, restart the node with the [`--nat-method`](../../reference/cli/options.md#nat-method) option set. ## Auto -`AUTO` detects if Besu is running inside a Kubernetes cluster or -a Docker container. +`AUTO` detects if Besu is running inside a Kubernetes cluster or a Docker container. -* If Besu is running in a Kubernetes cluster, `AUTO` sets to [`KUBERNETES`](#kubernetes). -* If Besu is running in a Docker container, `AUTO` sets to [`DOCKER`](#docker). -* If Besu is not running in Kubernetes or Docker container, `AUTO` sets to [`NONE`](#none). +- If Besu is running in a Kubernetes cluster, `AUTO` sets to [`KUBERNETES`](#kubernetes). +- If Besu is running in a Docker container, `AUTO` sets to [`DOCKER`](#docker). +- If Besu is not running in Kubernetes or Docker container, `AUTO` sets to [`NONE`](#none). `AUTO` is the default NAT method. The following log shows an automatic detection failure. -!!! example - The following log shows an automatic detection failure. +```log title="The following log shows an automatic detection failure" +INFO | KubernetesNatManager | Starting kubernetes NAT manager. +DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. +DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used +INFO | NetworkRunner | Starting Network. +``` - ``` - INFO | KubernetesNatManager | Starting kubernetes NAT manager. - DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. - DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used - INFO | NetworkRunner | Starting Network. - ``` +:::tip -!!!tip - If automatic detection fails, set the IP and ports in [`NONE`](#none) mode. +If automatic detection fails, set the IP and ports in [`NONE`](#none) mode. + +::: ## UPnP -Specify `UPNP` to quickly allow inbound peer connections without manual router configuration. Use -UPnP in home or small office environments where a wireless router or modem provides NAT isolation. +Specify `UPNP` to quickly allow inbound peer connections without manual router configuration. Use UPnP in home or small office environments where a wireless router or modem provides NAT isolation. -UPnP automatically detects if a node is running in a UPnP environment and provides port forwarding. -UPnP might introduce delays during node startup, especially on networks without a UPnP gateway -device. +UPnP automatically detects if a node is running in a UPnP environment and provides port forwarding. UPnP might introduce delays during node startup, especially on networks without a UPnP gateway device. Use `UPNPP2PONLY` if you wish to enable UPnP only for p2p traffic. -!!! tip +:::tip + +UPnP support is often disabled by default in networking firmware. If disabled by default, you must explicitly enable UPnP support. - UPnP support is often disabled by default in networking firmware. If disabled by default, you - must explicitly enable UPnP support. +::: -!!! important +:::info - When the NAT method is set to `UPNP`, the advertised port is the same as the - [listening port](../../reference/cli/options.md#p2p-port). +When the NAT method is set to `UPNP`, the advertised port is the same as the [listening port](../../reference/cli/options.md#p2p-port). + +::: ## Kubernetes -Specify `KUBERNETES` to explicitly specify Hyperledger Besu is running inside a Kubernetes cluster. -Besu automatically detects if it's running inside of a Kubernetes cluster and interacts with -Kubernetes APIs as required to determine external IP addresses and exposed ports. +Specify `KUBERNETES` to explicitly specify Hyperledger Besu is running inside a Kubernetes cluster. Besu automatically detects if it's running inside of a Kubernetes cluster and interacts with Kubernetes APIs as required to determine external IP addresses and exposed ports. -In Kubernetes, the Ingress IP of the load balancer will be used as the external IP for Besu. -A load balancer service can map any incoming port to a target port. These mapping rules will be the one retrieved by Besu. +In Kubernetes, the Ingress IP of the load balancer will be used as the external IP for Besu. A load balancer service can map any incoming port to a target port. These mapping rules will be the one retrieved by Besu. A tutorial to [Configure the Nat Manager for Kubernetes](../../../private-networks/tutorials/kubernetes/nat-manager.md) is available. ## Docker -Specify `DOCKER` to explicitly specify Hyperledger Besu is running inside a Docker container. If -you specify `DOCKER`, you advertise the host IP address not the container IP address. +Specify `DOCKER` to explicitly specify Hyperledger Besu is running inside a Docker container. If you specify `DOCKER`, you advertise the host IP address not the container IP address. -The host IP address is the advertised host specified in the -[`docker run` command](https://docs.docker.com/engine/reference/commandline/run/#add-entries-to-container-hosts-file---add-host). -If not specified in the `docker run` command, the advertised host defaults to the values for -[`--p2p-host`](../../reference/cli/options.md#p2p-host) and -[`--p2p-port`](../../reference/cli/options.md#p2p-port). +The host IP address is the advertised host specified in the [`docker run` command](https://docs.docker.com/engine/reference/commandline/run/#add-entries-to-container-hosts-file---add-host). If not specified in the `docker run` command, the advertised host defaults to the values for [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-port`](../../reference/cli/options.md#p2p-port). ## None Specify `NONE` to explicitly configure the external IP address and ports advertised using: -* [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-port`](../../reference/cli/options.md#p2p-port) - for the P2P service. -* [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) and [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) - for the JSON-RPC HTTP service. +- [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-port`](../../reference/cli/options.md#p2p-port) for the P2P service. +- [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) and [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) for the JSON-RPC HTTP service. The P2P and JSON-RPC HTTP hosts and ports are advertised in the [`net_services`](../../reference/api/index.md#net_services) method. -!!! important +:::tip + +When the NAT method is set to `NONE`, the advertised port is the same as the [listening port](../../reference/cli/options.md#p2p-port). - When the NAT method is set to `NONE`, the advertised port is the same as the - [listening port](../../reference/cli/options.md#p2p-port). +::: diff --git a/docs/public-networks/how-to/connect/static-nodes.md b/docs/public-networks/how-to/connect/static-nodes.md index 7e9446ca184..aa0eb09641f 100644 --- a/docs/public-networks/how-to/connect/static-nodes.md +++ b/docs/public-networks/how-to/connect/static-nodes.md @@ -1,78 +1,65 @@ --- +title: Configure static nodes +sidebar_position: 1 description: Configuring static nodes tags: + - public networks - private networks --- # Static nodes -Static nodes are a configured set of trusted nodes. Static nodes are exempt from -[maximum peer](manage-peers.md#limit-peers) and -[remote connection](manage-peers.md#limit-remote-connections) limits. +Static nodes are a configured set of trusted nodes. Static nodes are exempt from [maximum peer](manage-peers.md#limit-peers) and [remote connection](manage-peers.md#limit-remote-connections) limits. -Besu attempts to maintain connections with static nodes by periodically initiating a connection to -any unconnected static node. +Besu attempts to maintain connections with static nodes by periodically initiating a connection to any unconnected static node. -!!! tip +:::tip - Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, - you can use only bootnodes, only static nodes, or both bootnodes and static nodes. For - example, you run multiple nodes on Mainnet (discovery using bootnodes), but want to ensure your - nodes are always connected (using static nodes). +Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, you can use only bootnodes, only static nodes, or both bootnodes and static nodes. For example, you run multiple nodes on Mainnet (discovery using bootnodes), but want to ensure your nodes are always connected (using static nodes). - To find peers, configure one or more [bootnodes](../../../private-networks/how-to/configure/bootnodes.md). - To configure a specific set of peer connections, use static nodes. +To find peers, configure one or more [bootnodes](../../../private-networks/how-to/configure/bootnodes.md). To configure a specific set of peer connections, use static nodes. + +::: ## Configure static nodes To configure a network of static nodes: -1. List the [enode URLs](../../concepts/node-keys.md#enode-url) of the nodes in the - [`static-nodes.json` file](#static-nodesjson-file). +1. List the [enode URLs](../../concepts/node-keys.md#enode-url) of the nodes in the [`static-nodes.json` file](#static-nodesjson-file). + +1. Save the `static-nodes.json` file in the data directory (specified by [`--data-path`](../../reference/cli/options.md#data-path)) of each node. Alternatively, you can explicitly specify the static nodes file on the command line using [`--static-nodes-file`](../../reference/cli/options.md#static-nodes-file). + +1. Start Besu with discovery disabled using [`--discovery-enabled=false`](../../reference/cli/options.md#discovery-enabled). -1. Save the `static-nodes.json` file in the data directory (specified by - [`--data-path`](../../reference/cli/options.md#data-path)) of each node. - Alternatively, you can explicitly specify the static nodes file on the command line using - [`--static-nodes-file`](../../reference/cli/options.md#static-nodes-file). +To update the list of static peers at run time, use the [`admin_addPeer`](../../reference/api/index.md#admin_addpeer) and [`admin_removePeer`](../../reference/api/index.md#admin_removepeer) JSON-RPC API methods. -1. Start Besu with discovery disabled using - [`--discovery-enabled=false`](../../reference/cli/options.md#discovery-enabled). +:::note -To update the list of static peers at run time, use the -[`admin_addPeer`](../../reference/api/index.md#admin_addpeer) and -[`admin_removePeer`](../../reference/api/index.md#admin_removepeer) JSON-RPC API methods. +Runtime modifications of static nodes are not persisted between runs. The `static-nodes.json` file is not updated by the `admin_addPeer` and `admin_removePeer` methods. -!!! note +Nodes not in the list of the static nodes are not prevented from connecting. To prevent nodes from connecting, use [Permissioning](../../../private-networks/concepts/permissioning/index.md). - Runtime modifications of static nodes are not persisted between runs. The `static-nodes.json` - file is not updated by the `admin_addPeer` and `admin_removePeer` methods. +::: - Nodes not in the list of the static nodes are not prevented from connecting. To prevent nodes - from connecting, use [Permissioning](../../../private-networks/concepts/permissioning/index.md). +:::tip -!!! tip +If the added peer does not appear in the peer list (returned by [`admin_peers`](../../reference/api/index.md#admin_peers)), check the the supplied [enode URL](../../concepts/node-keys.md#enode-url) is correct, the node is running, and the node is listening for TCP connections on the endpoint. - If the added peer does not appear in the peer list (returned by - [`admin_peers`](../../reference/api/index.md#admin_peers)), check the the supplied - [enode URL](../../concepts/node-keys.md#enode-url) is correct, the node is running, and the - node is listening for TCP connections on the endpoint. +::: ### `static-nodes.json` file -The `static-nodes.json` file must be in the data directory (specified by -[`--data-path`](../../reference/cli/options.md#data-path)) and contain a JSON array of -[enode URLs](../../concepts/node-keys.md#enode-url). +The `static-nodes.json` file must be in the data directory (specified by [`--data-path`](../../reference/cli/options.md#data-path)) and contain a JSON array of [enode URLs](../../concepts/node-keys.md#enode-url). -!!! example +```json title="Example" +[ + "enode://cea71cb65a471037e01508cebcc178f176f9d5267bf29507ea1f6431eb6a5dc67d086dc8dc54358a72299dab1161febc5d7af49d1609c69b42b5e54544145d4f@127.0.0.1:30303", + "enode://ca05e940488614402705a6b6836288ea902169ecc67a89e1bd5ef94bc0d1933f20be16bc881ffb4be59f521afa8718fc26eec2b0e90f2cd0f44f99bc8103e60f@127.0.0.1:30304" +] +``` - ```json - [ - "enode://cea71cb65a471037e01508cebcc178f176f9d5267bf29507ea1f6431eb6a5dc67d086dc8dc54358a72299dab1161febc5d7af49d1609c69b42b5e54544145d4f@127.0.0.1:30303", - "enode://ca05e940488614402705a6b6836288ea902169ecc67a89e1bd5ef94bc0d1933f20be16bc881ffb4be59f521afa8718fc26eec2b0e90f2cd0f44f99bc8103e60f@127.0.0.1:30304" - ] - ``` +:::note -!!! note +Each node has a `static-nodes.json` file. We recommend each node in the network has the same `static-nodes.json` file. - Each node has a `static-nodes.json` file. We recommend each node in the network has the same - `static-nodes.json` file. +::: diff --git a/docs/public-networks/how-to/develop/_category_.json b/docs/public-networks/how-to/develop/_category_.json new file mode 100644 index 00000000000..8c8a280b930 --- /dev/null +++ b/docs/public-networks/how-to/develop/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Develop dapps", + "position": 9 +} diff --git a/docs/public-networks/how-to/develop/client-libraries.md b/docs/public-networks/how-to/develop/client-libraries.md index 65f6e32cc75..009e82d8d35 100644 --- a/docs/public-networks/how-to/develop/client-libraries.md +++ b/docs/public-networks/how-to/develop/client-libraries.md @@ -1,28 +1,31 @@ --- +title: Use client libraries +sidebar_position: 2 description: Hyperledger Besu client libraries tags: + - public networks - private networks --- # Use client libraries -Dapps use client libraries, such as [web3.js](https://github.com/ethereum/web3.js/), -[web3j](https://github.com/web3j/web3j), or [ethereumj](https://github.com/ethereum/ethereumj), to -forward JSON-RPC requests to Hyperledger Besu. Any client library implementing core Ethereum RPC -methods works with Besu. +Dapps use client libraries, such as [web3.js](https://github.com/ethereum/web3.js/), [web3j](https://github.com/web3j/web3j), or [ethereumj](https://github.com/ethereum/ethereumj), to forward JSON-RPC requests to Hyperledger Besu. Any client library implementing core Ethereum RPC methods works with Besu. -Use the [web3js-quorum library](../../../private-networks/how-to/use-privacy/web3js-quorum.md) with Besu for -[privacy features](../../../private-networks/concepts/privacy/index.md). +Use the [web3js-quorum library](../../../private-networks/how-to/use-privacy/web3js-quorum.md) with Besu for [privacy features](../../../private-networks/concepts/privacy/index.md). ![Client Libraries](../../../assets/images/Hyperledger-Besu-Client-Libraries.png) Use client libraries to: -* Create signed transactions -* [Create and send private transactions]. +- Create signed transactions +- [Create and send private transactions]. -!!! note - [Hyperledger Besu does not support key management inside the client](../send-transactions.md#use-wallets-for-key-management). +:::note + +[Hyperledger Besu does not support key management inside the client](../send-transactions.md#use-wallets-for-key-management). + +::: + [Create and send private transactions]: ../../../private-networks/how-to/send-transactions/private-transactions.md diff --git a/docs/public-networks/how-to/develop/truffle.md b/docs/public-networks/how-to/develop/truffle.md index babe4f4cca4..a97d5d4620a 100644 --- a/docs/public-networks/how-to/develop/truffle.md +++ b/docs/public-networks/how-to/develop/truffle.md @@ -1,14 +1,15 @@ --- +title: Use Truffle +sidebar_position: 1 description: Using Hyperledger Besu with Truffle tags: + - public networks - private networks --- # Use Truffle -Developing for Hyperledger Besu using Truffle is the same as developing for public Ethereum -networks using Truffle. Truffle supports Besu with the only difference being Besu does not support -private key management. To use Besu with Truffle, you must configure a Truffle wallet. +Developing for Hyperledger Besu using Truffle is the same as developing for public Ethereum networks using Truffle. Truffle supports Besu with the only difference being Besu does not support private key management. To use Besu with Truffle, you must configure a Truffle wallet. ## Install a Truffle wallet @@ -18,21 +19,26 @@ To install a Truffle wallet: npm install --save @truffle/hdwallet-provider ``` -!!!note +:::note - With Truffle 5, you must use a Web3 1.0 enabled wallet or the Truffle tasks hang. +With Truffle 5, you must use a Web3 1.0 enabled wallet or the Truffle tasks hang. + +::: ### Update the Truffle configuration file To add the wallet provider, update the `truffle-config.js` file in the project directory. Replace: -* `` with the JSON-RPC endpoint (IP address and port) of a Besu node. -* `` with the private key of an Ethereum account containing Ether. +- `` with the JSON-RPC endpoint (IP address and port) of a Besu node. +- `` with the private key of an Ethereum account containing Ether. ```javascript const PrivateKeyProvider = require("@truffle/hdwallet-provider"); const privateKey = ""; -const privateKeyProvider = new PrivateKeyProvider(privateKey, ""); +const privateKeyProvider = new PrivateKeyProvider( + privateKey, + "", +); module.exports = { // See @@ -40,16 +46,15 @@ module.exports = { networks: { besuWallet: { provider: privateKeyProvider, - network_id: "*" + network_id: "*", }, - } + }, }; ``` ### Start a Besu node -Start a Besu node with JSON-RPC enabled on the endpoint specified in the Truffle configuration -file. +Start a Besu node with JSON-RPC enabled on the endpoint specified in the Truffle configuration file. ### Deploy a contract diff --git a/docs/public-networks/how-to/monitor/_category_.json b/docs/public-networks/how-to/monitor/_category_.json new file mode 100644 index 00000000000..9be56b91890 --- /dev/null +++ b/docs/public-networks/how-to/monitor/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Monitor nodes", + "position": 6 +} diff --git a/docs/public-networks/how-to/monitor/index.md b/docs/public-networks/how-to/monitor/index.md index d8db7863784..c2c49d0e9fd 100644 --- a/docs/public-networks/how-to/monitor/index.md +++ b/docs/public-networks/how-to/monitor/index.md @@ -1,16 +1,15 @@ --- description: Monitoring using metrics and logging tags: + - public networks - private networks --- # Monitor Besu -Monitoring enables identification of node and network issues. Specifically, configuring metrics and -logging enables: +Monitoring enables identification of node and network issues. Specifically, configuring metrics and logging enables: -* [Visual representation of declining node or network performance](metrics.md) -* [Collection of log files to enable issue diagnosis](logging.md). +- [Visual representation of declining node or network performance](metrics.md) +- [Collection of log files to enable issue diagnosis](logging.md). -For an overview of monitoring Hyperledger Besu, view -[this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). +For an overview of monitoring Hyperledger Besu, view [this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). diff --git a/docs/public-networks/how-to/monitor/logging.md b/docs/public-networks/how-to/monitor/logging.md index f902301c80a..c994d6388c6 100644 --- a/docs/public-networks/how-to/monitor/logging.md +++ b/docs/public-networks/how-to/monitor/logging.md @@ -1,8 +1,11 @@ --- +title: Configure logging +sidebar_position: 3 description: Hyperledger Besu log level setting and log formatting path: blob/master/besu/src/main/resources/ source: log4j2.xml tags: + - public networks - private networks --- @@ -10,53 +13,46 @@ tags: Hyperledger Besu uses Log4J2 for logging and provides two methods to configure logging behavior: -* [Basic](#basic-logging) - Changes the log level. -* [Advanced](#advanced-logging) - Configures the output and format of the logs. +- [Basic](#basic-logging) - Changes the log level. +- [Advanced](#advanced-logging) - Configures the output and format of the logs. -[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) provides an -[example implementation using Elastic Stack](../../../private-networks/how-to/monitor/elastic-stack.md) for log management. +[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) provides an [example implementation using Elastic Stack](../../../private-networks/how-to/monitor/elastic-stack.md) for log management. ## Basic logging -Use the [`--logging`](../../reference/cli/options.md#logging) command line option to specify logging verbosity. -The [`--logging`](../../reference/cli/options.md#logging) option changes the volume of events displayed in the log. -Valid log levels are `OFF`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. -The default level is `INFO`. +Use the [`--logging`](../../reference/cli/options.md#logging) command line option to specify logging verbosity. The [`--logging`](../../reference/cli/options.md#logging) option changes the volume of events displayed in the log. Valid log levels are `OFF`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. The default level is `INFO`. For most use cases, the basic method provides enough configurability. -!!! tip +:::tip - Use the [`admin_changeLogLevel`](../../reference/api/index.md#admin_changeloglevel) API method - to change the log level while Besu is running. +Use the [`admin_changeLogLevel`](../../reference/api/index.md#admin_changeloglevel) API method to change the log level while Besu is running. + +::: ## Advanced logging -You can provide your own logging configuration using the standard Log4J2 configuration mechanisms. -For example, the following Log4J2 configuration is the same as the [default configuration] except for the exclusion of -logging of stack traces for exceptions. - -!!! example "debug.xml" - - ```xml - - - - INFO - - - - - - - - - - - - - - ``` +You can provide your own logging configuration using the standard Log4J2 configuration mechanisms. For example, the following Log4J2 configuration is the same as the [default configuration] except for the exclusion of logging of stack traces for exceptions. + +```xml title="debug.xml" + + + + INFO + + + + + + + + + + + + + +``` To use your custom configuration, set the environment variable `LOG4J_CONFIGURATION_FILE` to the location of your configuration file. @@ -64,20 +60,18 @@ If you have more specific requirements, you can create your own [log4j2 configur For Bash-based executions, you can set the variable for only the scope of the program execution by setting it before starting Besu. -!!! example - - To set the debug logging and start Besu connected to the Goerli testnet: +To set the debug logging and start Besu connected to the Goerli testnet: - ```bash - LOG4J_CONFIGURATION_FILE=./debug.xml besu --network=goerli - ``` +```bash +LOG4J_CONFIGURATION_FILE=./debug.xml besu --network=goerli +``` ### Log rotation -[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) logging configuration defines a -[log rotation to restrict the size of the log files]. +[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) logging configuration defines a [log rotation to restrict the size of the log files]. + [default configuration]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/besu/src/main/resources/log4j2.xml [log rotation to restrict the size of the log files]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/besu/config/besu/log-config.xml [default configuration]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/besu/src/main/resources/log4j2.xml diff --git a/docs/public-networks/how-to/monitor/metrics.md b/docs/public-networks/how-to/monitor/metrics.md index e0592dece64..e76b90abbc2 100644 --- a/docs/public-networks/how-to/monitor/metrics.md +++ b/docs/public-networks/how-to/monitor/metrics.md @@ -1,176 +1,175 @@ --- +title: Use metrics +sidebar_position: 1 description: Monitoring and metrics tags: + - public networks - private networks --- # Use metrics to monitor node performance -To enable the [Prometheus](https://prometheus.io/) monitoring and alerting service to access Hyperledger Besu metrics, -use the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. -Use [Grafana](https://grafana.com/) to visualize the collected data. -See the sample [Besu Full Grafana dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). +To enable the [Prometheus](https://prometheus.io/) monitoring and alerting service to access Hyperledger Besu metrics, use the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. Use [Grafana](https://grafana.com/) to visualize the collected data. See the sample [Besu Full Grafana dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). The Besu example networks have [monitoring with Prometheus and Grafana configured]. -!!! example +Use Prometheus to monitor the number of blocks your Besu node is behind the chain head, and to alert you that your node is not keeping up with the chain head. - Use Prometheus to monitor the number of blocks your Besu node is behind the chain head, and to alert you that your - node is not keeping up with the chain head. - - [This recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be) shows examples of monitoring Hyperledger Besu. +[This recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be) shows examples of monitoring Hyperledger Besu. ## Install Prometheus -To use Prometheus with Besu, install the [Prometheus main component](https://prometheus.io/download/). -On MacOS, install with [Homebrew](https://formulae.brew.sh/formula/prometheus): +To use Prometheus with Besu, install the [Prometheus main component](https://prometheus.io/download/). On MacOS, install with [Homebrew](https://formulae.brew.sh/formula/prometheus): ```bash brew install prometheus ``` -!!! tip +:::tip + +You can also install: - You can also install: +- Exporters that send system metrics to Prometheus to monitor non-Besu-specific items such as disk and CPU usage. +- Other Prometheus components, such as the Alert Manager. Additional configuration is not required for these components because Prometheus handles and analyzes data directly from the feed. - * Exporters that send system metrics to Prometheus to monitor non-Besu-specific items such as disk and CPU usage. - * Other Prometheus components, such as the Alert Manager. - Additional configuration is not required for these components because Prometheus handles and analyzes data directly - from the feed. +::: ## Set up and run Prometheus with Besu To configure Prometheus and run with Besu: -1. Configure Prometheus to poll Besu. - For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: +1. Configure Prometheus to poll Besu. For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: + + + + # Fragment to insert in prometheus.yml + + ```yml + - job_name: besu + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9545 + ``` - !!! example + # Full prometheus.yml example - === "Fragment to insert in prometheus.yml" + ```yml + global: + scrape_interval: 15s + + scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: besu + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9545 + ``` - ```yml - - job_name: besu - scrape_interval: 15s - scrape_timeout: 10s - metrics_path: /metrics - scheme: http - static_configs: - - targets: - - localhost:9545 - ``` + - === "Full prometheus.yml example" + Prometheus requires 3 MB of space per node per hour for metrics, with a `scrape_interval` of 15 seconds. - ```yml - global: - scrape_interval: 15s +2. Start Besu with the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. To start a single node for testing with metrics enabled, run the following command: - scrape_configs: - - job_name: "prometheus" - static_configs: - - targets: ["localhost:9090"] - - job_name: besu - scrape_interval: 15s - scrape_timeout: 10s - metrics_path: /metrics - scheme: http - static_configs: - - targets: - - localhost:9545 - ``` + - Prometheus requires 3 MB of space per node per hour for metrics, with a `scrape_interval` of 15 seconds. + # Syntax -1. Start Besu with the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. - To start a single node for testing with metrics enabled, run the following command: + ```bash + besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled + ``` - === "Syntax" + # Example - ```bash - besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled - ``` + ```bash + besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled + ``` - === "Example" + - ```bash - besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled - ``` + To specify the host and port on which Prometheus accesses Besu, use the [`--metrics-host`](../../reference/cli/options.md#metrics-host) and [`--metrics-port`](../../reference/cli/options.md#metrics-port) options. The default host and port are 127.0.0.1 (`localhost`) and 9545. - To specify the host and port on which Prometheus accesses Besu, use the [`--metrics-host`](../../reference/cli/options.md#metrics-host) - and [`--metrics-port`](../../reference/cli/options.md#metrics-port) options. - The default host and port are 127.0.0.1 (`localhost`) and 9545. + :::danger - !!! important + To avoid DNS rebinding attacks, if running Prometheus on a different host than your Besu node (any host other than `localhost`), add the hostname that Prometheus uses to [`--host-allowlist`](../../reference/cli/options.md#host-allowlist). - To avoid DNS rebinding attacks, if running Prometheus on a different host than your Besu node (any host other than - `localhost`), add the hostname that Prometheus uses to [`--host-allowlist`](../../reference/cli/options.md#host-allowlist). + For example, if Prometheus is configured to get metrics from `http://besu.local:8008/metrics`, then `besu.local` has to be in `--host-allowlist`. - For example, if Prometheus is configured to get metrics from `http://besu.local:8008/metrics`, then `besu.local` - has to be in `--host-allowlist`. + ::: -1. In another terminal, run Prometheus specifying the `prometheus.yml` file: +3. In another terminal, run Prometheus specifying the `prometheus.yml` file: ```bash prometheus --config.file=prometheus.yml ``` -1. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). +4. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). + + :::tip - !!! tip + Use a log ingestion tool, such as Logstash, to parse the logs and alert you to configured anomalies. - Use a log ingestion tool, such as Logstash, to parse the logs and alert you to configured anomalies. + ::: ## Run Prometheus with Besu in push mode -The [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option enables Prometheus polling of Besu, -but sometimes metrics are hard to poll (for example, when running inside Docker containers with varying IP addresses). -To enable Besu to push metrics to a [Prometheus Pushgateway](https://github.com/prometheus/pushgateway), use the -[`--metrics-push-enabled`](../../reference/cli/options.md#metrics-push-enabled) option. +The [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option enables Prometheus polling of Besu, but sometimes metrics are hard to poll (for example, when running inside Docker containers with varying IP addresses). To enable Besu to push metrics to a [Prometheus push gateway](https://github.com/prometheus/pushgateway), use the [`--metrics-push-enabled`](../../reference/cli/options.md#metrics-push-enabled) option. To configure Prometheus and run with Besu pushing to a push gateway: -1. Configure Prometheus to read from a push gateway. - For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: +1. Configure Prometheus to read from a push gateway. For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: ```yml - job_name: push-gateway metrics_path: /metrics scheme: http static_configs: - - targets: - - localhost:9091 + - targets: + - localhost:9091 ``` -1. Start the push gateway. - You can deploy the push gateway using the Docker image: +1. Start the push gateway. You can deploy the push gateway using the Docker image: ```bash docker pull prom/pushgateway docker run -d -p 9091:9091 prom/pushgateway ``` -1. Start Besu specifying the `--metrics-push-enabled` option and port of the push gateway: +1. Start Besu specifying the `--metrics-push-enabled` option and port of the push gateway: + + - === "Syntax" + # Syntax - ```bash - besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 - ``` + ```bash + besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 + ``` + + # Example - === "Example" + ```bash + besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 + ``` - ```bash - besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 - ``` + -1. In another terminal, run Prometheus specifying the `prometheus.yml` file: +1. In another terminal, run Prometheus specifying the `prometheus.yml` file: ```bash prometheus --config.file=prometheus.yml ``` -1. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). +1. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). ## View Prometheus graphical interface @@ -178,130 +177,121 @@ To configure Prometheus and run with Besu pushing to a push gateway: 1. Choose **Graph** from the menu bar and click the **Console** tab below. -1. From the **Insert metric at cursor** drop-down, select a [metric](#metrics-list) such as `besu_blockchain_difficulty_total` - or `ethereum_blockchain_height` and click **Execute**. - The values display. +1. From the **Insert metric at cursor** drop-down, select a [metric](#metrics-list) such as `besu_blockchain_difficulty_total` or `ethereum_blockchain_height` and click **Execute**. The values display. -1. Click the **Graph** tab to view the data as a time-based graph. - The query string displays below the graph. - For example, `{ethereum_blockchain_height{instance="localhost:9545",job="prometheus"}`. +1. Click the **Graph** tab to view the data as a time-based graph. The query string displays below the graph. For example, `{ethereum_blockchain_height{instance="localhost:9545",job="prometheus"}`. ## Metrics list -The following table lists available metrics. -Each metric starts with a metric category prefix. -Metrics specific to Besu use the `besu_` prefix, followed by another metric category. -Metric categories can be enabled using the [`metrics-category`](../../reference/cli/options.md#metrics-category) command line option. -If a metric has a JSON-RPC equivalent, it is included in the definition column. +The following table lists available metrics. Each metric starts with a metric category prefix. Metrics specific to Besu use the `besu_` prefix, followed by another metric category. Metric categories can be enabled using the [`metrics-category`](../../reference/cli/options.md#metrics-category) command line option. If a metric has a JSON-RPC equivalent, it is included in the definition column. | Name | Metric type | Definition | -| --- | --- | --- | -| `besu_blockchain_chain_head_gas_limit` | Gauge | Block gas limit of the current chain head block | -| `besu_blockchain_chain_head_gas_used` | Gauge | Gas used by the current chain head block | -| `besu_blockchain_chain_head_ommer_count` | Gauge | Number of uncles in the current chain head block (JSON-RPC equivalent: [`eth_getUncleCountByBlockHash`](../../reference/api/index.md#eth_getunclecountbyblockhash) or [`eth_getUncleCountByBlockNumber`](../../reference/api/index.md#eth_getunclecountbyblocknumber)) | -| `besu_blockchain_chain_head_timestamp` | Gauge | Timestamp from the current chain head | -| `besu_blockchain_chain_head_transaction_count` | Gauge | Number of transactions in the current chain head block (JSON-RPC equivalent: [`eth_getBlockTransactionCountByHash`](../../reference/api/index.md#eth_getblocktransactioncountbyhash) or [`eth_getBlockTransactionCountByNumber`](../../reference/api/index.md#eth_getblocktransactioncountbynumber)) | -| `besu_blockchain_difficulty_total` | Gauge | Difficulty of the chain head (JSON-RPC equivalent: `difficulty` of [`admin_peers`](../../reference/api/index.md#admin_peers)) | -| `besu_executors_ethscheduler_computation_active_threads_current` | Gauge | Current number of threads executing computation tasks | -| `besu_executors_ethscheduler_computation_completed_tasks_total` | Gauge | Total number of computation tasks executed | -| `besu_executors_ethscheduler_computation_pool_size_current` | Gauge | Current number of threads in the computation thread pool | -| `besu_executors_ethscheduler_computation_queue_length_current` | Gauge | Current number of computation tasks awaiting execution | -| `besu_executors_ethscheduler_computation_rejected_tasks_total` | Counter | Total number of tasks rejected by this computation executor | -| `besu_executors_ethscheduler_computation_submitted_tasks_total` | Gauge | Total number of computation tasks submitted | -| `besu_executors_ethscheduler_timer_active_threads_current` | Gauge | Current number of threads executing timer tasks | -| `besu_executors_ethscheduler_timer_completed_tasks_total` | Gauge | Total number of timer tasks executed | -| `besu_executors_ethscheduler_timer_pool_size_current` | Gauge | Current number of threads in the timer thread pool | -| `besu_executors_ethscheduler_timer_queue_length_current` | Gauge | Current number of timer tasks awaiting execution | -| `besu_executors_ethscheduler_timer_rejected_tasks_total` | Counter | Total number of tasks rejected by this timer executor | -| `besu_executors_ethscheduler_timer_submitted_tasks_total` | Gauge | Total number of timer tasks submitted | -| `besu_executors_ethscheduler_workers_active_threads_current` | Gauge | Current number of threads executing worker tasks | -| `besu_executors_ethscheduler_workers_completed_tasks_total` | Gauge | Total number of worker tasks executed | -| `besu_executors_ethscheduler_workers_pool_size_current` | Gauge | Current number of threads in the worker thread pool | -| `besu_executors_ethscheduler_workers_queue_length_current` | Gauge | Current number of worker tasks awaiting execution | -| `besu_executors_ethscheduler_workers_rejected_tasks_total` | Counter | Total number of tasks rejected by this worker executor | -| `besu_executors_ethscheduler_workers_submitted_tasks_total` | Gauge | Total number of worker tasks submitted | -| `besu_network_discovery_inflight_interactions_current` | Gauge | Current number of inflight discovery interactions | -| `besu_network_discovery_interaction_count` | Counter | Total number of discovery interactions initiated | -| `besu_network_discovery_interaction_retry_count` | Counter | Total number of interaction retries performed | -| `besu_network_discovery_messages_inbound` | Counter | Total number of P2P discovery messages received | -| `besu_network_discovery_messages_outbound` | Counter | Total number of P2P discovery messages sent | -| `besu_network_netty_boss_pending_tasks` | Gauge | Number of pending tasks in Netty boss event loop | -| `besu_network_netty_workers_pending_tasks` | Gauge | Number of pending tasks in Netty workers event loop | -| `besu_network_p2p_messages_inbound` | Counter | Total number of P2P messages received | -| `besu_network_vertx_eventloop_pending_tasks` | Gauge | Number of pending tasks in Vertx event loop | -| `besu_network_vertx_worker_pool_completed_total` | Counter | Total number of tasks completed by Vertx worker pool | -| `besu_network_vertx_worker_pool_rejected_total` | Counter | Total number of tasks rejected by Vertx worker pool | -| `besu_network_vertx_worker_pool_submitted_total` | Counter | Total number of tasks submitted to Vertx worker pool | -| `besu_peers_connected_total` | Counter | Total number of peers connected | -| `besu_peers_disconnected_total` | Counter | Total number of peers disconnected | -| `besu_peers_pending_peer_requests_current` | Gauge | Current number of peer requests pending because peers are busy | -| `besu_pruner_mark_time_duration` | Gauge | Cumulative number of seconds spent marking the state trie across all pruning cycles | -| `besu_pruner_mark_operations_total` | Counter | Total number of mark operations performed | -| `besu_pruner_marked_nodes_total` | Counter | Total number of nodes marked as in use | -| `besu_pruner_sweep_operations_total` | Counter | Total number of sweep operations performed | -| `besu_pruner_swept_nodes_total` | Counter | Total number of unused nodes removed | -| `besu_stratum_connections` | Counter | Number of connections over time | -| `besu_stratum_difficulty` | Gauge | Current mining difficulty | -| `besu_stratum_disconnections` | Counter | Number of disconnections over time | -| `besu_stratum_miners` | Gauge | Number of connected miners | -| `besu_synchronizer_chain_download_pipeline_processed_total` | Counter | Number of entries processed by each chain download pipeline stage | -| `besu_synchronizer_chain_download_pipeline_restarts` | Counter | Number of times chain download pipeline has been restarted | -| `besu_synchronizer_fast_sync_pivot_block_current` | Gauge | The current fast sync pivot block | -| `besu_synchronizer_fast_sync_pivot_block_selected_count` | Counter | Number of times a fast sync pivot block has been selected | -| `besu_synchronizer_fast_sync_validation_mode` | Counter | Number of blocks validated using light vs full validation during fast sync | -| `besu_synchronizer_in_sync` | Gauge | Whether or not the local node has caught up to the best known peer (1 or 0) | -| `besu_synchronizer_task` | Summary | Internal processing tasks | -| `besu_synchronizer_world_state_completed_requests_total` | Counter | Total number of node data requests completed as part of fast sync world state download | -| `besu_synchronizer_world_state_existing_nodes_total` | Counter | Total number of node data requests completed using existing data | -| `besu_synchronizer_world_state_inflight_requests_current` | Gauge | Number of in progress requests for world state data | -| `besu_synchronizer_world_state_node_requests_since_last_progress_current` | Gauge | Number of world state requests made since the last time new data was returned | -| `besu_synchronizer_world_state_pending_requests_cache_size` | Gauge | Pending request cache size for fast sync world state download | -| `besu_synchronizer_world_state_pending_requests_current` | Gauge | Number of pending requests for fast sync world state download | -| `besu_synchronizer_world_state_pipeline_processed_total` | Counter | Number of entries processed by each world state download pipeline stage | -| `besu_synchronizer_world_state_retried_requests_total` | Counter | Total number of node data requests repeated as part of fast sync world state download | -| `besu_transaction_pool_pending_transactions_messages_skipped_total` | Counter | Total number of pending transactions messages skipped by the processor | -| `besu_transaction_pool_transactions` | Gauge | Current size of the transaction pool (JSON-RPC equivalent: result number of [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions)) | -| `besu_transaction_pool_transactions_added_total` | Counter | Count of transactions added to the transaction pool | -| `besu_transaction_pool_transactions_messages_skipped_total` | Counter | Total number of transactions messages skipped by the processor. | -| `ethereum_best_known_block_number` | Gauge | Estimated highest block available (JSON-RPC equivalent: `highestBlock` of [`eth_syncing`](../../reference/api/index.md#eth_syncing), or [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) if not syncing) | -| `ethereum_blockchain_height` | Gauge | Current height of the canonical chain (JSON-RPC equivalent: [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber)) | -| `ethereum_peer_count` | Gauge | Current number of peers connected (JSON-RPC equivalent: [`net_peerCount`](../../reference/api/index.md#net_peercount)) | -| `ethereum_peer_limit` | Gauge | Maximum number of peers this node allows to connect | -| `jvm_buffer_pool_capacity_bytes` | Gauge | Bytes capacity of a given JVM buffer pool | -| `jvm_buffer_pool_used_buffers` | Gauge | Used buffers of a given JVM buffer pool | -| `jvm_buffer_pool_used_bytes` | Gauge | Used bytes of a given JVM buffer pool | -| `jvm_classes_loaded` | Gauge | Current number of classes loaded in the JVM | -| `jvm_classes_loaded_total` | Counter | Total number of classes loaded since the JVM started execution | -| `jvm_classes_unloaded_total` | Counter | Total number of classes unloaded since the JVM started execution | -| `jvm_gc_collection_seconds` | Summary | Seconds spent in a given JVM garbage collector | -| `jvm_memory_bytes_committed` | Gauge | Committed bytes of a given JVM memory area | -| `jvm_memory_bytes_init` | Gauge | Initial bytes of a given JVM memory area | -| `jvm_memory_bytes_max` | Gauge | Maximum bytes of a given JVM memory area | -| `jvm_memory_bytes_used` | Gauge | Used bytes of a given JVM memory area | -| `jvm_memory_pool_bytes_committed` | Gauge | Committed bytes of a given JVM memory pool | -| `jvm_memory_pool_bytes_init` | Gauge | Initial bytes of a given JVM memory pool | -| `jvm_memory_pool_bytes_max` | Gauge | Maximum bytes of a given JVM memory pool | -| `jvm_memory_pool_bytes_used` | Gauge | Used bytes of a given JVM memory pool | -| `jvm_threads_current` | Gauge | Current thread count of a JVM | -| `jvm_threads_daemon` | Gauge | Daemon thread count of a JVM | -| `jvm_threads_deadlocked` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors or ownable synchronizers | -| `jvm_threads_deadlocked_monitor` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors | -| `jvm_threads_peak` | Gauge | Peak thread count of a JVM | -| `jvm_threads_started_total` | Counter | Started thread count of a JVM | -| `jvm_threads_state` | Gauge | Current count of threads by state | -| `process_cpu_seconds_total` | Counter | Total user and system CPU time spent in seconds | -| `process_max_fds` | Gauge | Maximum number of open file descriptors | -| `process_open_fds` | Gauge | Number of open file descriptors | -| `process_start_time_seconds` | Gauge | Start time of the process since Unix epoch in seconds | - -!!! important - - * The `ethereum_best_known_block_number` metric always has a value. When the - [`eth_syncing` JSON-RPC method](../../reference/api/index.md#eth_syncing) returns - false, the current chain height displays. - * Although the `ethereum_peer_limit` metric does not have a JSON-RPC equivalent, the - [`max peers` command line option](../../reference/cli/options.md#max-peers) sets the - maximum number of P2P connections that can be established. +| --- | --- | --- | +| `besu_blockchain_chain_head_gas_limit` | Gauge | Block gas limit of the current chain head block | +| `besu_blockchain_chain_head_gas_used` | Gauge | Gas used by the current chain head block | +| `besu_blockchain_chain_head_ommer_count` | Gauge | Number of uncles in the current chain head block (JSON-RPC equivalent: [`eth_getUncleCountByBlockHash`](../../reference/api/index.md#eth_getunclecountbyblockhash) or [`eth_getUncleCountByBlockNumber`](../../reference/api/index.md#eth_getunclecountbyblocknumber)) | +| `besu_blockchain_chain_head_timestamp` | Gauge | Timestamp from the current chain head | +| `besu_blockchain_chain_head_transaction_count` | Gauge | Number of transactions in the current chain head block (JSON-RPC equivalent: [`eth_getBlockTransactionCountByHash`](../../reference/api/index.md#eth_getblocktransactioncountbyhash) or [`eth_getBlockTransactionCountByNumber`](../../reference/api/index.md#eth_getblocktransactioncountbynumber)) | +| `besu_blockchain_difficulty_total` | Gauge | Difficulty of the chain head (JSON-RPC equivalent: `difficulty` of [`admin_peers`](../../reference/api/index.md#admin_peers)) | +| `besu_executors_ethscheduler_computation_active_threads_current` | Gauge | Current number of threads executing computation tasks | +| `besu_executors_ethscheduler_computation_completed_tasks_total` | Gauge | Total number of computation tasks executed | +| `besu_executors_ethscheduler_computation_pool_size_current` | Gauge | Current number of threads in the computation thread pool | +| `besu_executors_ethscheduler_computation_queue_length_current` | Gauge | Current number of computation tasks awaiting execution | +| `besu_executors_ethscheduler_computation_rejected_tasks_total` | Counter | Total number of tasks rejected by this computation executor | +| `besu_executors_ethscheduler_computation_submitted_tasks_total` | Gauge | Total number of computation tasks submitted | +| `besu_executors_ethscheduler_timer_active_threads_current` | Gauge | Current number of threads executing timer tasks | +| `besu_executors_ethscheduler_timer_completed_tasks_total` | Gauge | Total number of timer tasks executed | +| `besu_executors_ethscheduler_timer_pool_size_current` | Gauge | Current number of threads in the timer thread pool | +| `besu_executors_ethscheduler_timer_queue_length_current` | Gauge | Current number of timer tasks awaiting execution | +| `besu_executors_ethscheduler_timer_rejected_tasks_total` | Counter | Total number of tasks rejected by this timer executor | +| `besu_executors_ethscheduler_timer_submitted_tasks_total` | Gauge | Total number of timer tasks submitted | +| `besu_executors_ethscheduler_workers_active_threads_current` | Gauge | Current number of threads executing worker tasks | +| `besu_executors_ethscheduler_workers_completed_tasks_total` | Gauge | Total number of worker tasks executed | +| `besu_executors_ethscheduler_workers_pool_size_current` | Gauge | Current number of threads in the worker thread pool | +| `besu_executors_ethscheduler_workers_queue_length_current` | Gauge | Current number of worker tasks awaiting execution | +| `besu_executors_ethscheduler_workers_rejected_tasks_total` | Counter | Total number of tasks rejected by this worker executor | +| `besu_executors_ethscheduler_workers_submitted_tasks_total` | Gauge | Total number of worker tasks submitted | +| `besu_network_discovery_inflight_interactions_current` | Gauge | Current number of inflight discovery interactions | +| `besu_network_discovery_interaction_count` | Counter | Total number of discovery interactions initiated | +| `besu_network_discovery_interaction_retry_count` | Counter | Total number of interaction retries performed | +| `besu_network_discovery_messages_inbound` | Counter | Total number of P2P discovery messages received | +| `besu_network_discovery_messages_outbound` | Counter | Total number of P2P discovery messages sent | +| `besu_network_netty_boss_pending_tasks` | Gauge | Number of pending tasks in Netty boss event loop | +| `besu_network_netty_workers_pending_tasks` | Gauge | Number of pending tasks in Netty workers event loop | +| `besu_network_p2p_messages_inbound` | Counter | Total number of P2P messages received | +| `besu_network_vertx_eventloop_pending_tasks` | Gauge | Number of pending tasks in Vertx event loop | +| `besu_network_vertx_worker_pool_completed_total` | Counter | Total number of tasks completed by Vertx worker pool | +| `besu_network_vertx_worker_pool_rejected_total` | Counter | Total number of tasks rejected by Vertx worker pool | +| `besu_network_vertx_worker_pool_submitted_total` | Counter | Total number of tasks submitted to Vertx worker pool | +| `besu_peers_connected_total` | Counter | Total number of peers connected | +| `besu_peers_disconnected_total` | Counter | Total number of peers disconnected | +| `besu_peers_pending_peer_requests_current` | Gauge | Current number of peer requests pending because peers are busy | +| `besu_pruner_mark_time_duration` | Gauge | Cumulative number of seconds spent marking the state trie across all pruning cycles | +| `besu_pruner_mark_operations_total` | Counter | Total number of mark operations performed | +| `besu_pruner_marked_nodes_total` | Counter | Total number of nodes marked as in use | +| `besu_pruner_sweep_operations_total` | Counter | Total number of sweep operations performed | +| `besu_pruner_swept_nodes_total` | Counter | Total number of unused nodes removed | +| `besu_stratum_connections` | Counter | Number of connections over time | +| `besu_stratum_difficulty` | Gauge | Current mining difficulty | +| `besu_stratum_disconnections` | Counter | Number of disconnections over time | +| `besu_stratum_miners` | Gauge | Number of connected miners | +| `besu_synchronizer_chain_download_pipeline_processed_total` | Counter | Number of entries processed by each chain download pipeline stage | +| `besu_synchronizer_chain_download_pipeline_restarts` | Counter | Number of times chain download pipeline has been restarted | +| `besu_synchronizer_fast_sync_pivot_block_current` | Gauge | The current fast sync pivot block | +| `besu_synchronizer_fast_sync_pivot_block_selected_count` | Counter | Number of times a fast sync pivot block has been selected | +| `besu_synchronizer_fast_sync_validation_mode` | Counter | Number of blocks validated using light vs full validation during fast sync | +| `besu_synchronizer_in_sync` | Gauge | Whether or not the local node has caught up to the best known peer (1 or 0) | +| `besu_synchronizer_task` | Summary | Internal processing tasks | +| `besu_synchronizer_world_state_completed_requests_total` | Counter | Total number of node data requests completed as part of fast sync world state download | +| `besu_synchronizer_world_state_existing_nodes_total` | Counter | Total number of node data requests completed using existing data | +| `besu_synchronizer_world_state_inflight_requests_current` | Gauge | Number of in progress requests for world state data | +| `besu_synchronizer_world_state_node_requests_since_last_progress_current` | Gauge | Number of world state requests made since the last time new data was returned | +| `besu_synchronizer_world_state_pending_requests_cache_size` | Gauge | Pending request cache size for fast sync world state download | +| `besu_synchronizer_world_state_pending_requests_current` | Gauge | Number of pending requests for fast sync world state download | +| `besu_synchronizer_world_state_pipeline_processed_total` | Counter | Number of entries processed by each world state download pipeline stage | +| `besu_synchronizer_world_state_retried_requests_total` | Counter | Total number of node data requests repeated as part of fast sync world state download | +| `besu_transaction_pool_pending_transactions_messages_skipped_total` | Counter | Total number of pending transactions messages skipped by the processor | +| `besu_transaction_pool_transactions` | Gauge | Current size of the transaction pool (JSON-RPC equivalent: result number of [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions)) | +| `besu_transaction_pool_transactions_added_total` | Counter | Count of transactions added to the transaction pool | +| `besu_transaction_pool_transactions_messages_skipped_total` | Counter | Total number of transactions messages skipped by the processor. | +| `ethereum_best_known_block_number` | Gauge | Estimated highest block available (JSON-RPC equivalent: `highestBlock` of [`eth_syncing`](../../reference/api/index.md#eth_syncing), or [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) if not syncing) | +| `ethereum_blockchain_height` | Gauge | Current height of the canonical chain (JSON-RPC equivalent: [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber)) | +| `ethereum_peer_count` | Gauge | Current number of peers connected (JSON-RPC equivalent: [`net_peerCount`](../../reference/api/index.md#net_peercount)) | +| `ethereum_peer_limit` | Gauge | Maximum number of peers this node allows to connect | +| `jvm_buffer_pool_capacity_bytes` | Gauge | Bytes capacity of a given JVM buffer pool | +| `jvm_buffer_pool_used_buffers` | Gauge | Used buffers of a given JVM buffer pool | +| `jvm_buffer_pool_used_bytes` | Gauge | Used bytes of a given JVM buffer pool | +| `jvm_classes_loaded` | Gauge | Current number of classes loaded in the JVM | +| `jvm_classes_loaded_total` | Counter | Total number of classes loaded since the JVM started execution | +| `jvm_classes_unloaded_total` | Counter | Total number of classes unloaded since the JVM started execution | +| `jvm_gc_collection_seconds` | Summary | Seconds spent in a given JVM garbage collector | +| `jvm_memory_bytes_committed` | Gauge | Committed bytes of a given JVM memory area | +| `jvm_memory_bytes_init` | Gauge | Initial bytes of a given JVM memory area | +| `jvm_memory_bytes_max` | Gauge | Maximum bytes of a given JVM memory area | +| `jvm_memory_bytes_used` | Gauge | Used bytes of a given JVM memory area | +| `jvm_memory_pool_bytes_committed` | Gauge | Committed bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_init` | Gauge | Initial bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_max` | Gauge | Maximum bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_used` | Gauge | Used bytes of a given JVM memory pool | +| `jvm_threads_current` | Gauge | Current thread count of a JVM | +| `jvm_threads_daemon` | Gauge | Daemon thread count of a JVM | +| `jvm_threads_deadlocked` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors or ownable synchronizers | +| `jvm_threads_deadlocked_monitor` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors | +| `jvm_threads_peak` | Gauge | Peak thread count of a JVM | +| `jvm_threads_started_total` | Counter | Started thread count of a JVM | +| `jvm_threads_state` | Gauge | Current count of threads by state | +| `process_cpu_seconds_total` | Counter | Total user and system CPU time spent in seconds | +| `process_max_fds` | Gauge | Maximum number of open file descriptors | +| `process_open_fds` | Gauge | Number of open file descriptors | +| `process_start_time_seconds` | Gauge | Start time of the process since Unix epoch in seconds | + +:::info + +- The `ethereum_best_known_block_number` metric always has a value. When the [`eth_syncing` JSON-RPC method](../../reference/api/index.md#eth_syncing) returns false, the current chain height displays. +- Although the `ethereum_peer_limit` metric does not have a JSON-RPC equivalent, the [`max peers` command line option](../../reference/cli/options.md#max-peers) sets the maximum number of P2P connections that can be established. + +::: + [monitoring with Prometheus and Grafana configured]: ../../../private-networks/tutorials/quickstart.md#monitor-nodes-with-prometheus-and-grafana diff --git a/docs/public-networks/how-to/monitor/understand-metrics.md b/docs/public-networks/how-to/monitor/understand-metrics.md index c75b16eb981..863798555be 100644 --- a/docs/public-networks/how-to/monitor/understand-metrics.md +++ b/docs/public-networks/how-to/monitor/understand-metrics.md @@ -1,4 +1,6 @@ --- +title: Understand metrics +sidebar_position: 2 description: Understand Besu performance metrics tags: - public networks @@ -6,15 +8,11 @@ tags: # Understand metrics -When running Besu on Ethereum Mainnet using [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), -you might notice graphical patterns that stand out in different metrics charts. -These patterns are related to the [CPU usage](#cpu-usage) and [block time](#block-time) of the Besu -sync process. +When running Besu on Ethereum Mainnet using [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), you might notice graphical patterns that stand out in different metrics charts. These patterns are related to the [CPU usage](#cpu-usage) and [block time](#block-time) of the Besu sync process. ## CPU usage -The following screenshot from [monitoring Besu with Prometheus and Grafana] shows patterns related -to CPU usage. +The following screenshot from [monitoring Besu with Prometheus and Grafana] shows patterns related to CPU usage. ![CPU Grafana Besu dashboard patterns screenshot](../../../assets/images/besu-cpu-pattern-during-sync.png) @@ -22,23 +20,17 @@ The CPU pattern is a "staircase" pattern, where each step represents one of the ### 1. Blocks import and world state download -Step 1 highlights blocks import and world state download, two tasks executed in parallel in Besu. -Besu manages these two tasks with two different pipelines. +Step 1 highlights blocks import and world state download, two tasks executed in parallel in Besu. Besu manages these two tasks with two different pipelines. -This step is CPU-bound.[^1] -The two pipeline stages run on multiple threads. +This step is CPU-bound.[^1] The two pipeline stages run on multiple threads. -As displayed in the following screenshot (for a VM with 8 CPUs) the CPU load average is about 7.5 -and sometimes exceeds 10 (a 100% load for the 8 CPUs is 8). -This means there's more work to be done than what the CPUs can handle. +As displayed in the following screenshot (for a VM with 8 CPUs) the CPU load average is about 7.5 and sometimes exceeds 10 (a 100% load for the 8 CPUs is 8). This means there's more work to be done than what the CPUs can handle. ![System load metrics screenshot](../../../assets/images/system-load.png) ### 2. World state healing -Step 2, world state healing, starts just after the world state download in step 1 is complete. -The peak in system CPU is related to the high rate of input and output (IO) required during this step. -IO usage is around 61% during healing, and it's only 39% during the remaining sync. +Step 2, world state healing, starts just after the world state download in step 1 is complete. The peak in system CPU is related to the high rate of input and output (IO) required during this step. IO usage is around 61% during healing, and it's only 39% during the remaining sync. ![IO utilization metrics screenshot](../../../assets/images/io-utilization.png) @@ -48,39 +40,31 @@ After steps 1 and 2, world state is downloaded and healed, and block import cont The visible drop in CPU shows that Besu finished the world state nodes download. -The block import step is long because Besu can't parallelize block import -- it must validate each -parent block before importing a child. +The block import step is long because Besu can't parallelize block import -- it must validate each parent block before importing a child. -!!! note +:::note - The Besu team is curently working on other algorithm and implementations to make this block - import faster. +The Besu team is currently working on other algorithm and implementations to make this block import faster. + +::: ### 4. Blocks full import -In step 4, Besu executes all transactions of each block. -This is when Besu updates the world state after the healing step. +In step 4, Besu executes all transactions of each block. This is when Besu updates the world state after the healing step. -The quantity of imported blocks in this step depends on the speed of the sync. -This number indicates the cumulated blocks quantity behind head since the last healing step. +The quantity of imported blocks in this step depends on the speed of the sync. This number indicates the cumulated blocks quantity behind head since the last healing step. -This step consumes less CPU than the previous steps because the sequential part --- executing transactions on the EVM -- must be single-threaded, -reducing the concurrent work at the CPU level. +This step consumes less CPU than the previous steps because the sequential part -- executing transactions on the EVM -- must be single-threaded, reducing the concurrent work at the CPU level. ### 5. Blocks production and propagation -Once Besu is completely synced, it propagates blocks and executes the transactions inside each block. -Step 5, block production and propagation, shows a reduction in CPU consumption due to the idle time -while waiting for the new block and the sequential nature of executing transactions on the EVM. +Once Besu is completely synced, it propagates blocks and executes the transactions inside each block. Step 5, block production and propagation, shows a reduction in CPU consumption due to the idle time while waiting for the new block and the sequential nature of executing transactions on the EVM. ## Block time -Block time measures the duration of getting new blocks in Besu. -Block time is closely related to [CPU usage](#cpu-usage). +Block time measures the duration of getting new blocks in Besu. Block time is closely related to [CPU usage](#cpu-usage). -The following screenshot shows patterns related to block time as available in the -[Besu Grafana full dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). +The following screenshot shows patterns related to block time as available in the [Besu Grafana full dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). ![Block time Grafana Besu dashboard patterns screenshot](../../../assets/images/block-time.png) @@ -100,16 +84,13 @@ Block import takes between a few and tens of milliseconds. ### 2. Block full import time -Step 2, block full import time, is the duration of importing a block (step 1) and executing all -its transactions. +Step 2, block full import time, is the duration of importing a block (step 1) and executing all its transactions. -Block full import takes between 1 and 2 seconds per block, depending on the number and complexity -of the transactions. +Block full import takes between 1 and 2 seconds per block, depending on the number and complexity of the transactions. ### 3. Block network time -Step 3, block network time, is the duration of propagating a block over the network and -executing all its transactions. +Step 3, block network time, is the duration of propagating a block over the network and executing all its transactions. Block network takes between 13 and 16 seconds. @@ -117,5 +98,4 @@ Block network takes between 13 and 16 seconds. [monitoring Besu with Prometheus and Grafana]: ../../../private-networks/tutorials/quickstart.md#monitor-nodes-with-prometheus-and-grafana -[^1]: A CPU-bound task means that the time required to execute the task is determined only by the -CPU speed. +[^1]: A CPU-bound task means that the time required to execute the task is determined only by the CPU speed. diff --git a/docs/public-networks/how-to/send-transactions.md b/docs/public-networks/how-to/send-transactions.md index b33fb496f1d..56d74607621 100644 --- a/docs/public-networks/how-to/send-transactions.md +++ b/docs/public-networks/how-to/send-transactions.md @@ -1,76 +1,65 @@ --- -description: Some use cases of creating transactions on a Hyperledger Besu network +title: Create and send transactions +sidebar_position: 4 +description: Send transactions using eth_call or eth_sendRawTransaction. +tags: + - public networks --- # Create and send transactions -You can send signed transactions using the -[`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction) JSON-RPC API -method. +You can send signed transactions using the [`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction) JSON-RPC API method. -Signed transactions can be simple value transfers, contract creation, or contract invocation. Set -the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../reference/cli/options.md#rpc-tx-feecap) -CLI option. +Signed transactions can be simple value transfers, contract creation, or contract invocation. Set the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../reference/cli/options.md#rpc-tx-feecap) CLI option. -To accept signed transactions from remote connections, set the -[API listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0`. +To accept signed transactions from remote connections, set the [API listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0`. -[Use client libraries](develop/client-libraries.md) to create and send a signed raw transaction to transfer -Ether and create a smart contract. +[Use client libraries](develop/client-libraries.md) to create and send a signed raw transaction to transfer Ether and create a smart contract. -!!! warning "Private keys" +:::danger Private keys - Don't use the accounts from the examples on Mainnet or any public network except for testing. - The private keys are displayed which means the accounts are not secure. +Don't use the accounts from the examples on Mainnet or any public network except for testing. The private keys are displayed which means the accounts are not secure. - All accounts and private keys in the examples are from the `dev.json` genesis file in the - [`/besu/config/src/main/resources`](https://github.com/hyperledger/besu/tree/master/config/src/main/resources) - directory. +All accounts and private keys in the examples are from the `dev.json` genesis file in the [`/besu/config/src/main/resources`](https://github.com/hyperledger/besu/tree/master/config/src/main/resources) directory. - In production environments avoid exposing your private keys by creating signed transactions - offline, or use [EthSigner](https://docs.ethsigner.consensys.net/) to isolate your private keys - and sign transactions with - [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). +In production environments avoid exposing your private keys by creating signed transactions offline, or use [EthSigner](https://docs.ethsigner.consensys.net/) to isolate your private keys and sign transactions with [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). -!!! caution +::: - Setting the [listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0` exposes the API service - connection on your node to any remote connection. - In a production environment, ensure you are using a firewall to avoid exposing your node to the - internet. +:::caution -!!! tip +Setting the [listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0` exposes the API service connection on your node to any remote connection. In a production environment, ensure you are using a firewall to avoid exposing your node to the internet. - Libraries such as [web3j](https://github.com/web3j/web3j) or - [ethereumj](https://github.com/ethereum/ethereumj) and tools such as - [MyCrypto](https://mycrypto.com/) can also create signed transactions. +::: + +:::tip + +Libraries such as [web3j](https://github.com/web3j/web3j) or [ethereumj](https://github.com/ethereum/ethereumj) and tools such as [MyCrypto](https://mycrypto.com/) can also create signed transactions. + +::: ## `eth_call` vs `eth_sendRawTransaction` -You can interact with contracts using [`eth_call`](../reference/api/index.md#eth_call) or -[`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction). The table below -compares the characteristics of both calls. - -| `eth_call` | `eth_sendRawTransaction` | -|----------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------| -| Read-only | Write | -| Invokes contract function locally | Broadcasts to the network | -| Does not change state of blockchain | Updates the blockchain (for example, transfers ether between accounts) | -| Does not consume gas | Requires gas | -| Synchronous | Asynchronous | +You can interact with contracts using [`eth_call`](../reference/api/index.md#eth_call) or [`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction). The table below compares the characteristics of both calls. + +| `eth_call` | `eth_sendRawTransaction` | +| --- | --- | +| Read-only | Write | +| Invokes contract function locally | Broadcasts to the network | +| Does not change state of blockchain | Updates the blockchain (for example, transfers ether between accounts) | +| Does not consume gas | Requires gas | +| Synchronous | Asynchronous | | Returns the value of a contract function available immediately | Returns transaction hash only. A block might not include all possible transactions (for example, if the gas price is too low). | ## Use wallets for key management Besu doesn't support key management inside the client. Use: -* [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu to provide access to your - key store and sign transactions. -* Third-party tools (for example, [MetaMask](https://metamask.io/) and [web3j](https://web3j.io/)) - for creating accounts. +- [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu to provide access to your key store and sign transactions. +- Third-party tools (for example, [MetaMask](https://metamask.io/) and [web3j](https://web3j.io/)) for creating accounts. + +:::tip -!!! tip +[EthSigner](http://docs.ethsigner.consensys.net/en/latest/) implements [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction) and [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). - [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) implements - [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction) - and [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). +::: diff --git a/docs/public-networks/how-to/troubleshoot/_category_.json b/docs/public-networks/how-to/troubleshoot/_category_.json new file mode 100644 index 00000000000..cf5f9653813 --- /dev/null +++ b/docs/public-networks/how-to/troubleshoot/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Troubleshoot", + "position": 12 +} diff --git a/docs/public-networks/how-to/troubleshoot/evm-tool.md b/docs/public-networks/how-to/troubleshoot/evm-tool.md index 3893c465640..7e5a044180a 100644 --- a/docs/public-networks/how-to/troubleshoot/evm-tool.md +++ b/docs/public-networks/how-to/troubleshoot/evm-tool.md @@ -1,18 +1,19 @@ --- +title: Use EVM tool +sidebar_position: 1 description: Hyperledger Besu EVM tool tags: + - public networks - private networks --- # Use the EVM tool -The Besu EVM tool is a CLI program that executes arbitrary EVM programs and Ethereum State Tests -outside the context of an operating node. Use the EVM tool for benchmarking and fuzz testing. +The Besu EVM tool is a CLI program that executes arbitrary EVM programs and Ethereum State Tests outside the context of an operating node. Use the EVM tool for benchmarking and fuzz testing. ## Get the EVM tool -The Besu EVM tool does not have a standard zip file distribution. To use, you need to either -build from the source repository or use a pre-published docker image. +The Besu EVM tool does not have a standard zip file distribution. To use, you need to either build from the source repository or use a pre-published docker image. ### Build from source @@ -22,8 +23,7 @@ To build from source, run the following from the root of the Besu repository: ./gradlew :ethereum:evmTool:installDist ``` -An extractable archive files is created in `ethereum/evmtool/build/distributions` and an -executable installation in `ethereum/evmtool/build/install/evmtool`. +An extractable archive files is created in `ethereum/evmtool/build/distributions` and an executable installation in `ethereum/evmtool/build/install/evmtool`. Execute the EVM tool: @@ -39,40 +39,36 @@ To run the Besu EVM tool in a container: docker run -rm hyperledger/besu-evmtool:develop ``` -- Because no data is stored in local directories we recommended using the `-rm` docker option. - The `-rm` option deletes the container at the end of execution. -- If you use an option that requires input from standard in, use the `-i` docker option. The `-i` option - pipes standard input to the EVM tool. -- If you need to reference files we recommend using a docker file binding, such as - `-v ${PWD}:/opt/data`, which maps the current directory to the `/opt/data` directory in the - container. +- Because no data is stored in local directories we recommended using the `-rm` docker option. The `-rm` option deletes the container at the end of execution. +- If you use an option that requires input from standard in, use the `-i` docker option. The `-i` option pipes standard input to the EVM tool. +- If you need to reference files we recommend using a docker file binding, such as `-v ${PWD}:/opt/data`, which maps the current directory to the `/opt/data` directory in the container. -!!! note +:::note - The `latest` tag is the latest released version of Besu, starting with 1.5.3. The `develop` tag - is the current main branch code that will go into a future release version of Besu. +The `latest` tag is the latest released version of Besu, starting with 1.5.3. The `develop` tag is the current main branch code that will go into a future release version of Besu. + +::: ## EVM tool run options -The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. -[Command line options](../../reference/evm-tool.md) specify the code and other contextual information. +The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. [Command line options](../../reference/evm-tool.md) specify the code and other contextual information. + +The EVM tool also has a [`state-test` subcommand](../../reference/evm-tool.md#state-test-options) that allows [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) to be evaluated, and a [`code-validate` subcommand](../../reference/evm-tool.md#eof-code-validation) that allows [Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. Most of the options from EVM execution don't apply. -The EVM tool also has a [`state-test` subcommand](../../reference/evm-tool.md#state-test-options) -that allows [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) -to be evaluated, and a [`code-validate` subcommand](../../reference/evm-tool.md#eof-code-validation) -that allows [Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. -Most of the options from EVM execution don't apply. + -=== "`state-test`" +# `state-test` - ```bash - evm state-test --nomemory - ``` +```bash +evm state-test --nomemory +``` -=== "`code-validate`" +# `code-validate` + +```bash +evm code-validate --file +``` - ```bash - evm code-validate --file - ``` + The [EVM tool reference](../../reference/evm-tool.md) provides more information on these modes. diff --git a/docs/public-networks/how-to/troubleshoot/peering.md b/docs/public-networks/how-to/troubleshoot/peering.md index 370e824c05a..a0b218f40ff 100644 --- a/docs/public-networks/how-to/troubleshoot/peering.md +++ b/docs/public-networks/how-to/troubleshoot/peering.md @@ -1,95 +1,69 @@ --- +title: Troubleshoot peering +sidebar_position: 4 description: How to troubleshoot peering +tags: + - public networks --- # Troubleshoot peering -Many factors can affect the ability of your node to find and maintain peers. -Your network router, machine environment, and node configuration are all important. -If you have peering issues, start by [configuring your ports](../connect/configure-ports.md) and -[managing peers](../connect/manage-peers.md). +Many factors can affect the ability of your node to find and maintain peers. Your network router, machine environment, and node configuration are all important. If you have peering issues, start by [configuring your ports](../connect/configure-ports.md) and [managing peers](../connect/manage-peers.md). ## Peering FAQ -??? question "Why can’t I find enough peers to sync?" - One or more of the following may be the cause: - - - Your hardware doesn't have enough CPU, disk IOPS, or bandwidth to handle all the peers. - - Your ports aren't open in your firewall and/or router. - - Your node is sending large numbers of DNS requests. - See [issue #4375](https://github.com/hyperledger/besu/issues/4375). - - You're using [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), - which doesn't download all historical block data, so your peers may disconnect you when - fetching those blocks. - - Your node is experiencing the normal behavior of peers connecting and disconnecting. - This is especially normal soon after you start your node. - - You can try the following to find more peers: - - - Set [`p2p-host`](../../reference/cli/options.md#p2p-host) to your external IP address to allow - inbound connections. - - Restart Besu. - This can take a while to build up again. - - Set `-Xdns-enabled` to `true` (only for private networks). - - Set `-Xp2p-peer-lower-bound` to a minimum number of peers. - - Delete the node key (which is autogenerated in your data directory). - There are two reasons that this might help find more peers: - 1. Your node (identified by the address associated with this key) has been put onto other - peers' bad peer lists for some reason. - 2. Peer discovery is influenced by the value of the node key. - This is related to the node "distance" in the [discovery algorithm](https://github.com/ethereum/devp2p/wiki/Discovery-Overview#kademlia). - - You can read the - [Prysm EL and CL peering documentation](https://docs.prylabs.network/docs/prysm-usage/p2p-host-ip) - for more information. - -??? question "What network or router/modem settings should I check?" - Check the following settings: - - - Your machine and router's specified DNS should support TCP. - You can check your DNS online for TCP support. - Google and Cloudflare, 8.8.8.8 and 1.1.1.1, support TCP over port 853. - Other DNS might as well. - - The appropriate ports should be open on your router, or your router should have UPNP enabled. - See the next FAQ for more information on router settings. - - If you use [Docker](https://docs.docker.com/network/network-tutorial-host/) or virtualization, - the container should be able to create outbound connections on the host machine. - -??? question "How do I open/forward my ports?" - If you’re behind NAT, you probably need to set up port forwarding in your router. - You might also need to configure your firewall. - Forward and open `30303` (if using the default p2p port) for both UDP and TCP. - If your router supports UPNP, you can set - [`--nat-method`](../../reference/cli/options.md#nat-method) to - [`UPNPP2PONLY`](../connect/specify-nat.md#upnp). - -??? question "How do I test that my ports are open?" - You can use this [open port checker](https://www.yougetsignal.com/tools/open-ports/). - -??? question "What's the ideal number of peers for Besu?" - The default maximum is 25. - Increasing the number of peers increases the bandwidth, CPU, and disk access Besu uses to - respond to peers. - Hardware with low specifications might result in low peer numbers. - You'll experience diminishing returns with a larger number of peers (>100). - -??? question "What's the benefit of increasing the number of peers?" - Increasing the number of max peers won't speed up Besu syncing, because the bottleneck during - sync is disk IO and CPU. - - Note that Besu's peers are only used for the initial sync and transaction gossip, neither of - which affects attestation performance. - The beacon node connectivity controls how quickly you receive blocks and how attestations are published. - Increasing Besu's peer count increases the load on your node, which may hurt attestations. +### "Why can’t I find enough peers to sync?" + +One or more of the following may be the cause: + +- Your hardware doesn't have enough CPU, disk IOPS, or bandwidth to handle all the peers. +- Your ports aren't open in your firewall and/or router. +- Your node is sending large numbers of DNS requests. See [issue #4375](https://github.com/hyperledger/besu/issues/4375). +- You're using [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), which doesn't download all historical block data, so your peers may disconnect you when fetching those blocks. +- Your node is experiencing the normal behavior of peers connecting and disconnecting. This is especially normal soon after you start your node. + +You can try the following to find more peers: + +- Set [`p2p-host`](../../reference/cli/options.md#p2p-host) to your external IP address to allow inbound connections. +- Restart Besu. This can take a while to build up again. +- Set `-Xdns-enabled` to `true` (only for private networks). +- Set `-Xp2p-peer-lower-bound` to a minimum number of peers. +- Delete the node key (which is autogenerated in your data directory). There are two reasons that this might help find more peers: + 1. Your node (identified by the address associated with this key) has been put onto other peers' bad peer lists for some reason. + 2. Peer discovery is influenced by the value of the node key. This is related to the node "distance" in the [discovery algorithm](https://github.com/ethereum/devp2p/wiki/Discovery-Overview#kademlia). + +You can read the [Prysm EL and CL peering documentation](https://docs.prylabs.network/docs/prysm-usage/p2p-host-ip) for more information. + +### "What network or router/modem settings should I check?" + +Check the following settings: + +- Your machine and router's specified DNS should support TCP. You can check your DNS online for TCP support. Google and Cloudflare, 8.8.8.8 and 1.1.1.1, support TCP over port 853. Other DNS might as well. +- The appropriate ports should be open on your router, or your router should have UPNP enabled. See the next FAQ for more information on router settings. +- If you use [Docker](https://docs.docker.com/network/network-tutorial-host/) or virtualization, the container should be able to create outbound connections on the host machine. + +### "How do I open/forward my ports?" + +If you’re behind NAT, you probably need to set up port forwarding in your router. You might also need to configure your firewall. Forward and open `30303` (if using the default p2p port) for both UDP and TCP. If your router supports UPNP, you can set [`--nat-method`](../../reference/cli/options.md#nat-method) to [`UPNPP2PONLY`](../connect/specify-nat.md#upnp). + +### "How do I test that my ports are open?" + +You can use this [open port checker](https://www.yougetsignal.com/tools/open-ports/). + +### "What's the ideal number of peers for Besu?" + +The default maximum is 25. Increasing the number of peers increases the bandwidth, CPU, and disk access Besu uses to respond to peers. Hardware with low specifications might result in low peer numbers. You'll experience diminishing returns with a larger number of peers (>100). + +### question "What's the benefit of increasing the number of peers?" + +Increasing the number of max peers won't speed up Besu syncing, because the bottleneck during sync is disk IO and CPU. + +Note that Besu's peers are only used for the initial sync and transaction gossip, neither of which affects attestation performance. The beacon node connectivity controls how quickly you receive blocks and how attestations are published. Increasing Besu's peer count increases the load on your node, which may hurt attestations. ## Metrics Capture [metrics](../monitor/index.md) to gain insights into peering behavior over time. -To [enable Prometheus to access Besu](../monitor/metrics.md), open the metrics port or metrics push -port to Prometheus or the Prometheus push gateway on TCP. +To [enable Prometheus to access Besu](../monitor/metrics.md), open the metrics port or metrics push port to Prometheus or the Prometheus push gateway on TCP. -Specify the ports for Prometheus and Prometheus push gateway using the -[`--metrics-port`](../../reference/cli/options.md#metrics-port) and -[`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. -The defaults are `9545` and `9001`. +Specify the ports for Prometheus and Prometheus push gateway using the [`--metrics-port`](../../reference/cli/options.md#metrics-port) and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. The defaults are `9545` and `9001`. diff --git a/docs/public-networks/how-to/troubleshoot/performance.md b/docs/public-networks/how-to/troubleshoot/performance.md index 9c62a2efb2c..545cfb80856 100644 --- a/docs/public-networks/how-to/troubleshoot/performance.md +++ b/docs/public-networks/how-to/troubleshoot/performance.md @@ -1,5 +1,9 @@ --- description: Troubleshoot poor performance and resource constraints. +sidebar_label: Troubleshoot performance +sidebar_position: 3 +tags: + - public networks --- # Troubleshoot poor performance and resource constraints @@ -18,21 +22,21 @@ try the following suggestions: disable swap (and caveats). * Use a high performance SSD disk with NVMe, since Besu's performance bottleneck is often slow disk I/O. * Configure memory and RAM: - * If you have RAM constraints, use [OpenJ9](../../get-started/system-requirements.md) if you're - running on `x86_64` Linux architecture to reduce memory usage. - * Review and change your [Java heap size](../configure-jvm/manage-memory.md) if necessary. - 5GB is an appropriate limit. - Higher values may improve sync time, but can be reduced after completing sync. - * Ensure Besu is using [jemalloc](../../get-started/install/binary-distribution.md). - * If you have 32GB RAM or more, set the `Xplugin-rocksdb-high-spec-enabled` configuration option - to `true`. - Don't use this on RAM machines with 16GB RAM or less if you're running a consensus client on the - same hardware. + * If you have RAM constraints, use [OpenJ9](../../get-started/system-requirements.md) if you're + running on `x86_64` Linux architecture to reduce memory usage. + * Review and change your [Java heap size](../configure-jvm/manage-memory.md) if necessary. + 5GB is an appropriate limit. + Higher values may improve sync time, but can be reduced after completing sync. + * Ensure Besu is using [jemalloc](../../get-started/install/binary-distribution.md). + * If you have 32GB RAM or more, set the `Xplugin-rocksdb-high-spec-enabled` configuration option + to `true`. + Don't use this on RAM machines with 16GB RAM or less if you're running a consensus client on the + same hardware. * If you're running on ARM64, make sure the glibc version is greater than 2.29. If not, Besu uses a Java implementation instead of the native one for some precompiled contracts, which results in lower performance. - * On Ubuntu, run `ldd --version`. - See [the methods for other environments](https://dev.to/0xbf/how-to-get-glibc-version-c-lang-26he). + * On Ubuntu, run `ldd --version`. + See [the methods for other environments](https://dev.to/0xbf/how-to-get-glibc-version-c-lang-26he). * Pay attention to what processes are running on the same machine/VM as Besu. Java applications, with default settings, are designed to run alone on the machine. You can run your consensus client on the same machine, but this adds overhead on Besu, and vice diff --git a/docs/public-networks/how-to/troubleshoot/trace-transactions.md b/docs/public-networks/how-to/troubleshoot/trace-transactions.md index 4e05997f872..773b0d9fa05 100644 --- a/docs/public-networks/how-to/troubleshoot/trace-transactions.md +++ b/docs/public-networks/how-to/troubleshoot/trace-transactions.md @@ -1,50 +1,40 @@ --- +title: Trace transactions +sidebar_position: 2 description: How to trace transactions tags: + - public networks - private networks --- # Trace transactions -To get detailed information about transaction processing, use the -[`TRACE` API](../../reference/api/index.md#trace-methods). -Enable the `TRACE` API using the -[`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or -[`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api) command line options. +To get detailed information about transaction processing, use the [`TRACE` API](../../reference/api/index.md#trace-methods). Enable the `TRACE` API using the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api) command line options. -The `TRACE` API has two sets of trace calls, [ad-hoc tracing APIs](#ad-hoc-tracing-apis) and -[transaction-trace filtering APIs](#transaction-trace-filtering-apis). +The `TRACE` API has two sets of trace calls, [ad-hoc tracing APIs](#ad-hoc-tracing-apis) and [transaction-trace filtering APIs](#transaction-trace-filtering-apis). ## Ad-hoc tracing APIs -These APIs allow you to use the [`trace`, `vmTrace`, or `stateDiff`](../../reference/trace-types.md) -diagnostic options when tracing calls or transactions. +These APIs allow you to use the [`trace`, `vmTrace`, or `stateDiff`](../../reference/trace-types.md) diagnostic options when tracing calls or transactions. -To use the ad-hoc tracing APIs, the requested block or transaction must be within the -number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) -(by default, 1024). +To use the ad-hoc tracing APIs, the requested block or transaction must be within the number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) (by default, 1024). The ad-hoc tracing APIs are: -* [`trace_call`](../../reference/api/index.md#trace_call) -* [`trace_callMany`](../../reference/api/index.md#trace_callmany) -* [`trace_rawTransaction`](../../reference/api/index.md#trace_rawtransaction) -* [`trace_replayBlockTransactions`](../../reference/api/index.md#trace_replayblocktransactions) +- [`trace_call`](../../reference/api/index.md#trace_call) +- [`trace_callMany`](../../reference/api/index.md#trace_callmany) +- [`trace_rawTransaction`](../../reference/api/index.md#trace_rawtransaction) +- [`trace_replayBlockTransactions`](../../reference/api/index.md#trace_replayblocktransactions) ## Transaction-trace filtering APIs -These APIs allow you to filter and search by specific information such as the block, address, or transaction. -These APIs only use the [`trace` type](../../reference/trace-types.md#trace). +These APIs allow you to filter and search by specific information such as the block, address, or transaction. These APIs only use the [`trace` type](../../reference/trace-types.md#trace). -To use the transaction-trace filtering APIs, your node must be an archive node -(that is, synchronized without pruning or fast sync) or the -requested block or transaction must be within the -number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) -(by default, 1024). +To use the transaction-trace filtering APIs, your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block or transaction must be within the number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) (by default, 1024). The transaction-trace filtering APIs are: -* [`trace_block`](../../reference/api/index.md#trace_block) -* [`trace_filter`](../../reference/api/index.md#trace_filter) -* [`trace_get`](../../reference/api/index.md#trace_get) -* [`trace_transaction`](../../reference/api/index.md#trace_transaction) +- [`trace_block`](../../reference/api/index.md#trace_block) +- [`trace_filter`](../../reference/api/index.md#trace_filter) +- [`trace_get`](../../reference/api/index.md#trace_get) +- [`trace_transaction`](../../reference/api/index.md#trace_transaction) diff --git a/docs/public-networks/how-to/upgrade-node.md b/docs/public-networks/how-to/upgrade-node.md index 5845db71b70..4e33d3dce08 100644 --- a/docs/public-networks/how-to/upgrade-node.md +++ b/docs/public-networks/how-to/upgrade-node.md @@ -1,23 +1,23 @@ --- -description: Upgrade Besu +title: Upgrade Besu +sidebar_position: 11 +description: Upgrade your Besu node to a new version. +tags: + - public networks --- # Upgrade your Besu node When upgrading your Besu node, we recommend: -* Using an orchestration method (for example, Ansible or Chef) to keep all nodes in sync with your - desired configuration. -* Storing your configuration under version control. +- Using an orchestration method (for example, Ansible or Chef) to keep all nodes in sync with your desired configuration. +- Storing your configuration under version control. ## Ansible -You can use the [Ansible role on Galaxy](https://galaxy.ansible.com/consensys/hyperledger_besu) -directly or customize it to suit your needs. +You can use the [Ansible role on Galaxy](https://galaxy.ansible.com/consensys/hyperledger_besu) directly or customize it to suit your needs. -Upgrade the Besu version on nodes by running the play with the new version. For more information, -For more information, select **Read Me** on the -[Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). +Upgrade the Besu version on nodes by running the play with the new version. For more information, For more information, select **Read Me** on the [Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). The playbook: @@ -28,13 +28,6 @@ The playbook: ## Find peers on restarting -Nodes store known peers in the peer table. The peer table is not persisted to disk. -When a node restarts, the node connects to the specified bootnodes and discovers other nodes through the peer -discovery process. -The node continues collecting data from where it left off before the restart -(assuming there was no data corruption in a failure scenario). +Nodes store known peers in the peer table. The peer table is not persisted to disk. When a node restarts, the node connects to the specified bootnodes and discovers other nodes through the peer discovery process. The node continues collecting data from where it left off before the restart (assuming there was no data corruption in a failure scenario). -Before the node restarted, connected peers saved the node details in their peer tables. These peers -can reconnect to the restarted node. -The restarted node uses these peers and the bootnodes, to discover more peers. -To ensure that the restarted node successfully rejoins the network, ensure you specify at least one operational bootnode. +Before the node restarted, connected peers saved the node details in their peer tables. These peers can reconnect to the restarted node. The restarted node uses these peers and the bootnodes, to discover more peers. To ensure that the restarted node successfully rejoins the network, ensure you specify at least one operational bootnode. diff --git a/docs/public-networks/how-to/use-besu-api/_category_.json b/docs/public-networks/how-to/use-besu-api/_category_.json new file mode 100644 index 00000000000..300deff1cbe --- /dev/null +++ b/docs/public-networks/how-to/use-besu-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use the Besu API", + "position": 1 +} diff --git a/docs/public-networks/how-to/use-besu-api/access-logs.md b/docs/public-networks/how-to/use-besu-api/access-logs.md index c20e0028c5b..04dbfd60d34 100644 --- a/docs/public-networks/how-to/use-besu-api/access-logs.md +++ b/docs/public-networks/how-to/use-besu-api/access-logs.md @@ -1,4 +1,6 @@ --- +title: Access logs using JSON-RPC +sidebar_position: 5 description: Accessing logs using the Hyperledger Besu API tags: - private networks @@ -6,217 +8,187 @@ tags: # Access logs using the Hyperledger Besu API -Subscribe to events, such as logs, using either -[RPC Pub/Sub over WebSockets](rpc-pubsub.md) or filters over HTTP. +Subscribe to events, such as logs, using either [RPC Pub/Sub over WebSockets](rpc-pubsub.md) or filters over HTTP. Access logs using the following Hyperledger Besu API methods: -* [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) -* [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs) -* [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). +- [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) +- [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs) +- [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). -Use [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) to create the filter before -using [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) and -[`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs)). +Use [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) to create the filter before using [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) and [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs)). -Access logs for [private contracts](../../../private-networks/concepts/privacy/index.md) using the equivalent -[`priv_*` methods and specifying the privacy group ID](#filters-for-private-contracts). For example, -[`priv_getLogs`](../../reference/api/index.md#priv_getlogs). +Access logs for [private contracts](../../../private-networks/concepts/privacy/index.md) using the equivalent [`priv_*` methods and specifying the privacy group ID](#filters-for-private-contracts). For example, [`priv_getLogs`](../../reference/api/index.md#priv_getlogs). -!!! note +:::note - The following examples use the sample contract included in [events and logs](../../concepts/events-and-logs.md). +The following examples use the sample contract included in [events and logs](../../concepts/events-and-logs.md). + +::: ## Create a filter Create a filter using [`eth_newFilter`](../../reference/api/index.md#eth_newfilter). -!!! example - - If the [example contract](../../concepts/events-and-logs.md) was deployed to - 0x42699a7612a82f1d9c36148af9c77354759b210b, the following request for `eth_newFilter` creates a - filter to log when `valueIndexed` is set to 5: +If the [example contract](../../concepts/events-and-logs.md) was deployed to 0x42699a7612a82f1d9c36148af9c77354759b210b, the following request for `eth_newFilter` creates a filter to log when `valueIndexed` is set to 5: - ```json +```json +{ + "jsonrpc": "2.0", + "method": "eth_newFilter", + "params": [ { - "jsonrpc":"2.0", - "method":"eth_newFilter", - "params":[ - { - "fromBlock":"earliest", - "toBlock":"latest", - "address":"0x42699a7612a82f1d9c36148af9c77354759b210b", - "topics":[ - ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], - ["0x0000000000000000000000000000000000000000000000000000000000000005"] - ] - } - ], - "id":1 + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + ["0x0000000000000000000000000000000000000000000000000000000000000005"] + ] } - ``` + ], + "id": 1 +} +``` -[`eth_newFilter`](../../reference/api/index.md#eth_newfilter) returns a filter ID hash (for -example, `0x1ddf0c00989044e9b41cc0ae40272df3`). +[`eth_newFilter`](../../reference/api/index.md#eth_newfilter) returns a filter ID hash (for example, `0x1ddf0c00989044e9b41cc0ae40272df3`). ### Poll a filter for changes -To poll the filter for changes since the last poll, use -[`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) with the filter ID -hash returned by [`eth_newFilter`](../../reference/api/index.md#eth_newfilter). - -!!! example +To poll the filter for changes since the last poll, use [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) with the filter ID hash returned by [`eth_newFilter`](../../reference/api/index.md#eth_newfilter). - If the contract had been executed twice since the last poll, with `valueIndexed` set to 1 and - 5, [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) returns - only the log where the [topic](../../concepts/events-and-logs.md#event-parameters) for - `valueIndexed` is 5: +If the contract had been executed twice since the last poll, with `valueIndexed` set to 1 and 5, [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) returns only the log where the [topic](../../concepts/events-and-logs.md#event-parameters) for `valueIndexed` is 5: - ```json +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x21c", - "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", - "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", - "transactionIndex": "0x0", - "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", - "data": "0x0000000000000000000000000000000000000000000000000000000000000005", - "topics": [ - "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", - "0x0000000000000000000000000000000000000000000000000000000000000005" - ] - } - ] + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x21c", + "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", + "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] } - ``` + ] +} +``` ### Get all logs for a filter -To get all logs for a filter, use -[`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). - -!!! example +To get all logs for a filter, use [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). - If the contract had been executed twice with `valueIndexed` set to 5 since the filter was - created using `eth_newFilter`, `eth_getFilterLogs` returns: +If the contract had been executed twice with `valueIndexed` set to 5 since the filter was created using `eth_newFilter`, `eth_getFilterLogs` returns: - ```json +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x1a7", - "blockHash": "0x4edda22a242ddc7bc51e2b6b11e63cd67be1af7389470cdea9c869768ff75d42", - "transactionHash": "0x9535bf8830a72ca7d0020df0b547adc4d0ecc4321b7d5b5d6beb1eccee5c0afa", - "transactionIndex": "0x0", - "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", - "data": "0x0000000000000000000000000000000000000000000000000000000000000005", - "topics": [ - "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", - "0x0000000000000000000000000000000000000000000000000000000000000005" - ] - }, - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x21c", - "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", - "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", - "transactionIndex": "0x0", - "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", - "data": "0x0000000000000000000000000000000000000000000000000000000000000005", - "topics": [ - "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", - "0x0000000000000000000000000000000000000000000000000000000000000005" - ] - } + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x1a7", + "blockHash": "0x4edda22a242ddc7bc51e2b6b11e63cd67be1af7389470cdea9c869768ff75d42", + "transactionHash": "0x9535bf8830a72ca7d0020df0b547adc4d0ecc4321b7d5b5d6beb1eccee5c0afa", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x21c", + "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", + "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" ] } - ``` + ] +} +``` + +:::tip -!!! tip +You can use [`eth_getLogs`](#get-logs-using-a-filter-options-object) with a filter options object to get all logs matching the filter options instead of using [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) followed by [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). - You can use [`eth_getLogs`](#get-logs-using-a-filter-options-object) with a filter options - object to get all logs matching the filter options instead of using - [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) followed by - [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). +::: ## Uninstall a filter -When a filter is no longer required, use -[`eth_uninstallFilter`](../../reference/api/index.md#eth_uninstallfilter) to remove the -filter. +When a filter is no longer required, use [`eth_uninstallFilter`](../../reference/api/index.md#eth_uninstallfilter) to remove the filter. ## Filters for private contracts Filters for private contracts are created, accessed, and uninstalled using: -* [`priv_getFilterChanges`](../../reference/api/index.md#priv_getfilterchanges) -* [`priv_getFilterLogs`](../../reference/api/index.md#priv_getfilterlogs) -* [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) -* [`priv_newFilter`](../../reference/api/index.md#priv_newfilter) -* [`priv_uninstallFilter`](../../reference/api/index.md#priv_uninstallfilter). - -The [privacy group ID](../../../private-networks/concepts/privacy/index.md) must be specified as parameter 0 -for the `priv` methods. +- [`priv_getFilterChanges`](../../reference/api/index.md#priv_getfilterchanges) +- [`priv_getFilterLogs`](../../reference/api/index.md#priv_getfilterlogs) +- [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) +- [`priv_newFilter`](../../reference/api/index.md#priv_newfilter) +- [`priv_uninstallFilter`](../../reference/api/index.md#priv_uninstallfilter). -!!! example +The [privacy group ID](../../../private-networks/concepts/privacy/index.md) must be specified as parameter 0 for the `priv` methods. - ```json +```json +{ + "jsonrpc": "2.0", + "method": "priv_newFilter", + "params": [ + "4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=", { - "jsonrpc": "2.0", - "method": "priv_newFilter", - "params": [ - "4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=", - { - "fromBlock": "earliest", - "toBlock": "latest", - "addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"], - "topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"] - } - ], - "id": 1 + "fromBlock": "earliest", + "toBlock": "latest", + "addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"], + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410" + ] } - ``` + ], + "id": 1 +} +``` ## Get logs using a filter options object -To get all logs for a filter options object, use -[`eth_getLogs`](../../reference/api/index.md#eth_getlogs) or [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) -for a private contract. - -!!! example +To get all logs for a filter options object, use [`eth_getLogs`](../../reference/api/index.md#eth_getlogs) or [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) for a private contract. - The following request for `eth_getLogs` returns all the logs where the example contract has - been deployed to `0x42699a7612a82f1d9c36148af9c77354759b210b` and executed with `valueIndexed` - set to 5. +The following request for `eth_getLogs` returns all the logs where the example contract has been deployed to `0x42699a7612a82f1d9c36148af9c77354759b210b` and executed with `valueIndexed` set to 5. - ```json +```json +{ + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [ { - "jsonrpc":"2.0", - "method":"eth_getLogs", - "params":[ - { - "fromBlock":"earliest", - "toBlock":"latest", - "address":"0x42699a7612a82f1d9c36148af9c77354759b210b", - "topics":[ - ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], - ["0x0000000000000000000000000000000000000000000000000000000000000005"] - ] - } - ], - "id":1 + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + ["0x0000000000000000000000000000000000000000000000000000000000000005"] + ] } - ``` + ], + "id": 1 +} +``` - The above example returns the same result as calling [eth_newFilter](#creating-a-filter) - followed by [eth_getFilterLogs](#getting-all-logs-for-a-filter). +The above example returns the same result as calling [eth_newFilter](#creating-a-filter) followed by [eth_getFilterLogs](#getting-all-logs-for-a-filter). diff --git a/docs/public-networks/how-to/use-besu-api/authenticate.md b/docs/public-networks/how-to/use-besu-api/authenticate.md index 7ee8e826488..747debefe94 100644 --- a/docs/public-networks/how-to/use-besu-api/authenticate.md +++ b/docs/public-networks/how-to/use-besu-api/authenticate.md @@ -1,4 +1,6 @@ --- +title: Authenticate over JSON-RPC requests +sidebar_position: 4 description: Hyperledger Besu authentication and authorization for JSON-RPC tags: - private networks @@ -6,33 +8,30 @@ tags: # Authenticate and authorize JSON-RPC -Authentication identifies a user, and authorization verifies user access to requested JSON-RPC -methods. Hyperledger Besu verifies users using -[JSON Web Tokens (JWT)](https://jwt.io/introduction/). JWT is also used in -[multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md) to verify tenant data access. +Authentication identifies a user, and authorization verifies user access to requested JSON-RPC methods. Hyperledger Besu verifies users using [JSON Web Tokens (JWT)](https://jwt.io/introduction/). JWT is also used in [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md) to verify tenant data access. Besu supports two mutually exclusive authentication methods: -* [Username and password](#username-and-password-authentication) -* [JWT public key](#jwt-public-key-authentication). +- [Username and password](#username-and-password-authentication) +- [JWT public key](#jwt-public-key-authentication). -Besu creates JWT internally with -[username and password authentication](#username-and-password-authentication), and externally with -[JWT public key authentication](#jwt-public-key-authentication). +Besu creates JWT internally with [username and password authentication](#username-and-password-authentication), and externally with [JWT public key authentication](#jwt-public-key-authentication). -!!! note - Using JSON-RPC authentication and authorization with [MetaMask](https://metamask.io/) is not supported. +:::info -!!! important - To prevent interception of authentication credentials and authenticated tokens, make - authenticated requests over HTTPS. We recommend running production deployments behind a network - layer that provides SSL termination. Besu does not provide a HTTPS connection natively. +Using JSON-RPC authentication and authorization with [MetaMask](https://metamask.io/) is not supported. + +::: + +:::caution + +To prevent interception of authentication credentials and authenticated tokens, make authenticated requests over HTTPS. We recommend running production deployments behind a network layer that provides SSL termination. Besu does not provide a HTTPS connection natively. + +::: ## Username and password authentication -Enable authentication from the command line. Supply the credentials file and send a request to the -`/login` endpoint using the username and password. The `/login` endpoint creates a JWT for making -permitted JSON-RPC requests. +Enable authentication from the command line. Supply the credentials file and send a request to the `/login` endpoint using the username and password. The `/login` endpoint creates a JWT for making permitted JSON-RPC requests. Using [public key authentication](#jwt-public-key-authentication) disables the `/login` endpoint. @@ -40,105 +39,102 @@ Using [public key authentication](#jwt-public-key-authentication) disables the ` The `toml` credentials file defines user details and the JSON-RPC methods they can access. -!!! example "Sample `auth.toml` credentials file" +:::info Sample `auth.toml` credentials file - ```toml - [Users.username1] - password = "$2a$10$l3GA7K8g6rJ/Yv.YFSygCuI9byngpEzxgWS9qEg5emYDZomQW7fGC" - permissions=["net:*","eth:blockNumber"] - privacyPublicKey="U7ANiOOd5L9Z/dMxRFjdbhA1Qragw6fLuYgmgCvLoX4=" +```toml +[Users.username1] +password = "$2a$10$l3GA7K8g6rJ/Yv.YFSygCuI9byngpEzxgWS9qEg5emYDZomQW7fGC" +permissions=["net:*","eth:blockNumber"] +privacyPublicKey="U7ANiOOd5L9Z/dMxRFjdbhA1Qragw6fLuYgmgCvLoX4=" - [Users.username2] - password = "$2b$10$6sHt1J0MVUGIoNKvJiK33uaZzUwNmMmJlaVLkIwinkPiS1UBnAnF2" - permissions=["net:version","admin:*"] - privacyPublicKey="quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=" - ``` +[Users.username2] +password = "$2b$10$6sHt1J0MVUGIoNKvJiK33uaZzUwNmMmJlaVLkIwinkPiS1UBnAnF2" +permissions=["net:version","admin:*"] +privacyPublicKey="quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=" +``` + +::: Each user requiring JSON-RPC access the configuration file lists the: -* Username. `Users.` is mandatory and followed by the username. That is, replace `` in - `[Users.]` with the username. -* Hash of the user password. Use the - [`password hash`](../../reference/cli/subcommands.md#password) subcommand to generate the - hash. -* [JSON-RPC permissions](#json-rpc-permissions). -* Optional. The tenant's Tessera public key using `privacyPublicKey`. Only used for - [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). +- Username. `Users.` is mandatory and followed by the username. That is, replace `` in `[Users.]` with the username. +- Hash of the user password. Use the [`password hash`](../../reference/cli/subcommands.md#password) subcommand to generate the hash. +- [JSON-RPC permissions](#json-rpc-permissions). +- Optional. The tenant's Tessera public key using `privacyPublicKey`. Only used for [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). + + -!!! example "Password hash subcommand" +# Command - === "Command" +```bash +besu password hash --password=MyPassword +``` - ```bash - besu password hash --password=MyPassword - ``` +# Hash output - === "Hash output" +```text +$2a$10$L3Xb5G/AJOsEK5SuOn9uzOhpCCfuVWTajc5hwWerY6N5xBM/xlrMK +``` - ```text - $2a$10$L3Xb5G/AJOsEK5SuOn9uzOhpCCfuVWTajc5hwWerY6N5xBM/xlrMK - ``` + ### 2. Enable authentication -To require authentication for the JSON-RPC API, use the -[`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) -or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) -options. +To require authentication for the JSON-RPC API, use the [`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) options. -To specify the [credentials file](#1-create-the-credentials-file), use the -[`--rpc-http-authentication-credentials-file`](../../reference/cli/options.md#rpc-http-authentication-credentials-file) -and [`--rpc-ws-authentication-credentials-file`](../../reference/cli/options.md#rpc-ws-authentication-credentials-file) -options. +To specify the [credentials file](#1-create-the-credentials-file), use the [`--rpc-http-authentication-credentials-file`](../../reference/cli/options.md#rpc-http-authentication-credentials-file) and [`--rpc-ws-authentication-credentials-file`](../../reference/cli/options.md#rpc-ws-authentication-credentials-file) options. ### 3. Generate an authentication token -To generate an authentication token, make a request to the `/login` endpoint with your username and -password. Specify the HTTP port or the WS port to generate a token to authenticate over HTTP or WS -respectively. HTTP and WS requires a different token. +To generate an authentication token, make a request to the `/login` endpoint with your username and password. Specify the HTTP port or the WS port to generate a token to authenticate over HTTP or WS respectively. HTTP and WS requires a different token. + + -!!! example +# Generate a token for HTTP - === "Generate a token for HTTP" +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login +``` - ```bash - curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login - ``` +# Example for HTTP - === "Example for HTTP" +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8545/login +``` - ```bash - curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8545/login - ``` +# Generate a token for WS - === "Generate a token for WS" +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login +``` - ```bash - curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login - ``` +# Example for WS - === "Example for WS" +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8546/login +``` - ```bash - curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8546/login - ``` +# JSON result - === "JSON result" +```json +{ + "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MDYwNCwiZXhwIjoxNTUwNDYwOTA0fQ.l2Ycqzl_AyvReXBeUSayOlOMS_E8-DCuz3q0Db0DKD7mqyl6q-giWoEtfdWzUEvZbRRi2_ecKO3N6JkXq7zMKQAJbVAEzobfbaaXWcQEpHOjtnK4_Yz-UPyKiXtu7HGdcdl5Tfx3dKoksbqkBl3U3vFWxzmFnuu3dAISfVJYUNA" +} +``` - ```json - {"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MDYwNCwiZXhwIjoxNTUwNDYwOTA0fQ.l2Ycqzl_AyvReXBeUSayOlOMS_E8-DCuz3q0Db0DKD7mqyl6q-giWoEtfdWzUEvZbRRi2_ecKO3N6JkXq7zMKQAJbVAEzobfbaaXWcQEpHOjtnK4_Yz-UPyKiXtu7HGdcdl5Tfx3dKoksbqkBl3U3vFWxzmFnuu3dAISfVJYUNA"} - ``` + -Authentication tokens expire five minutes after generation. If you require access after the token -expires, you need to generate a new token. +Authentication tokens expire five minutes after generation. If you require access after the token expires, you need to generate a new token. ## JWT public key authentication Enable authentication from the command line and supply the external JWT provider's public key. -!!! important - JWT public authentication disables the Besu `/login` endpoint, meaning - [username and password authentication](#username-and-password-authentication) will not work. +:::danger + +JWT public authentication disables the Besu `/login` endpoint, meaning [username and password authentication](#username-and-password-authentication) will not work. + +::: ### 1. Generate a private and public key pair @@ -146,52 +142,52 @@ The private and accompanying public key files must be in `.pem` format. The [key algorithm](https://datatracker.ietf.org/doc/html/rfc7518#section-3.1) can be: -* RSA with private key length of at least 2048 bits using algorithm `RS256`, `RS384` or `RS512`. -* ECDSA private key, using `ES256` (`secp256r1` or `secp256k1`), `ES384` or `ES512`. +- RSA with private key length of at least 2048 bits using algorithm `RS256`, `RS384` or `RS512`. +- ECDSA private key, using `ES256` (`secp256r1` or `secp256k1`), `ES384` or `ES512`. Besu default is `RS256`. -!!! example "Example of key generation using OpenSSL" + - === "`RS256` RSA Keys" +# `RS256` RSA Keys - 1. Generate the private key: +1. Generate the private key: - ```bash - openssl genrsa -out privateRSAKey.pem 2048 - ``` + ```bash + openssl genrsa -out privateRSAKey.pem 2048 + ``` - 1. Generate the public key: +2. Generate the public key: - ```bash - openssl rsa -pubout -in privateRSAKey.pem -pubout -out publicRSAKey.pem - ``` + ```bash + openssl rsa -pubout -in privateRSAKey.pem -pubout -out publicRSAKey.pem + ``` - === "`ES256` `secp256r1` ECDSA Keys" +# `ES256` `secp256r1` ECDSA Keys - 1. Generate the private key: +1. Generate the private key: - ```bash - openssl ecparam -name secp256r1 -genkey -out privateECDSAKey.pem - ``` + ```bash + openssl ecparam -name secp256r1 -genkey -out privateECDSAKey.pem + ``` + +2. Generate the public key: + + ```bash + openssl ec -in privateECDSAKey.pem -pubout -out publicECDSAKey.pem + ``` + + - 1. Generate the public key: +:::danger Private key security - ```bash - openssl ec -in privateECDSAKey.pem -pubout -out publicECDSAKey.pem - ``` +The private key must be kept secret. Never share private keys publicly or on a Web site, even if advertised as secure. -!!! critical "Private key security" - The private key must be kept secret. Never share private keys publicly or on a Web site, - even if advertised as secure. +Always keep your private keys safe -- ideally using [hardware](https://connect2id.com/products/nimbus-jose-jwt/examples/pkcs11) or [vault](https://www.vaultproject.io/docs/secrets/identity/identity-token) -- and define a strong security policy and [best practices](https://auth0.com/docs/best-practices/token-best-practices). - Always keep your private keys safe -- ideally using - [harware](https://connect2id.com/products/nimbus-jose-jwt/examples/pkcs11) or - [vault](https://www.vaultproject.io/docs/secrets/identity/identity-token) -- - and define a strong security policy and - [best practices](https://auth0.com/docs/best-practices/token-best-practices). +Compromised keys can provide attackers access to you nodes RPC-API. - Compromised keys can provide attackers access to you nodes RPC-API. +::: ### 2. Create the JWT @@ -199,59 +195,53 @@ Create the JWT using a trusted authentication provider[^1] or [library](https:// [^1]: for example [Auth0](https://auth0.com/) or [Keycloak](https://www.keycloak.org/) -See [Java code sample to generate JWT using Vertx](https://github.com/NicolasMassart/java-jwt-sample-generation/) -for an example implementation. +See [Java code sample to generate JWT using Vertx](https://github.com/NicolasMassart/java-jwt-sample-generation/) for an example implementation. -!!! important - The JWT must use one of the `RS256`, `RS384`, `RS512`, `ES256`, `ES384`, or `ES512` algorithms. +:::caution + +The JWT must use one of the `RS256`, `RS384`, `RS512`, `ES256`, `ES384`, or `ES512` algorithms. + +::: Each payload for the JWT must contain: -* [JSON-RPC permissions](#json-rpc-permissions) -* [`exp` (Expiration Time) claim](https://tools.ietf.org/html/rfc7519#section-4.1.4) -* Optionally, the tenant's Tessera public key using `privacyPublicKey`. Only used for - [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). +- [JSON-RPC permissions](#json-rpc-permissions) +- [`exp` (Expiration Time) claim](https://tools.ietf.org/html/rfc7519#section-4.1.4) +- Optionally, the tenant's Tessera public key using `privacyPublicKey`. Only used for [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). -!!! example "JWT generation example" + - === "Example JSON Payload" +# Example JSON Payload - ```json - { - "permissions": ["*:*"], - "privacyPublicKey": "2UKH3VJThkOoKskrLFpwoxCnnRARyobV1bEdgseFHTs=", - "exp": 1600899999002 - } - ``` +```json +{ + "permissions": ["*:*"], + "privacyPublicKey": "2UKH3VJThkOoKskrLFpwoxCnnRARyobV1bEdgseFHTs=", + "exp": 1600899999002 +} +``` - === "Example JWT result" +# Example JWT result - ![eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6Iio6KiIsInByaXZhY3lQdWJsaWNLZXkiOiIyVUtIM1ZKVGhrT29Lc2tyTEZwd294Q25uUkFSeW9iVjFiRWRnc2VGSFRzPSIsImV4cCI6IjE2MDA4OTk5OTkwMDIiLCJpYXQiOjE2MzkxNTc2Mjd9.FGf-FmfDQlIPCRDGmNnsHZWlwrUr69d7AIDqQrIrUrSJLiwGpR3NCUhVHIDMpQvDHQYf-sFMZTYvZGrvztYRuBKWMbTfIZKN74onzNJbFIPBVQuUX2HMXmI4VQ3UFB11LShiUJHKLna13qdbqfbgJIO3HetxJhJQxTiwtixfHwyPXl-Nx8HbQy_AWH58lLAUeaoLzN7QIA9kborthBpvfK9C7Sv1lXT1cdCDC4oRKBoiMg2RWFZtGtxFsnWyloangwbhCB6Bc_elqY5nd9WkF4ix95xsP_HgBcouy1sDw6jxn5_LveX53H8owczVWP6S1e6hv6hq2fs6YkSntKMK2g](jwt.png){: style='width:15rem' } +![Example result](jwt.png) + + ### 3. Enable authentication -To require authentication for the JSON-RPC API, use the -[`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) -or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) -options. +To require authentication for the JSON-RPC API, use the [`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) options. -To specify the JWT provider's public key file to use with the externally created JWT, use the -[`--rpc-http-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) -or [`--rpc-ws-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-ws-authentication-jwt-public-key-file) -options. +To specify the JWT provider's public key file to use with the externally created JWT, use the [`--rpc-http-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) or [`--rpc-ws-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-ws-authentication-jwt-public-key-file) options. ## JSON-RPC permissions -Each user has a list of permissions strings defining the methods they can access. To give access -to: +Each user has a list of permissions strings defining the methods they can access. To give access to: -* All API methods, specify `["*:*"]`. -* All API methods in an API group, specify `[":*"]`. For example, `["eth:*"]`. -* Specific API methods, specify `[":"]`. For example, `["admin:peers"]`. +- All API methods, specify `["*:*"]`. +- All API methods in an API group, specify `[":*"]`. For example, `["eth:*"]`. +- Specific API methods, specify `[":"]`. For example, `["admin:peers"]`. -With authentication enabled, to explicitly specify a user cannot access any methods, include the -user with an empty permissions list (`[]`). Users with an empty permissions list and users not -included in the credentials file cannot access any JSON-RPC methods. +With authentication enabled, to explicitly specify a user cannot access any methods, include the user with an empty permissions list (`[]`). Users with an empty permissions list and users not included in the credentials file cannot access any JSON-RPC methods. ## Use an authentication token to make requests @@ -259,24 +249,24 @@ Specify the authentication token as a `Bearer` token in the JSON-RPC request hea ### Postman -In the **Authorization** tab in the **TYPE** drop-down list, select **Bearer Token** and specify the -token (generated either [externally](#2-create-the-jwt) or by the -[`login` request](#3-generate-an-authentication-token)). +In the **Authorization** tab in the **TYPE** drop-down list, select **Bearer Token** and specify the token (generated either [externally](#2-create-the-jwt) or by the [`login` request](#3-generate-an-authentication-token)). ### cURL Specify the `Bearer` in the header. -!!! example + + +# cURL Request with authentication placeholders - === "cURL Request with authentication placeholders" +```bash +curl -X POST -H 'Authorization: Bearer ' -d '{"jsonrpc":"2.0","method":"","params":[],"id":1}' +``` - ```bash - curl -X POST -H 'Authorization: Bearer ' -d '{"jsonrpc":"2.0","method":"","params":[],"id":1}' - ``` +# cURL Request with authentication - === "cURL Request with authentication" +```bash +curl -X POST -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MTQxNiwiZXhwIjoxNTUwNDYxNzE2fQ.WQ1mqpqzRLHaoL8gOSEZPvnRs_qf6j__7A3Sg8vf9RKvWdNTww_vRJF1gjcVy-FFh96AchVnQyXVx0aNUz9O0txt8VN3jqABVWbGMfSk2T_CFdSw5aDjuriCsves9BQpP70Vhj-tseaudg-XU5hCokX0tChbAqd9fB2138zYm5M' -d '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":1}' http://localhost:8545 +``` - ```bash - curl -X POST -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MTQxNiwiZXhwIjoxNTUwNDYxNzE2fQ.WQ1mqpqzRLHaoL8gOSEZPvnRs_qf6j__7A3Sg8vf9RKvWdNTww_vRJF1gjcVy-FFh96AchVnQyXVx0aNUz9O0txt8VN3jqABVWbGMfSk2T_CFdSw5aDjuriCsves9BQpP70Vhj-tseaudg-XU5hCokX0tChbAqd9fB2138zYm5M' -d '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":1}' http://localhost:8545 - ``` + diff --git a/docs/public-networks/how-to/use-besu-api/graphql.md b/docs/public-networks/how-to/use-besu-api/graphql.md index 676cc068268..ba369af65a3 100644 --- a/docs/public-networks/how-to/use-besu-api/graphql.md +++ b/docs/public-networks/how-to/use-besu-api/graphql.md @@ -1,4 +1,6 @@ --- +title: Use GraphQL over HTTP +sidebar_position: 3 description: How to access the Hyperledger Besu API using GraphQL tags: - private networks @@ -6,40 +8,31 @@ tags: # Use GraphQL over HTTP -GraphQL can reduce the overhead needed for common queries. For example, instead of querying each -receipt in a block, GraphQL can get the same result with a single query for the entire block. +GraphQL can reduce the overhead needed for common queries. For example, instead of querying each receipt in a block, GraphQL can get the same result with a single query for the entire block. -The [Besu GraphQL schema] describes the GraphQL implementation for Ethereum. Enable the GraphQL -service using [command line options](index.md#enable-api-access). +The [Besu GraphQL schema] describes the GraphQL implementation for Ethereum. Enable the GraphQL service using [command line options](index.md#enable-api-access). -!!! note +:::note - GraphQL is not supported over WebSocket. +GraphQL is not supported over WebSocket. -Access the GraphQL endpoint at `http://:/graphql`. Configure `` and `` -using [`graphql-http-host`](../../reference/cli/options.md#graphql-http-host) and -[`graphql-http-port`](../../reference/cli/options.md#graphql-http-port). The default endpoint -is `http://127.0.0.1:8547/graphql`. +::: -## GraphQL requests with cURL +Access the GraphQL endpoint at `http://:/graphql`. Configure `` and `` using [`graphql-http-host`](../../reference/cli/options.md#graphql-http-host) and [`graphql-http-port`](../../reference/cli/options.md#graphql-http-port). The default endpoint is `http://127.0.0.1:8547/graphql`. -[Hyperledger Besu JSON-RPC API methods](../../reference/api/index.md) with an equivalent -[GraphQL](graphql.md) query include a GraphQL request and result in the method example. +## GraphQL requests with cURL -!!! example +[Hyperledger Besu JSON-RPC API methods](../../reference/api/index.md) with an equivalent [GraphQL](graphql.md) query include a GraphQL request and result in the method example. - The following [`syncing`](../../reference/api/index.md#eth_syncing) request returns data - about the synchronization status. +The following [`syncing`](../../reference/api/index.md#eth_syncing) request returns data about the synchronization status. - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock}}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock}}"}' http://localhost:8547/graphql +``` ## GraphQL requests with GraphiQL app -The third-party tool, [GraphiQL](https://github.com/skevy/graphiql-app), provides a tabbed -interface for editing and testing GraphQL queries and mutations. GraphiQL also provides access to -the [Besu GraphQL schema] from within the app. +The third-party tool, [GraphiQL](https://github.com/skevy/graphiql-app), provides a tabbed interface for editing and testing GraphQL queries and mutations. GraphiQL also provides access to the [Besu GraphQL schema] from within the app. ![GraphiQL](../../../assets/images/GraphiQL.png) @@ -47,54 +40,63 @@ the [Besu GraphQL schema] from within the app. `transactionCount` and `transactions` supports the Pending query. -!!! important +:::info - Besu does not execute pending transactions so results from `account`, `call`, and `estimateGas` - for Pending do not reflect pending transactions. +Besu does not execute pending transactions so results from `account`, `call`, and `estimateGas` for Pending do not reflect pending transactions. -!!! example +::: - === "Pending transaction count" + - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactionCount}}"}' http://localhost:8547/graphql - ``` +# Pending transaction count - === "Result" +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactionCount}}"}' http://localhost:8547/graphql +``` - ```bash - { - "data" : { - "pending" : { - "transactionCount" : 2 - } - } - } - ``` +# Result + +```json +{ + "data": { + "pending": { + "transactionCount": 2 + } + } +} +``` -!!! example + - === "Pending transactions" + - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactions{hash}}}"}' http://localhost:8547/graphql - ``` +# Pending transactions - === "Result" +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactions{hash}}}"}' http://localhost:8547/graphql +``` - ```bash +# Result + +```json +{ + "data": { + "pending": { + "transactions": [ + { + "hash": "0xbb3ab8e2113a4afdde9753782cb0680408c0d5b982572dda117a4c72fafbf3fa" + }, { - "data" : { - "pending" : { - "transactions" : [ { - "hash" : "0xbb3ab8e2113a4afdde9753782cb0680408c0d5b982572dda117a4c72fafbf3fa" - }, { - "hash" : "0xf6bd6b1bccf765024bd482a71c6855428e2903895982090ab5dbb0feda717af6" - } ] - } - } + "hash": "0xf6bd6b1bccf765024bd482a71c6855428e2903895982090ab5dbb0feda717af6" } - ``` + ] + } + } +} +``` + + + [Besu GraphQL schema]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/ethereum/api/src/main/resources/schema.graphqls diff --git a/docs/public-networks/how-to/use-besu-api/index.md b/docs/public-networks/how-to/use-besu-api/index.md index 113cc9474d9..5fca272858e 100644 --- a/docs/public-networks/how-to/use-besu-api/index.md +++ b/docs/public-networks/how-to/use-besu-api/index.md @@ -1,6 +1,7 @@ --- description: Hyperledger Besu API tags: + - public networks - private networks --- @@ -8,91 +9,79 @@ tags: Access the [Hyperledger Besu API](../../reference/api/index.md) using: -* [JSON-RPC over HTTP, WebSocket, or IPC](json-rpc.md) -* [RPC Pub/Sub over WebSockets](rpc-pubsub.md) -* [GraphQL over HTTP](graphql.md). +- [JSON-RPC over HTTP, WebSocket, or IPC](json-rpc.md) +- [RPC Pub/Sub over WebSockets](rpc-pubsub.md) +- [GraphQL over HTTP](graphql.md). The following sections provide information about JSON-RPC, RPC Pub/Sub, and GraphQL. ## Enable API access -To enable API access, use the -[`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled), -[`--ws-http-enabled`](../../reference/cli/options.md#rpc-ws-enabled), -[`--graphql-http-enabled`](../../reference/cli/options.md#graphql-http-enabled), and -`--Xrpc-ipc-enabled` options. +To enable API access, use the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled), [`--ws-http-enabled`](../../reference/cli/options.md#rpc-ws-enabled), [`--graphql-http-enabled`](../../reference/cli/options.md#graphql-http-enabled), and `--Xrpc-ipc-enabled` options. -!!! caution +:::caution - `--Xrpc-ipc-enabled` is an early access option. +`--Xrpc-ipc-enabled` is an early access option. + +::: ## Service hosts -To specify the host the API service listens on, use the -[`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host), -[`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host), and -[`--graphql-http-host`](../../reference/cli/options.md#graphql-http-host) options. The -default host is `127.0.0.1`. +To specify the host the API service listens on, use the [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host), [`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host), and [`--graphql-http-host`](../../reference/cli/options.md#graphql-http-host) options. The default host is `127.0.0.1`. To allow remote connections, set the host to `0.0.0.0`. -!!! caution +:::caution + +Setting the host to `0.0.0.0` exposes the API service connection on your node to any remote connection. In a production environment, ensure you use a firewall to avoid exposing your node to the internet. - Setting the host to `0.0.0.0` exposes the API service connection on your node to any remote - connection. In a production environment, ensure you use a firewall to avoid exposing your node - to the internet. +::: ## Service ports -To specify the port the API service listens on, use the -[`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), -[`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), and -[`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port) options. +To specify the port the API service listens on, use the [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), and [`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port) options. The default ports are: -* 8545 for JSON-RPC over HTTP. -* 8546 for JSON-RPC over WebSocket. -* 8547 for GraphQL over HTTP. +- 8545 for JSON-RPC over HTTP. +- 8546 for JSON-RPC over WebSocket. +- 8547 for GraphQL over HTTP. Ports must be [exposed appropriately](../connect/configure-ports.md). ## Socket path -To specify the socket path for the IPC socket, use the `--Xrpc-ipc-path` option. -The default path is `besu.ipc` in the Besu data directory. +To specify the socket path for the IPC socket, use the `--Xrpc-ipc-path` option. The default path is `besu.ipc` in the Besu data directory. + +:::caution -!!! caution +`--Xrpc-ipc-path` is an early access option. - `--Xrpc-ipc-path` is an early access option. +::: ## Host allowlist -To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL -requests. -Besu accepts requests only when hostnames specified using the -[`--host-allowlist`](../../reference/cli/options.md#host-allowlist) option matches the request host headers. -By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. +To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL requests. Besu accepts requests only when hostnames specified using the [`--host-allowlist`](../../reference/cli/options.md#host-allowlist) option matches the request host headers. By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. -!!! important +:::info - This isn't a permissioning feature. - To restrict access to the API, we recommend using the [Besu authentication mechanism](authenticate.md) - with username and password authentication or JWT public key authentication. +This isn't a permissioning feature. To restrict access to the API, we recommend using the [Besu authentication mechanism](authenticate.md) with username and password authentication or JWT public key authentication. -If your application publishes RPC ports, specify the hostnames when starting Besu. +::: -!!! example +If your application publishes RPC ports, specify the hostnames when starting Besu. - ```bash - besu --host-allowlist=example.com - ``` +```bash +besu --host-allowlist=example.com +``` Specify `*` for `--host-allowlist` to effectively disable host protection. -!!! caution +:::caution + +Specifying `*` for `--host-allowlist` is not recommended for production code. - Specifying `*` for `--host-allowlist` is not recommended for production code. +::: ## Not supported by Besu @@ -100,9 +89,7 @@ Specify `*` for `--host-allowlist` to effectively disable host protection. Account management relies on private key management in the client, which is not supported by Besu. -To send signed transactions, use -[`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction). -`eth_sendTransaction` is not implemented. +To send signed transactions, use [`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction). `eth_sendTransaction` is not implemented. For [account management](../send-transactions.md#use-wallets-for-key-management), use third-party wallets. diff --git a/docs/public-networks/how-to/use-besu-api/json-rpc.md b/docs/public-networks/how-to/use-besu-api/json-rpc.md index efc700a1353..f7890d9bd12 100644 --- a/docs/public-networks/how-to/use-besu-api/json-rpc.md +++ b/docs/public-networks/how-to/use-besu-api/json-rpc.md @@ -1,66 +1,64 @@ --- +title: Use JSON-RPC over HTTP, WS, and IPC +sidebar_position: 1 description: How to access the Hyperledger Besu API using JSON-RPC tags: - private networks --- +import Postman from '../../../global/postman.md'; + # Use JSON-RPC over HTTP, WebSocket, and IPC JSON-RPC APIs allow you to interact with your node. JSON-RPC endpoints are not enabled by default. -!!! caution +:::caution + +You should secure access to your node's JSON-RPC endpoints. Users with access to your node via JSON-RPC can make calls directly to your node, causing your node to consume resources. - You should secure access to your node's JSON-RPC endpoints. Users with access to your node - via JSON-RPC can make calls directly to your node, causing your node to consume resources. +::: -To enable JSON-RPC over HTTP or WebSocket, use the -[`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) and -[`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) options. +To enable JSON-RPC over HTTP or WebSocket, use the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) and [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) options. -To enable JSON-RPC over an [IPC socket](index.md#socket-path), use the -`--Xrpc-ipc-enabled` option. +To enable JSON-RPC over an [IPC socket](index.md#socket-path), use the `--Xrpc-ipc-enabled` option. -!!! caution +:::caution - `--Xrpc-ipc-enabled` is an early access option. +`--Xrpc-ipc-enabled` is an early access option. ---8<-- "global/postman.md" +::: + + ## Geth console -The geth console is a REPL (Read, Evaluate, & Print Loop) JavaScript console. Use JSON-RPC APIs -supported by geth and Hyperledger Besu directly in the console. +The geth console is a REPL (Read, Evaluate, & Print Loop) JavaScript console. Use JSON-RPC APIs supported by geth and Hyperledger Besu directly in the console. To use the geth console with Besu: -1. Start Besu with the - [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) or `--Xrpc-ipc-enabled` option. -1. Specify which APIs to enable using the - [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or `--Xrpc-ipc-api` option. +1. Start Besu with the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) or `--Xrpc-ipc-enabled` option. +1. Specify which APIs to enable using the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or `--Xrpc-ipc-api` option. 1. Start the geth console specifying the JSON-RPC endpoint: -!!! example - - === "HTTP endpoint" + - ```bash - geth attach http://localhost:8545 - ``` +# HTTP endpoint - === "IPC endpoint" +```bash +geth attach http://localhost:8545 +``` - ```bash - geth attach /path/to/besu.ipc - ``` +# IPC endpoint -Use the geth console to call [JSON-RPC API methods](../../reference/api/index.md) that geth -and Besu share. +```bash +geth attach /path/to/besu.ipc +``` -!!! example +Use the geth console to call [JSON-RPC API methods](../../reference/api/index.md) that geth and Besu share. - ```bash - eth.syncing - ``` +```bash +eth.syncing +``` ## JSON-RPC authentication @@ -72,61 +70,64 @@ Besu disables [Authentication](authenticate.md) by default. To make RPC requests over HTTP, you can use [`curl`](https://curl.haxx.se/download.html). -!!! example + - === "Syntax" +# Syntax - ```bash - curl -X POST --data '{"jsonrpc":"2.0","id":,"method":"","params":[]}' - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","id":,"method":"","params":[]}' +``` - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}' http://127.0.0.1:8555 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}' http://127.0.0.1:8555 +``` + +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": "1", + "result": "0x60e" +} +``` - ```json - { - "jsonrpc":"2.0", - "id":"1", - "result":"0x60e" - } - ``` + -You can use `curl` to make multiple RPC requests (batch requests) over HTTP at the same time. -Send the requests as an array, and receive an array of responses. The default number of allowed requests -in a RPC batch request is `1024`. Use the [`--rpc-http-max-batch-size`](../../reference/cli/options.md#rpc-http-max-batch-size) -command line option to update the default value. +You can use `curl` to make multiple RPC requests (batch requests) over HTTP at the same time. Send the requests as an array, and receive an array of responses. The default number of allowed requests in a RPC batch request is `1024`. Use the [`--rpc-http-max-batch-size`](../../reference/cli/options.md#rpc-http-max-batch-size) command line option to update the default value. -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '[{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}]' http://127.0.0.1:8555 - ``` +```bash +curl -X POST --data '[{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}]' http://127.0.0.1:8555 +``` - === "JSON result" +# JSON result + +```json +[ + { + "jsonrpc": "2.0", + "id": "1", + "result": "0x60e" + }, + { + "jsonrpc": "2.0", + "id": "2", + "result": [] + } +] +``` - ```json - [{ - "jsonrpc":"2.0", - "id":"1", - "result":"0x60e" - },{ - "jsonrpc":"2.0", - "id":"2", - "result":[] - }] - ``` + ### WebSocket -To make RPC requests over WebSocket, you can use [`wscat`](https://github.com/websockets/wscat), a -Node.js based command-line tool. +To make RPC requests over WebSocket, you can use [`wscat`](https://github.com/websockets/wscat), a Node.js based command-line tool. First connect to the WebSocket server using `wscat` (you only need to connect once per session): @@ -134,160 +135,157 @@ First connect to the WebSocket server using `wscat` (you only need to connect on wscat -c ws:// ``` -After you establish a connection, the terminal displays a '>' prompt. -Send individual requests as a JSON data package at each prompt. +After you establish a connection, the terminal displays a '>' prompt. Send individual requests as a JSON data package at each prompt. -!!! Example + - === "Syntax" +# Syntax - ```bash - {"jsonrpc":"2.0","id":,"method":"","params":[]} - ``` +```bash +{"jsonrpc":"2.0","id":,"method":"","params":[]} +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]} - ``` +```bash +{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc":"2.0", - "id":"1", - "result":"0x23" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": "1", + "result": "0x23" +} +``` -You can use `wscat` to make multiple RPC requests over WebSocket at the same time. -Send the requests as an array, and receive an array of responses. + -!!! example +You can use `wscat` to make multiple RPC requests over WebSocket at the same time. Send the requests as an array, and receive an array of responses. - === "wscat WS request" + - ```bash - [{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}] - ``` +# wscat WS request - === "JSON result" +```bash +[{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}] +``` + +# JSON result + +```json +[ + { + "jsonrpc": "2.0", + "id": "1", + "result": "0x23" + }, + { + "jsonrpc": "2.0", + "id": "2", + "result": [] + } +] +``` - ```json - [{ - "jsonrpc":"2.0", - "id":"1", - "result":"0x23" - },{ - "jsonrpc":"2.0", - "id":"2", - "result":[] - }] - ``` + -!!! note +:::note - `wscat` does not support headers. [Authentication](authenticate.md) requires you to pass an - authentication token in the request header. To use authentication with WebSocket, you need - an app that supports headers. +`wscat` does not support headers. [Authentication](authenticate.md) requires you to pass an authentication token in the request header. To use authentication with WebSocket, you need an app that supports headers. + +::: ## Readiness and liveness endpoints -Besu provides readiness and liveness endpoints to confirm the Besu node status. Both return a -`200 OK` status when ready or live and a `503 Service Unavailable` status if not ready or live. +Besu provides readiness and liveness endpoints to confirm the Besu node status. Both return a `200 OK` status when ready or live and a `503 Service Unavailable` status if not ready or live. ### Readiness -By default, the readiness check requires a connected peer and the node to be within two blocks of -the best known block. If you have -[disabled P2P communication](../../reference/cli/options.md#p2p-enabled), you do not need -peers. A live node with P2P disabled is always ready. +By default, the readiness check requires a connected peer and the node to be within two blocks of the best known block. If you have [disabled P2P communication](../../reference/cli/options.md#p2p-enabled), you do not need peers. A live node with P2P disabled is always ready. + +Use the query parameters `minPeers` and `maxBlocksBehind` to adjust the number of peers required and the number of blocks tolerance. + + -Use the query parameters `minPeers` and `maxBlocksBehind` to adjust the number of peers required -and the number of blocks tolerance. +# Readiness endpoint -=== "Readiness endpoint" +```bash +http:///readiness +``` - ```bash - http:///readiness - ``` +# curl request example -=== "curl request example" +```bash +curl -v 'http://localhost:8545/readiness' +``` - ```bash - curl -v 'http://localhost:8545/readiness' - ``` +# Query parameters example -=== "Query parameters example" +```bash +curl -v 'http://localhost:8545/readiness?minPeers=0&maxBlocksBehind=10' +``` - ```bash - curl -v 'http://localhost:8545/readiness?minPeers=0&maxBlocksBehind=10' - ``` + ### Liveness -The liveness check requires the JSON-RPC server to be up. You can use the endpoint to verify that -the node can respond to RPC calls. The status in the response will always be `UP`. +The liveness check requires the JSON-RPC server to be up. You can use the endpoint to verify that the node can respond to RPC calls. The status in the response will always be `UP`. -=== "Liveness endpoint" + - ```bash - http:///liveness - ``` +# Liveness endpoint -=== "curl request example" +```bash +http:///liveness +``` + +# curl request example + +```bash +curl -v 'http://localhost:8545/liveness' +``` - ```bash - curl -v 'http://localhost:8545/liveness' - ``` + ## API methods enabled by default Besu enables the `ETH`, `NET`, and `WEB3` API methods by default. -To enable the `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `IBFT`, `MINER`, `PERM`, `PLUGINS`, `PRIV`, -`TRACE`, and `TXPOOL` API methods, use the -[`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api), -[`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api), or -`--Xrpc-ipc-api` options. +To enable the `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `IBFT`, `MINER`, `PERM`, `PLUGINS`, `PRIV`, `TRACE`, and `TXPOOL` API methods, use the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api), [`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api), or `--Xrpc-ipc-api` options. -!!! caution +:::caution - `--Xrpc-ipc-api` is an early access option. +`--Xrpc-ipc-api` is an early access option. + +::: ## Block parameter -When you make requests that might have different results depending on the block accessed, the block -parameter specifies the block. Methods such as -[`eth_getTransactionByBlockNumberAndIndex`](../../reference/api/index.md#eth_gettransactionbyblocknumberandindex) -have a block parameter. +When you make requests that might have different results depending on the block accessed, the block parameter specifies the block. Methods such as [`eth_getTransactionByBlockNumberAndIndex`](../../reference/api/index.md#eth_gettransactionbyblocknumberandindex) have a block parameter. The block parameter can have one of the following values: -* `blockNumber` : *quantity* - The block number, specified in hexadecimal or decimal. 0 represents - the genesis block. -* `blockHash` : *string* or *object* - 32-byte block hash or JSON object specifying the block hash. - If using a JSON object, you can specify `requireCanonical` to indicate whether the block must be a - canonical block. - See [this example](https://github.com/hyperledger/besu/blob/a2dedb0b2c7980cdc35db8eb4c094f2eb0dc7deb/ethereum/api/src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/eth/eth_getBalance_blockHashObjectCanonical.json). - - !!! note - - Only the following methods support the `blockHash` parameter: - - * [`eth_call`](../../reference/api/index.md#eth_call) - * [`eth_getBalance`](../../reference/api/index.md#eth_getbalance) - * [`eth_getCode`](../../reference/api/index.md#eth_getcode) - * [`eth_getProof`](../../reference/api/index.md#eth_getproof) - * [`eth_getStorageAt`](../../reference/api/index.md#eth_getstorageat) - * [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) - -* `earliest` : *tag* - The earliest (genesis) block. -* `latest` : *tag* - The last block mined. -* `pending` : *tag* - The last block mined plus pending transactions. Use only with - [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). -* `finalized` : *tag* - The most recent crypto-economically secure block. - It cannot be reorganized outside manual intervention driven by community coordination. -* `safe` : *tag* - The most recent block that is safe from reorganization under - honest majority and certain synchronicity assumptions. +- `blockNumber` : _quantity_ - The block number, specified in hexadecimal or decimal. 0 represents the genesis block. +- `blockHash` : _string_ or _object_ - 32-byte block hash or JSON object specifying the block hash. If using a JSON object, you can specify `requireCanonical` to indicate whether the block must be a canonical block. See [this example](https://github.com/hyperledger/besu/blob/a2dedb0b2c7980cdc35db8eb4c094f2eb0dc7deb/ethereum/api/src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/eth/eth_getBalance_blockHashObjectCanonical.json). + + :::note + + Only the following methods support the `blockHash` parameter: + + - [`eth_call`](../../reference/api/index.md#eth_call) + - [`eth_getBalance`](../../reference/api/index.md#eth_getbalance) + - [`eth_getCode`](../../reference/api/index.md#eth_getcode) + - [`eth_getProof`](../../reference/api/index.md#eth_getproof) + - [`eth_getStorageAt`](../../reference/api/index.md#eth_getstorageat) + - [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) + + ::: + +- `earliest` : _tag_ - The earliest (genesis) block. +- `latest` : _tag_ - The last block mined. +- `pending` : _tag_ - The last block mined plus pending transactions. Use only with [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). +- `finalized` : _tag_ - The most recent crypto-economically secure block. It cannot be reorganized outside manual intervention driven by community coordination. +- `safe` : _tag_ - The most recent block that is safe from reorganization under honest majority and certain synchronicity assumptions. diff --git a/docs/public-networks/how-to/use-besu-api/rpc-pubsub.md b/docs/public-networks/how-to/use-besu-api/rpc-pubsub.md index 869d7c2a6c9..4bc56782d7b 100644 --- a/docs/public-networks/how-to/use-besu-api/rpc-pubsub.md +++ b/docs/public-networks/how-to/use-besu-api/rpc-pubsub.md @@ -1,4 +1,6 @@ --- +title: Use RPC Pub/Sub over WS +sidebar_position: 2 description: Using RPC Pub/Sub with Hyperledger Besu WebSockets tags: - private networks @@ -8,483 +10,523 @@ tags: ## Introduction -Subscribe to events by using either RPC Pub/Sub over WebSockets or -[filters over HTTP](access-logs.md). +Subscribe to events by using either RPC Pub/Sub over WebSockets or [filters over HTTP](access-logs.md). -Use RPC Pub/Sub over WebSockets to wait for events instead of polling for them. For example, dapps -subscribe to logs and receive notifications when a specific event occurs. +Use RPC Pub/Sub over WebSockets to wait for events instead of polling for them. For example, dapps subscribe to logs and receive notifications when a specific event occurs. Methods specific to RPC Pub/Sub are: -* `eth_subscribe` and `eth_unsubscribe` - create or cancel a subscription for specific events. -* `priv_subscribe` and `priv_unsubscribe` - create or cancel a subscription for [private logs](../../../private-networks/concepts/privacy/index.md). +- `eth_subscribe` and `eth_unsubscribe` - create or cancel a subscription for specific events. +- `priv_subscribe` and `priv_unsubscribe` - create or cancel a subscription for [private logs](../../../private-networks/concepts/privacy/index.md). -!!!important +:::info - Unlike other [Hyperledger Besu API methods](../../reference/api/index.md), you cannot call - the RPC Pub/Sub methods over HTTP. Use the - [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) option to enable the - WebSockets JSON-RPC service. +Unlike other [Hyperledger Besu API methods](../../reference/api/index.md), you cannot call the RPC Pub/Sub methods over HTTP. Use the [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) option to enable the WebSockets JSON-RPC service. + +::: ### Use RPC Pub/Sub [WebSockets](json-rpc.md#http-and-websocket-requests) supports the RPC Pub/Sub API. -To create subscriptions, use `eth_subscribe` or `priv_subscribe`. Once subscribed, the API publishes -notifications using `eth_subscription` or `priv_subscription`. +To create subscriptions, use `eth_subscribe` or `priv_subscribe`. Once subscribed, the API publishes notifications using `eth_subscription` or `priv_subscription`. -Subscriptions couple with connections. If a connection is closed, all subscriptions -created over the connection are removed. +Subscriptions couple with connections. If a connection is closed, all subscriptions created over the connection are removed. ### Subscription ID -`eth_subscribe` and `priv_subscribe` return a subscription ID for each subscription created. -Notifications include the subscription ID. - -!!!example +`eth_subscribe` and `priv_subscribe` return a subscription ID for each subscription created. Notifications include the subscription ID. - For example, to create a synchronizing subscription: +For example, to create a synchronizing subscription: - ```json - {"id": 1, "method": "eth_subscribe", "params": ["syncing"]} - ``` +```json +{ "id": 1, "method": "eth_subscribe", "params": ["syncing"] } +``` - The result includes the subscription ID of `"0x1"`: +The result includes the subscription ID of `"0x1"`: - ```json - {"jsonrpc":"2.0","id":1,"result":"0x1"} - ``` +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` - The notifications also include the subscription ID of `"0x1"`: +The notifications also include the subscription ID of `"0x1"`: - ```json - {"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0x1","result":{"startingBlock":"0x0","currentBlock":"0x50","highestBlock":"0x343c19"}}} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": { + "startingBlock": "0x0", + "currentBlock": "0x50", + "highestBlock": "0x343c19" + } + } +} +``` ### Notifications when synchronizing -Subscribing to some events (for example, logs) can cause a flood of notifications while the node is -synchronizing. +Subscribing to some events (for example, logs) can cause a flood of notifications while the node is synchronizing. ## Subscribe Use `eth_subscribe` to create subscriptions for the following event types: -* [New headers](#new-headers) -* [Logs](#logs) -* [Pending transactions](#pending-transactions) -* [Dropped transactions](#dropped-transactions) -* [Synchronizing](#synchronizing) +- [Use RPC Pub/Sub over WebSockets](#use-rpc-pubsub-over-websockets) + - [Introduction](#introduction) + - [Use RPC Pub/Sub](#use-rpc-pubsub) + - [Subscription ID](#subscription-id) + - [Notifications when synchronizing](#notifications-when-synchronizing) + - [Subscribe](#subscribe) + - [New headers](#new-headers) + - [Logs](#logs) +- [All logs](#all-logs) +- [Specific address, topic, fromBlock and toBlock](#specific-address-topic-fromblock-and-toblock) +- [Result](#result) +- [Notification](#notification) +- [All logs for privacy group](#all-logs-for-privacy-group) +- [Specific address and topic](#specific-address-and-topic) +- [Result](#result-1) +- [Notification](#notification-1) + - [Pending transactions](#pending-transactions) + - [Dropped transactions](#dropped-transactions) + - [Synchronizing](#synchronizing) + - [Unsubscribe](#unsubscribe) Use `priv_subscribe` to [create subscriptions for logs on private contracts](#logs). -!!! tip - - Only logs subscriptions are relevant for private transactions because private transactions are - anchored to the public chain rather than having their own private blockchain. - -### New headers - -To notify you about each block added to the blockchain, use the `newHeads` parameter with -`eth_subscribe`. - -If a chain reorganization occurs, the subscription publishes notifications for blocks in the new -chain. This means the subscription can publish notifications for multiple blocks at the same height -on the blockchain. - -The new headers notification returns -[block objects](../../reference/api/objects.md#block-object). The second parameter is optional. -If specified, the notifications include whole -[transaction objects](../../reference/api/objects.md#transaction-object), Otherwise, the -notifications include transaction hashes. +:::tip -!!!example +Only logs subscriptions are relevant for private transactions because private transactions are anchored to the public chain rather than having their own private blockchain. - To subscribe to new header notifications: +::: - ```json - {"id": 1, "method": "eth_subscribe", "params": ["newHeads", {"includeTransactions": true}]} - ``` - - Example result: - - ```json - {"jsonrpc":"2.0","id":2,"result":"0x1"} - ``` - - Example notification without the `{"includeTransactions": true}` parameter included: +### New headers - ```json - { - "jsonrpc": "2.0", - "method": "eth_subscription", - "params":{ - "subscription":"0x1", - "result": { - "number":"0x40c22", - "hash":"0x16af2ee1672203c7ac13ff280822008be0f38e1e5bdc675760015ae3192c0e3a", - "parentHash":"0x1fcf5dadfaf2ab4d985eb05d40eaa23605b0db25d736610c4b87173bfe438f91", - "nonce":"0x0000000000000000", - "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom":"0x00008000000000080000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000040000000000000000000000000000000000000000001000000000000000000000040000000000000000000000000000000000000400000000010000000000000000100000000000020000000000000000000000000000000000010000000000000000000000000000000000000000000", - "transactionsRoot":"0x5b2e3c1a49352f1ca9fb5dfe74b7ffbbb6d70e23a12693444e26058d8a8e6296", - "stateRoot":"0xbe8d3bc58bd982421a3ea8b66753404502df0f464ae78a17661d157c406dd38b", - "receiptsRoot":"0x81b175ec1f4d44fbbd6ba08f1bd3950663b307b7cb35751c067b535cc0b58f12", - "miner":"0x0000000000000000000000000000000000000000", - "difficulty":"0x1", - "totalDifficulty":"0x7c16e", - "extraData":"0xd783010600846765746887676f312e372e33856c696e757800000000000000002160f780bb1f61eda045c67cdb1297ba37d8349df8035533cb0cf82a7e45f23f3d72bbec125a9f499b3eb110b7d1918d466cb2ede90b38296cfe2aaf452c513f00", - "size":"0x3a1", - "gasLimit":"0x47e7c4", - "gasUsed":"0x11ac3a", - "timestamp":"0x592afc24", - "uncles":[], - "transactions":["0x419c69d21b14e2e8f911def22bb6d0156c876c0e1c61067de836713043364d6c","0x70a5b2cb2cee6e0b199232a1757fc2a9d6053a4691a7afef8508fd88aeeec703","0x4b3035f1d32339fe1a4f88147dc197a0fe5bbd63d3b9dec2dad96a3b46e4fddd"], - }, - } +To notify you about each block added to the blockchain, use the `newHeads` parameter with `eth_subscribe`. + +If a chain reorganization occurs, the subscription publishes notifications for blocks in the new chain. This means the subscription can publish notifications for multiple blocks at the same height on the blockchain. + +The new headers notification returns [block objects](../../reference/api/objects.md#block-object). The second parameter is optional. If specified, the notifications include whole [transaction objects](../../reference/api/objects.md#transaction-object), Otherwise, the notifications include transaction hashes. + +To subscribe to new header notifications: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newHeads", { "includeTransactions": true }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 2, "result": "0x1" } +``` + +Example notification without the `{"includeTransactions": true}` parameter included: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": { + "number": "0x40c22", + "hash": "0x16af2ee1672203c7ac13ff280822008be0f38e1e5bdc675760015ae3192c0e3a", + "parentHash": "0x1fcf5dadfaf2ab4d985eb05d40eaa23605b0db25d736610c4b87173bfe438f91", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00008000000000080000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000040000000000000000000000000000000000000000001000000000000000000000040000000000000000000000000000000000000400000000010000000000000000100000000000020000000000000000000000000000000000010000000000000000000000000000000000000000000", + "transactionsRoot": "0x5b2e3c1a49352f1ca9fb5dfe74b7ffbbb6d70e23a12693444e26058d8a8e6296", + "stateRoot": "0xbe8d3bc58bd982421a3ea8b66753404502df0f464ae78a17661d157c406dd38b", + "receiptsRoot": "0x81b175ec1f4d44fbbd6ba08f1bd3950663b307b7cb35751c067b535cc0b58f12", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x7c16e", + "extraData": "0xd783010600846765746887676f312e372e33856c696e757800000000000000002160f780bb1f61eda045c67cdb1297ba37d8349df8035533cb0cf82a7e45f23f3d72bbec125a9f499b3eb110b7d1918d466cb2ede90b38296cfe2aaf452c513f00", + "size": "0x3a1", + "gasLimit": "0x47e7c4", + "gasUsed": "0x11ac3a", + "timestamp": "0x592afc24", + "uncles": [], + "transactions": [ + "0x419c69d21b14e2e8f911def22bb6d0156c876c0e1c61067de836713043364d6c", + "0x70a5b2cb2cee6e0b199232a1757fc2a9d6053a4691a7afef8508fd88aeeec703", + "0x4b3035f1d32339fe1a4f88147dc197a0fe5bbd63d3b9dec2dad96a3b46e4fddd" + ] } - ``` - - Example notification with the `{"includeTransactions": true}` parameter included: - - ```json - { - "jsonrpc": "2.0", - "method": "eth_subscription", - "params":{ - "subscription":"0x1", - "result": { - .... - "transactions":[ - { - "blockHash":"0xa30ee4d7c271ae5150aec494131c5f1f34089c7aa8fb58bd8bb916a55275bb90", - "blockNumber":"0x63", - "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas":"0x5208", - "gasPrice":"0x3b9aca00", - "hash":"0x11f66c3e96a92e3c14c1c33ad77381221bf8b58a887b4fed6aee456fc6f39b24", - "input":"0x", - "nonce":"0x1", - "to":"0x627306090abab3a6e1400e9345bc60c78a8bef57", - "transactionIndex":"0x0", - "value":"0x56bc75e2d63100000", - "v":"0xfe8", - "r":"0x4b57d179c74885ef5f9326fd000665ea7fae44095c1e2016a2817fc671beb8cc", - "s":"0x7ec060b115746dda392777df07ae1feacc0b83b3646f0a3de9a5fc3615af9bb8", - } - ], - }, - } - } - ``` + } +} +``` + +Example notification with the `{"includeTransactions": true}` parameter included: + +```json +{ +"jsonrpc": "2.0", +"method": "eth_subscription", +"params":{ + "subscription":"0x1", + "result": { + .... + "transactions":[ + { + "blockHash":"0xa30ee4d7c271ae5150aec494131c5f1f34089c7aa8fb58bd8bb916a55275bb90", + "blockNumber":"0x63", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0x5208", + "gasPrice":"0x3b9aca00", + "hash":"0x11f66c3e96a92e3c14c1c33ad77381221bf8b58a887b4fed6aee456fc6f39b24", + "input":"0x", + "nonce":"0x1", + "to":"0x627306090abab3a6e1400e9345bc60c78a8bef57", + "transactionIndex":"0x0", + "value":"0x56bc75e2d63100000", + "v":"0xfe8", + "r":"0x4b57d179c74885ef5f9326fd000665ea7fae44095c1e2016a2817fc671beb8cc", + "s":"0x7ec060b115746dda392777df07ae1feacc0b83b3646f0a3de9a5fc3615af9bb8", + } + ], + }, + } +} +``` ### Logs -To notify you about [logs](../../concepts/events-and-logs.md) included in new blocks, use the -`logs` parameter with `eth_subscribe` or `priv_subscribe`. Specify a filter object to receive -notifications only for logs matching your filter. +To notify you about [logs](../../concepts/events-and-logs.md) included in new blocks, use the `logs` parameter with `eth_subscribe` or `priv_subscribe`. Specify a filter object to receive notifications only for logs matching your filter. Logs subscriptions have an filter object parameter with the following fields: -* `address` - (optional) Either an address or an array of addresses. Returns only logs created from - these addresses. -* `topics` - (optional) Returns only logs that match the - [specified topics](../../concepts/events-and-logs.md#topic-filters). -* `fromBlock` - (optional) The earliest block from which to return logs. -* `toBlock` - (optional) The last block from which to return logs. +- `address` - (optional) Either an address or an array of addresses. Returns only logs created from these addresses. +- `topics` - (optional) Returns only logs that match the [specified topics](../../concepts/events-and-logs.md#topic-filters). +- `fromBlock` - (optional) The earliest block from which to return logs. +- `toBlock` - (optional) The last block from which to return logs. -For private contracts, the privacy group ID must be specified. Only members of a privacy group receive -logs for a private contract subscription. If you create a subscription for a privacy group you are -not a member of, you will not receive any notifications. +For private contracts, the privacy group ID must be specified. Only members of a privacy group receive logs for a private contract subscription. If you create a subscription for a privacy group you are not a member of, you will not receive any notifications. -If a chain reorganization occurs, the subscription publishes notifications for logs from the old -chain with the `removed` property in the [log object](../../reference/api/objects.md#log-object) -set to `true`. This means the subscription can publish notifications for multiple logs for the same -transaction. +If a chain reorganization occurs, the subscription publishes notifications for logs from the old chain with the `removed` property in the [log object](../../reference/api/objects.md#log-object) set to `true`. This means the subscription can publish notifications for multiple logs for the same transaction. The logs subscription returns [log objects](../../reference/api/objects.md#log-object). -!!!example "Public logs" - - === "All logs" - - ```json - {"id": 1, "method": "eth_subscribe", "params": ["logs",{}]} - ``` - - === "Specific address, topic, fromBlock and toBlock" - - ```json - {"id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"], "fromBlock":"0x0","toBlock":"latest"}]} - ``` - - === "Result" - - ```json - {"jsonrpc":"2.0","id":1,"result":"0x2"} - ``` - - === "Notification" - - ```json - { - "jsonrpc":"2.0", - "method":"eth_subscription", - "params":{ - "subscription":"0x2", - "result":{ - "logIndex":"0x0", - "removed":false, - "blockNumber":"0x2174", - "blockHash":"0x7bc83837534aa13df55ff7db77784b1d1ba666d4c4bdd223cae9fe09c7c37eba", - "transactionHash":"0x942179373e413824c6bc7045e92295aff91b679215446549b4aeb084da46495b", - "transactionIndex":"0x0", - "address":"0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517", - "data":"0x", - "topics":["0x199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca072787","0x0000000000000000000000000000000000000000000000000000000000000005"] - } - } - } - ``` - -!!!example "Private logs" - - === "All logs for privacy group" - - ```json - {"id": 1, "method": "priv_subscribe", "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "logs",{}]} - ``` + - === "Specific address and topic" +# All logs - ```json - {"id": 1, "method": "priv_subscribe", "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]} - ``` +```json +{ "id": 1, "method": "eth_subscribe", "params": ["logs", {}] } +``` - === "Result" +# Specific address, topic, fromBlock and toBlock - ```json - {"jsonrpc":"2.0","id":1,"result":"0x1"} - ``` - - === "Notification" - - ```json - { - "jsonrpc":"2.0", - "method":"priv_subscription", - "params":{ - "subscription":"0x1", - "privacyGroupId":"4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", - "result":{ - "logIndex":"0x0", - "removed":false, - "blockNumber":"0x285", - "blockHash":"0x98490766b16de2a4d044c04d92599d71e626bc96e42f0c74274ef4e03fafd579", - "transactionHash":"0x40034ef14e3a22946693dd2a11efddf3a8850ddcad46b408198df6c176c53ffb", - "transactionIndex":"0x0", - "address":"0x61f96a7ed09877197d4fff0c29b8e523913651a9", - "data":"0x", - "topics":["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410","0x0000000000000000000000000000000000000000000000000000000000000002"] - } - } - } - ``` - -### Pending transactions - -To notify you about pending transactions added to the transaction pool for the node, use the -`newPendingTransactions` parameter with `eth_subscribe`. - -The pending transactions subscription returns the transaction hashes or transaction details of the -pending transactions. If the `includeTransactions` parameter is not included, the default is -transaction hashes only. - -If a chain reorganization occurs, Besu resubmits transactions for inclusion in the new canonical -chain. This means the subscription can publish notifications for the same pending transaction more -than once. - -!!!example "Transaction hashes" +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": [ + "logs", + { + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "topics": [ + "0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902" + ], + "fromBlock": "0x0", + "toBlock": "latest" + } + ] +} +``` + +# Result + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x2" } +``` + +# Notification + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x2", + "result": { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x2174", + "blockHash": "0x7bc83837534aa13df55ff7db77784b1d1ba666d4c4bdd223cae9fe09c7c37eba", + "transactionHash": "0x942179373e413824c6bc7045e92295aff91b679215446549b4aeb084da46495b", + "transactionIndex": "0x0", + "address": "0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517", + "data": "0x", + "topics": [ + "0x199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca072787", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + } +} +``` - To subscribe to pending transaction notifications and receive transaction hashes only: + - ```json - {"id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions", {"includeTransactions":false}]} - ``` + - Example result: +# All logs for privacy group - ```json - {"jsonrpc":"2.0","id":1,"result":"0x1"} - ``` +```json +{ + "id": 1, + "method": "priv_subscribe", + "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "logs", {}] +} +``` - Example notification: +# Specific address and topic - ```json +```json +{ + "id": 1, + "method": "priv_subscribe", + "params": [ + "4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", + "logs", { - "jsonrpc":"2.0", - "method":"eth_subscription", - "params":{ - "subscription":"0x1", - "result":"0x5705bc8bf875ff03e98adb98489428835892dc6ba6a6b139fee1becbc26db0b8" - } + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "topics": [ + "0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902" + ] } - ``` - -!!!example "Transaction details" - - To subscribe to pending transaction notifications and receive transaction details: - - ```json - {"id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions", {"includeTransactions":true}]} - ``` - - Example result: + ] +} +``` + +# Result + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +# Notification + +```json +{ + "jsonrpc": "2.0", + "method": "priv_subscription", + "params": { + "subscription": "0x1", + "privacyGroupId": "4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", + "result": { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x285", + "blockHash": "0x98490766b16de2a4d044c04d92599d71e626bc96e42f0c74274ef4e03fafd579", + "transactionHash": "0x40034ef14e3a22946693dd2a11efddf3a8850ddcad46b408198df6c176c53ffb", + "transactionIndex": "0x0", + "address": "0x61f96a7ed09877197d4fff0c29b8e523913651a9", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + } +} +``` - ```json - {"jsonrpc":"2.0","id":1,"result":"0x2"} - ``` + - Example notification: +### Pending transactions - ```json - { - "jsonrpc":"2.0", - "method":"eth_subscription", - "params":{ - "subscription":"0x2", - "result":{ - "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas":"0x5208", - "gasPrice":"0x2540be400", - "hash":"0x7a4185f40ee93cb27eb132f301d0a5414c1f871051f166fc8804c376aab3ffec", - "input":"0x", - "nonce":"0x13", - "to":"0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f", - "value":"0x8ac7230489e80000", - "v":"0xfe7", - "r":"0xdd9013c67469d2fe79afdc61777c55bdced33c90fa6f9b83d8f9b7e445085123", - "s":"0x45823a1ab22ae9c83876ea435dc5ecc4fe3a83c1bfbc340a5f57df2f5a474fa5" - } - } +To notify you about pending transactions added to the transaction pool for the node, use the `newPendingTransactions` parameter with `eth_subscribe`. + +The pending transactions subscription returns the transaction hashes or transaction details of the pending transactions. If the `includeTransactions` parameter is not included, the default is transaction hashes only. + +If a chain reorganization occurs, Besu resubmits transactions for inclusion in the new canonical chain. This means the subscription can publish notifications for the same pending transaction more than once. + +To subscribe to pending transaction notifications and receive transaction hashes only: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newPendingTransactions", { "includeTransactions": false }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": "0x5705bc8bf875ff03e98adb98489428835892dc6ba6a6b139fee1becbc26db0b8" + } +} +``` + +To subscribe to pending transaction notifications and receive transaction details: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newPendingTransactions", { "includeTransactions": true }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x2" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x2", + "result": { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0x2540be400", + "hash": "0x7a4185f40ee93cb27eb132f301d0a5414c1f871051f166fc8804c376aab3ffec", + "input": "0x", + "nonce": "0x13", + "to": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f", + "value": "0x8ac7230489e80000", + "v": "0xfe7", + "r": "0xdd9013c67469d2fe79afdc61777c55bdced33c90fa6f9b83d8f9b7e445085123", + "s": "0x45823a1ab22ae9c83876ea435dc5ecc4fe3a83c1bfbc340a5f57df2f5a474fa5" } - ``` + } +} +``` ### Dropped transactions -To notify you about transactions dropped from the transaction pool for the node, use the -`droppedPendingTransactions` parameter with `eth_subscribe`. +To notify you about transactions dropped from the transaction pool for the node, use the `droppedPendingTransactions` parameter with `eth_subscribe`. The dropped transactions subscription returns the transaction hashes of the dropped transactions. -Dropped transactions can be re-added to the transaction pool from a variety of sources. For -example, receiving a previously dropped transaction from a peer. As a result, it's possible to -receive multiple dropped transaction notifications for the same transaction. - -!!!example +Dropped transactions can be re-added to the transaction pool from a variety of sources. For example, receiving a previously dropped transaction from a peer. As a result, it's possible to receive multiple dropped transaction notifications for the same transaction. - To subscribe to dropped transaction notifications: +To subscribe to dropped transaction notifications: - ```json - {"id": 1, "method": "eth_subscribe", "params": ["droppedPendingTransactions"]} - ``` +```json +{ "id": 1, "method": "eth_subscribe", "params": ["droppedPendingTransactions"] } +``` - Example result: +Example result: - ```json - {"jsonrpc":"2.0","id":1,"result":"0x1"} - ``` +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` - Example notification: +Example notification: - ```json - { - "jsonrpc":"2.0", - "method":"eth_subscription", - "params":{ - "subscription":"0x1", - "result":"0xf57d6a90a7fb30880cfbdf6b432b487d0e94a3b55b34dc4b45e3b0b237ecab4c" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": "0xf57d6a90a7fb30880cfbdf6b432b487d0e94a3b55b34dc4b45e3b0b237ecab4c" + } +} +``` ### Synchronizing To notify you about synchronization progress, use the `syncing` parameter with `eth_subscribe`. -When behind the chain head, the synchronizing subscription returns an object indicating the -synchronization progress. When fully synchronized, returns `false`. +When behind the chain head, the synchronizing subscription returns an object indicating the synchronization progress. When fully synchronized, returns `false`. -!!!example +To subscribe to synchronizing notifications: - To subscribe to synchronizing notifications: +```json +{ "id": 1, "method": "eth_subscribe", "params": ["syncing"] } +``` - ```json - {"id": 1, "method": "eth_subscribe", "params": ["syncing"]} - ``` +Example result: - Example result: +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x4" } +``` - ```json - {"jsonrpc":"2.0","id":1,"result":"0x4"} - ``` +Example notification while synchronizing: - Example notification while synchronizing: - - ```json - { - "jsonrpc":"2.0", - "method":"eth_subscription", - "params":{ - "subscription":"0x4", - "result":{ - "startingBlock":"0x0", - "currentBlock":"0x3e80", - "highestBlock":"0x67b93c" - } - } - } - ``` - - Example notification when synchronized with chain head: - - ```json - { - "jsonrpc":"2.0", - "method":"eth_subscription", - "params":{ - "subscription":"0x4", - "result":false - } +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4", + "result": { + "startingBlock": "0x0", + "currentBlock": "0x3e80", + "highestBlock": "0x67b93c" } - ``` + } +} +``` + +Example notification when synchronized with chain head: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4", + "result": false + } +} +``` ## Unsubscribe -To cancel a subscription, use the [subscription ID](#subscription-id) with `eth_unsubscribe` or -`priv_unsubscribe`. Only the connection that created a subscription can unsubscribe from it. +To cancel a subscription, use the [subscription ID](#subscription-id) with `eth_unsubscribe` or `priv_unsubscribe`. Only the connection that created a subscription can unsubscribe from it. When cancelling a subscription for private logs, the privacy group ID must be specified. -`eth_unsubscribe` and `priv_unsubscribe` return `true` if subscription successfully unsubscribed; -otherwise, returns an error. - -!!!example +`eth_unsubscribe` and `priv_unsubscribe` return `true` if subscription successfully unsubscribed; otherwise, returns an error. - To unsubscribe from a subsciption with subscription ID of `0x1`: +To unsubscribe from a subscription with subscription ID of `0x1`: - ```json - {"id": 1, "method": "eth_unsubscribe", "params": ["0x1"]} - ``` +```json +{ "id": 1, "method": "eth_unsubscribe", "params": ["0x1"] } +``` - To unsubscribe from private logs subscription: +To unsubscribe from private logs subscription: - ```json - {"id": 1, "method": "priv_unsubscribe", "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=","0x2"]} - ``` +```json +{ + "id": 1, + "method": "priv_unsubscribe", + "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "0x2"] +} +``` - Example result: +Example result: - ```json - {"jsonrpc":"2.0","id":1,"result":true} - ``` +```json +{ "jsonrpc": "2.0", "id": 1, "result": true } +``` diff --git a/docs/public-networks/how-to/use-engine-api.md b/docs/public-networks/how-to/use-engine-api.md index 626e74bb85e..1155a51fe6a 100644 --- a/docs/public-networks/how-to/use-engine-api.md +++ b/docs/public-networks/how-to/use-engine-api.md @@ -1,74 +1,73 @@ --- -description: How to enable and use the Engine API +title: Use the Engine API +sidebar_position: 2 +description: Use the Engine API to communicate with a consensus client. +tags: + - public networks --- # Use the Engine API -[Consensus and execution clients](../concepts/the-merge.md#execution-and-consensus-clients) -communicate with each other using the [Engine API](../reference/engine-api/index.md). -These API methods are a separate subsection of the [JSON-RPC API](../how-to/use-besu-api/index.md). +[Consensus and execution clients](../concepts/the-merge.md#execution-and-consensus-clients) communicate with each other using the [Engine API](../reference/engine-api/index.md). These API methods are a separate subsection of the [JSON-RPC API](../how-to/use-besu-api/index.md). ## Configure the Engine API To configure the Engine API: - [Enable the Engine API](#enable-the-engine-api) (it's disabled by default). -- [Enable the JSON-RPC API](use-besu-api/index.md#enable-api-access). - Ensure the [`ETH` method is enabled](use-besu-api/json-rpc.md#api-methods-enabled-by-default) (it's enabled by default). +- [Enable the JSON-RPC API](use-besu-api/index.md#enable-api-access). Ensure the [`ETH` method is enabled](use-besu-api/json-rpc.md#api-methods-enabled-by-default) (it's enabled by default). - Specify the [service ports](#service-ports). - Specify the [host allowlist](#host-allowlist). -!!! example "Example Engine API configuration" - - ```bash - besu --engine-rpc-enabled --rpc-http-enabled --engine-rpc-port=8551 --engine-host-allowlist=localhost,127.0.0.1 --engine-jwt-secret=jwt.hex - ``` +```bash title="Example Engine API configuration" +besu --engine-rpc-enabled --rpc-http-enabled --engine-rpc-port=8551 --engine-host-allowlist=localhost,127.0.0.1 --engine-jwt-secret=jwt.hex +``` ### Enable the Engine API Enable the Engine API with the [`--engine-rpc-enabled`](../reference/cli/options.md#engine-rpc-enabled) CLI option. -!!! note +:::note + +The `--engine-rpc-enabled` CLI option enables the Engine API even if no consensus client configuration exists. - The `--engine-rpc-enabled` CLI option enables the Engine API even if no consensus client - configuration exists. +::: ### Service ports -To specify the port the Engine API service listens on for HTTP and WebSocket, use the -[`--engine-rpc-port`](../reference/cli/options.md#engine-rpc-port) option. -The default is `8551`. +To specify the port the Engine API service listens on for HTTP and WebSocket, use the [`--engine-rpc-port`](../reference/cli/options.md#engine-rpc-port) option. The default is `8551`. ### Host allowlist -To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL -requests. -Besu accepts requests only when hostnames specified using the -[`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) option matches the request host headers. -By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. +To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL requests. Besu accepts requests only when hostnames specified using the [`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) option matches the request host headers. By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. + +:::info -!!! important +This isn't a permissioning feature. To restrict access to the Engine API, we recommend using [authentication](#authentication). - This isn't a permissioning feature. - To restrict access to the Engine API, we recommend using [authentication](#authentication). +::: If your application publishes RPC ports, specify the hostnames when starting Besu. Specify `*` for `--engine-host-allowlist` to effectively disable host protection. -!!! caution +:::caution - We don't recommend specifying `*` for `--engine-host-allowlist` in production. +We don't recommend specifying `*` for `--engine-host-allowlist` in production. + +::: ## Authentication -By default, [authentication](../how-to/use-besu-api/authenticate.md) for the Engine API is enabled. -To disable, set the [`--engine-jwt-disabled`](../reference/cli/options.md#engine-jwt-disabled) option to `true`. +By default, [authentication](../how-to/use-besu-api/authenticate.md) for the Engine API is enabled. To disable, set the [`--engine-jwt-disabled`](../reference/cli/options.md#engine-jwt-disabled) option to `true`. + +:::caution + +Don't disable JWT authentication in production environments. -!!! warning +Disable only for testing purposes. - Don't disable JWT authentication in production environments. - Disable only for testing purposes. +::: Set the [JWT secret](use-besu-api/authenticate.md#jwt-public-key-authentication) by using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. @@ -78,136 +77,144 @@ Set the [JWT secret](use-besu-api/authenticate.md#jwt-public-key-authentication) Prepare to send a payload using [`engine_forkchoiceUpdatedV1`](../reference/engine-api/index.md#engine_forkchoiceupdatedv1). -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "safeBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "finalizedBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000"},{"timestamp": "0x5","prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000","suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"}],"id":67}' http://127.0.0.1:8550 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "safeBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "finalizedBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000"},{"timestamp": "0x5","prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000","suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"}],"id":67}' http://127.0.0.1:8550 +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "payloadStatus": { - "status": "VALID", - "latestValidHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", - "validationError": null - }, - "payloadId": "0x0000000021f32cc1" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } +} +``` + + ### 2. Get the payload Get the payload using [`engine_getPayloadV1`](../reference/engine-api/index.md#engine_getpayloadv1) -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x1"],"id":1}' http://127.0.0.1:8550 - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", - "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x1", - "gasLimit": "0x1c9c380", - "gasUsed": "0x0", - "timestamp": "0x5", - "extraData": "0x", - "baseFeePerGas": "0x7", - "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", - "transactions": [] - } - } - ``` + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x1"],"id":1}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +} +``` + + ### 3. Execute the payload Execute the payload using [`engine_newPayloadV1`](../reference/engine-api/index.md#engine_newpayloadv1) -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ - { - "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", - "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x1", - "gasLimit": "0x1c9c380", - "gasUsed": "0x0", - "timestamp": "0x5", - "extraData": "0x", - "baseFeePerGas": "0x7", - "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", - "transactions": [] - } - ],"id":67}' http://127.0.0.1:8550 - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "status": "VALID", - "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", - "validationError": null - } - } - ``` + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } +} +``` + + ### 4. Update the fork choice Update the fork choice using [`engine_forkchoiceUpdatedV1`](../reference/engine-api/index.md#engine_forkchoiceupdatedv1) again. -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "payloadStatus": { - "status": "VALID", - "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", - "validationError": null - }, - "payloadId": null - } - } - ``` + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": null + } +} +``` + + diff --git a/docs/public-networks/how-to/use-pow/_category_.json b/docs/public-networks/how-to/use-pow/_category_.json new file mode 100644 index 00000000000..1381dd9fc66 --- /dev/null +++ b/docs/public-networks/how-to/use-pow/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use proof of work", + "position": 10 +} diff --git a/docs/public-networks/how-to/use-pow/mining.md b/docs/public-networks/how-to/use-pow/mining.md index 8f2cfa4fee5..6dbd9b29f52 100644 --- a/docs/public-networks/how-to/use-pow/mining.md +++ b/docs/public-networks/how-to/use-pow/mining.md @@ -1,6 +1,9 @@ --- +title: Configure mining +sidebar_position: 1 description: Using Hyperledger Besu for PoW CPU mining tags: + - public networks - private networks --- @@ -8,18 +11,17 @@ tags: Hyperledger Besu supports CPU and GPU mining, which are configured using command line options. -GPU mining tests used [Ethminer](https://github.com/ethereum-mining/ethminer) with the -`stratum+tcp` and `getwork` schemes. +GPU mining tests used [Ethminer](https://github.com/ethereum-mining/ethminer) with the `stratum+tcp` and `getwork` schemes. -Ethminer has been used with Hyperledger Besu to mine blocks on the [Ropsten testnet](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine), -[ETC Mainnet (uncle block only)](https://etc.tokenview.com/en/uncleblock/10555173) and Mordor ETC testnet. +Ethminer has been used with Hyperledger Besu to mine blocks on the [Ropsten testnet](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine), [ETC Mainnet (uncle block only)](https://etc.tokenview.com/en/uncleblock/10555173) and Mordor ETC testnet. -!!! note "Notes" +:::note - - Some mining software supports the `getwork` scheme as the `http` scheme. +- Some mining software supports the `getwork` scheme as the `http` scheme. - - The Ropsten testnet is now deprecated. - It transitioned to proof of stake consensus before deprecation. +- The Ropsten testnet is now deprecated. It transitioned to proof of stake consensus before deprecation. + +::: ## Configure CPU mining @@ -29,16 +31,13 @@ To enable CPU mining, start Hyperledger Besu with the following options: besu --rpc-http-api=ETH,MINER --miner-enabled --miner-coinbase= ``` -Where `` is the account you pay mining rewards to. For example, -`fe3b557e8fb62b89f4916b721be55ceb828dbd73`. +Where `` is the account you pay mining rewards to. For example, `fe3b557e8fb62b89f4916b721be55ceb828dbd73`. -Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and -[`miner_stop`](../../reference/api/index.md#miner_stop) APIs. +Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and [`miner_stop`](../../reference/api/index.md#miner_stop) APIs. ## Configure GPU mining -Besu supports GPU mining, tested using [Ethminer](https://github.com/ethereum-mining/ethminer) with -the `stratum+tcp` scheme. +Besu supports GPU mining, tested using [Ethminer](https://github.com/ethereum-mining/ethminer) with the `stratum+tcp` scheme. To enable GPU mining, start Hyperledger Besu with the following options: @@ -46,55 +45,42 @@ To enable GPU mining, start Hyperledger Besu with the following options: besu --rpc-http-api=ETH,MINER --miner-enabled --miner-stratum-enabled --miner-coinbase= ``` -Where `` is the account you pay mining rewards to. For example, -`fe3b557e8fb62b89f4916b721be55ceb828dbd73`. +Where `` is the account you pay mining rewards to. For example, `fe3b557e8fb62b89f4916b721be55ceb828dbd73`. Optional command line options are: -* [`--miner-stratum-host`](../../reference/cli/options.md#miner-stratum-host) to specify the - host of the mining service. -* [`--miner-stratum-port`](../../reference/cli/options.md#miner-stratum-port) to specify the - port of the mining service. +- [`--miner-stratum-host`](../../reference/cli/options.md#miner-stratum-host) to specify the host of the mining service. +- [`--miner-stratum-port`](../../reference/cli/options.md#miner-stratum-port) to specify the port of the mining service. + +:::note -!!! note +Besu also supports the `getwork` scheme. Use the [`--miner-stratum-enabled`](../../reference/cli/options.md#miner-stratum-enabled) option and [enable the `ETH` RPCs](../../reference/cli/options.md#rpc-http-api). - Besu also supports the `getwork` scheme. Use the - [`--miner-stratum-enabled`](../../reference/cli/options.md#miner-stratum-enabled) option and - [enable the `ETH` RPCs](../../reference/cli/options.md#rpc-http-api). +The `getwork` scheme is supported as the `http` scheme in certain mining software. - The `getwork` scheme is supported as the `http` scheme in certain mining software. +::: -Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and -[`miner_stop`](../../reference/api/index.md#miner_stop) APIs. +Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and [`miner_stop`](../../reference/api/index.md#miner_stop) APIs. ## Mining APIs The JSON-RPC API methods for mining are: -* [`miner_start`](../../reference/api/index.md#miner_start) to start mining. -* [`miner_stop`](../../reference/api/index.md#miner_stop) to stop mining. -* [`eth_mining`](../../reference/api/index.md#eth_mining) to determine whether the client is - actively mining new blocks. -* [`eth_getMinerDataByBlockHash`](../../reference/api/index.md#eth_getminerdatabyblockhash) and -[`eth_getMinerDataByBlockNumber`](../../reference/api/index.md#eth_getminerdatabyblocknumber) to -get the miner data for a specified block. -* [`eth_hashrate`](../../reference/api/index.md#eth_hashrate) to get the number of hashes per - second with which the node is mining. Not supported for GPU mining. -* [`eth_getWork`](../../reference/api/index.md#eth_getwork) to get the hash of the current block, - the seed hash, and the target boundary condition. Only used when using the `getwork` - scheme. -* [`eth_submitWork`](../../reference/api/index.md#eth_submitwork) to submit the PoW solution. - Only used when using the `getwork` scheme. +- [`miner_start`](../../reference/api/index.md#miner_start) to start mining. +- [`miner_stop`](../../reference/api/index.md#miner_stop) to stop mining. +- [`eth_mining`](../../reference/api/index.md#eth_mining) to determine whether the client is actively mining new blocks. +- [`eth_getMinerDataByBlockHash`](../../reference/api/index.md#eth_getminerdatabyblockhash) and [`eth_getMinerDataByBlockNumber`](../../reference/api/index.md#eth_getminerdatabyblocknumber) to get the miner data for a specified block. +- [`eth_hashrate`](../../reference/api/index.md#eth_hashrate) to get the number of hashes per second with which the node is mining. Not supported for GPU mining. +- [`eth_getWork`](../../reference/api/index.md#eth_getwork) to get the hash of the current block, the seed hash, and the target boundary condition. Only used when using the `getwork` scheme. +- [`eth_submitWork`](../../reference/api/index.md#eth_submitwork) to submit the PoW solution. Only used when using the `getwork` scheme. ## Besu mined blocks -Besu has successfully mined blocks on the Ropsten testnet, ETC Mainnet (uncle block only) and Mordor ETC testnet. -Blocks mined by the Hyperledger Besu team contain the version number used in the block's `extraData` field. The following accounts -have been used to mine on public networks with Hyperledger Besu: +Besu has successfully mined blocks on the Ropsten testnet, ETC Mainnet (uncle block only) and Mordor ETC testnet. Blocks mined by the Hyperledger Besu team contain the version number used in the block's `extraData` field. The following accounts have been used to mine on public networks with Hyperledger Besu: -* **Ropsten**: [`0x2f14582947E292a2eCd20C430B46f2d27CFE213c`](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine) -* **ETC**: [`0x3125309aa670f5e60493b50884a7e7abf9ebb701`](https://etc.tokenview.com/en/address/0x3125309aa670f5e60493b50884a7e7abf9ebb701) -* **Mordor**: `0x2f14582947E292a2eCd20C430B46f2d27CFE213c` +- **Ropsten**: [`0x2f14582947E292a2eCd20C430B46f2d27CFE213c`](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine) +- **ETC**: [`0x3125309aa670f5e60493b50884a7e7abf9ebb701`](https://etc.tokenview.com/en/address/0x3125309aa670f5e60493b50884a7e7abf9ebb701) +- **Mordor**: `0x2f14582947E292a2eCd20C430B46f2d27CFE213c` ## Troubleshoot @@ -102,36 +88,24 @@ have been used to mine on public networks with Hyperledger Besu: On mining nodes, log messages indicate block creation. -!!! example - - ```bash - 2019-05-08 20:28:27.026+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=660, Round=0}, hash=0x759afaba4e923d89175d850ceca4b8ef81f7d9c727b0b0b8e714b624a4b8e8cc - 2019-05-08 20:28:29.020+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=661, Round=0}, hash=0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14 - ``` +```bash +2019-05-08 20:28:27.026+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=660, Round=0}, hash=0x759afaba4e923d89175d850ceca4b8ef81f7d9c727b0b0b8e714b624a4b8e8cc +2019-05-08 20:28:29.020+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=661, Round=0}, hash=0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14 +``` On non-mining nodes, log messages indicate importing blocks. -!!! example - - ```bash - 2019-05-08 20:28:29.026+10:00 | EthScheduler-Workers-1 | INFO | BlockPropagationManager | Imported #661 / 0 tx / 0 om / 0 (0.0%) gas / (0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14) in 0.000s. - 2019-05-08 20:28:31.031+10:00 | EthScheduler-Workers-0 | INFO | BlockPropagationManager | Imported #662 / 0 tx / 0 om / 0 (0.0%) gas / (0x0ead4e20123d3f1433d8dec894fcce386da4049819b24b309963ce7a8a0fcf03) in 0.000s. - ``` +```bash +2019-05-08 20:28:29.026+10:00 | EthScheduler-Workers-1 | INFO | BlockPropagationManager | Imported #661 / 0 tx / 0 om / 0 (0.0%) gas / (0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14) in 0.000s. +2019-05-08 20:28:31.031+10:00 | EthScheduler-Workers-0 | INFO | BlockPropagationManager | Imported #662 / 0 tx / 0 om / 0 (0.0%) gas / (0x0ead4e20123d3f1433d8dec894fcce386da4049819b24b309963ce7a8a0fcf03) in 0.000s. +``` -To confirm the block number is increasing, use the -[`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) JSON-RPC API method. +To confirm the block number is increasing, use the [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) JSON-RPC API method. -If there's no block creation in [Clique](../../../private-networks/how-to/configure/consensus/clique.md#extra-data) -or [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md#extra-data) networks, -ensure the validator addresses in the genesis file match running nodes. +If there's no block creation in [Clique](../../../private-networks/how-to/configure/consensus/clique.md#extra-data) or [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md#extra-data) networks, ensure the validator addresses in the genesis file match running nodes. ### No mined transactions -If you add a transaction to the [transaction pool](../../concepts/transactions/pool.md) and the -transaction hash returns, but the transaction is never mined, check the -[`--min-gas-price`](../../reference/cli/options.md#min-gas-price) option on mining nodes. -If the `gasPrice` on a [transaction](../send-transactions.md) is lower than the `min-gas-price` for -the mining node, the transaction will never mine. +If you add a transaction to the [transaction pool](../../concepts/transactions/pool.md) and the transaction hash returns, but the transaction is never mined, check the [`--min-gas-price`](../../reference/cli/options.md#min-gas-price) option on mining nodes. If the `gasPrice` on a [transaction](../send-transactions.md) is lower than the `min-gas-price` for the mining node, the transaction will never mine. -In [free gas networks](../../../private-networks/how-to/configure/free-gas.md), you must set -[`--min-gas-price`](../../reference/cli/options.md#min-gas-price) to zero. +In [free gas networks](../../../private-networks/how-to/configure/free-gas.md), you must set [`--min-gas-price`](../../reference/cli/options.md#min-gas-price) to zero. diff --git a/docs/public-networks/index.md b/docs/public-networks/index.md index b4a7abe1ed9..d16d273afd8 100644 --- a/docs/public-networks/index.md +++ b/docs/public-networks/index.md @@ -1,13 +1,15 @@ --- -# page icon, insider only, see https://squidfunk.github.io/mkdocs-material/reference/#setting-the-page-icon -icon: material/book-open-variant +title: Public networks +sidebar_position: 1 +sidebar_label: Introduction description: Public networks overview +tags: + - public networks --- # Hyperledger Besu for public networks -Besu serves as an [execution client](concepts/the-merge.md#execution-clients) on public -proof-of-stake Ethereum networks such as Ethereum Mainnet, Goerli, and Sepolia. +Besu serves as an [execution client](concepts/the-merge.md#execution-clients) on public proof-of-stake Ethereum networks such as Ethereum Mainnet, Goerli, and Sepolia. You can also run Besu using proof of work on [Ethereum Classic (ETC)](how-to/use-pow/mining.md). @@ -19,5 +21,5 @@ The following diagram outlines the high-level architecture of Besu for public ne ![Public architecture](../assets/images/public-architecture.jpeg) -If you have any questions about Besu for public networks, contact us on the -[Besu channel on Hyperledger Discord](https://discord.gg/hyperledger). +If you have any questions about Besu for public networks, ask on the **besu** channel on +[Hyperledger Discord](https://discord.gg/hyperledger). diff --git a/docs/public-networks/reference/_category_.json b/docs/public-networks/reference/_category_.json new file mode 100644 index 00000000000..1f988aef3d0 --- /dev/null +++ b/docs/public-networks/reference/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Reference", + "position": 6, + "link": { + "type": "generated-index", + "slug": "public-networks/reference" + } +} diff --git a/docs/public-networks/reference/api/index.md b/docs/public-networks/reference/api/index.md index 7b38f61ed23..852a6cc370f 100644 --- a/docs/public-networks/reference/api/index.md +++ b/docs/public-networks/reference/api/index.md @@ -1,208 +1,229 @@ --- +title: Besu API +sidebar_position: 2 description: Hyperledger Besu JSON-RPC API methods reference tags: + - public networks - private networks --- +import Postman from '../../../global/postman.md' + # Besu API methods -!!! attention +:::caution + +- This reference contains API methods that apply to both public and private networks. For private-network-specific API methods, see the [private network API reference](../../../private-networks/reference/api/index.md). +- All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If using the [--rpc-http-host](../cli/options.md#rpc-http-host) or [--rpc-http-port](../cli/options.md#rpc-http-port) options, update the endpoint. +- Most example requests are made against private networks. Depending on network configuration and activity, your example results might be different. - * This reference contains API methods that apply to both public and private networks. - For private-network-specific API methods, see the - [private network API reference](../../../private-networks/reference/api/index.md). - * All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If - using the [--rpc-http-host](../cli/options.md#rpc-http-host) or - [--rpc-http-port](../cli/options.md#rpc-http-port) options, update the endpoint. - * Most example requests are made against private networks. - Depending on network configuration and activity, your example results might be different. +::: ---8<-- "global/postman.md" + ## `ADMIN` methods The `ADMIN` API methods provide administrative functionality to manage your node. -!!! note +:::note - The `ADMIN` API methods are not enabled by default for JSON-RPC. To enable the `ADMIN` API - methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. +The `ADMIN` API methods are not enabled by default for JSON-RPC. To enable the `ADMIN` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: ### `admin_addPeer` Adds a [static node](../../how-to/connect/static-nodes.md). -!!! caution +:::caution + +If connections are timing out, ensure the node ID in the [enode URL](../../concepts/node-keys.md#enode-url) is correct. - If connections are timing out, ensure the node ID in the - [enode URL](../../concepts/node-keys.md#enode-url) is correct. +::: #### Parameters -`enode`: *string* - [enode URL](../../concepts/node-keys.md#enode-url) of peer to add +`enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of peer to add #### Returns -`result`: *boolean* - `true` if peer added or `false` if peer already a -[static node](../../how-to/connect/static-nodes.md) +`result`: _boolean_ - `true` if peer added or `false` if peer already a [static node](../../how-to/connect/static-nodes.md) -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + ### `admin_changeLogLevel` -Changes the log level without restarting Besu. You can change the log level for all logs, or you -can change the log level for specific packages or classes. +Changes the log level without restarting Besu. You can change the log level for all logs, or you can change the log level for specific packages or classes. You can specify only one log level per RPC call. #### Parameters -* `level`: *string* - [log level](../cli/options.md#logging) +- `level`: _string_ - [log level](../cli/options.md#logging) -* `log_filter`: *array* - (optional) packages or classes for which to change the log level +- `log_filter`: _array_ - (optional) packages or classes for which to change the log level #### Returns -`result`: *string* - `Success` if the log level has changed, otherwise `error` +`result`: _string_ - `Success` if the log level has changed, otherwise `error` -!!! example +The following example changes the debug level for specified classes to `DEBUG`. - The following example changes the debug level for specified classes to `DEBUG`. + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1} - ``` +```bash +{"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "Success" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` - The following example changes the debug level of all logs to `WARN`. + - === "curl HTTP request" +The following example changes the debug level of all logs to `WARN`. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_changeLogLevel","params":["WARN"], "id":1}' http://127.0.0.1:8545 - ``` + - === "wscat WS request" +# curl HTTP request - ```bash - {"jsonrpc":"2.0","method":"admin_changeLogLevel","params":["WARN"], "id":1} - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_changeLogLevel","params":["WARN"], "id":1}' http://127.0.0.1:8545 +``` - === "JSON result" +# wscat WS request - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "Success" - } - ``` +```json +{ + "jsonrpc": "2.0", + "method": "admin_changeLogLevel", + "params": ["WARN"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + ### `admin_generateLogBloomCache` -Generates cached log bloom indexes for blocks. APIs such as [`eth_getLogs`](#eth_getlogs) and -[`eth_getFilterLogs`](#eth_getfilterlogs) use the cache for improved performance. +Generates cached log bloom indexes for blocks. APIs such as [`eth_getLogs`](#eth_getlogs) and [`eth_getFilterLogs`](#eth_getfilterlogs) use the cache for improved performance. + +:::tip + +Manually executing `admin_generateLogBloomCache` is not required unless the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option is set to false. -!!! tip +::: - Manually executing `admin_generateLogBloomCache` is not required unless the - [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command - line option is set to false. +:::note -!!! note +Each index file contains 100000 blocks. The last fragment of blocks less than 100000 are not indexed. - Each index file contains 100000 blocks. The last fragment of blocks less than 100000 are not - indexed. +::: #### Parameters -* `startBlock`: *string* - block to start generating indexes +- `startBlock`: _string_ - block to start generating indexes -* `endBlock`: *string* - block to stop generating indexes +- `endBlock`: _string_ - block to stop generating indexes #### Returns -`result`: *object* - log bloom index details: +`result`: _object_ - log bloom index details: -* `startBlock`: *string* - starting block for the last requested cache generation +- `startBlock`: _string_ - starting block for the last requested cache generation -* `endBlock`: *string* - ending block for the last requested cache generation +- `endBlock`: _string_ - ending block for the last requested cache generation -* `currentBlock`: *string* - most recent block added to the cache +- `currentBlock`: _string_ - most recent block added to the cache -* `indexing`: *boolean* - indicates if indexing is in progress +- `indexing`: _boolean_ - indicates if indexing is in progress -* *boolean* - indicates acceptance of the request from this call to generate the cache +- _boolean_ - indicates acceptance of the request from this call to generate the cache -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{jsonrpc":"2.0","method":"admin_generateLogBloomCache", "params":["0x0", "0x10000"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{jsonrpc":"2.0","method":"admin_generateLogBloomCache", "params":["0x0", "0x10000"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"admin_generateLogBloomCache", "params":["0x0", "0x10000"], "id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "admin_generateLogBloomCache", + "params": ["0x0", "0x10000"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "startBlock": "0x0", - "endBlock": "0x10000", - "currentBlock": "0x0", - "indexing": true, - "requestAccepted": true - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "startBlock": "0x0", + "endBlock": "0x10000", + "currentBlock": "0x0", + "indexing": true, + "requestAccepted": true + } +} +``` + + ### `admin_logsRemoveCache` @@ -210,52 +231,54 @@ Removes cache files for the specified range of blocks. #### Parameters -* `fromBlock`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +- `fromBlock`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) -* `toBlock`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +- `toBlock`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) -You can skip a parameter by using an empty string, `""`. -If you specify: +You can skip a parameter by using an empty string, `""`. If you specify: -* No parameters, the call removes cache files for all blocks. +- No parameters, the call removes cache files for all blocks. -* Only `fromBlock`, the call removes cache files for the specified block. +- Only `fromBlock`, the call removes cache files for the specified block. -* Only `toBlock`, the call removes cache files from the genesis block to the specified block. +- Only `toBlock`, the call removes cache files from the genesis block to the specified block. #### Returns -`result`: *object* - `Cache Removed` status or `error`. +`result`: _object_ - `Cache Removed` status or `error`. -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRemoveCache","params":["1", "100"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRemoveCache","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"admin_logsRemoveCache","params":["1", "100"], "id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "admin_logsRemoveCache", + "params": ["1", "100"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "Status": "Cache Removed" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "Status": "Cache Removed" + } +} +``` + + ### `admin_logsRepairCache` @@ -263,42 +286,48 @@ Repairs cached logs by fixing all segments starting with the specified block num #### Parameters -`startBlock`: *string* - decimal index of the starting block to fix; defaults to the head block +`startBlock`: _string_ - decimal index of the starting block to fix; defaults to the head block #### Returns -`result`: *object* - status of the repair request; `Started` or `Already running` +`result`: _object_ - status of the repair request; `Started` or `Already running` -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRepairCache","params":["1200"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRepairCache","params":["1200"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"admin_logsRepairCache","params":["1200"], "id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "admin_logsRepairCache", + "params": ["1200"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "Status": "Started" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "Status": "Started" + } +} +``` + + ### `admin_nodeInfo` -Returns networking information about the node. The information includes general information about -the node and specific information from each running Ethereum sub-protocol (for example, `eth`). +Returns networking information about the node. The information includes general information about the node and specific information from each running Ethereum sub-protocol (for example, `eth`). #### Parameters @@ -306,82 +335,83 @@ None #### Returns -`result`: *object* - node object with the following fields: +`result`: _object_ - node object with the following fields: -* `enode`: *string* - [enode URL](../../concepts/node-keys.md#enode-url) of the node +- `enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of the node -* `listenAddr`: *string* - host and port for the node +- `listenAddr`: _string_ - host and port for the node -* `name`: *string* - client name +- `name`: _string_ - client name -* `id`: *string* - [node public key](../../concepts/node-keys.md#node-public-key) +- `id`: _string_ - [node public key](../../concepts/node-keys.md#node-public-key) -* `ports`: *object* - peer discovery and listening - [ports](../../how-to/connect/manage-peers.md#port-configuration) +- `ports`: _object_ - peer discovery and listening [ports](../../how-to/connect/manage-peers.md#port-configuration) -* `protocols`: *object* - list of objects containing information for each Ethereum sub-protocol +- `protocols`: _object_ - list of objects containing information for each Ethereum sub-protocol -!!! note +:::note - If the node is running locally, the host of the `enode` and `listenAddr` display as `[::]` in - the result. When advertising externally, the external address displayed for the `enode` and - `listenAddr` is defined by [`--nat-method`](../../how-to/connect/specify-nat.md). +If the node is running locally, the host of the `enode` and `listenAddr` display as `[::]` in the result. When advertising externally, the external address displayed for the `enode` and `listenAddr` is defined by [`--nat-method`](../../how-to/connect/specify-nat.md). -!!! example +::: - === "curl HTTP request" + - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' http://127.0.0.1:8545 - ``` +# curl HTTP request - === "wscat WS request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' http://127.0.0.1:8545 +``` - ```bash - {"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1} - ``` +# wscat WS request - === "JSON result" +```bash +{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "enode": "enode://87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3@[::]:30303", - "listenAddr": "[::]:30303", - "name": "besu/v1.0.1-dev-0d2294a5/osx-x86_64/oracle-java-1.8", - "id": "87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3", - "ports": { - "discovery": 30303, - "listener": 30303 - }, - "protocols": { - "eth": { - "config": { - "chainId": 2018, - "homesteadBlock": 0, - "daoForkBlock": 0, - "daoForkSupport": true, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "constantinopleFixBlock": 0, - "ethash": { - "fixeddifficulty": 100 - } - }, - "difficulty": 78536, - "genesis": "0x43ee12d45470e57c86a0dfe008a5b847af9e372d05e8ba8f01434526eb2bea0f", - "head": "0xc6677651f16d07ae59cab3a5e1f0b814ed2ec27c00a93297b2aa2e29707844d9", - "network": 2018 - } - } +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enode": "enode://87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3@[::]:30303", + "listenAddr": "[::]:30303", + "name": "besu/v1.0.1-dev-0d2294a5/osx-x86_64/oracle-java-1.8", + "id": "87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3", + "ports": { + "discovery": 30303, + "listener": 30303 + }, + "protocols": { + "eth": { + "config": { + "chainId": 2018, + "homesteadBlock": 0, + "daoForkBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "constantinopleFixBlock": 0, + "ethash": { + "fixeddifficulty": 100 } - } - ``` + }, + "difficulty": 78536, + "genesis": "0x43ee12d45470e57c86a0dfe008a5b847af9e372d05e8ba8f01434526eb2bea0f", + "head": "0xc6677651f16d07ae59cab3a5e1f0b814ed2ec27c00a93297b2aa2e29707844d9", + "network": 2018 + } + } + } +} +``` + + ### `admin_peers` @@ -393,77 +423,69 @@ None #### Returns -`result`: *array* of *objects* - list of objects returned for each remote node, with the following fields. +`result`: _array_ of _objects_ - list of objects returned for each remote node, with the following fields. -* `version`: *string* - P2P protocol version +- `version`: _string_ - P2P protocol version -* `name`: *string* - client name +- `name`: _string_ - client name -* `caps`: *array* of *strings* - list of Ethereum sub-protocol capabilities +- `caps`: _array_ of _strings_ - list of Ethereum sub-protocol capabilities -* `network`: *object* - local and remote addresses established at time of bonding with the peer (the remote - address might not match the hex value for `port`; it depends on which node - initiated the connection.) +- `network`: _object_ - local and remote addresses established at time of bonding with the peer (the remote address might not match the hex value for `port`; it depends on which node initiated the connection.) -* `port`: *string* - port on the remote node on which P2P discovery is listening +- `port`: _string_ - port on the remote node on which P2P discovery is listening -* `id`: *string* - node public key (excluding the `0x` prefix, the node public key is the ID in the - [enode URL](../../concepts/node-keys.md#enode-url) `enode://@:`.) +- `id`: _string_ - node public key (excluding the `0x` prefix, the node public key is the ID in the [enode URL](../../concepts/node-keys.md#enode-url) `enode://@:`.) -* `protocols`: *object* - [current state of peer](../../how-to/connect/manage-peers.md#monitor-peer-connections) - including `difficulty` and `head` (`head` is the hash of the highest known block for the peer.) +- `protocols`: _object_ - [current state of peer](../../how-to/connect/manage-peers.md#monitor-peer-connections) including `difficulty` and `head` (`head` is the hash of the highest known block for the peer.) -* `enode`: *string* - enode URL of the remote node +- `enode`: _string_ - enode URL of the remote node -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "version": "0x5", - "name": "besu/v20.10.4-dev-0905d1b2/osx-x86_64/adoptopenjdk-java-11", - "caps": [ - "eth/62", - "eth/63", - "eth/64", - "eth/65", - "IBF/1" - ], - "network": { - "localAddress": "192.168.1.229:50115", - "remoteAddress": "168.61.153.255:40303" - }, - "port": "0x765f", - "id": "0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc", - "protocols": { - "eth": { - "difficulty": "0x1ac", - "head": "0x964090ae9277aef43f47f1b8c28411f162243d523118605f0b1231dbfdf3611a", - "version": 65 - } - }, - "enode": "enode://e143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc@127.0.0.1:30303" - } - ] +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "version": "0x5", + "name": "besu/v20.10.4-dev-0905d1b2/osx-x86_64/adoptopenjdk-java-11", + "caps": ["eth/62", "eth/63", "eth/64", "eth/65", "IBF/1"], + "network": { + "localAddress": "192.168.1.229:50115", + "remoteAddress": "168.61.153.255:40303" + }, + "port": "0x765f", + "id": "0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc", + "protocols": { + "eth": { + "difficulty": "0x1ac", + "head": "0x964090ae9277aef43f47f1b8c28411f162243d523118605f0b1231dbfdf3611a", + "version": 65 } - ``` + }, + "enode": "enode://e143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc@127.0.0.1:30303" + } + ] +} +``` + + ### `admin_removePeer` @@ -471,51 +493,47 @@ Removes a [static node](../../how-to/connect/static-nodes.md). #### Parameters -`enode`: *string* - [enode URL](../../concepts/node-keys.md#enode-url) of peer to remove +`enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of peer to remove #### Returns -`result`: *boolean* - `true` if peer removed or `false` if peer not a -[static node](../../how-to/connect/static-nodes.md) +`result`: _boolean_ - `true` if peer removed or `false` if peer not a [static node](../../how-to/connect/static-nodes.md) -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + ## `DEBUG` methods -The `DEBUG` API methods allow you to inspect and debug the network. -The `DEBUG` API is a more verbose alternative to the [`TRACE` API](#trace-methods), and its main purpose is -compatibility with tools such as [Remix](https://remix.ethereum.org/). -Where these APIs overlap, we recommend using the [`TRACE` API](#trace-methods) for production use over the -`DEBUG` API. Specifically, we recommend `trace_block` over `debug_traceBlock`, and `trace_transaction` over -`debug_traceTransaction`. +The `DEBUG` API methods allow you to inspect and debug the network. The `DEBUG` API is a more verbose alternative to the [`TRACE` API](#trace-methods), and its main purpose is compatibility with tools such as [Remix](https://remix.ethereum.org/). Where these APIs overlap, we recommend using the [`TRACE` API](#trace-methods) for production use over the `DEBUG` API. Specifically, we recommend `trace_block` over `debug_traceBlock`, and `trace_transaction` over `debug_traceTransaction`. + +:::note -!!! note +The `DEBUG` API methods are not enabled by default for JSON-RPC. To enable the `DEBUG` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. - The `DEBUG` API methods are not enabled by default for JSON-RPC. To enable the `DEBUG` API - methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. +::: ### `debug_accountAt` @@ -523,210 +541,238 @@ Returns account information at the specified index of the specified block. #### Parameters -* `blockHashOrNumber`: *string* - block hash or number at which to retrieve account information +- `blockHashOrNumber`: _string_ - block hash or number at which to retrieve account information -* `txIndex`: *number* - transaction index at which to retrieve account information +- `txIndex`: _number_ - transaction index at which to retrieve account information -* `address`: *string* - contract or account address for which to retrieve information +- `address`: _string_ - contract or account address for which to retrieve information #### Returns -`result`: *object* - account details object with the following fields: +`result`: _object_ - account details object with the following fields: -* `code`: *data* - code for the account. Displays `0x0` if the address is an externally owned account. +- `code`: _data_ - code for the account. Displays `0x0` if the address is an externally owned account. -* `nonce`: *quantity* - number of transactions made by the account before this one +- `nonce`: _quantity_ - number of transactions made by the account before this one -* `balance`: *quantity* - balance of the account in Wei +- `balance`: _quantity_ - balance of the account in Wei -* `codehash`: *data* - code hash for the account +- `codehash`: _data_ - code hash for the account -!!! example +This example uses an externally owned account address for the `address` parameter. - This example uses an externally owned account address for the `address` parameter. + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", 0, "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", 0, "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_accountAt","params":["0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", 0, "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountAt", + "params": [ + "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", + 0, + "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b" + ], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "code": "0x0", - "nonce": "0x5", - "balance": "0xad78ebc5ac6200000", - "codehash" : "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "code": "0x0", + "nonce": "0x5", + "balance": "0xad78ebc5ac6200000", + "codehash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + } +} +``` - This example uses a contract address for the `address` parameter. + - === "curl HTTP request" +This example uses a contract address for the `address` parameter. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", 0, "0x0e0d2c8f7794e82164f11798276a188147fbd415"],"id":1}' http://127.0.0.1:8545 - ``` + - === "wscat WS request" +# curl HTTP request - ```bash - {"jsonrpc":"2.0","method":"debug_accountAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", 0, "0x0e0d2c8f7794e82164f11798276a188147fbd415"],"id":1} - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", 0, "0x0e0d2c8f7794e82164f11798276a188147fbd415"],"id":1}' http://127.0.0.1:8545 +``` - === "JSON result" +# wscat WS request - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "code": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b27b880414610030575b600080fd5b61004a60048036038101906100459190610108565b61004c565b005b60606000806000604051935036600085376000803686885af490503d9150816000853e806000811461007d57610093565b60008311156100925761012085019350836040525b5b5060008114156100ec578473ffffffffffffffffffffffffffffffffffffffff167f410d96db3f80b0f89b36888c4d8a94004268f8d42309ac39b7bcba706293e099856040516100e3919061016e565b60405180910390a25b5050505050565b60008135905061010281610227565b92915050565b60006020828403121561011e5761011d610211565b5b600061012c848285016100f3565b91505092915050565b600061014082610190565b61014a818561019b565b935061015a8185602086016101de565b61016381610216565b840191505092915050565b600060208201905081810360008301526101888184610135565b905092915050565b600081519050919050565b600082825260208201905092915050565b60006101b7826101be565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156101fc5780820151818401526020810190506101e1565b8381111561020b576000848401525b50505050565b600080fd5b6000601f19601f8301169050919050565b610230816101ac565b811461023b57600080fd5b5056fea2646970667358221220fdfb5c371055342507b8fb9ca7b0c234f79819bd5cb05c0d467fb605de979eb564736f6c63430008060033", - "nonce": "0x1", - "balance": "0x0", - "codehash" : "0xf5f334d41776ed2828fc910d488a05c57fe7c2352aab2d16e30539d7726e1562" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountAt", + "params": [ + "0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", + 0, + "0x0e0d2c8f7794e82164f11798276a188147fbd415" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "code": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b27b880414610030575b600080fd5b61004a60048036038101906100459190610108565b61004c565b005b60606000806000604051935036600085376000803686885af490503d9150816000853e806000811461007d57610093565b60008311156100925761012085019350836040525b5b5060008114156100ec578473ffffffffffffffffffffffffffffffffffffffff167f410d96db3f80b0f89b36888c4d8a94004268f8d42309ac39b7bcba706293e099856040516100e3919061016e565b60405180910390a25b5050505050565b60008135905061010281610227565b92915050565b60006020828403121561011e5761011d610211565b5b600061012c848285016100f3565b91505092915050565b600061014082610190565b61014a818561019b565b935061015a8185602086016101de565b61016381610216565b840191505092915050565b600060208201905081810360008301526101888184610135565b905092915050565b600081519050919050565b600082825260208201905092915050565b60006101b7826101be565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156101fc5780820151818401526020810190506101e1565b8381111561020b576000848401525b50505050565b600080fd5b6000601f19601f8301169050919050565b610230816101ac565b811461023b57600080fd5b5056fea2646970667358221220fdfb5c371055342507b8fb9ca7b0c234f79819bd5cb05c0d467fb605de979eb564736f6c63430008060033", + "nonce": "0x1", + "balance": "0x0", + "codehash": "0xf5f334d41776ed2828fc910d488a05c57fe7c2352aab2d16e30539d7726e1562" + } +} +``` + + ### `debug_accountRange` -[Retesteth](https://github.com/ethereum/retesteth/wiki/Retesteth-Overview) uses -`debug_accountRange` to implement debugging. +[Retesteth](https://github.com/ethereum/retesteth/wiki/Retesteth-Overview) uses `debug_accountRange` to implement debugging. Returns the accounts for a specified block. #### Parameters -* `blockHashOrNumber`: *string* - block hash or number at which to retrieve account information +- `blockHashOrNumber`: _string_ - block hash or number at which to retrieve account information -* `txIndex`: *number* - transaction index at which to retrieve account information +- `txIndex`: _number_ - transaction index at which to retrieve account information -* `address`: *string* - address hash from which to start +- `address`: _string_ - address hash from which to start -* `limit`: *integer* - maximum number of account entries to return +- `limit`: _integer_ - maximum number of account entries to return #### Returns -`result`: *object* - account details object with the following fields: +`result`: _object_ - account details object with the following fields: -* `addressMap`: *map* of *strings* to *strings* - map of address hashes and account addresses +- `addressMap`: _map_ of _strings_ to _strings_ - map of address hashes and account addresses -* `nextKey`: *string* - hash of the next address if any addresses remain in the state, otherwise - zero +- `nextKey`: _string_ - hash of the next address if any addresses remain in the state, otherwise zero -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountRange","params":["12345", 0, "0", 5],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountRange","params":["12345", 0, "0", 5],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_accountRange","params":["12345", 0, "0", 5],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountRange", + "params": ["12345", 0, "0", 5], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "addressMap": { - "0x005e5...86960": "0x0000000000000000000000000000000000000000", - "0x021fe...6ffe3": "0x0000000000000000000000000000000000000000", - "0x028e6...ab776": "0x0000000000000000000000000000000000000000", - "0x02cb5...bc4d8": "0x0000000000000000000000000000000000000000", - "0x03089...23fd5": "0x0000000000000000000000000000000000000000" - }, - "nextKey": "0x04242954a5cb9748d3f66bcd4583fd3830287aa585bebd9dd06fa6625976be49" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "addressMap": { + "0x005e5...86960": "0x0000000000000000000000000000000000000000", + "0x021fe...6ffe3": "0x0000000000000000000000000000000000000000", + "0x028e6...ab776": "0x0000000000000000000000000000000000000000", + "0x02cb5...bc4d8": "0x0000000000000000000000000000000000000000", + "0x03089...23fd5": "0x0000000000000000000000000000000000000000" + }, + "nextKey": "0x04242954a5cb9748d3f66bcd4583fd3830287aa585bebd9dd06fa6625976be49" + } +} +``` + + ### `debug_batchSendRawTransaction` -Sends a list of [signed transactions](../../how-to/send-transactions.md). -This is used to quickly load a network with a lot of transactions. -This does the same thing as calling [`eth_sendRawTransaction`](#eth_sendrawtransaction) multiple times. +Sends a list of [signed transactions](../../how-to/send-transactions.md). This is used to quickly load a network with a lot of transactions. This does the same thing as calling [`eth_sendRawTransaction`](#eth_sendrawtransaction) multiple times. #### Parameters -`data`: *string* - signed transaction data array +`data`: _string_ - signed transaction data array #### Returns -`result`: *array* of *objects* - object returned for each transaction, with the following fields: +`result`: _array_ of _objects_ - object returned for each transaction, with the following fields: -* `index`: *string* - index of the transaction in the request parameters array +- `index`: _string_ - index of the transaction in the request parameters array -* `success`: *boolean* - indicates whether or not the transaction has been added to the transaction pool +- `success`: _boolean_ - indicates whether or not the transaction has been added to the transaction pool -* `errorMessage`: *string* - (optional) error message +- `errorMessage`: _string_ - (optional) error message -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "index": 0, - "success": true - }, - { - "index": 1, - "success": false, - "errorMessage": "Invalid raw transaction hex" - }, - { - "index": 2, - "success": true - }, - { - "index": 3, - "success": false, - "errorMessage": "TRANSACTION_REPLACEMENT_UNDERPRICED" - } - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "index": 0, + "success": true + }, + { + "index": 1, + "success": false, + "errorMessage": "Invalid raw transaction hex" + }, + { + "index": 2, + "success": true + }, + { + "index": 3, + "success": false, + "errorMessage": "TRANSACTION_REPLACEMENT_UNDERPRICED" + } + ] +} +``` + + ### `debug_getBadBlocks` -Returns a list of invalid blocks. -This is used to detect and analyze consensus flaws. +Returns a list of invalid blocks. This is used to detect and analyze consensus flaws. #### Parameters @@ -734,211 +780,215 @@ None #### Returns -`result`: *array* of *objects* - list of [block objects](objects.md#block-object) - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1} - ``` - - === "JSON result" +`result`: _array_ of _objects_ - list of [block objects](objects.md#block-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "block": { + "number": "0xd", + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x02c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41", + "stateRoot": "0x861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5", + "receiptsRoot": "0xccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x1", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a488", + "timestamp": "0x5f5b6824", + "uncles": [], + "transactions": [ + { + "blockHash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "blockNumber": "0xd", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a49e", + "gasPrice": "0x3e8", + "hash": "0xdd8cf045113754c306ba9ac8ac8786235e33bc5c087678084ef260a2a583f127", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0xa7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7", + "s": "0x130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fca" + } + ] + }, + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "rlp": "0xf9039df9025ca0544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5a002c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41a0ccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d86ffffffffffff8301a488845f5b6824b86100000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a49e8080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da0a7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7a0130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fcac0" + }, + { + "block": { + "number": "0x8", + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x98ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x8ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486", + "stateRoot": "0x140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3bac", + "receiptsRoot": "0x2b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x2", + "totalDifficulty": "0x2", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a4c9", + "timestamp": "0x5f5b6b80", + "uncles": [], + "transactions": [ + { + "blockHash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "blockNumber": "0x8", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a4c9", + "gasPrice": "0x3e8", + "hash": "0x675e336a4281b29c619dfd4ccfbd2f930f3728b20caf9e0067284aa3224e6758", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0x2e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4", + "s": "0x50e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0" + } + ] + }, + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "rlp": "0xf9039df9025ca098ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3baca08ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486a02b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020886ffffffffffff8301a4c9845f5b6b80b86100000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a4c98080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da002e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4a050e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0c0" + } + ] +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "block": { - "number": "0xd", - "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31", - "nonce": "0x0000000000000000", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "transactionsRoot": "0x02c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41", - "stateRoot": "0x861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5", - "receiptsRoot": "0xccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7", - "miner": "0x0000000000000000000000000000000000000000", - "difficulty": "0x1", - "totalDifficulty": "0x1", - "extraData": "0x00000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01", - "size": "0x3a0", - "gasLimit": "0xffffffffffff", - "gasUsed": "0x1a488", - "timestamp": "0x5f5b6824", - "uncles": [], - "transactions": [ - { - "blockHash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", - "blockNumber": "0xd", - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0x1a49e", - "gasPrice": "0x3e8", - "hash": "0xdd8cf045113754c306ba9ac8ac8786235e33bc5c087678084ef260a2a583f127", - "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", - "nonce": "0x0", - "to": null, - "transactionIndex": "0x0", - "value": "0x0", - "v": "0xf9d", - "r": "0xa7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7", - "s": "0x130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fca" - } - ] - }, - "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", - "rlp": "0xf9039df9025ca0544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5a002c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41a0ccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d86ffffffffffff8301a488845f5b6824b86100000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a49e8080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da0a7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7a0130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fcac0" - }, - { - "block": { - "number": "0x8", - "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x98ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207", - "nonce": "0x0000000000000000", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "transactionsRoot": "0x8ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486", - "stateRoot": "0x140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3bac", - "receiptsRoot": "0x2b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3", - "miner": "0x0000000000000000000000000000000000000000", - "difficulty": "0x2", - "totalDifficulty": "0x2", - "extraData": "0x00000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701", - "size": "0x3a0", - "gasLimit": "0xffffffffffff", - "gasUsed": "0x1a4c9", - "timestamp": "0x5f5b6b80", - "uncles": [], - "transactions": [ - { - "blockHash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", - "blockNumber": "0x8", - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0x1a4c9", - "gasPrice": "0x3e8", - "hash": "0x675e336a4281b29c619dfd4ccfbd2f930f3728b20caf9e0067284aa3224e6758", - "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", - "nonce": "0x0", - "to": null, - "transactionIndex": "0x0", - "value": "0x0", - "v": "0xf9d", - "r": "0x2e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4", - "s": "0x50e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0" - } - ] - }, - "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", - "rlp": "0xf9039df9025ca098ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3baca08ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486a02b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020886ffffffffffff8301a4c9845f5b6b80b86100000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a4c98080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da002e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4a050e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0c0" - } - ] - } - ``` + ### `debug_getRawBlock` -Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) -of the specified block. +Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) of the specified block. #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *object* - RLP-encoded [block object](objects.md#block-object) +`result`: _object_ - RLP-encoded [block object](objects.md#block-object) -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0xf96096f90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9bf95c56f8ac82d51f8502540be4008303c9e294a68d4c1e3de1b721ad1356bbf827d6bc8cef304f80b844b1bb4d351300dbc7e12342566318001b83aefc9f20080000f3ef25472407fe9c9c69a1470000000242692bb4cd506c409651ab80eb3acfa54551d3dbc9af4493605d79871ba01e474fb147b16b9538d7a59a57738e406158d9cc306a9062b1b7a9f544c35abfa061aabb714c760f2243a16a024811679d402c8822e8b25dfd0038d84298fb5205b87502f87283aa36a754849502f900849502f9108302222794102554afa6b5dbccc86176faef2b2d854201756e8084e2bc7b43c001a04f2398f24bc950db1f5439de3cf6431ea277236595ae8dc5815c0cc671c9f97ca029898786a59c56f086fc0f7a16859f366cf46084add999fe137cbf43693712e8b87c02f87983aa36a7830293748459682f00850165a0bc008255f094fafb56bb5b37c3b0b0ee9d7c31f018aac91dfb778806f05b59d3b2000080c080a0b069dd8967533a773e592c26b1b36df0793d0b9f6eceba34da246f602c2fae58a002009dab32ab63a25b705d9a00e311f7cd5d85e73f9b2c03ffd0e5135c0bb2c6b89502f89283aa36a7018459682f008459682f0983011fec945b9fedd37f0b92e7e282b19cebcf06f57b77c60480a46a62784200000000000000000000000019a1fcc6fcc5832cd2db7704d75efbc800f5a742c001a0c65eb0e48090a8f8830de47f430b9ad11071a62a5db9555619a990d7e9b81738a05a6e826610a5b2ee529a22942ebcd3abd2a8a10228098c8158380e8fcceb962fb9028002f9027c83aa36a7178459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e17852000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f16827000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a004f8666c8e5d0f3c7110994f624d24aa47a1327814289698c3e2777284a5cfdca04ff05f1b8c5beb58972d40e5a7b894d5e28ad2f15a3429c7d2bee6b6a9633730b9019f02f9019b83aa36a70b8459682f008459682f098303644f944284890d4acd0bcb017ece481b96fd4cb457cac88715c0f4db6e0ea0b90124ee1490b20000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d40000000000000000000000001e8c104d068f22d351859cdbfe41a697a98e6ea20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000222e00000000000000000000000000000000000000000000000000015c0f4db6e0ea00000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d400000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000c080a0e5270f6291acc162885656bedf64fbcb904c41951221dc0cbbbdca03bb33ce43a01f08c7ed3c231403b55f37a157d80e121b653baa810add8c02aea722631450dcb87c02f87983aa36a7830293758459682f00850165a0bc008255f0948d247f4fbbe81429d3d164a5c9ae0063210edbdc8806f05b59d3b2000080c080a0bb83dd6181c9a7ae3069af3bdf1820b5e556eaf99e385b8d7b3571321fb2966ba02ac193773704524adcd02824796df83407a42cdd81e786b591eba43c4ffc6c40b9028002f9027c83aa36a7048459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e178520000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac6790000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c00000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac679000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c001a0fc882968005f717a74a2c2fb345f691091cab084f4bd3934358741807bd5a66ea03f81c68d05d06bf851a6ef5ea6874557a221cbadde24f3fa51f777699b5d2804b8d802f8d583aa36a7822c0b8459682f008459682f098303534f943367dfa11e3148a07c2da773e1f65b155b0abe5680b864ad58bdd100000000000000000000000053844f9577c2334e541aec7df7174ece5df1fcf0000000000000000000000000e9e12c660e77a732940bab3c2cf385c843b834b800000000000000000000000000000000000000000006015d637c177581800000c001a0a292e7723d3c950aa8a557bd91dece34ec527d9efe2cc413d582dcd9fc6bf6eba03386ce6f58e862f329946bf32897f7df5d1c8f818fecfafc1223052fb251d97eb8b602f8b383aa36a7138459682f008459682f09832dc6c094ba175fdab00e7fcf603f43be8f68db7f4de9f3a980b844095ea7b300000000000000000000000084a0cc1ab353da6b7817947f7b116b8ea982c3d20000000000000000000000000000000000000000000000068f365aea1e440000c001a0968ed0274829918071d9cef28e1adbf1fd15ec76e5a4f809971e887b4c9f34b6a001ce26485bc7e3ea71fb99866bd43002b264b2ed80e10850203c2f07b78856bdb87c02f87983aa36a7830293768459682f00850165a0bc008255f0946d3b93db4e4078cf6541a68532d00705d9a4da618806f05b59d3b2000080c080a083c831630788e7ee57c87128d18582e29aa51f1f233e91d916c06d0750578156a0549b5a00477f3fb4d8fbf95ba3a636c3a14ff011c1bbf3a717e00d61735cbf34b87c02f87983aa36a7830293778459682f00850165a0bc008255f0940d3a7d69859a0dd6971d39703b15379e05ae2ec48806f05b59d3b2000080c001a0082660b5db2d3a8a58c0b863673ab27f7cfe4c049dcc52c76a00ab45b0358db5a05a7519a2d399cb534480383ac21262fbde2dd85241495d7832dee8bb02c49c87b87c02f87983aa36a7830293788459682f00850165a0bc008255f0941be13f64a2463fc7a76b4092c53328cc965a77fb8806f05b59d3b2000080c001a0e6ee9b85c3b729518524fdaeb25d47f89f6fc6c4d2c4df707187bef74d73f958a0756bbf4ab119805b77466957b5895c1d5bf422c5f65d8a06f7efd37dcb2c87afb87c02f87983aa36a7830293798459682f00850165a0bc008255f094a90b28fd6f8e46ac668fcb688414184a163e2cd28806f05b59d3b2000080c080a0d394dd43c58591e5dda8a7f3a2f4eae1bfd65655b9e9eec5facc6dcb39aa77baa002eeabf3fe9c0a56eae476d2f6452ea72e63a9c9b1180290b792883258f939f5b8f802f8f583aa36a7830283818459682f008459682f1082962494d0f723c6b2226df56fe41e63b9eaa66eb540bcb880b884abac047b000000000000000000000000000000000000000000000000000000000103e9f0f3471dc445d8f209ef546e0d20eaccc12ed0a5b4100007f57d9bc8638dacaf6480000000000000000000000000000000000000000000000000000000001d209b1ea11d77d1ab457eb3e2954cb2b98e77b5b07e2a4f48507af0adc61329ddc210c001a0efa10ab60f3bd1e7c4a8d52a275a568fbe2f5edc9e1eaf386299577ff9ddbd6ba06e62cf2f66b58f655ddd3eae47ce40408445b086f6ea858edb7bd847ee206207f86f82e6e582014482f618949ebf6b12e7e33b8672788e7b2b3330356f6f2c41880de0b6b3a7640000808401546d72a008d6be7aa21be0a43e08e960620f4c40c44010a743ead9919ef9423863c08b12a06a63a7caae4504ee5528e50387ca09974f7124035328a62d1085da2fee6618f9f86f82e1c382014482f618949c68eb31c4d00b94c3e3d4c2887946f8b076b24c880de0b6b3a7640000808401546d72a0c22d48d72c70ccf0a44d0950daf16741838f9333ee0bc5e05ff02b058da1e010a06a20c9f74cbc14c0d5bf3b3c38d3c33a5ace9194cddc2c533afb16459eaa7647f86f82e4cb82014482f61894d531e7aa3c0bee832aaff22642c7a3128d48a81a880de0b6b3a7640000808401546d72a01dbaeffc8e11964c06a722bae73e35bb5de55b8f959592868f2ff5fc13b69bd3a002acadc04665570a2032cdb616de15bdca79127f21302d62db5baf96ae4734e6f86e830176e381d882520894ad346e81c5b26fe563ab1ba2aa4ff811655882ca872386f26fc10000808401546d72a0b6de11598824e338100d5ebe70c0b0f4d6893fbb36f11ad55cf74b2f43afc5dda05101e65e7e84ea9edba6e5bf1a1e07028ae3fa5213240e812e57cf6b29080726b9235302f9234f83aa36a7830137d564748315f52194ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5000000000000000000000000000077770000000000000000000000000000000191c15235c348207e935e72b9151056a9661d73631d1e2c3f89ffddf8e74efe8a42ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000030ef2c000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000ec15abee257256da1a964434000f59ddd45b1ce67d5df44f1c82fd5bfe95c3b31dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000777700000000000000000000000000000001d4b5b35d93f51c8143f6a4cc3d7b320d37ce03989cd88c28601f4ea94cd6554249cff83e4dd8e99a8ef9004b2ac7518996f4784af1f9e52debb6223a697e9652530feda219f333e01f8cd0b31ee83b9c250ee51fde9718ef5fa305cbcd01901200200100002020000400000280000006004000c0020000000000000000000100000000029000000000000000090000000000008000200040000012004020000800000000240002400008000800000020000000001040000000000040824000000000000002040000400000002000080000000000000804000000001001000c84000208000000000180020000014000000000210100510008000082c0000000001200002000000024000008400000000220001800400000008010000052000200000200028000000000800000040200000110000010000010000001020000210004100002000000000900280000010008001000000018004000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc0000000000000000000000000000000000000000000000000000000000034bfbc00000000000000000000000000000000000000000000000000000000002ddb24000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000002e042ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b2a7122720155935f15da0807d0054f1a4c3db2a92ec4124bf590ce7a16594f3f1812f260acb049d01ad534a937840a80c0f56fd9a54ca5a8628ed896d14a5f8b2570f5813e35c990656f6300a1a1849429135ada6337646248f6ea03a7f70ac426c1d805216d154ea5a8e5ff953bc04b71b049b4b5bd549b6b0cfa7f8b21dba72a3805c7093d8589f2d4c55b6211441041e8bd7916daed5093fcebd377c31e810a6499e6e26840e3afadc9b339c6abc86b7f89fc3559f4242d373a71389db20219195f6e13069701f6d539dcf63a049726cdd8cadc412d1c43cf3fc0095ae5e2157dc668bdb924d7d7afc2b4632ab8a0e4ef71941a0a6a65645f6cd8570302f90b98bbdd01be238dc07780ee9b93e22ab87f26170d7fc5531347fb9fadcb65dc2ca20442a70be9e785292d533fa9496308a7b1588b50b45c17ea765de525259f036edd3984782399b46793acd5abb9f49e38b309c2363aead57264ac1a44e6432b81127a0bfdc29f01bd04e7db2b2545ed8426d2fe9b3e561793ec8fc875f2a71f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f11fcba848e01c60438611958101321898e95c8fdc936d31389bdba8073b382e5b1e2cd25993ad31586d7525f165fb25a1cf8c22623f983c025d21f0e52ecfec5f0232a753addaad88340ca39f00e9722f35dd25fbe8fdd8846bfc0288215d0638004009396bfcd5e6eb0c587797ae8297decbca48b02407219b910ce163552ed230438292cec430007886beabe7cdf5c6f9c3740a3dd6c52ba88e6d652ce43f90044193c4a42335291795c2cc160dc68b6225edb425a88d27cae159f77df3a2241fbe809c8f1122d245bf439df0761bec97358b96d6653bc83702b559bde5a2d12f771a2a11bc9dc32580bc3ccf9dfacd0a5379587ac5160b45d333a85cde46810ad2875b406f00438aee245ecc63815528a185e9e2a029147db7fcffcb8875e5259f15c3e467de02e035891b131bc715e54e7e27a7acc437bb9f6f84fa4456aa016b3578a73ed8a4706efb935be8b6abe0697e46d878d9c74e274f2816d2fd88146b316731719e125d227e002af95aa13f468a9bae4ff41a4a6036ee7fc321b3249aed4dfb6e75089ec0656ee4e87e1fffefbd74edf55a20d752a85caccf583c0d9e2ef1040b4d36a8e992ad50ce1c4bd2b300b344ca881725c164886a5f8f18035f6e75e67a3eaa2064fc24ff79897edb624e1a67f34deb414d5efaf4c55d482da108aa2ab7504fd5d7f78d91da5c20230380ec013b910b01a26b8bed8a05a004d52db30b7fb01f16347692e9f19f303f48ea8cbbed2d3a3eb277ddf4e9ed8026af5ce92a618c8942caf28b3249044347e14e5c3c2ed5ec0f9cccf1d11a5b290c00773e12c25feafbcceeb8ae6c25a88c9657c627187af6fe0bfea0b3cc36c908a76f90e965bc4135c8596534f444c91aaaaaa6277985e36248bd53ef0f74f103eeac98ba92c5350e4a0c586c851ad25df982e16b2d408de37c687efc6915a41197df379614aa657ab5100627c47896b51b000cb95505bac77e4e440ecd1fe50252fc98f15ee41cafbf717e144da35f424e141639de04ebe5d333e9df8c06821c689d1ef2abbfd12e8a1edc059a9279db7ff44bac1962b5f7297da5c989528229e98a91a3a2e351f371dfa34d4c3676725baa5fa4696f67f4239b5fe1e3fa351d66aa5a2df992426d94ba049bbb4eea0ab22e3b9a7409f2b6719ede64353f4112e4da3919adc16dcd99c545966256493d2699ae529e365c20515d95c013ba2627576fb75a030ffd25b85ed3fc40dbbedbca54427f8dc2255c16b742b3e2b82e1bb634ae73a402927e6dc424d1908942b9b0f2cc17909ed050defe85d24a1986291facbb4ecf9b7ff66c27f8e771d28ec6866e3d24bc97e7be388013df8ba8f407b9147ed9b3581784003a22eeada55656d2be271afce06ef3fca32ac9b77b4f2420d60e892c95418b2a1b7d3dae2738a073ef105e66c08488e8a91e8ebdb5a10e979611bd29245c13cc4c0f5b33eedc5263edd6c27666e0c3f02161114120230511406f9f82102fd8c37c36d4e383e445df4afc6e7dbaa570cfe05b3f6038ec1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5006f155ac97d6757728caceba5530eb745e72277723ad34268b34008a97a27c370e9bc006aeaca4ac36414f35aa41ff400f698623a447c949f7f004f3c3fdb09f2af3c96042e215f0d4bbb23fda72d4f01dd9a55dbdec930919715a23e2cd772a260e2b91324c244d88ce1b83c92dce1aa0e0c255b80ed9325dec0e677563984a1c559ddb4a544eadeb2a38e8ed7736174a30d2bee6e0b65f3766e0b7a4e4d8022dd9f82493a9b1fadd1907147ac29edeb8cf8c7c58fbfa9b82ed3d9f9f05bfc900e52e29a05ca8d445b5245b16928dd61800ebb63933d9c471c2fb38776459641e9debdc606abf6ccfdf8fb41da88ba0745d96fd4557a879fee82e33df32d18b18d7360529f89f3dea680a5cb0c6a7652ee38589e1997f3e64ce4db1d3c04cd628fc0fd6e7ef1944108d48eb742a28467fa4bca693dbc8f923945256da2a83222d172286c82b1949803c54409de4653f258d0cf4266c83d5675ca9b5b3a3fb322b9c493ed7bff0a6165babb19c94d9e2014b13b099f09894fbcf32959b9d4ce71ddf9d24dee8bc40d6be92ee6e1220d84d68ecf1a0424132315c0612802b477b0acabcf346b0ad5ea329ea72f4de7524530bc00ad36baeee835908655faecd350463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea0908c560e84b404afb45f69169d28348ca20bb4f5693db19304d154f60a91ec4e9255be05739f5dc7e0b420d4bde4b188a8520bf39202f81dd3e2f4adcc6f4b4be16880103e0ab232f509729c91ddf0006d6a099a769b38affb89d7489b3bf261106aec362c77acdbb0a71c3da369067eb0f2ee9866a0bbdc4ee41ae81a88d860f1784565b7b1cdd350e8e12241103ff9d57c86c368775530773bafc058cbcea6309bd6d9c144cf6657cac5084ac5fe63ef038a71b3d79e6b7a32cc70039e182052f5cd5e415128e9ab1f553f13c165ea122d089975c1daf617766e12d9f3abb2501571eefde182b767e4b63568d37a8c553671adcee2ee4c7c6d77493e4599cd70d002a718fe0d7c31b7df3893f8b9993c90d7d55eea1c38292f1eae3a7887cfd182977403d5c029a42809f2c6fb8d04aff1c60106ba36367ecca0699866e5ec922ebaeffc4e624d0cc2c748f9c446da0c293d8ba7a28125145ce0936a2dd47172c4502ccf050145fc0584ad8608ee8f6c34c3e718fa5ca616722c5b3549ddb5e2f6a96e82c3d706bf255afda0272c199da51f9a4a869ce8b164694f6ef7593ce08b4bb0afda822eed4a0a7863f532fc0a22de9de5d3456574021b711c42eb1c9190de35ea592568f8ba5528c0f5fadc38e10b14a89a1e49fba9a76ca2478dcca20f8a3c78bb3e1b9869b7375d0deb87819ce7209ad4d73d84a92d08d23649bb50ecb4a1763050b7860afb055461b3158647b453d7977bddde0fac9415327e7eb2ea373fc8abd6793f576e72a47c92d6f6e19fadfdf2c6912365b74929d9b483c19f5146ac5a8dd943caf50b2e0a95fb19066a63a71862a540b2e41731ea66697094e51d309589ce9d25a37c06c9a12839c4c08a050a3ff9e502514f20d573c610466ac5399e11b0153954428f25d16958ab48614d34f768991f84411c401e6900fb0dfaab4108db0ad42fc9ae0a255e60fa4d92747ddda47d07de9f847e7a2be289798c5d34924aae419abdc41d30fb095c6ccabe5c5d5be73ec6197371ea74e08f0583b21901bd748db5348282cabaf57d883f5c55311f1304d7fcd30a9f0b22f810b1a7f089860e4ca0f23ddce9a23d7167762734b10b995d5bd2cf3b31f8f24b18d0a2f7ce1101d3a32d18988f162e91ac94b0f521f24fa287b0d2b97c408079336b89af9e842cf31886c701018ba98d5b0eb0e6d41b67b499f4c466cb1412db0e5937f7ffa83426c9234c713096444d0fc65d1b45f166e54d2a54bc103de110669fbc34555a6d16714ca37651e976b06a7ee96d80af9ff50162016a998451e2ce5819f3346b1fcdf6fe9ff3ec8420d4860a9980ce28fd8c55660983a3fb02cbedb5c638a49e5cdf0b69b71d78e071f1200608e235e6ed0ee8fea5567be12018bcd026412db0538c28bcd4a9afe799d5c677298646943c4200a039d2fced71d985d188f84dfd3132b6a015c50b8a60d712a97c89e0cd7d3a1740244c1522b117dad1220463f5d4af1004c1a2ad6b5708d7d6b28f8ae1e1e7dd1b2d3798b8c2e27a3559c7202aa268099eb3bbdf7c42d0d20b47e5623dba8e6aa1392ff532113c32bd836f4160abb287aefe648aaff6bb0a23928f580347046b64babf354790704538c6ce83f117ac7e83e1e0f54054466cc82b2144cf135be31f24f1b224e2a956827c303b0d82964e284b968c5ebe97688e49ca793a4aba81a3d36eefd8c12e3ce9409be63c3a308636a7b296b804d8125b4f29068ef44d3f2a3c9eb13e61d6365bb96d6973e88a70757b1d9213511d357d252df58d1e848d534d9517165263e803855e8caf387579f1ff0e7e9c3c8e532a2025d8016b70a45c24a546f0b21acf38d16b27eae6466e22396097090291184a7719beb4a55beb89275c6893e01f2075d3b73e165c39335d34a5aa7b280386e30a6df9ba917e1dc6774e2edaa0c87e8f5fcf89306a6fdbcf8cf52cf25f5df473fe350325d510421546765acd00b34ef53e56b01445deea042282e7d6ce20c8f967204c26bda9f2596fa378dc611091ab6db9e1e8d4e9b5c1cc4c4d6ee2ad82b32d08f8cb5a9dd9b03f7aa754f2738ddf2dc0c3318974ff3810765917c251c74ce3d7132c26b5f2ede12a6f62f2e8ddecd5e0d02f99f2ed8ac15641c586d68e093fbe80cefd6a7dbdac6d43e261160807eb82fc2aea870a22b25148d256a083325a5b97bcf0187f748b6c0a1691867344efdd53809fb9edea57669c33780a4aa9e65149937817d3d845d9fccae1876575d5383d06adeacd0f3371209a30e1a9c98446174b0b98560652d0643f120bdabd5484435871b42ad0ce36aa8330c7edd26e64e89eb84e0c72a2c6e49fb24088ae2bdaf7ef07af9bfe381dd6a9ed430a553de1bad4dcefd5239b389090925a69e44e25800d9fccda11ff4e1e4d3049386397f1145c3595ab5115255bc1c1eabb379a37504eda27b1a103b88ae8f174e1d182e3dfbb0b8317d05d6e08c191661b04537421fd84057a9ff5a6eceb68c5bf1f0e356df6e93d936bb6bdccb42127cba43e7615d522242df13f08e5fa162a641430c1431a7d7181dec65202fb618a690c2bf3361d7dc689d5e4a97a550a9b17c8a5ada8f32db3f774e9ed047c02eb7d1ba7add29fa07ab90f290e77bd91ee9b5208b1fb19a37f29dd1a492fa32156a7d43146a336fe6144d19228f975c54ab304565269124e069e864873c0eef23f2e7b012e84ad0c71d76e1b23b8b9a0a66edcd59f4b203a9773ce26baee206254b49efb10cc48bad814b2e299bd478fd4bd8b1ae2c8bd99070b259a9e204e42fc5f65f9e25cb4e4a1a3b67872314fcaeede2abbbc6978660c3e685f6dccb53160d1f7517bbda54177495c23fcf45cdd66363a70a84f2699e239b5071c9e6cb19069f3e0be9f4390c8028ae9960851e34ea18ff88d36ee826c0a4db4e33e94f0ec6651a728a1a2b0c15b30a1783ad4b1d224d87264779a817d107d40c75b77c25addd7b7d6a8b73b2d551f125daed95786920c4130d2061178604f9604a0e2f1c6cdbf3066fd28bf276ee0aee379bc049bc8eba361f4052bd2a698da312c991015c0fbc43ea1d2e72426279fc5181851a15a2f4883018ab01ff8745625f388f05f5fa9abc5d87a710a1227322626115b60f781f4ddd91e205c1cca582a5e37e005396703375846be4f36fdb76c277dc1a2ff1f183cbafc6db485a562f4d08262a207844a3d12261fa0ac479abca76f417df42b037e611b1b6acfda94d5dacc620c3edf5744db24bcc41ef1722dc0e620f8a35c50585a7cecfc97f05bfec21f919420e62a9c4f28ea9585cc056aee08ed8891d077a9647d9c0b5c3141f8c517f13b05bf0a18b99111d2d6e7b4892e78fab35d882e4e153060f0c44cb946d20ad0897a34d2a24d3800b54acd68fdd797aa362560dcede6d12909948bd6f4726a20142eec9c6b78d224b2c24885490bfb492217c6809e0628164579d2c2c16a90f28aa5393ad44c45d4e1500fccdcc684023d7cac4e2cca889333f048cd9a29de018e958d00553c77c74ab50d974df5f654233fb923e809ef6ceabe6a860386603003cc376e90b8bee74f2477343a5ae923aea4ffe99a91b9d9289ddcc3ca316b026b3d369aca474b7941588fc6e9cb062528b10f13b90dd55afd64f7b0ab79163163ce02aed379af25740ac5e37c5628c0b868b7ccfed0ae521c964846f0287d3006952539b2dffaf891bd01fe98a1685e71536d7f33ae85775d11545eb379e0916be616206968605e5033267f6f79cc651c2ce71a790ae5cef19fea7604e479c0793f82db1f8e85bec40d8c6a2dbc9bf76d02a616aced611ae1a7a3756d87dab2855ca585d0048e1e4222ed9d6fa24e3e13677256fbb9959b965727c192696a11474a7f6a6b6c8efb649b1f601c76576f36996ec7a20eee84208232c20e8502903d4e303e4ad7139c654b7e5d2aa262d75672cbb4f653e62ed8e4d28835f7d6d0efb3f39c40558d9cbf19f250681a5c8a59143fec80d6a69d8a265835d6562ef248fa4ac508bd60c9283f6e731baa786828d0f7a635e1d14a448383c8b0243570df4a42799afe03143c227e3fcf0b1393bdf8bacbd26f1041d5e3112c84755942fac77981fe16f048cd882243a8787b09bdc38847a5a9cc9aaf4d30544181ff014dca8b2892c00a933333df6d8ef79041483f2d8c6416897ae7897ca1da85e8f0a493be4520595cd0dd7d32c87999e703704ba0ac7d8b444dba807746123100e2cf7573843a0a755eebad6045d2970a0ef8c9adddff093e79731d5e506f1c43318fb25144ff5fb63041574e89216ebe0ac75d7dcffc35d095691723493c94dcc11d4480bf3fe7b76ba53cae5b409c002f2d1bb5eab08ac993054ec297543798700fe3e2877a4a0cce53599a66eb4f1fef5cafc774277f0e694ebd7f8748fb5140735282e5e0b9bb35b8aeb098775a33820c9b8decad3ad6ce36f79c347dcc2c60a5442d2eab4368827acae1f0ccd52f0475fab95ac57c3c9d7c2649d355756140d5a1e8c6eab8b67a5c169cb899230c4be1dc702323f2b07ee1fcf5657361e250ccbe93bb403abd857eee4335e454e8485a3b055c908c957dca3f9a288299729216103089910386fb994285602ce12b04be1819a2c80394b2410767d9aabdb591e4c4dcd08d1d5bc1bcb532496ff1fc968ac3ff59bc7266d8ecbb67f34b681331685a99b781c9752dfe83d145bd4f3c8ec634f028e850e246aa81f1d03aef40d000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a0bf32b9037b600aae3ecd3dd1838bc9f18ae1661f615cf3d70bc270b6c31f55fb80808080808080a0a2381991afea644ece5cba0d8d69f838f7b123d2e0057a54509e0c61e8b293028080808080808080b8b2f8b030b8adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a0529f2d89256fc038782a4d70b40bf127de906cbe211e7acaa3e928e0fd5cf11d80808080808080a0b4f4d0be01c65da5308bab41d52d8a7c93a1693c170c44d1f619b8364d40e3428080808080808080b90190f9018d30b90189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa50000000000000000000000000000000000000000000000c080a0ae5e67673b90f2d6802e8dba26aadb2e8b81e059d1611afd1908e743e3c0b75da004886b0ac3a810519aa2395bffdd94fbcfe4a2de989ec95d1aea0fcd09afd931b9235302f9234f83aa36a7830137d664748315f42594ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000007777000000000000000000000000000000010012f20d5ba20a09e185d452c999c129d712b83c75480e2e029fc895986d361a781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000004f9456000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000bbe20eedcc0216c615d3a0550a5507bdb2f9912eba7b608300486e871a4e42491dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000007777000000000000000000000000000000014852ab81d236f35c396d4836a6f82239f5672a4b6136ab9ebdd8669a9f9e831b87a26944e5c04f16b79426135ac11b155922c14178bf3d1ecbb1fb12ccc8119a22df5003de2d5956c745f9e825a8f0ca1bb1e265d4d431781b00765e0fe37280000000000004a00000000000800000020400004002001000000000000000010000000002800000000000100009000000000000a000000050000010004020000000000000000412000008002900000000000000000000000000000000820000000000000002000000400000000000080000000000000800000000001000040c0400000000000000010000000001400000000081000001800800008280000000001200002000000000000008440000000000001000000000004000000000000200200040028000000000000000000200000000000000000010000000020200290004100000000000000902080400010000001000000008000000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc100000000000000000000000000000000000000000000000000000000005364e600000000000000000000000000000000000000000000000000000000004456ed000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000002e0781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b21ad05b7c1eb0d208d17426c52831c6347a8db75b12bfeb2970c4dc6666e4eba0492d2ec318089b11ee7ec6087ab6a3df335770526cc0c1679b764d847b4ec1e303d400c12e690aa26a3771e5676e7ac95e2dc7a1b33be698f077c598f880d4203defa26ad36b84573e923af347475c7c7671be245e9859ca1db3c047faeee4b1c0e81d8a92915c2b94ff300e18f77f70ffec15631161e0bc3cdc9143c43422c208187652c1ec83c5d282e10587216eaf56689e5fe236f72c13eb9574afabc622a739cefbbe11aaa4e2e3d4c5415818914fe554a07be374f565d9bcebc0134940e8921b87bd4f6b42a6432e6e176be5ec82bb8eb6bdb7e4acc1f1e99725bd3ab2e3fa52e02c2741dfe6eddf5a3846dfd57f6a72e834faa048cb007826a293d9e163d47f9ea635871b25afcc3561dfce77b3a2604b3c8de90aa24916f41aed62d2e0c0d18f9c259bf614f1321c5b7cf7b5bd73cec408dd85f046bf36302e20f3603b7832071796022e893386de4e3b170135a591b1a44117240ba85876dba586b1f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f12f7e30e74b0329222f6067cad3b4324a80f570506985d729f7780955333f40e615f065023fb607d975d7a2b9f234137e72260d8f6b586baecf42819f8328dfb3304441f2c9e97d1fab9a3625073ac3d2bff6ba2f8d659cbc6f66e8d9afde1ef229ff39bac1ecd65eddc4953e2726a72daefa76f00d58e11c9a9ba3448fbe0d3a03db78d70ed9c574ddc45de5c73efdf3113ee70a4b42cea9884f85c1b995516912800abeb70f3022d5de6d9f49469161a36a6a309099ca43e388908635ed4ae825a14b7cf5213454a1f345497008ed417e5d33ef84c4934368b36f27606072192a1b43396f89647f0541dd25f55b42c5295d3ab2a22355664608b8dfec3c9d76045b27d8c2bdba7f376a44826bbf4044aed0d57068489fd32a2bf52f8613aa150185aafe655d2b86bf8867a6f7728c4133fb95776545b19767a0d7144f60f5ef038eac390d1cac6f9882211d7302137efc82b93b8f9c55db629f47a2c61931c21d01d5ad967c9dc6c1abfd496a74df2ac4714cfb027bc4d8c0153543ca663ded2af64f7396ed3b2ebd1976386814e94b7f7fcc3a19a4dd876288b905c381bc8f008de145083d6404890a863e1af1dd897aeef2516b20df50befb6c708c9728a22cb31d80b0e953aa71230d2462bb0668dd8701e11bc5240d85184f9298e2c5a3257b5dcc3e138df8b7d4162d6253fb5c21a65e952600c8764c613c6f43d22c861d4380cd688c286e9ffad6bb8582421fcab96b075769cf48b3160f056dfac4041b08287533a769bed0f08fdee9a16c5c8f414eb35830793c7b64341fef79dbc529a7b99f85d4e2e88b64954be967c5ee6386f9131b80b454ce70209f78f2101d0ca71da273735bcbcdc5ea5d3d54b607820b9bc852abb1b733cb7bb5018276d30c4c0a7f9ffcd318499a2041043494b82456ca8ac6f07678a8b770329b7c00f31e70e97ce48bc796570be27577e8986ee4c7fa51da44bdecfddfcf18686cbddc02ca206d9132d451ab55cce8069f631412ad2ae02b1a8245d31c0a65854d07370259f632fe253b2412c5a785148248d660d7cb6bef5240749d6ac4a4ac59384b27e7019c6cae15ef7c82e5a952f4da079b6205f9e16f3d3c84e94b490530c5b602d4bf5e9d34f2a785cdb7f7755d6d467a9d88071bbdf8c79195730db7d0b7872cbdcdabab02bd4b8487b726c5ce6492344ae7e900a21893e7b840b46380ba99278ce95322dc23daa97995d1149d425952913428c8ef8659dd2cc2895f12b08e0532a254fd5674fcac1b0992472ef75337d8d77f6fef3720d4b7b17302478c7d2e3b8dec7af4c681aba5e25d8aa3f4382b0082066c3f7a0b4e42c4637df90d9a1e2f3fd1cffa7e0d5577f5da89353521ed02cb1c39eb5746cef10ceb74c3fdba13199b42516ebfe29af40da64ad81b46b7bf04bf25994255c7a51f6839848810025bb52fe7500cf1ef628a07747894e3b73d53e6b2997d0654f1ffd0c070455400fd7e9d670984ac807a0f8131977ed1806fd3c0927c34b7b4dabf011d31e86b1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5020d266b1ccea774955484405f58ad161251d879a87c43d5dbaecd976ac5d04dd2586d70031a86b0dcade14028f36a04508494c7a20e98b3b21f7765e7b3ef68f10960709e63eea35a26ff47424e18df8cc271ff3049262c855d6a131695a395f2ba2f1b039012ac8a2abdf6d9f6b0c432f0ae78b9bccb99f89759434477257ce1f44cc61e95b9c9843ec8efb17c640fc4c837ec125fb25323d3f0644615d21721607fee4d68e2dc9bd29f5b13fafe39b0710d0365dccda35e3c937aed1b6949b2a0a7523011eb706357b85e174376ea7cadbd01ed0dd1bc6a8e5a5a11bc6131f0661dd6365b13c6e2de50b98cba1cde58a921d19936c711424eb625b7c35cba01a0f7dfa8d6f86a2a02425ab48e2c28f8f2f61adbb744c221b9c4f35b16c749c227bcee1202e87537c7441f421c855ce87d858a679f09dcf814bfa1f26f7d9ce18f723d2f84d4b25ec60adbb6367e92270836d03c71ed43413767342a4fb8d6801b8755bf65e7947ed4459ad6486fc1cca1f1cc89df3d307f01d8ac68aa1d08d18aa35a46bf245589c599eddc6337e764c36426f7b7f5d2afde0a76fd3aa536d1a165f9f23cfc65866f574f2289aa5be056dd32c72a204ba8328dd9b0b4643790463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea09160db3fa7477a2fff436ecee95aa2d51ff42ca9d4fcf021b6e501410fd41098a1a8f6021636ece98c27bd74740b7280d3a5e13d9850fcf7f2118c4c91572ba5826fcc4b0837d0b394f6683cba38fa35a5e2bd242041533bd25939cc873d1f5852a2f57cb172eb17c2e3c351240a0b2b334978b90ac18041b09aead26649b1c1c019e41731e77c6b2211d7da94630507bad027561dc625b7e84094378e599a57b09eb32c2a67cf5f2f0bf9250e6da07b165f97dca10517e9f3fe3561d02ec83a722b544bd6e25ef27d9825d13651443c4d984d7e5d0fd70c2a7f983b3ae8c698d27a2a0bf2d35655f477adc99c56f48773922831746f8af58de941a020986ad7c23fb7d31c2f17f305174db26b40447e64c66216dce98e7a8316dd91dee468e602206a4d1d18fa7827f733037fa87dfc9c74c9df0960867087c776382b94db9420a19e5338e17e8a68cb7621f0b56984610bedd3d9b77dc5447cdb129ecc33596079cf206e93904368cae07f0d449e2095f8abd95f26603d2db047647babc8342200be0095aa5489fd18cd00a52f59b70ff04c4b1e572db76d08bad419abbabb00b9e485e3f017807c12b427b5e0e648cf7b16065e313c1c073ce354a5fc6812c02b8d4b6aa1168c575dad9875087fe9f61702309febfb99b895387cc1104c35e123b713019b5e51c320fc2521cdb5cfca20f617773fd46d3872128b87df6f66a21fb3fa16711245ab65eef629c5e6073efaff5b707657f4442f2eb2637fa71000f14fc691a71aacf902c0c1a1a5d7d8d351b8b3cad57acd0a9e47a1abdcaf2b70aed8b7370a6bb2bb4f3d679c4f9793e4b256deefaef1e6dbcdbb648b917e34822d833d2ac1614aebcf360d328d9271f27c52c93de4a9455ce6cd8d2140ebf6b21c9b172cf47556efc5dff9afb913e328a708292bfb65c96d668f4d0b3a9a21b222039156cba9980d6bf11efbd8dd893378e5dc1b323c57d8f702076c22d125d1489bab2553c5521631c35f7b5236007ce8f37012cace78d6eb39718904b5dc31ddcb6f4f175e52bcf6c6008f6f5a572925600194b9af7ae074dbf85119e3afd141b2ff2652a58f043e97f11b77997a9da1c96c18b5254a107f24e997a3ea61c2069b9d04d49bd1bcd2495b19bc71848f28bfb4f0346b682a1b474e040b056e60a32b5e8aa532103101cb45ca41c6a690c8688523b8566d507f29eb44fe2d2490e81f4343ca61c8783b83e40e3ce66532f186e9d09bd2667cf974a763072a910121aa5e86e151d92a868508b680f795bc30b4502769f41e3afef5f321be9ce2f1cff3eb3308d65aa0ed780cc889f605f35eb5e02ba772d08db2579f8561c61fa09a8e23ea1416fb95ca0c7e139ddd16f04b0c872499e44cb5a03868d6c5fa1300c19a96b8586b8f33bd760c6350713696b7d3236acb0eb35bde2e6378e9ef9b117b02290ead7824d42452e332f6ec95a7f871da9ebdf6ad02c959a1a36ba33ff0089a4f5217b7bfa5379a507b1e994fb7b8fef489f1f2cf6fdedf0e530635ef31faaa1a37457c445836376dc5cdefc7770fbbad8c326955655efe4ecde89bd2f1dc62a2551a45206fd7d42605aa1c0fc80476b741bd7df1f0f2db0fc387614240e78427bb3a8cbbaf9bb112da06ea6942335f88c65d42d17816136509ec39b51079b5eb2a8cd15c3d1fbc56dd72c3499c101e2fc9126e8f194c6c8006faef30917c5e535439c6b0d78be52a4d17a3a25d0878649b668db027eecbbafcfac7a612138c77d1511f9cc5e763eaddbad6d9d8770705ef7b4d062b4c6dc72f30d1d272dca8700ae03a4c6d2cc6a0a03f9bfb2615b2b294515ca80827ec9cbaa7746112530f5e70f236a641c05bbc8647dd130f02db3561f9dfaa1d687235bccb0498202af478a6070dfa49df99785a61eb5fe5f18777569c18b08d2042ae8639abbc225b832a2fbcd95ff43a3fee4fb2962983af8304ef995716110a7ad35c538697c109c01c427ca6cefef3a842fcf74b1c49a3f2da88b85fdb1d05e20cd567538942fa2f0ffbb5d2ff73d60d562d9a0a6894bec3d85a709b43e42ab64e2306cb96919e078b899f3155af56390d06ddc662afe8d2c91fc091e2c5cbbfab3fdb3f49423a5a5f7741f2d70c6736adc66e7c2caa89c6bbc678bb4b445a8a63d120867f01f164dc87adc853633ca7bd4b9d585c2a637d1469da612b5210476fc8d66f90029bdbf7fa5eddc8335cd23deb4bb47e1582e64a03dd021292d34435419af80af178cdfab0fb9374fa0fade48108cd3a571b814231784ac37c9f6071fc6ac0bb018595c9d8afbfcd6f31832b2581f7f7ce7c45d22817aab8ac6df0e0995e12dbd1595c3377b707b816c96ceb1893b9e7c747a577bb7540b89eb3ff7cac878a7a121a37b38fcd3248abfd24b50e25948dcaeff8c1c7ab8b745a93adb87cd54fca223dd940ef4d7eca9dd69243c74ea128ed624e52c7a2257f3950d0c7409d665d912495f8a8a2cf2482c1d51cd7793d3d31f32ffc24374d8606daa2a423931d97019ba2fd3ba773645b7fd01cf75e8201dd29f694a72136b585d940bff8867654223c28d0603d85fe4472d93ee30e35f46e27b8f40f9a9ad03992d9ff23305fc062c7d95971baae1ab074df88d41e09ec9752efff012c482e0cf9aea2b78cc26db146a278d584575ed615f5d168e6df7a832322da093f0aea706cee594207427d3005fd910843f3dc54b14f8b187e3b495b7474792743fc2e43f62bbc7fd50a76513f1fa4073b15a42d1e78a708134238f2521c749d086deeef512823b514aa64122b365efd51e11415de40826971c234d571c3e2a0507226c6ccc540e43a9aa32244b29784ac824c20d3d1b72dc7262f61cce4eefbe9a4ea4cb1061e4a71925aa13f31d6ce80bb7c56bf47b91cf107ab17168dd4fb60614757d7c7f4ebe0320692235fb502621ed9b15b9b3fa23aa1bf266a2a2c3f2386b52625e42e0cd85c37319e3266185419bcf6dea997e52ec8fca5887a68530002fcc5b3619e88d4dc9a918cc36bac2416ffa9b9734ac4e67a93a800f36d7aba4ecfed8d65f62cf6ad13d184a8c6406e3ba17b8aee6af0721ed091e1d225d044629a4ef5153c294a3e87e243e03bdcf6eaf7ee56d9d969a1f054d5774a7e2c363b160386b909c89717aa7015385f4ab8b6c97805c12c37d981ca945134cb1306d39a4d136b42c36d8aacd2c37575a11b17fa50ede8072d667f64bb55e3b54aff2c3c61782e442e088db7c1ce62287477132bef00c17e9992dd42f35b5e098eb97724fc4e697d75812635203abe8f96000d9553012be065980fb16d6d1c0c80457585c6eb699b0e8a6e36c1cd518dd1ffc517afcb9114a4ff629d06cd2f0be1495c4ee09243e96529e6c3a228c923ca2a703930ea94f7a5803645324ba9ea1a08e6c3241fe57a80bd24f780566342561189baed15e85ba9257b701d651754ff534e51279961ff379974e34010d80773b169a140e0ee7c5e2c0312c9dee46fb7b309710d448a43805c7eab513e84e346411b7145f77ff4ced7b32eb641528f78d88af0fe88e0840e9c16f2210e18c1da605bb04a4c963441c06fa839f722b0c67345168bc0fbb1c826f20472c7551a1327eae9eddbc24e63814fb81320cbc6f03488d64587f3e5f53c03db02cb15412e622f9ec9944643d4b5530b0cd4d577489d8ee499ecf2b74fb72423412aca8530fe53c3fc584ed8e39f900843ac73e36fb113c343cc197cd689a09e12f29203c1dfe839630f6932f3a29de81ba787f6044e70dff8981b71fe82f8a4d01f45770a53b090026a003b3e639eca0e6a1e5bdd0aad456e89d83012ea1f53e1a5fe848b33528f7195a7b0c36d4315f1b96b62d5603e87a13e12a97ec335e3922d4339d9575cb26d5691da78a738aa5c84aecc22a93033a6912f84360d13e2e23b0185bdc2cd331bd26ababcc91894935db5c7e1800b8a10db884a7614ceea91f38bbf623c5e7e7238eef06cd9fc9e43507c56e8d6212b7d03ef2db0dfceb040c0b206e1b7eee6ae564b15e4c02e9c3e4179d78bc68a9fbc2166cb8458342f218dc631705602b2ef1c6716dbc08f30810c9e2ab3ac7a03e300e9c21cd2a0240025ed5eda13e6daa246241669acfae65302dbca5c579d3b5c3a4c16a976209e22845337f9ca033329f849f3ccebc69ff01b301d99dbe9e79058fade67bf881c70283f41eaca130d1423e733ccd520f26ebbe8d304cbb8fa2f4bf67e2e041e5e90e840d5510d33a9f700219fbead699901ea3b3f8aa3d5ff0c028ceee5b5e711c29e7740bc98f4b78f15f2aa1e01449f1f15e68023861f540d2ae0541273c641914ea0e6abadbb2f11618bb678c8b7abff1f6d4e9f789706cdbd8dcc1acd4bbd506e42e928d134366d3f32d8caa4b86736bb065b1a3f89354835b7ba5ae1e53cc1bd9f5dfa3e0d49c0a0a8d32670c382712e30f8f4cb8fc980785fb6012df752e02c923d3f56f5764a41629646f9fd7641c8365f0917f85a64d0ba36179e2c2b3045d7b3c6ccfdb60cd5c365c43d88e231465c6616f7d2cab0db88cd79268e5ba0cecb98875958ee3827af7842e35d9cc89c3776e5640f2433a6afccf0e6fff9321e31802746639bf2bf77f375dd6799baa184b48815f24d3fca5d534dfe61d1306d15e97d3a320457ddd2239cc52fb31dbf98709cf090ae59afabbda6da75f4e1373a28bcadc2405e0a7f6dbf9a3e26511fc600a496b4623593213283a1fd33f000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a04dd5a916917c46969db2e2093e73972daa52d5582e183eb0bd08362e7aca1dc280808080808080a03605d0d2c4765be29883abb71f1c4b162f9d6786835ccabb068a243ff819909f8080808080808080b8b2f8b030b8adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a087eef6c6fab228bc280138441d870592a3910f042806b16f257faf5f1542f9a280808080808080a00ac60a3a5bafa4560edb7bd978a6b8980fa818c5edea7c010986328de4d9b4ba8080808080808080b90190f9018d30b90189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d67440000000000000000000000000000000000000000000000c080a0d86a71e8e531bae3b2a2e70d98e516ccf31b6583d936ffa31c3772ac265db828a0420f5a8067c7eec5214117647da149eaa4e7c78a10d8ee6fa62001ee1b680f9fb9060002f905fc83aa36a7823d3f647482a9c494bac000000000000000000000000000000000000380b905930001536cb8da3dd105e94414690798c7f100000000057b78da8ccffb3bd38b03c0f12199bb964b426dd6b091efd7dc3ad1a9d321d1713b2ea1189d39280b4791c5c858729090c3b6182ac75951eef74b38191686b35c4669656ca9dc5a0ce7e9399f7efffc03afe7fd6e7485887f6264e97e9856a6978b65c5db3b4ce57cf4812abeba0de10d0d6ee5a2cbc9885a2163a58d1895524adbfd86d795eac74ec74d783b599861bf4b7b3e6daf70b3ae0e5740c88a4dc15b893f76fe074a718bcead52fb2a06d6e5f1cf3ca344ad05dcf5ca10bd9bc2809cd8ecd40a2dd0e03200dadd8f921f0e9953a7e6d8c7dc99e60cf6fe81465175e0cf99b702ac6a13706e64ac349a1119796eb0b6e7d5ae48ad74a5c997d679ef9c637c619587cb98ecf88e620dacdc57701500c74e087533f978831a78bf3857cb6044a8c66e41645cdee74ac7cdac69a8484083eb003827ccfd6b92c77b7097a15f38a419f6f0578f3568465e6fb639f1a8d6e52e9d17a0413100ca8d08b210a2e5adb2bead3dfaada14b2513113802f3996daccac89014dafd1368700300053ad7daeea2a4d4d9e8502aa44337c6ff91165a25de84fe5273b2e5b7f4dda3a0410900125e7778d5c2a59a2ca2ce36bacc9e95812ae1b69a478fc7ecf5ded14b68a80a010d6e03e07137d5de8082773f8a422390cd0a592d81e6e623a42bc69547e6b343e1d9a14e64ac3486116e29a8315486a2324d93d3e33a8344ffdbc2655b76dbf72077e43c13961a6a52f0565f2000881576c7a113e7aa6e9a6ed4679014533f8d1bf80ff44ae5599813e80d2c1f2fd0a03400864952137916724a4504bb118ccaf9236f217a1e43c97e471397a3f86672226dd0e02e00d4dcbfe4dd250a97d0c830b3d93213fd048fed38ea8378018c726be68728e22c687037000e3bb6d2858fba82db877c2e28fa1e2cca4ce57b6bdfdba7513dcd2649da93544083d06f85c8f4d21559e8e7651dcaa0c3aafc4a691fdfb27f2f39ea08ea62feff43cf0d80061500b0b00cb246f3641d83f5c934c477ca641a5c545da8aa0e4662c4c5f26ee70525a04125006cf268fbdcaddb151168bf24d3fa2e09f7445d859ff9e5ba2fe71e7ef8861ba61834a80280ebddf1bc99e8d00ae5d2a0893d64774d4cea1bad7146fc964526b6c4617cd70a68500d00f7e8131b976b9537ab4e2b9c9cf086fcfd82e235cf6c6eabbf8030cc3fd1e395071a840120bfbd7fd4a54397eca0c0f7adc1231dd539950f508f92e237e3aeb91468c38d4083ea0068a89abd38178e2e9f67559758419b6908d48d58967547c9edfe98ba016e050734a809807957936c079272b238748593ee3a73f5c7647d0ece20a5c208769c484474aa2f192b6dcc780a770c9b40b42348219a34a746cb495f3f1efb710a816ac142121461c6f7bf82fb00b0dec5bfbcaa2e32983075c84989e439154bfc7df1d0549680a6c1a4999c18aa010dee074028fcade2995b7daec4562449ccbced0caf7a660f49ac4ea07d485b22348948a0415d001ce8e16f70ca5813141f7f7544586da1364d2f77dd8fbb7cc937c6d46136f93d68f000009a72d59e5a9bdf1de5e60bbb17358bc65e8ff1566fabad6d6eb42ef2781f6d6d40837000bce21c64847942319b4ac1c92b2ee02fe2bfbf43b685908b92a0c3cd25f21641a0417d0084138599419cf73489312bda0d53e1fa748e1f7927380961470ec9fda73b36978c953661c8065aaafe09fb847fb54e35b3c68f771b6953941b2b4e619b486d81761ee187bf828700301cd34529763c60738c12e1ccce6ddff8b8338cda8fda245e5d8d5613d20734408306df96bd65c7b8d5c27299269dd9335ef7cb1f3357145983f365ec2f933686fc6d77d0a01100ca3a3773d3f0a52559ee691776b714fedc8c7b2cd672c7065c295693d0616d37408318007c18e9a9f6e4929e20d8efd4c2428065720ed1938af8e5348c14b373b0a845d1063468d2f96f000000ffff86f9aa5001c001a08f785a1c8e4c549c415dd948da80f86e3aaabc4e7a784604b6362208e0fb6b85a011d366d57b6ad95cda2eb6b618704859b4d433ad7557cad177eff6f6bae578cbc0f90200df8345de7e8203e494e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de7f8203e594e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de8082062294388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de8182062394388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de828201949425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de838201979425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de848201999425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8582019a9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8682019b9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8782019e9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de888201a29425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de898201a59425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8a8201a89425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8b8201a99425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8c8201aa9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8d8201ac9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xf96096f90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9bf95c56f8ac82d51f8502540be4008303c9e294a68d4c1e3de1b721ad1356bbf827d6bc8cef304f80b844b1bb4d351300dbc7e12342566318001b83aefc9f20080000f3ef25472407fe9c9c69a1470000000242692bb4cd506c409651ab80eb3acfa54551d3dbc9af4493605d79871ba01e474fb147b16b9538d7a59a57738e406158d9cc306a9062b1b7a9f544c35abfa061aabb714c760f2243a16a024811679d402c8822e8b25dfd0038d84298fb5205b87502f87283aa36a754849502f900849502f9108302222794102554afa6b5dbccc86176faef2b2d854201756e8084e2bc7b43c001a04f2398f24bc950db1f5439de3cf6431ea277236595ae8dc5815c0cc671c9f97ca029898786a59c56f086fc0f7a16859f366cf46084add999fe137cbf43693712e8b87c02f87983aa36a7830293748459682f00850165a0bc008255f094fafb56bb5b37c3b0b0ee9d7c31f018aac91dfb778806f05b59d3b2000080c080a0b069dd8967533a773e592c26b1b36df0793d0b9f6eceba34da246f602c2fae58a002009dab32ab63a25b705d9a00e311f7cd5d85e73f9b2c03ffd0e5135c0bb2c6b89502f89283aa36a7018459682f008459682f0983011fec945b9fedd37f0b92e7e282b19cebcf06f57b77c60480a46a62784200000000000000000000000019a1fcc6fcc5832cd2db7704d75efbc800f5a742c001a0c65eb0e48090a8f8830de47f430b9ad11071a62a5db9555619a990d7e9b81738a05a6e826610a5b2ee529a22942ebcd3abd2a8a10228098c8158380e8fcceb962fb9028002f9027c83aa36a7178459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e17852000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f16827000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a004f8666c8e5d0f3c7110994f624d24aa47a1327814289698c3e2777284a5cfdca04ff05f1b8c5beb58972d40e5a7b894d5e28ad2f15a3429c7d2bee6b6a9633730b9019f02f9019b83aa36a70b8459682f008459682f098303644f944284890d4acd0bcb017ece481b96fd4cb457cac88715c0f4db6e0ea0b90124ee1490b20000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d40000000000000000000000001e8c104d068f22d351859cdbfe41a697a98e6ea20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000222e00000000000000000000000000000000000000000000000000015c0f4db6e0ea00000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d400000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000c080a0e5270f6291acc162885656bedf64fbcb904c41951221dc0cbbbdca03bb33ce43a01f08c7ed3c231403b55f37a157d80e121b653baa810add8c02aea722631450dcb87c02f87983aa36a7830293758459682f00850165a0bc008255f0948d247f4fbbe81429d3d164a5c9ae0063210edbdc8806f05b59d3b2000080c080a0bb83dd6181c9a7ae3069af3bdf1820b5e556eaf99e385b8d7b3571321fb2966ba02ac193773704524adcd02824796df83407a42cdd81e786b591eba43c4ffc6c40b9028002f9027c83aa36a7048459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e178520000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac6790000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c00000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac679000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c001a0fc882968005f717a74a2c2fb345f691091cab084f4bd3934358741807bd5a66ea03f81c68d05d06bf851a6ef5ea6874557a221cbadde24f3fa51f777699b5d2804b8d802f8d583aa36a7822c0b8459682f008459682f098303534f943367dfa11e3148a07c2da773e1f65b155b0abe5680b864ad58bdd100000000000000000000000053844f9577c2334e541aec7df7174ece5df1fcf0000000000000000000000000e9e12c660e77a732940bab3c2cf385c843b834b800000000000000000000000000000000000000000006015d637c177581800000c001a0a292e7723d3c950aa8a557bd91dece34ec527d9efe2cc413d582dcd9fc6bf6eba03386ce6f58e862f329946bf32897f7df5d1c8f818fecfafc1223052fb251d97eb8b602f8b383aa36a7138459682f008459682f09832dc6c094ba175fdab00e7fcf603f43be8f68db7f4de9f3a980b844095ea7b300000000000000000000000084a0cc1ab353da6b7817947f7b116b8ea982c3d20000000000000000000000000000000000000000000000068f365aea1e440000c001a0968ed0274829918071d9cef28e1adbf1fd15ec76e5a4f809971e887b4c9f34b6a001ce26485bc7e3ea71fb99866bd43002b264b2ed80e10850203c2f07b78856bdb87c02f87983aa36a7830293768459682f00850165a0bc008255f0946d3b93db4e4078cf6541a68532d00705d9a4da618806f05b59d3b2000080c080a083c831630788e7ee57c87128d18582e29aa51f1f233e91d916c06d0750578156a0549b5a00477f3fb4d8fbf95ba3a636c3a14ff011c1bbf3a717e00d61735cbf34b87c02f87983aa36a7830293778459682f00850165a0bc008255f0940d3a7d69859a0dd6971d39703b15379e05ae2ec48806f05b59d3b2000080c001a0082660b5db2d3a8a58c0b863673ab27f7cfe4c049dcc52c76a00ab45b0358db5a05a7519a2d399cb534480383ac21262fbde2dd85241495d7832dee8bb02c49c87b87c02f87983aa36a7830293788459682f00850165a0bc008255f0941be13f64a2463fc7a76b4092c53328cc965a77fb8806f05b59d3b2000080c001a0e6ee9b85c3b729518524fdaeb25d47f89f6fc6c4d2c4df707187bef74d73f958a0756bbf4ab119805b77466957b5895c1d5bf422c5f65d8a06f7efd37dcb2c87afb87c02f87983aa36a7830293798459682f00850165a0bc008255f094a90b28fd6f8e46ac668fcb688414184a163e2cd28806f05b59d3b2000080c080a0d394dd43c58591e5dda8a7f3a2f4eae1bfd65655b9e9eec5facc6dcb39aa77baa002eeabf3fe9c0a56eae476d2f6452ea72e63a9c9b1180290b792883258f939f5b8f802f8f583aa36a7830283818459682f008459682f1082962494d0f723c6b2226df56fe41e63b9eaa66eb540bcb880b884abac047b000000000000000000000000000000000000000000000000000000000103e9f0f3471dc445d8f209ef546e0d20eaccc12ed0a5b4100007f57d9bc8638dacaf6480000000000000000000000000000000000000000000000000000000001d209b1ea11d77d1ab457eb3e2954cb2b98e77b5b07e2a4f48507af0adc61329ddc210c001a0efa10ab60f3bd1e7c4a8d52a275a568fbe2f5edc9e1eaf386299577ff9ddbd6ba06e62cf2f66b58f655ddd3eae47ce40408445b086f6ea858edb7bd847ee206207f86f82e6e582014482f618949ebf6b12e7e33b8672788e7b2b3330356f6f2c41880de0b6b3a7640000808401546d72a008d6be7aa21be0a43e08e960620f4c40c44010a743ead9919ef9423863c08b12a06a63a7caae4504ee5528e50387ca09974f7124035328a62d1085da2fee6618f9f86f82e1c382014482f618949c68eb31c4d00b94c3e3d4c2887946f8b076b24c880de0b6b3a7640000808401546d72a0c22d48d72c70ccf0a44d0950daf16741838f9333ee0bc5e05ff02b058da1e010a06a20c9f74cbc14c0d5bf3b3c38d3c33a5ace9194cddc2c533afb16459eaa7647f86f82e4cb82014482f61894d531e7aa3c0bee832aaff22642c7a3128d48a81a880de0b6b3a7640000808401546d72a01dbaeffc8e11964c06a722bae73e35bb5de55b8f959592868f2ff5fc13b69bd3a002acadc04665570a2032cdb616de15bdca79127f21302d62db5baf96ae4734e6f86e830176e381d882520894ad346e81c5b26fe563ab1ba2aa4ff811655882ca872386f26fc10000808401546d72a0b6de11598824e338100d5ebe70c0b0f4d6893fbb36f11ad55cf74b2f43afc5dda05101e65e7e84ea9edba6e5bf1a1e07028ae3fa5213240e812e57cf6b29080726b9235302f9234f83aa36a7830137d564748315f52194ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5000000000000000000000000000077770000000000000000000000000000000191c15235c348207e935e72b9151056a9661d73631d1e2c3f89ffddf8e74efe8a42ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000030ef2c000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000ec15abee257256da1a964434000f59ddd45b1ce67d5df44f1c82fd5bfe95c3b31dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000777700000000000000000000000000000001d4b5b35d93f51c8143f6a4cc3d7b320d37ce03989cd88c28601f4ea94cd6554249cff83e4dd8e99a8ef9004b2ac7518996f4784af1f9e52debb6223a697e9652530feda219f333e01f8cd0b31ee83b9c250ee51fde9718ef5fa305cbcd01901200200100002020000400000280000006004000c0020000000000000000000100000000029000000000000000090000000000008000200040000012004020000800000000240002400008000800000020000000001040000000000040824000000000000002040000400000002000080000000000000804000000001001000c84000208000000000180020000014000000000210100510008000082c0000000001200002000000024000008400000000220001800400000008010000052000200000200028000000000800000040200000110000010000010000001020000210004100002000000000900280000010008001000000018004000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc0000000000000000000000000000000000000000000000000000000000034bfbc00000000000000000000000000000000000000000000000000000000002ddb24000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000002e042ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b2a7122720155935f15da0807d0054f1a4c3db2a92ec4124bf590ce7a16594f3f1812f260acb049d01ad534a937840a80c0f56fd9a54ca5a8628ed896d14a5f8b2570f5813e35c990656f6300a1a1849429135ada6337646248f6ea03a7f70ac426c1d805216d154ea5a8e5ff953bc04b71b049b4b5bd549b6b0cfa7f8b21dba72a3805c7093d8589f2d4c55b6211441041e8bd7916daed5093fcebd377c31e810a6499e6e26840e3afadc9b339c6abc86b7f89fc3559f4242d373a71389db20219195f6e13069701f6d539dcf63a049726cdd8cadc412d1c43cf3fc0095ae5e2157dc668bdb924d7d7afc2b4632ab8a0e4ef71941a0a6a65645f6cd8570302f90b98bbdd01be238dc07780ee9b93e22ab87f26170d7fc5531347fb9fadcb65dc2ca20442a70be9e785292d533fa9496308a7b1588b50b45c17ea765de525259f036edd3984782399b46793acd5abb9f49e38b309c2363aead57264ac1a44e6432b81127a0bfdc29f01bd04e7db2b2545ed8426d2fe9b3e561793ec8fc875f2a71f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f11fcba848e01c60438611958101321898e95c8fdc936d31389bdba8073b382e5b1e2cd25993ad31586d7525f165fb25a1cf8c22623f983c025d21f0e52ecfec5f0232a753addaad88340ca39f00e9722f35dd25fbe8fdd8846bfc0288215d0638004009396bfcd5e6eb0c587797ae8297decbca48b02407219b910ce163552ed230438292cec430007886beabe7cdf5c6f9c3740a3dd6c52ba88e6d652ce43f90044193c4a42335291795c2cc160dc68b6225edb425a88d27cae159f77df3a2241fbe809c8f1122d245bf439df0761bec97358b96d6653bc83702b559bde5a2d12f771a2a11bc9dc32580bc3ccf9dfacd0a5379587ac5160b45d333a85cde46810ad2875b406f00438aee245ecc63815528a185e9e2a029147db7fcffcb8875e5259f15c3e467de02e035891b131bc715e54e7e27a7acc437bb9f6f84fa4456aa016b3578a73ed8a4706efb935be8b6abe0697e46d878d9c74e274f2816d2fd88146b316731719e125d227e002af95aa13f468a9bae4ff41a4a6036ee7fc321b3249aed4dfb6e75089ec0656ee4e87e1fffefbd74edf55a20d752a85caccf583c0d9e2ef1040b4d36a8e992ad50ce1c4bd2b300b344ca881725c164886a5f8f18035f6e75e67a3eaa2064fc24ff79897edb624e1a67f34deb414d5efaf4c55d482da108aa2ab7504fd5d7f78d91da5c20230380ec013b910b01a26b8bed8a05a004d52db30b7fb01f16347692e9f19f303f48ea8cbbed2d3a3eb277ddf4e9ed8026af5ce92a618c8942caf28b3249044347e14e5c3c2ed5ec0f9cccf1d11a5b290c00773e12c25feafbcceeb8ae6c25a88c9657c627187af6fe0bfea0b3cc36c908a76f90e965bc4135c8596534f444c91aaaaaa6277985e36248bd53ef0f74f103eeac98ba92c5350e4a0c586c851ad25df982e16b2d408de37c687efc6915a41197df379614aa657ab5100627c47896b51b000cb95505bac77e4e440ecd1fe50252fc98f15ee41cafbf717e144da35f424e141639de04ebe5d333e9df8c06821c689d1ef2abbfd12e8a1edc059a9279db7ff44bac1962b5f7297da5c989528229e98a91a3a2e351f371dfa34d4c3676725baa5fa4696f67f4239b5fe1e3fa351d66aa5a2df992426d94ba049bbb4eea0ab22e3b9a7409f2b6719ede64353f4112e4da3919adc16dcd99c545966256493d2699ae529e365c20515d95c013ba2627576fb75a030ffd25b85ed3fc40dbbedbca54427f8dc2255c16b742b3e2b82e1bb634ae73a402927e6dc424d1908942b9b0f2cc17909ed050defe85d24a1986291facbb4ecf9b7ff66c27f8e771d28ec6866e3d24bc97e7be388013df8ba8f407b9147ed9b3581784003a22eeada55656d2be271afce06ef3fca32ac9b77b4f2420d60e892c95418b2a1b7d3dae2738a073ef105e66c08488e8a91e8ebdb5a10e979611bd29245c13cc4c0f5b33eedc5263edd6c27666e0c3f02161114120230511406f9f82102fd8c37c36d4e383e445df4afc6e7dbaa570cfe05b3f6038ec1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5006f155ac97d6757728caceba5530eb745e72277723ad34268b34008a97a27c370e9bc006aeaca4ac36414f35aa41ff400f698623a447c949f7f004f3c3fdb09f2af3c96042e215f0d4bbb23fda72d4f01dd9a55dbdec930919715a23e2cd772a260e2b91324c244d88ce1b83c92dce1aa0e0c255b80ed9325dec0e677563984a1c559ddb4a544eadeb2a38e8ed7736174a30d2bee6e0b65f3766e0b7a4e4d8022dd9f82493a9b1fadd1907147ac29edeb8cf8c7c58fbfa9b82ed3d9f9f05bfc900e52e29a05ca8d445b5245b16928dd61800ebb63933d9c471c2fb38776459641e9debdc606abf6ccfdf8fb41da88ba0745d96fd4557a879fee82e33df32d18b18d7360529f89f3dea680a5cb0c6a7652ee38589e1997f3e64ce4db1d3c04cd628fc0fd6e7ef1944108d48eb742a28467fa4bca693dbc8f923945256da2a83222d172286c82b1949803c54409de4653f258d0cf4266c83d5675ca9b5b3a3fb322b9c493ed7bff0a6165babb19c94d9e2014b13b099f09894fbcf32959b9d4ce71ddf9d24dee8bc40d6be92ee6e1220d84d68ecf1a0424132315c0612802b477b0acabcf346b0ad5ea329ea72f4de7524530bc00ad36baeee835908655faecd350463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea0908c560e84b404afb45f69169d28348ca20bb4f5693db19304d154f60a91ec4e9255be05739f5dc7e0b420d4bde4b188a8520bf39202f81dd3e2f4adcc6f4b4be16880103e0ab232f509729c91ddf0006d6a099a769b38affb89d7489b3bf261106aec362c77acdbb0a71c3da369067eb0f2ee9866a0bbdc4ee41ae81a88d860f1784565b7b1cdd350e8e12241103ff9d57c86c368775530773bafc058cbcea6309bd6d9c144cf6657cac5084ac5fe63ef038a71b3d79e6b7a32cc70039e182052f5cd5e415128e9ab1f553f13c165ea122d089975c1daf617766e12d9f3abb2501571eefde182b767e4b63568d37a8c553671adcee2ee4c7c6d77493e4599cd70d002a718fe0d7c31b7df3893f8b9993c90d7d55eea1c38292f1eae3a7887cfd182977403d5c029a42809f2c6fb8d04aff1c60106ba36367ecca0699866e5ec922ebaeffc4e624d0cc2c748f9c446da0c293d8ba7a28125145ce0936a2dd47172c4502ccf050145fc0584ad8608ee8f6c34c3e718fa5ca616722c5b3549ddb5e2f6a96e82c3d706bf255afda0272c199da51f9a4a869ce8b164694f6ef7593ce08b4bb0afda822eed4a0a7863f532fc0a22de9de5d3456574021b711c42eb1c9190de35ea592568f8ba5528c0f5fadc38e10b14a89a1e49fba9a76ca2478dcca20f8a3c78bb3e1b9869b7375d0deb87819ce7209ad4d73d84a92d08d23649bb50ecb4a1763050b7860afb055461b3158647b453d7977bddde0fac9415327e7eb2ea373fc8abd6793f576e72a47c92d6f6e19fadfdf2c6912365b74929d9b483c19f5146ac5a8dd943caf50b2e0a95fb19066a63a71862a540b2e41731ea66697094e51d309589ce9d25a37c06c9a12839c4c08a050a3ff9e502514f20d573c610466ac5399e11b0153954428f25d16958ab48614d34f768991f84411c401e6900fb0dfaab4108db0ad42fc9ae0a255e60fa4d92747ddda47d07de9f847e7a2be289798c5d34924aae419abdc41d30fb095c6ccabe5c5d5be73ec6197371ea74e08f0583b21901bd748db5348282cabaf57d883f5c55311f1304d7fcd30a9f0b22f810b1a7f089860e4ca0f23ddce9a23d7167762734b10b995d5bd2cf3b31f8f24b18d0a2f7ce1101d3a32d18988f162e91ac94b0f521f24fa287b0d2b97c408079336b89af9e842cf31886c701018ba98d5b0eb0e6d41b67b499f4c466cb1412db0e5937f7ffa83426c9234c713096444d0fc65d1b45f166e54d2a54bc103de110669fbc34555a6d16714ca37651e976b06a7ee96d80af9ff50162016a998451e2ce5819f3346b1fcdf6fe9ff3ec8420d4860a9980ce28fd8c55660983a3fb02cbedb5c638a49e5cdf0b69b71d78e071f1200608e235e6ed0ee8fea5567be12018bcd026412db0538c28bcd4a9afe799d5c677298646943c4200a039d2fced71d985d188f84dfd3132b6a015c50b8a60d712a97c89e0cd7d3a1740244c1522b117dad1220463f5d4af1004c1a2ad6b5708d7d6b28f8ae1e1e7dd1b2d3798b8c2e27a3559c7202aa268099eb3bbdf7c42d0d20b47e5623dba8e6aa1392ff532113c32bd836f4160abb287aefe648aaff6bb0a23928f580347046b64babf354790704538c6ce83f117ac7e83e1e0f54054466cc82b2144cf135be31f24f1b224e2a956827c303b0d82964e284b968c5ebe97688e49ca793a4aba81a3d36eefd8c12e3ce9409be63c3a308636a7b296b804d8125b4f29068ef44d3f2a3c9eb13e61d6365bb96d6973e88a70757b1d9213511d357d252df58d1e848d534d9517165263e803855e8caf387579f1ff0e7e9c3c8e532a2025d8016b70a45c24a546f0b21acf38d16b27eae6466e22396097090291184a7719beb4a55beb89275c6893e01f2075d3b73e165c39335d34a5aa7b280386e30a6df9ba917e1dc6774e2edaa0c87e8f5fcf89306a6fdbcf8cf52cf25f5df473fe350325d510421546765acd00b34ef53e56b01445deea042282e7d6ce20c8f967204c26bda9f2596fa378dc611091ab6db9e1e8d4e9b5c1cc4c4d6ee2ad82b32d08f8cb5a9dd9b03f7aa754f2738ddf2dc0c3318974ff3810765917c251c74ce3d7132c26b5f2ede12a6f62f2e8ddecd5e0d02f99f2ed8ac15641c586d68e093fbe80cefd6a7dbdac6d43e261160807eb82fc2aea870a22b25148d256a083325a5b97bcf0187f748b6c0a1691867344efdd53809fb9edea57669c33780a4aa9e65149937817d3d845d9fccae1876575d5383d06adeacd0f3371209a30e1a9c98446174b0b98560652d0643f120bdabd5484435871b42ad0ce36aa8330c7edd26e64e89eb84e0c72a2c6e49fb24088ae2bdaf7ef07af9bfe381dd6a9ed430a553de1bad4dcefd5239b389090925a69e44e25800d9fccda11ff4e1e4d3049386397f1145c3595ab5115255bc1c1eabb379a37504eda27b1a103b88ae8f174e1d182e3dfbb0b8317d05d6e08c191661b04537421fd84057a9ff5a6eceb68c5bf1f0e356df6e93d936bb6bdccb42127cba43e7615d522242df13f08e5fa162a641430c1431a7d7181dec65202fb618a690c2bf3361d7dc689d5e4a97a550a9b17c8a5ada8f32db3f774e9ed047c02eb7d1ba7add29fa07ab90f290e77bd91ee9b5208b1fb19a37f29dd1a492fa32156a7d43146a336fe6144d19228f975c54ab304565269124e069e864873c0eef23f2e7b012e84ad0c71d76e1b23b8b9a0a66edcd59f4b203a9773ce26baee206254b49efb10cc48bad814b2e299bd478fd4bd8b1ae2c8bd99070b259a9e204e42fc5f65f9e25cb4e4a1a3b67872314fcaeede2abbbc6978660c3e685f6dccb53160d1f7517bbda54177495c23fcf45cdd66363a70a84f2699e239b5071c9e6cb19069f3e0be9f4390c8028ae9960851e34ea18ff88d36ee826c0a4db4e33e94f0ec6651a728a1a2b0c15b30a1783ad4b1d224d87264779a817d107d40c75b77c25addd7b7d6a8b73b2d551f125daed95786920c4130d2061178604f9604a0e2f1c6cdbf3066fd28bf276ee0aee379bc049bc8eba361f4052bd2a698da312c991015c0fbc43ea1d2e72426279fc5181851a15a2f4883018ab01ff8745625f388f05f5fa9abc5d87a710a1227322626115b60f781f4ddd91e205c1cca582a5e37e005396703375846be4f36fdb76c277dc1a2ff1f183cbafc6db485a562f4d08262a207844a3d12261fa0ac479abca76f417df42b037e611b1b6acfda94d5dacc620c3edf5744db24bcc41ef1722dc0e620f8a35c50585a7cecfc97f05bfec21f919420e62a9c4f28ea9585cc056aee08ed8891d077a9647d9c0b5c3141f8c517f13b05bf0a18b99111d2d6e7b4892e78fab35d882e4e153060f0c44cb946d20ad0897a34d2a24d3800b54acd68fdd797aa362560dcede6d12909948bd6f4726a20142eec9c6b78d224b2c24885490bfb492217c6809e0628164579d2c2c16a90f28aa5393ad44c45d4e1500fccdcc684023d7cac4e2cca889333f048cd9a29de018e958d00553c77c74ab50d974df5f654233fb923e809ef6ceabe6a860386603003cc376e90b8bee74f2477343a5ae923aea4ffe99a91b9d9289ddcc3ca316b026b3d369aca474b7941588fc6e9cb062528b10f13b90dd55afd64f7b0ab79163163ce02aed379af25740ac5e37c5628c0b868b7ccfed0ae521c964846f0287d3006952539b2dffaf891bd01fe98a1685e71536d7f33ae85775d11545eb379e0916be616206968605e5033267f6f79cc651c2ce71a790ae5cef19fea7604e479c0793f82db1f8e85bec40d8c6a2dbc9bf76d02a616aced611ae1a7a3756d87dab2855ca585d0048e1e4222ed9d6fa24e3e13677256fbb9959b965727c192696a11474a7f6a6b6c8efb649b1f601c76576f36996ec7a20eee84208232c20e8502903d4e303e4ad7139c654b7e5d2aa262d75672cbb4f653e62ed8e4d28835f7d6d0efb3f39c40558d9cbf19f250681a5c8a59143fec80d6a69d8a265835d6562ef248fa4ac508bd60c9283f6e731baa786828d0f7a635e1d14a448383c8b0243570df4a42799afe03143c227e3fcf0b1393bdf8bacbd26f1041d5e3112c84755942fac77981fe16f048cd882243a8787b09bdc38847a5a9cc9aaf4d30544181ff014dca8b2892c00a933333df6d8ef79041483f2d8c6416897ae7897ca1da85e8f0a493be4520595cd0dd7d32c87999e703704ba0ac7d8b444dba807746123100e2cf7573843a0a755eebad6045d2970a0ef8c9adddff093e79731d5e506f1c43318fb25144ff5fb63041574e89216ebe0ac75d7dcffc35d095691723493c94dcc11d4480bf3fe7b76ba53cae5b409c002f2d1bb5eab08ac993054ec297543798700fe3e2877a4a0cce53599a66eb4f1fef5cafc774277f0e694ebd7f8748fb5140735282e5e0b9bb35b8aeb098775a33820c9b8decad3ad6ce36f79c347dcc2c60a5442d2eab4368827acae1f0ccd52f0475fab95ac57c3c9d7c2649d355756140d5a1e8c6eab8b67a5c169cb899230c4be1dc702323f2b07ee1fcf5657361e250ccbe93bb403abd857eee4335e454e8485a3b055c908c957dca3f9a288299729216103089910386fb994285602ce12b04be1819a2c80394b2410767d9aabdb591e4c4dcd08d1d5bc1bcb532496ff1fc968ac3ff59bc7266d8ecbb67f34b681331685a99b781c9752dfe83d145bd4f3c8ec634f028e850e246aa81f1d03aef40d000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a0bf32b9037b600aae3ecd3dd1838bc9f18ae1661f615cf3d70bc270b6c31f55fb80808080808080a0a2381991afea644ece5cba0d8d69f838f7b123d2e0057a54509e0c61e8b293028080808080808080b8b2f8b030b8adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a0529f2d89256fc038782a4d70b40bf127de906cbe211e7acaa3e928e0fd5cf11d80808080808080a0b4f4d0be01c65da5308bab41d52d8a7c93a1693c170c44d1f619b8364d40e3428080808080808080b90190f9018d30b90189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa50000000000000000000000000000000000000000000000c080a0ae5e67673b90f2d6802e8dba26aadb2e8b81e059d1611afd1908e743e3c0b75da004886b0ac3a810519aa2395bffdd94fbcfe4a2de989ec95d1aea0fcd09afd931b9235302f9234f83aa36a7830137d664748315f42594ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000007777000000000000000000000000000000010012f20d5ba20a09e185d452c999c129d712b83c75480e2e029fc895986d361a781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000004f9456000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000bbe20eedcc0216c615d3a0550a5507bdb2f9912eba7b608300486e871a4e42491dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000007777000000000000000000000000000000014852ab81d236f35c396d4836a6f82239f5672a4b6136ab9ebdd8669a9f9e831b87a26944e5c04f16b79426135ac11b155922c14178bf3d1ecbb1fb12ccc8119a22df5003de2d5956c745f9e825a8f0ca1bb1e265d4d431781b00765e0fe37280000000000004a00000000000800000020400004002001000000000000000010000000002800000000000100009000000000000a000000050000010004020000000000000000412000008002900000000000000000000000000000000820000000000000002000000400000000000080000000000000800000000001000040c0400000000000000010000000001400000000081000001800800008280000000001200002000000000000008440000000000001000000000004000000000000200200040028000000000000000000200000000000000000010000000020200290004100000000000000902080400010000001000000008000000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc100000000000000000000000000000000000000000000000000000000005364e600000000000000000000000000000000000000000000000000000000004456ed000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000002e0781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b21ad05b7c1eb0d208d17426c52831c6347a8db75b12bfeb2970c4dc6666e4eba0492d2ec318089b11ee7ec6087ab6a3df335770526cc0c1679b764d847b4ec1e303d400c12e690aa26a3771e5676e7ac95e2dc7a1b33be698f077c598f880d4203defa26ad36b84573e923af347475c7c7671be245e9859ca1db3c047faeee4b1c0e81d8a92915c2b94ff300e18f77f70ffec15631161e0bc3cdc9143c43422c208187652c1ec83c5d282e10587216eaf56689e5fe236f72c13eb9574afabc622a739cefbbe11aaa4e2e3d4c5415818914fe554a07be374f565d9bcebc0134940e8921b87bd4f6b42a6432e6e176be5ec82bb8eb6bdb7e4acc1f1e99725bd3ab2e3fa52e02c2741dfe6eddf5a3846dfd57f6a72e834faa048cb007826a293d9e163d47f9ea635871b25afcc3561dfce77b3a2604b3c8de90aa24916f41aed62d2e0c0d18f9c259bf614f1321c5b7cf7b5bd73cec408dd85f046bf36302e20f3603b7832071796022e893386de4e3b170135a591b1a44117240ba85876dba586b1f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f12f7e30e74b0329222f6067cad3b4324a80f570506985d729f7780955333f40e615f065023fb607d975d7a2b9f234137e72260d8f6b586baecf42819f8328dfb3304441f2c9e97d1fab9a3625073ac3d2bff6ba2f8d659cbc6f66e8d9afde1ef229ff39bac1ecd65eddc4953e2726a72daefa76f00d58e11c9a9ba3448fbe0d3a03db78d70ed9c574ddc45de5c73efdf3113ee70a4b42cea9884f85c1b995516912800abeb70f3022d5de6d9f49469161a36a6a309099ca43e388908635ed4ae825a14b7cf5213454a1f345497008ed417e5d33ef84c4934368b36f27606072192a1b43396f89647f0541dd25f55b42c5295d3ab2a22355664608b8dfec3c9d76045b27d8c2bdba7f376a44826bbf4044aed0d57068489fd32a2bf52f8613aa150185aafe655d2b86bf8867a6f7728c4133fb95776545b19767a0d7144f60f5ef038eac390d1cac6f9882211d7302137efc82b93b8f9c55db629f47a2c61931c21d01d5ad967c9dc6c1abfd496a74df2ac4714cfb027bc4d8c0153543ca663ded2af64f7396ed3b2ebd1976386814e94b7f7fcc3a19a4dd876288b905c381bc8f008de145083d6404890a863e1af1dd897aeef2516b20df50befb6c708c9728a22cb31d80b0e953aa71230d2462bb0668dd8701e11bc5240d85184f9298e2c5a3257b5dcc3e138df8b7d4162d6253fb5c21a65e952600c8764c613c6f43d22c861d4380cd688c286e9ffad6bb8582421fcab96b075769cf48b3160f056dfac4041b08287533a769bed0f08fdee9a16c5c8f414eb35830793c7b64341fef79dbc529a7b99f85d4e2e88b64954be967c5ee6386f9131b80b454ce70209f78f2101d0ca71da273735bcbcdc5ea5d3d54b607820b9bc852abb1b733cb7bb5018276d30c4c0a7f9ffcd318499a2041043494b82456ca8ac6f07678a8b770329b7c00f31e70e97ce48bc796570be27577e8986ee4c7fa51da44bdecfddfcf18686cbddc02ca206d9132d451ab55cce8069f631412ad2ae02b1a8245d31c0a65854d07370259f632fe253b2412c5a785148248d660d7cb6bef5240749d6ac4a4ac59384b27e7019c6cae15ef7c82e5a952f4da079b6205f9e16f3d3c84e94b490530c5b602d4bf5e9d34f2a785cdb7f7755d6d467a9d88071bbdf8c79195730db7d0b7872cbdcdabab02bd4b8487b726c5ce6492344ae7e900a21893e7b840b46380ba99278ce95322dc23daa97995d1149d425952913428c8ef8659dd2cc2895f12b08e0532a254fd5674fcac1b0992472ef75337d8d77f6fef3720d4b7b17302478c7d2e3b8dec7af4c681aba5e25d8aa3f4382b0082066c3f7a0b4e42c4637df90d9a1e2f3fd1cffa7e0d5577f5da89353521ed02cb1c39eb5746cef10ceb74c3fdba13199b42516ebfe29af40da64ad81b46b7bf04bf25994255c7a51f6839848810025bb52fe7500cf1ef628a07747894e3b73d53e6b2997d0654f1ffd0c070455400fd7e9d670984ac807a0f8131977ed1806fd3c0927c34b7b4dabf011d31e86b1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5020d266b1ccea774955484405f58ad161251d879a87c43d5dbaecd976ac5d04dd2586d70031a86b0dcade14028f36a04508494c7a20e98b3b21f7765e7b3ef68f10960709e63eea35a26ff47424e18df8cc271ff3049262c855d6a131695a395f2ba2f1b039012ac8a2abdf6d9f6b0c432f0ae78b9bccb99f89759434477257ce1f44cc61e95b9c9843ec8efb17c640fc4c837ec125fb25323d3f0644615d21721607fee4d68e2dc9bd29f5b13fafe39b0710d0365dccda35e3c937aed1b6949b2a0a7523011eb706357b85e174376ea7cadbd01ed0dd1bc6a8e5a5a11bc6131f0661dd6365b13c6e2de50b98cba1cde58a921d19936c711424eb625b7c35cba01a0f7dfa8d6f86a2a02425ab48e2c28f8f2f61adbb744c221b9c4f35b16c749c227bcee1202e87537c7441f421c855ce87d858a679f09dcf814bfa1f26f7d9ce18f723d2f84d4b25ec60adbb6367e92270836d03c71ed43413767342a4fb8d6801b8755bf65e7947ed4459ad6486fc1cca1f1cc89df3d307f01d8ac68aa1d08d18aa35a46bf245589c599eddc6337e764c36426f7b7f5d2afde0a76fd3aa536d1a165f9f23cfc65866f574f2289aa5be056dd32c72a204ba8328dd9b0b4643790463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea09160db3fa7477a2fff436ecee95aa2d51ff42ca9d4fcf021b6e501410fd41098a1a8f6021636ece98c27bd74740b7280d3a5e13d9850fcf7f2118c4c91572ba5826fcc4b0837d0b394f6683cba38fa35a5e2bd242041533bd25939cc873d1f5852a2f57cb172eb17c2e3c351240a0b2b334978b90ac18041b09aead26649b1c1c019e41731e77c6b2211d7da94630507bad027561dc625b7e84094378e599a57b09eb32c2a67cf5f2f0bf9250e6da07b165f97dca10517e9f3fe3561d02ec83a722b544bd6e25ef27d9825d13651443c4d984d7e5d0fd70c2a7f983b3ae8c698d27a2a0bf2d35655f477adc99c56f48773922831746f8af58de941a020986ad7c23fb7d31c2f17f305174db26b40447e64c66216dce98e7a8316dd91dee468e602206a4d1d18fa7827f733037fa87dfc9c74c9df0960867087c776382b94db9420a19e5338e17e8a68cb7621f0b56984610bedd3d9b77dc5447cdb129ecc33596079cf206e93904368cae07f0d449e2095f8abd95f26603d2db047647babc8342200be0095aa5489fd18cd00a52f59b70ff04c4b1e572db76d08bad419abbabb00b9e485e3f017807c12b427b5e0e648cf7b16065e313c1c073ce354a5fc6812c02b8d4b6aa1168c575dad9875087fe9f61702309febfb99b895387cc1104c35e123b713019b5e51c320fc2521cdb5cfca20f617773fd46d3872128b87df6f66a21fb3fa16711245ab65eef629c5e6073efaff5b707657f4442f2eb2637fa71000f14fc691a71aacf902c0c1a1a5d7d8d351b8b3cad57acd0a9e47a1abdcaf2b70aed8b7370a6bb2bb4f3d679c4f9793e4b256deefaef1e6dbcdbb648b917e34822d833d2ac1614aebcf360d328d9271f27c52c93de4a9455ce6cd8d2140ebf6b21c9b172cf47556efc5dff9afb913e328a708292bfb65c96d668f4d0b3a9a21b222039156cba9980d6bf11efbd8dd893378e5dc1b323c57d8f702076c22d125d1489bab2553c5521631c35f7b5236007ce8f37012cace78d6eb39718904b5dc31ddcb6f4f175e52bcf6c6008f6f5a572925600194b9af7ae074dbf85119e3afd141b2ff2652a58f043e97f11b77997a9da1c96c18b5254a107f24e997a3ea61c2069b9d04d49bd1bcd2495b19bc71848f28bfb4f0346b682a1b474e040b056e60a32b5e8aa532103101cb45ca41c6a690c8688523b8566d507f29eb44fe2d2490e81f4343ca61c8783b83e40e3ce66532f186e9d09bd2667cf974a763072a910121aa5e86e151d92a868508b680f795bc30b4502769f41e3afef5f321be9ce2f1cff3eb3308d65aa0ed780cc889f605f35eb5e02ba772d08db2579f8561c61fa09a8e23ea1416fb95ca0c7e139ddd16f04b0c872499e44cb5a03868d6c5fa1300c19a96b8586b8f33bd760c6350713696b7d3236acb0eb35bde2e6378e9ef9b117b02290ead7824d42452e332f6ec95a7f871da9ebdf6ad02c959a1a36ba33ff0089a4f5217b7bfa5379a507b1e994fb7b8fef489f1f2cf6fdedf0e530635ef31faaa1a37457c445836376dc5cdefc7770fbbad8c326955655efe4ecde89bd2f1dc62a2551a45206fd7d42605aa1c0fc80476b741bd7df1f0f2db0fc387614240e78427bb3a8cbbaf9bb112da06ea6942335f88c65d42d17816136509ec39b51079b5eb2a8cd15c3d1fbc56dd72c3499c101e2fc9126e8f194c6c8006faef30917c5e535439c6b0d78be52a4d17a3a25d0878649b668db027eecbbafcfac7a612138c77d1511f9cc5e763eaddbad6d9d8770705ef7b4d062b4c6dc72f30d1d272dca8700ae03a4c6d2cc6a0a03f9bfb2615b2b294515ca80827ec9cbaa7746112530f5e70f236a641c05bbc8647dd130f02db3561f9dfaa1d687235bccb0498202af478a6070dfa49df99785a61eb5fe5f18777569c18b08d2042ae8639abbc225b832a2fbcd95ff43a3fee4fb2962983af8304ef995716110a7ad35c538697c109c01c427ca6cefef3a842fcf74b1c49a3f2da88b85fdb1d05e20cd567538942fa2f0ffbb5d2ff73d60d562d9a0a6894bec3d85a709b43e42ab64e2306cb96919e078b899f3155af56390d06ddc662afe8d2c91fc091e2c5cbbfab3fdb3f49423a5a5f7741f2d70c6736adc66e7c2caa89c6bbc678bb4b445a8a63d120867f01f164dc87adc853633ca7bd4b9d585c2a637d1469da612b5210476fc8d66f90029bdbf7fa5eddc8335cd23deb4bb47e1582e64a03dd021292d34435419af80af178cdfab0fb9374fa0fade48108cd3a571b814231784ac37c9f6071fc6ac0bb018595c9d8afbfcd6f31832b2581f7f7ce7c45d22817aab8ac6df0e0995e12dbd1595c3377b707b816c96ceb1893b9e7c747a577bb7540b89eb3ff7cac878a7a121a37b38fcd3248abfd24b50e25948dcaeff8c1c7ab8b745a93adb87cd54fca223dd940ef4d7eca9dd69243c74ea128ed624e52c7a2257f3950d0c7409d665d912495f8a8a2cf2482c1d51cd7793d3d31f32ffc24374d8606daa2a423931d97019ba2fd3ba773645b7fd01cf75e8201dd29f694a72136b585d940bff8867654223c28d0603d85fe4472d93ee30e35f46e27b8f40f9a9ad03992d9ff23305fc062c7d95971baae1ab074df88d41e09ec9752efff012c482e0cf9aea2b78cc26db146a278d584575ed615f5d168e6df7a832322da093f0aea706cee594207427d3005fd910843f3dc54b14f8b187e3b495b7474792743fc2e43f62bbc7fd50a76513f1fa4073b15a42d1e78a708134238f2521c749d086deeef512823b514aa64122b365efd51e11415de40826971c234d571c3e2a0507226c6ccc540e43a9aa32244b29784ac824c20d3d1b72dc7262f61cce4eefbe9a4ea4cb1061e4a71925aa13f31d6ce80bb7c56bf47b91cf107ab17168dd4fb60614757d7c7f4ebe0320692235fb502621ed9b15b9b3fa23aa1bf266a2a2c3f2386b52625e42e0cd85c37319e3266185419bcf6dea997e52ec8fca5887a68530002fcc5b3619e88d4dc9a918cc36bac2416ffa9b9734ac4e67a93a800f36d7aba4ecfed8d65f62cf6ad13d184a8c6406e3ba17b8aee6af0721ed091e1d225d044629a4ef5153c294a3e87e243e03bdcf6eaf7ee56d9d969a1f054d5774a7e2c363b160386b909c89717aa7015385f4ab8b6c97805c12c37d981ca945134cb1306d39a4d136b42c36d8aacd2c37575a11b17fa50ede8072d667f64bb55e3b54aff2c3c61782e442e088db7c1ce62287477132bef00c17e9992dd42f35b5e098eb97724fc4e697d75812635203abe8f96000d9553012be065980fb16d6d1c0c80457585c6eb699b0e8a6e36c1cd518dd1ffc517afcb9114a4ff629d06cd2f0be1495c4ee09243e96529e6c3a228c923ca2a703930ea94f7a5803645324ba9ea1a08e6c3241fe57a80bd24f780566342561189baed15e85ba9257b701d651754ff534e51279961ff379974e34010d80773b169a140e0ee7c5e2c0312c9dee46fb7b309710d448a43805c7eab513e84e346411b7145f77ff4ced7b32eb641528f78d88af0fe88e0840e9c16f2210e18c1da605bb04a4c963441c06fa839f722b0c67345168bc0fbb1c826f20472c7551a1327eae9eddbc24e63814fb81320cbc6f03488d64587f3e5f53c03db02cb15412e622f9ec9944643d4b5530b0cd4d577489d8ee499ecf2b74fb72423412aca8530fe53c3fc584ed8e39f900843ac73e36fb113c343cc197cd689a09e12f29203c1dfe839630f6932f3a29de81ba787f6044e70dff8981b71fe82f8a4d01f45770a53b090026a003b3e639eca0e6a1e5bdd0aad456e89d83012ea1f53e1a5fe848b33528f7195a7b0c36d4315f1b96b62d5603e87a13e12a97ec335e3922d4339d9575cb26d5691da78a738aa5c84aecc22a93033a6912f84360d13e2e23b0185bdc2cd331bd26ababcc91894935db5c7e1800b8a10db884a7614ceea91f38bbf623c5e7e7238eef06cd9fc9e43507c56e8d6212b7d03ef2db0dfceb040c0b206e1b7eee6ae564b15e4c02e9c3e4179d78bc68a9fbc2166cb8458342f218dc631705602b2ef1c6716dbc08f30810c9e2ab3ac7a03e300e9c21cd2a0240025ed5eda13e6daa246241669acfae65302dbca5c579d3b5c3a4c16a976209e22845337f9ca033329f849f3ccebc69ff01b301d99dbe9e79058fade67bf881c70283f41eaca130d1423e733ccd520f26ebbe8d304cbb8fa2f4bf67e2e041e5e90e840d5510d33a9f700219fbead699901ea3b3f8aa3d5ff0c028ceee5b5e711c29e7740bc98f4b78f15f2aa1e01449f1f15e68023861f540d2ae0541273c641914ea0e6abadbb2f11618bb678c8b7abff1f6d4e9f789706cdbd8dcc1acd4bbd506e42e928d134366d3f32d8caa4b86736bb065b1a3f89354835b7ba5ae1e53cc1bd9f5dfa3e0d49c0a0a8d32670c382712e30f8f4cb8fc980785fb6012df752e02c923d3f56f5764a41629646f9fd7641c8365f0917f85a64d0ba36179e2c2b3045d7b3c6ccfdb60cd5c365c43d88e231465c6616f7d2cab0db88cd79268e5ba0cecb98875958ee3827af7842e35d9cc89c3776e5640f2433a6afccf0e6fff9321e31802746639bf2bf77f375dd6799baa184b48815f24d3fca5d534dfe61d1306d15e97d3a320457ddd2239cc52fb31dbf98709cf090ae59afabbda6da75f4e1373a28bcadc2405e0a7f6dbf9a3e26511fc600a496b4623593213283a1fd33f000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a04dd5a916917c46969db2e2093e73972daa52d5582e183eb0bd08362e7aca1dc280808080808080a03605d0d2c4765be29883abb71f1c4b162f9d6786835ccabb068a243ff819909f8080808080808080b8b2f8b030b8adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a087eef6c6fab228bc280138441d870592a3910f042806b16f257faf5f1542f9a280808080808080a00ac60a3a5bafa4560edb7bd978a6b8980fa818c5edea7c010986328de4d9b4ba8080808080808080b90190f9018d30b90189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d67440000000000000000000000000000000000000000000000c080a0d86a71e8e531bae3b2a2e70d98e516ccf31b6583d936ffa31c3772ac265db828a0420f5a8067c7eec5214117647da149eaa4e7c78a10d8ee6fa62001ee1b680f9fb9060002f905fc83aa36a7823d3f647482a9c494bac000000000000000000000000000000000000380b905930001536cb8da3dd105e94414690798c7f100000000057b78da8ccffb3bd38b03c0f12199bb964b426dd6b091efd7dc3ad1a9d321d1713b2ea1189d39280b4791c5c858729090c3b6182ac75951eef74b38191686b35c4669656ca9dc5a0ce7e9399f7efffc03afe7fd6e7485887f6264e97e9856a6978b65c5db3b4ce57cf4812abeba0de10d0d6ee5a2cbc9885a2163a58d1895524adbfd86d795eac74ec74d783b599861bf4b7b3e6daf70b3ae0e5740c88a4dc15b893f76fe074a718bcead52fb2a06d6e5f1cf3ca344ad05dcf5ca10bd9bc2809cd8ecd40a2dd0e03200dadd8f921f0e9953a7e6d8c7dc99e60cf6fe81465175e0cf99b702ac6a13706e64ac349a1119796eb0b6e7d5ae48ad74a5c997d679ef9c637c619587cb98ecf88e620dacdc57701500c74e087533f978831a78bf3857cb6044a8c66e41645cdee74ac7cdac69a8484083eb003827ccfd6b92c77b7097a15f38a419f6f0578f3568465e6fb639f1a8d6e52e9d17a0413100ca8d08b210a2e5adb2bead3dfaada14b2513113802f3996daccac89014dafd1368700300053ad7daeea2a4d4d9e8502aa44337c6ff91165a25de84fe5273b2e5b7f4dda3a0410900125e7778d5c2a59a2ca2ce36bacc9e95812ae1b69a478fc7ecf5ded14b68a80a010d6e03e07137d5de8082773f8a422390cd0a592d81e6e623a42bc69547e6b343e1d9a14e64ac3486116e29a8315486a2324d93d3e33a8344ffdbc2655b76dbf72077e43c13961a6a52f0565f2000881576c7a113e7aa6e9a6ed4679014533f8d1bf80ff44ae5599813e80d2c1f2fd0a03400864952137916724a4504bb118ccaf9236f217a1e43c97e471397a3f86672226dd0e02e00d4dcbfe4dd250a97d0c830b3d93213fd048fed38ea8378018c726be68728e22c687037000e3bb6d2858fba82db877c2e28fa1e2cca4ce57b6bdfdba7513dcd2649da93544083d06f85c8f4d21559e8e7651dcaa0c3aafc4a691fdfb27f2f39ea08ea62feff43cf0d80061500b0b00cb246f3641d83f5c934c477ca641a5c545da8aa0e4662c4c5f26ee70525a04125006cf268fbdcaddb151168bf24d3fa2e09f7445d859ff9e5ba2fe71e7ef8861ba61834a80280ebddf1bc99e8d00ae5d2a0893d64774d4cea1bad7146fc964526b6c4617cd70a68500d00f7e8131b976b9537ab4e2b9c9cf086fcfd82e235cf6c6eabbf8030cc3fd1e395071a840120bfbd7fd4a54397eca0c0f7adc1231dd539950f508f92e237e3aeb91468c38d4083ea0068a89abd38178e2e9f67559758419b6908d48d58967547c9edfe98ba016e050734a809807957936c079272b238748593ee3a73f5c7647d0ece20a5c208769c484474aa2f192b6dcc780a770c9b40b42348219a34a746cb495f3f1efb710a816ac142121461c6f7bf82fb00b0dec5bfbcaa2e32983075c84989e439154bfc7df1d0549680a6c1a4999c18aa010dee074028fcade2995b7daec4562449ccbced0caf7a660f49ac4ea07d485b22348948a0415d001ce8e16f70ca5813141f7f7544586da1364d2f77dd8fbb7cc937c6d46136f93d68f000009a72d59e5a9bdf1de5e60bbb17358bc65e8ff1566fabad6d6eb42ef2781f6d6d40837000bce21c64847942319b4ac1c92b2ee02fe2bfbf43b685908b92a0c3cd25f21641a0417d0084138599419cf73489312bda0d53e1fa748e1f7927380961470ec9fda73b36978c953661c8065aaafe09fb847fb54e35b3c68f771b6953941b2b4e619b486d81761ee187bf828700301cd34529763c60738c12e1ccce6ddff8b8338cda8fda245e5d8d5613d20734408306df96bd65c7b8d5c27299269dd9335ef7cb1f3357145983f365ec2f933686fc6d77d0a01100ca3a3773d3f0a52559ee691776b714fedc8c7b2cd672c7065c295693d0616d37408318007c18e9a9f6e4929e20d8efd4c2428065720ed1938af8e5348c14b373b0a845d1063468d2f96f000000ffff86f9aa5001c001a08f785a1c8e4c549c415dd948da80f86e3aaabc4e7a784604b6362208e0fb6b85a011d366d57b6ad95cda2eb6b618704859b4d433ad7557cad177eff6f6bae578cbc0f90200df8345de7e8203e494e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de7f8203e594e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de8082062294388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de8182062394388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de828201949425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de838201979425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de848201999425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8582019a9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8682019b9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8782019e9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de888201a29425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de898201a59425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8a8201a89425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8b8201a99425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8c8201aa9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8d8201ac9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08" +} +``` + + ### `debug_getRawHeader` -Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) -of the header of specified block. +Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) of the header of specified block. #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *string* - RLP-encoded block header or `error` +`result`: _string_ - RLP-encoded block header or `error` -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawHeader","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawHeader","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_getRawHeader","params":["0x32026E"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "debug_getRawHeader", + "params": ["0x32026E"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0xf90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9b" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xf90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9b" +} +``` + + ### `debug_metrics` Returns metrics providing information on the internal operation of Besu. -The available metrics might change over time. -The JVM metrics might vary based on the JVM implementation used. +The available metrics might change over time. The JVM metrics might vary based on the JVM implementation used. The metric types are: -* Timer +- Timer -* Counter +- Counter -* Gauge +- Gauge #### Parameters @@ -946,166 +996,166 @@ None #### Returns -`result`: *object* - metrics object - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_metrics","params":[],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"debug_metrics","params":[],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "jvm": { - "memory_bytes_init": { - "heap": 268435456, - "nonheap": 2555904 - }, - "threads_current": 41, - "memory_bytes_used": { - "heap": 696923976, - "nonheap": 63633456 - }, - "memory_pool_bytes_used": { - "PS Eden Space": 669119360, - "Code Cache": 19689024, - "Compressed Class Space": 4871144, - "PS Survivor Space": 2716320, - "PS Old Gen": 25088296, - "Metaspace": 39073288 - }, - ... - }, - "process": { - "open_fds": 546, - "cpu_seconds_total": 67.148992, - "start_time_seconds": 1543897699.589, - "max_fds": 10240 - }, - "rpc": { - "request_time": { - "debug_metrics": { - "bucket": { - "+Inf": 2, - "0.01": 1, - "0.075": 2, - "0.75": 2, - "0.005": 1, - "0.025": 2, - "0.1": 2, - "1.0": 2, - "0.05": 2, - "10.0": 2, - "0.25": 2, - "0.5": 2, - "5.0": 2, - "2.5": 2, - "7.5": 2 - }, - "count": 2, - "sum": 0.015925392 - } - } - }, - "blockchain": { - "difficulty_total": 3533501, - "announcedBlock_ingest": { - "bucket": { - "+Inf": 0, - "0.01": 0, - "0.075": 0, - "0.75": 0, - "0.005": 0, - "0.025": 0, - "0.1": 0, - "1.0": 0, - "0.05": 0, - "10.0": 0, - "0.25": 0, - "0.5": 0, - "5.0": 0, - "2.5": 0, - "7.5": 0 - }, - "count": 0, - "sum": 0 - }, - "height": 1908793 - }, - "peers": { - "disconnected_total": { - "remote": { - "SUBPROTOCOL_TRIGGERED": 5 - }, - "local": { - "TCP_SUBSYSTEM_ERROR": 1, - "SUBPROTOCOL_TRIGGERED": 2, - "USELESS_PEER": 3 - } - }, - "peer_count_current": 2, - "connected_total": 10 - } - } +`result`: _object_ - metrics object + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_metrics","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_metrics", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "jvm": { + "memory_bytes_init": { + "heap": 268435456, + "nonheap": 2555904 + }, + "threads_current": 41, + "memory_bytes_used": { + "heap": 696923976, + "nonheap": 63633456 + }, + "memory_pool_bytes_used": { + "PS Eden Space": 669119360, + "Code Cache": 19689024, + "Compressed Class Space": 4871144, + "PS Survivor Space": 2716320, + "PS Old Gen": 25088296, + "Metaspace": 39073288 + }, + ... + }, + "process": { + "open_fds": 546, + "cpu_seconds_total": 67.148992, + "start_time_seconds": 1543897699.589, + "max_fds": 10240 + }, + "rpc": { + "request_time": { + "debug_metrics": { + "bucket": { + "+Inf": 2, + "0.01": 1, + "0.075": 2, + "0.75": 2, + "0.005": 1, + "0.025": 2, + "0.1": 2, + "1.0": 2, + "0.05": 2, + "10.0": 2, + "0.25": 2, + "0.5": 2, + "5.0": 2, + "2.5": 2, + "7.5": 2 + }, + "count": 2, + "sum": 0.015925392 + } + } + }, + "blockchain": { + "difficulty_total": 3533501, + "announcedBlock_ingest": { + "bucket": { + "+Inf": 0, + "0.01": 0, + "0.075": 0, + "0.75": 0, + "0.005": 0, + "0.025": 0, + "0.1": 0, + "1.0": 0, + "0.05": 0, + "10.0": 0, + "0.25": 0, + "0.5": 0, + "5.0": 0, + "2.5": 0, + "7.5": 0 + }, + "count": 0, + "sum": 0 + }, + "height": 1908793 + }, + "peers": { + "disconnected_total": { + "remote": { + "SUBPROTOCOL_TRIGGERED": 5 + }, + "local": { + "TCP_SUBSYSTEM_ERROR": 1, + "SUBPROTOCOL_TRIGGERED": 2, + "USELESS_PEER": 3 } - ``` + }, + "peer_count_current": 2, + "connected_total": 10 + } + } +} +``` + + ### `debug_replayBlock` -Re-imports the block matching the specified block number, by rolling the head of the local chain -back to the block right before the specified block, then importing the specified block. +Re-imports the block matching the specified block number, by rolling the head of the local chain back to the block right before the specified block, then importing the specified block. #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *string* - `Success` or `error` +`result`: _string_ - `Success` or `error` -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_replayBlock","params":["0x1"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_replayBlock","params":["0x1"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_replayBlock","params":["0x1"],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "debug_replayBlock", "params": ["0x1"], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "Success" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + ### `debug_resyncWorldstate` -Triggers a re-synchronization of the world state while retaining imported blocks. -This is useful if there are world state database inconsistencies (for example, Bonsai database issues). +Triggers a re-synchronization of the world state while retaining imported blocks. This is useful if there are world state database inconsistencies (for example, Bonsai database issues). #### Parameters @@ -1113,31 +1163,33 @@ None #### Returns -`result`: *string* - `Success` or `error` +`result`: _string_ - `Success` or `error` -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_resyncWorldstate","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"debug_resyncWorldstate","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_resyncWorldstate","params":[],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "debug_resyncWorldstate", "params": [], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "Success" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + ### `debug_setHead` @@ -1145,247 +1197,285 @@ Sets the current head of the local chain to the block matching the specified blo #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *string* - `Success` or `error` +`result`: _string_ - `Success` or `error` -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_setHead","params":["0x1"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_setHead","params":["0x1"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_setHead","params":["0x1"],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "debug_setHead", "params": ["0x1"], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "Success" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + ### `debug_standardTraceBlockToFile` -Generates files containing the block trace. A separate file is generated for each -transaction in the block. +Generates files containing the block trace. A separate file is generated for each transaction in the block. You can also specify a trace file for a specific transaction in a block. -Use [`debug_standardTraceBadBlockToFile`](#debug_standardtracebadblocktofile) to view the trace for -an invalid block. +Use [`debug_standardTraceBadBlockToFile`](#debug_standardtracebadblocktofile) to view the trace for an invalid block. #### Parameters -`blockHash`: *string* - block hash +`blockHash`: _string_ - block hash -`txHash`: *string* - (optional) transaction hash; if omitted, a trace file is generated for each -transaction in the block. +`txHash`: _string_ - (optional) transaction hash; if omitted, a trace file is generated for each transaction in the block. -`disableMemory`: *boolean* - (optional) specifies whether to capture EVM memory during the trace; defaults to `true` +`disableMemory`: _boolean_ - (optional) specifies whether to capture EVM memory during the trace; defaults to `true` #### Returns -`result`: *string* - location of the generated trace files +`result`: _string_ - location of the generated trace files -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBlockToFile","params":["0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", { - "txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", "disableMemory": false}], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBlockToFile","params":["0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", { +"txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", "disableMemory": false}], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_standardTraceBlockToFile","params":["0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", { - "txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", "disableMemory": false}], "id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "debug_standardTraceBlockToFile", + "params": [ + "0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", + { + "txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", + "disableMemory": false + } + ], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "/Users/me/mynode/goerli/data/traces/block_0x2dc0b6c4-4-0x4ff04c4a-1612820117332" - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "/Users/me/mynode/goerli/data/traces/block_0x2dc0b6c4-4-0x4ff04c4a-1612820117332" + ] +} +``` + + ### `debug_standardTraceBadBlockToFile` -Generates files containing the block trace of invalid blocks. -A separate file is generated for each -transaction in the block. +Generates files containing the block trace of invalid blocks. A separate file is generated for each transaction in the block. -Use [`debug_standardTraceBlockToFile`](#debug_standardtraceblocktofile) to view the trace for a -valid block. +Use [`debug_standardTraceBlockToFile`](#debug_standardtraceblocktofile) to view the trace for a valid block. #### Parameters -`blockHash`: *string* - block hash +`blockHash`: _string_ - block hash #### Returns -`result`: *string* - location of the generated trace files +`result`: _string_ - location of the generated trace files -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBadBlockToFile","params":["0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa"], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBadBlockToFile","params":["0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa"], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_standardTraceBadBlockToFile","params":["0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa"], "id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "debug_standardTraceBadBlockToFile", + "params": [ + "0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa" + ], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "/Users/me/mynode/goerli/data/traces/block_0x53741e9e-0-0x407ec43d-1600951088172" - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "/Users/me/mynode/goerli/data/traces/block_0x53741e9e-0-0x407ec43d-1600951088172" + ] +} +``` + + ### `debug_storageRangeAt` -[Remix](https://remix.ethereum.org/) uses `debug_storageRangeAt` to implement debugging. -Use the *Debugger* tab in Remix instead of calling `debug_storageRangeAt` directly. +[Remix](https://remix.ethereum.org/) uses `debug_storageRangeAt` to implement debugging. Use the _Debugger_ tab in Remix instead of calling `debug_storageRangeAt` directly. Returns the contract storage for the specified range. #### Parameters -* `blockHash`: *string* - block hash +- `blockHash`: _string_ - block hash -* `txIndex`: *number* - transaction index from which to start +- `txIndex`: _number_ - transaction index from which to start -* `address`: *string* - contract address +- `address`: _string_ - contract address -* `startKey`: *string* - start key +- `startKey`: _string_ - start key -* `limit`: *number* - number of storage entries to return +- `limit`: _number_ - number of storage entries to return #### Returns -`result`: *object* - [range object](objects.md#range-object). - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_storageRangeAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c",0,"0x0e0d2c8f7794e82164f11798276a188147fbd415","0x0000000000000000000000000000000000000000000000000000000000000000",1], "id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"debug_storageRangeAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c",0,"0x0e0d2c8f7794e82164f11798276a188147fbd415","0x0000000000000000000000000000000000000000000000000000000000000000",1], "id":1} - ``` - - === "JSON result" +`result`: _object_ - [range object](objects.md#range-object). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_storageRangeAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c",0,"0x0e0d2c8f7794e82164f11798276a188147fbd415","0x0000000000000000000000000000000000000000000000000000000000000000",1], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_storageRangeAt", + "params": [ + "0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", + 0, + "0x0e0d2c8f7794e82164f11798276a188147fbd415", + "0x0000000000000000000000000000000000000000000000000000000000000000", + 1 + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "storage": { + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": { + "key": null, + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + }, + "nextKey": "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6" + } +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "storage": { - "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": { - "key": null, - "value": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - }, - "nextKey": "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6" - } - } - ``` +::: ### `debug_traceTransaction` -[Remix](https://remix.ethereum.org/) uses `debug_traceTransaction` to implement debugging. -Use the *Debugger* tab in Remix instead of calling `debug_traceTransaction` directly. +[Remix](https://remix.ethereum.org/) uses `debug_traceTransaction` to implement debugging. Use the _Debugger_ tab in Remix instead of calling `debug_traceTransaction` directly. Reruns the transaction with the same state as when the transaction executed. #### Parameters -* `transactionHash`: *string* - transaction hash +- `transactionHash`: _string_ - transaction hash -* `options`: *object* - request options object with the following fields (all optional and default to `false`): +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): - * `disableStorage`: *boolean* - `true` disables storage capture. + - `disableStorage`: _boolean_ - `true` disables storage capture. - * `disableMemory`: *boolean* - `true` disables memory capture. + - `disableMemory`: _boolean_ - `true` disables memory capture. - * `disableStack` : *boolean* - `true` disables stack capture. + - `disableStack` : _boolean_ - `true` disables stack capture. #### Returns -`result`: *object* - [trace object](objects.md#trace-object) - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e",{"disableStorage":true}],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"debug_traceTransaction","params":["0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e",{"disableStorage":true}],"id":1} - ``` - - === "JSON result" +`result`: _object_ - [trace object](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e",{"disableStorage":true}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceTransaction", + "params": [ + "0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e", + { "disableStorage": true } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null + } + ] + } +} +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : { - "gas" : 21000, - "failed" : false, - "returnValue" : "", - "structLogs" : [ { - "pc" : 0, - "op" : "STOP", - "gas" : 0, - "gasCost" : 0, - "depth" : 1, - "stack" : [ ], - "memory" : [ ], - "storage" : null - } ] - } - } - ``` + ### `debug_traceBlock` @@ -1393,57 +1483,68 @@ Returns full trace of all invoked opcodes of all transactions included in the bl #### Parameters -* `block`: *string* - RLP of the block +- `block`: _string_ - RLP of the block -* `options`: *object* - request options object with the following fields (all optional and default to `false`): +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): - * `disableStorage`: *boolean* - `true` disables storage capture. + - `disableStorage`: _boolean_ - `true` disables storage capture. - * `disableMemory`: *boolean* - `true` disables memory capture. + - `disableMemory`: _boolean_ - `true` disables memory capture. - * `disableStack` : *boolean* - `true` disables stack capture. + - `disableStack` : _boolean_ - `true` disables stack capture. #### Returns -`result`: *object* - [trace object](objects.md#trace-object) +`result`: _object_ - [trace object](objects.md#trace-object) -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlock","params":["0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlock","params":["0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"debug_traceBlock","params":["0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlock", + "params": [ + "0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0" + ], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : { - "gas" : 21000, - "failed" : false, - "returnValue" : "", - "structLogs" : [ { - "pc" : 0, - "op" : "STOP", - "gas" : 0, - "gasCost" : 0, - "depth" : 1, - "stack" : [ ], - "memory" : [ ], - "storage" : null - } ] - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null + } + ] + } +} +``` + + ### `debug_traceBlockByHash` @@ -1451,62 +1552,71 @@ Returns full trace of all invoked opcodes of all transactions included in the bl #### Parameters -* `blockHash`: *string* - block hash +- `blockHash`: _string_ - block hash -* `options`: *object* - request options object with the following fields (all optional and default to `false`): +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): - * `disableStorage`: *boolean* - `true` disables storage capture. + - `disableStorage`: _boolean_ - `true` disables storage capture. - * `disableMemory`: *boolean* - `true` disables memory capture. + - `disableMemory`: _boolean_ - `true` disables memory capture. - * `disableStack` : *boolean* - `true` disables stack capture. + - `disableStack` : _boolean_ - `true` disables stack capture. #### Returns -`result`: *array* of *objects* - list of [trace objects](objects.md#trace-object) - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByHash","params":["0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5"], "id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"debug_traceBlockByHash","params":["0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5"], "id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "gas": 21000, - "failed": false, - "returnValue": "", - "structLogs": [ - { - "pc": 0, - "op": "STOP", - "gas": 0, - "gasCost": 0, - "depth": 1, - "stack": [], - "memory": [], - "storage": {}, - "reason": null - } - ] - } - ] - } - ``` +`result`: _array_ of _objects_ - list of [trace objects](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByHash","params":["0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlockByHash", + "params": [ + "0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": {}, + "reason": null + } + ] + } + ] +} +``` + + ### `debug_traceBlockByNumber` @@ -1514,87 +1624,91 @@ Returns full trace of all invoked opcodes of all transactions included in the bl #### Parameters -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) -* `options`: *object* - request options object with the following fields (all optional and default to `false`): +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): - * `disableStorage`: *boolean* - `true` disables storage capture. + - `disableStorage`: _boolean_ - `true` disables storage capture. - * `disableMemory`: *boolean* - `true` disables memory capture. + - `disableMemory`: _boolean_ - `true` disables memory capture. - * `disableStack` : *boolean* - `true` disables stack capture. + - `disableStack` : _boolean_ - `true` disables stack capture. #### Returns -`result`: *array* of *objects* - list of [trace objects](objects.md#trace-object) - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByNumber","params":["0x7224",{"disableStorage":true}], "id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"debug_traceBlockByNumber","params":["0x7224",{"disableStorage":true}], "id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "gas": 21000, - "failed": false, - "returnValue": "", - "structLogs": [ - { - "pc": 0, - "op": "STOP", - "gas": 0, - "gasCost": 0, - "depth": 1, - "stack": [], - "memory": [], - "storage": null, - "reason": null - } - ] - } - ] - } - ``` +`result`: _array_ of _objects_ - list of [trace objects](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByNumber","params":["0x7224",{"disableStorage":true}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlockByNumber", + "params": ["0x7224", { "disableStorage": true }], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null, + "reason": null + } + ] + } + ] +} +``` + + ## `ETH` methods The `ETH` API methods allow you to interact with the blockchain. -!!! note +:::note - Methods with an equivalent [GraphQL](../../how-to/use-besu-api/graphql.md) query include a GraphQL - request and result in the method example. The parameter and result descriptions apply to the - JSON-RPC requests. The GraphQL specification is defined in the [schema]. +Methods with an equivalent [GraphQL](../../how-to/use-besu-api/graphql.md) query include a GraphQL request and result in the method example. The parameter and result descriptions apply to the JSON-RPC requests. The GraphQL specification is defined in the [schema]. + +::: ### `eth_accounts` Returns a list of account addresses a client owns. -!!!note +:::note + +This method returns an empty object because Besu [doesn't support key management](../../how-to/send-transactions.md) inside the client. - This method returns an empty object because Besu - [doesn't support key management](../../how-to/send-transactions.md) inside the - client. +To provide access to your key store and and then sign transactions, use [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu. - To provide access to your key store and and then sign transactions, use - [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu. +::: #### Parameters @@ -1602,31 +1716,33 @@ None #### Returns -`result`: *array* of *strings* - list of 20-byte account addresses owned by the client +`result`: _array_ of _strings_ - list of 20-byte account addresses owned by the client -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":53}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":53} - ``` +```json +{ "jsonrpc": "2.0", "method": "eth_accounts", "params": [], "id": 53 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : [ ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": [] +} +``` + + ### `eth_blockNumber` @@ -1638,60 +1754,61 @@ None #### Returns -`result`: *string* - hexadecimal integer representing the index corresponding to the block -number of the current chain head +`result`: _string_ - hexadecimal integer representing the index corresponding to the block number of the current chain head -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":51}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":51}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":51} - ``` +```json +{ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 51 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 51, - "result" : "0x2377" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x2377" +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{number}}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{number}}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - block { - number - } - } - ``` +```text +{ + block { + number + } +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "block" : { - "number" : 16221 - } - } - } - ``` +```json +{ + "data": { + "block": { + "number": 16221 + } + } +} +``` + + ### `eth_call` @@ -1699,108 +1816,119 @@ Invokes a contract function locally and does not change the state of the blockch You can interact with contracts using [`eth_sendRawTransaction`](#eth_sendrawtransaction) or `eth_call`. -If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), -the `eth_call` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). +If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the `eth_call` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). #### Parameters -`call`: *object* - [transaction call object](objects.md#transaction-call-object) - -`blockNumber` or `blockHash`: *string* - integer representing a block number, block hash, or one of -the string tags `latest`, `earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`call`: _object_ - [transaction call object](objects.md#transaction-call-object) -!!! note +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) - By default, `eth_call` does not fail if the sender account has an insufficient balance. - This is done by setting the balance of the account to a large amount of ether. - To enforce balance rules, set the [`strict` parameter](objects.md#transaction-call-object) in the transaction call object to `true`. +:::note -#### Returns - -`result`: *string* - return value of the executed contract - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","value":"0x1"}, "latest"],"id":53}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","value":"0x1"}, "latest"],"id":53} - ``` - - === "JSON result" +By default, `eth_call` does not fail if the sender account has an insufficient balance. This is done by setting the balance of the account to a large amount of ether. To enforce balance rules, set the [`strict` parameter](objects.md#transaction-call-object) in the transaction call object to `true`. - ```json - { - "jsonrpc": "2.0", - "id": 53, - "result": "0x" - } - ``` +::: - === "curl GraphQL" +#### Returns - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql - ``` +`result`: _string_ - return value of the executed contract + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","value":"0x1"}, "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_call", + "params": [ + { "to": "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", "value": "0x1" }, + "latest" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + number + call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { + data + status + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17449, + "call": { + "data": "0x", + "status": 1 + } + } + } +} +``` - === "GraphQL" + - ```text - { - block { - number - call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { - data - status - } - } - } - ``` +:::info Example of a simulated contract creation - === "GraphQL result" +The following example creates a simulated contract by not including the `to` parameter from the [transaction call object](objects.md#transaction-call-object) in the `call` parameter. Besu simulates the data to create the contract. - ```json - { - "data" : { - "block" : { - "number" : 17449, - "call" : { - "data" : "0x", - "status" : 1 - } - } - } - } - ``` + -!!! example "Example of a simulated contract creation" +# curl HTTP - The following example creates a simulated contract by not including the `to` parameter from the - [transaction call object](objects.md#transaction-call-object) in the `call` parameter. - Besu simulates the data to create the contract. +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "data":"0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005057600080fd5b5061021e806100606000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032","gas":"0x439cf","gasPrice":"0x0"},"latest"],"id":53}' http://127.0.0.1:8545 +``` - === "curl HTTP" +# JSON result - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "data":"0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005057600080fd5b5061021e806100606000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032","gas":"0x439cf","gasPrice":"0x0"},"latest"],"id":53}' http://127.0.0.1:8545 - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032" +} +``` - === "JSON result" + - ```json - { - "jsonrpc": "2.0", - "id": 53, - "result": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032" - } - ``` +::: ### `eth_chainId` @@ -1812,45 +1940,43 @@ None #### Returns -`result`: *string* - chain ID in hexadecimal +`result`: _string_ - chain ID in hexadecimal -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":51}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":51}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":51} - ``` +```json +{ "jsonrpc": "2.0", "method": "eth_chainId", "params": [], "id": 51 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 51, - "result" : "0x7e2" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x7e2" +} +``` + + ### `eth_coinbase` Returns the client coinbase address. The coinbase address is the account to pay mining rewards to. -To set a coinbase address, start Besu with the `--miner-coinbase` option set to a valid Ethereum -account address. You can get the Ethereum account address from a client such as MetaMask or -Etherscan. For example: +To set a coinbase address, start Besu with the `--miner-coinbase` option set to a valid Ethereum account address. You can get the Ethereum account address from a client such as MetaMask or Etherscan. For example: -!!!example - - ```bash - besu --miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" --rpc-http-enabled - ``` +```bash title="Example" +besu --miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" --rpc-http-enabled +``` #### Parameters @@ -1858,351 +1984,347 @@ None #### Returns -`result`: *string* - coinbase address +`result`: _string_ - coinbase address -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":53}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":53} - ``` +```json +{ "jsonrpc": "2.0", "method": "eth_coinbase", "params": [], "id": 53 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +} +``` + + ### `eth_createAccessList` -Creates an [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) access list that you can -[include in a transaction](../../concepts/transactions/types.md#access_list-transactions). +Creates an [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) access list that you can [include in a transaction](../../concepts/transactions/types.md#access_list-transactions). #### Parameters -`transaction`: *object* - [transaction call object](objects.md#transaction-call-object) +`transaction`: _object_ - [transaction call object](objects.md#transaction-call-object) -`blockNumber` or `blockHash`: *string* - integer representing a block number, block hash, or one of -the string tags `latest`, `earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). #### Returns -`result`: *object* - access list object with the following fields: +`result`: _object_ - access list object with the following fields: + +- `accessList`: _array_ of _objects_ - list of objects with the following fields: + - `address`: _string_ - addresses to be accessed by the transaction + - `storageKeys`: _array_ - storage keys to be accessed by the transaction +- `gasUsed`: _string_ - approximate gas cost for the transaction if the access list is included + + + +# curl HTTP + +```bash +curl -X POST --data '{"method":"eth_createAccessList","params":[{"from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", "data": "0x608060806080608155"}, "pending"],"id":1,"jsonrpc":"2.0"}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "method": "eth_createAccessList", + "params": [ + { + "from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", + "data": "0x608060806080608155" + }, + "pending" + ], + "id": 1, + "jsonrpc": "2.0" +} +``` + +# JSON result + +```json +{ + "accessList": [ + { + "address": "0xa02457e5dfd32bda5fc7e1f1b008aa5979568150", + "storageKeys": [ + "0x0000000000000000000000000000000000000000000000000000000000000081", + ] + } + ] + "gasUsed": "0x125f8" +} +``` + + -* `accessList`: *array* of *objects* - list of objects with the following fields: - * `address`: *string* - addresses to be accessed by the transaction - * `storageKeys`: *array* - storage keys to be accessed by the transaction -* `gasUsed`: *string* - approximate gas cost for the transaction if the access list is included - -!!! example +### `eth_estimateGas` - === "curl HTTP" +Returns an estimate of the gas required for a transaction to complete. The estimation process does not use gas and the transaction is not added to the blockchain. The resulting estimate can be greater than the amount of gas the transaction ends up using, for reasons including EVM mechanics and node performance. - ```bash - curl -X POST --data '{"method":"eth_createAccessList","params":[{"from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", "data": "0x608060806080608155"}, "pending"],"id":1,"jsonrpc":"2.0"}' http://127.0.0.1:8545 - ``` +The `eth_estimateGas` call does not send a transaction. You must call [`eth_sendRawTransaction`](#eth_sendrawtransaction) to execute the transaction. - === "wscat WS" +If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the `eth_estimateGas` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). - ```bash - {"method":"eth_createAccessList","params":[{"from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", "data": "0x608060806080608155"}, "pending"],"id":1,"jsonrpc":"2.0"} - ``` +#### Parameters - === "JSON result" +For `eth_estimateGas`, all fields are optional because setting a gas limit is irrelevant to the estimation process (unlike transactions, in which gas limits apply). - ```json - { - "accessList": [ - { - "address": "0xa02457e5dfd32bda5fc7e1f1b008aa5979568150", - "storageKeys": [ - "0x0000000000000000000000000000000000000000000000000000000000000081", - ] - } - ] - "gasUsed": "0x125f8" - } - ``` +`call`: _object_ - [transaction call object](objects.md#transaction-call-object) -### `eth_estimateGas` +#### Returns -Returns an estimate of the gas required for a transaction to complete. The estimation process -does not use gas and the transaction is not added to the blockchain. The resulting estimate can be -greater than the amount of gas the transaction ends up using, for reasons including EVM mechanics -and node performance. +`result`: _string_ - amount of gas used + +The following example returns an estimate of 21000 wei (`0x5208`) for the transaction. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"from":"0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73","to":"0x44Aa93095D6749A706051658B970b941c72c1D53","value":"0x1"}],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_estimateGas", + "params": [ + { + "from": "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "to": "0x44Aa93095D6749A706051658B970b941c72c1D53", + "value": "0x1" + } + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5208" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{estimateGas (data: {from :\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", to :\"0x8888f1f195afa192cfee860698584c030f4c9db1\"})}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + estimateGas(data: {from: "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f", to: "0x8888f1f195afa192cfee860698584c030f4c9db1"}) + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "estimateGas": 21000 + } + } +} +``` + + + +The following example request estimates the cost of deploying a simple storage smart contract to the network. The data field contains the hash of the compiled contract you want to deploy. (You can get the compiled contract hash from your IDE, for example, **Remix > Compile tab > details > WEB3DEPLOY**.) The result is 113355 wei. + + + +# curl HTTP request + +```bash +curl -X POST \ +http://127.0.0.1:8545 \ +-H 'Content-Type: application/json' \ +-d '{ + "jsonrpc": "2.0", + "method": "eth_estimateGas", + "params": [{ + "from": "0x8bad598904ec5d93d07e204a366d084a80c7694e", + "data": "0x608060405234801561001057600080fd5b5060e38061001f6000396000f3fe6080604052600436106043576000357c0100000000000000000000000000000000000000000000000000000000900480633fa4f24514604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b806000819055505056fea165627a7a7230582020d7ad478b98b85ca751c924ef66bcebbbd8072b93031073ef35270a4c42f0080029" + }], + "id": 1 +}' +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1bacb" +} +``` + + -The `eth_estimateGas` call does not send a transaction. You must call -[`eth_sendRawTransaction`](#eth_sendrawtransaction) to execute the transaction. +### `eth_feeHistory` -If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), -the `eth_estimateGas` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). +Returns base fee per gas and transaction effective priority fee per gas history for the requested block range, allowing you to track trends over time. #### Parameters -For `eth_estimateGas`, all fields are optional because setting a gas limit -is irrelevant to the estimation process (unlike transactions, in which gas limits apply). +- `blockCount`: _integer_ or _string_ - Number of blocks in the requested range. Between 1 and 1024 blocks can be requested in a single query. If blocks in the specified block range are not available, then only the fee history for available blocks is returned. Accepts hexadecimal or integer values. + +- `newestBlock`: _string_ - Integer representing the highest number block of the requested range or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). -`call`: *object* - [transaction call object](objects.md#transaction-call-object) +- `array` of `integers` - (optional) A monotonically increasing list of percentile values to sample from each block's effective priority fees per gas in ascending order, weighted by gas used. #### Returns -`result`: *string* - amount of gas used +`result`: _object_ - [Fee history results object](objects.md#fee-history-results-object). + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_feeHistory","params": ["0x5", "latest", [20,30]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_feeHistory", + "params": ["0x5", "latest", [20, 30]], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "baseFeePerGas": [ + "0x3da8e7618", + "0x3e1ba3b1b", + "0x3dfd72b90", + "0x3d64eee76", + "0x3d4da2da0", + "0x3ccbcac6b" + ], + "gasUsedRatio": [ + 0.5290747666666666, 0.49240453333333334, 0.4615576, 0.49407083333333335, + 0.4669053 + ], + "oldestBlock": "0xfab8ac", + "reward": [ + ["0x59682f00", "0x59682f00"], + ["0x59682f00", "0x59682f00"], + ["0x3b9aca00", "0x59682f00"], + ["0x510b0870", "0x59682f00"], + ["0x3b9aca00", "0x59682f00"] + ] + }, + "id": 1 +} +``` + + -!!! example "Example of cost estimate of a value transaction" +### `eth_gasPrice` - The following example returns an estimate of 21000 wei (`0x5208`) for the transaction. +Returns a percentile gas unit price for the most recent blocks, in Wei. By default, the last 100 blocks are examined and the 50th percentile gas unit price (that is, the median value) is returned. - === "curl HTTP" +If there are no blocks, the value for [`--min-gas-price`](../cli/options.md#min-gas-price) is returned. The value returned is restricted to values between [`--min-gas-price`](../cli/options.md#min-gas-price) and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max). By default, 1000 Wei and 500GWei. - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"from":"0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73","to":"0x44Aa93095D6749A706051658B970b941c72c1D53","value":"0x1"}],"id":53}' http://127.0.0.1:8545 - ``` +Use the [`--api-gas-price-blocks`](../cli/options.md#api-gas-price-blocks), [`--api-gas-price-percentile`](../cli/options.md#api-gas-price-percentile) , and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max) command line options to configure the `eth_gasPrice` default values. - === "wscat WS" +#### Parameters - ```bash - {"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"from":"0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73","to":"0x44Aa93095D6749A706051658B970b941c72c1D53","value":"0x1"}],"id":53} - ``` +None - === "JSON result" +#### Returns - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : "0x5208" - } - ``` +`result`: _string_ - percentile gas unit price for the most recent blocks, in Wei, as a hexadecimal value - === "curl GraphQL" + - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{estimateGas (data: {from :\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", to :\"0x8888f1f195afa192cfee860698584c030f4c9db1\"})}}"}' http://localhost:8547/graphql - ``` +# curl HTTP - === "GraphQL" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":53}' http://127.0.0.1:8545 +``` - ```text - { - block { - estimateGas(data: {from: "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f", to: "0x8888f1f195afa192cfee860698584c030f4c9db1"}) - } - } - ``` - - === "GraphQL result" - - ```json - { - "data" : { - "block" : { - "estimateGas" : 21000 - } - } - } - ``` - -!!! example "Example of cost estimate of deploying a simple storage smart contract" - - The following example request estimates the cost of deploying a simple storage smart contract to - the network. The data field contains the hash of the compiled contract you want to deploy. (You can - get the compiled contract hash from your IDE, for example, **Remix > Compile tab > details > - WEB3DEPLOY**.) The result is 113355 wei. - - === "curl HTTP request" - - ```bash - curl -X POST \ - http://127.0.0.1:8545 \ - -H 'Content-Type: application/json' \ - -d '{ - "jsonrpc": "2.0", - "method": "eth_estimateGas", - "params": [{ - "from": "0x8bad598904ec5d93d07e204a366d084a80c7694e", - "data": "0x608060405234801561001057600080fd5b5060e38061001f6000396000f3fe6080604052600436106043576000357c0100000000000000000000000000000000000000000000000000000000900480633fa4f24514604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b806000819055505056fea165627a7a7230582020d7ad478b98b85ca751c924ef66bcebbbd8072b93031073ef35270a4c42f0080029" - }], - "id": 1 - }' - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x1bacb" - } - ``` - -### `eth_feeHistory` - -Returns base fee per gas and transaction effective priority fee per gas history -for the requested block range, allowing you to track trends over time. - -#### Parameters - -* `blockCount`: *integer* or *string* - Number of blocks in the requested range. Between 1 and 1024 blocks can be requested in a single query. -If blocks in the specified block range are not available, then only the fee history for available blocks is returned. -Accepts hexadecimal or integer values. - -* `newestBlock`: *string* - Integer representing the highest number block of the requested range or one of the string tags `latest`, - `earliest`, or `pending`, as described in - [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). - -* `array` of `integers` - (optional) A monotonically increasing list of percentile values to sample from each block's - effective priority fees per gas in ascending order, weighted by gas used. - -#### Returns - -`result`: *object* - [Fee history results object](objects.md#fee-history-results-object). - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_feeHistory","params": ["0x5", "latest", [20,30]],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_feeHistory","params": ["0x5", "latest", [20,30]],"id":1} - ``` - - === "JSON result" +# wscat WS - ```json - { - "jsonrpc": "2.0", - "result": { - "baseFeePerGas": [ - "0x3da8e7618", - "0x3e1ba3b1b", - "0x3dfd72b90", - "0x3d64eee76", - "0x3d4da2da0", - "0x3ccbcac6b" - ], - "gasUsedRatio": [ - 0.5290747666666666, - 0.49240453333333334, - 0.4615576, - 0.49407083333333335, - 0.4669053 - ], - "oldestBlock": "0xfab8ac", - "reward": [ - [ - "0x59682f00", - "0x59682f00" - ], - [ - "0x59682f00", - "0x59682f00" - ], - [ - "0x3b9aca00", - "0x59682f00" - ], - [ - "0x510b0870", - "0x59682f00" - ], - [ - "0x3b9aca00", - "0x59682f00" - ] - ] - }, - "id": 1 - } - ``` - -### `eth_gasPrice` - -Returns a percentile gas unit price for the most recent blocks, in Wei. By default, -the last 100 blocks are examined and the 50th percentile gas unit price (that is, the median value) -is returned. - -If there are no blocks, the value for [`--min-gas-price`](../cli/options.md#min-gas-price) is returned. -The value returned is restricted to values between [`--min-gas-price`](../cli/options.md#min-gas-price) -and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max). By default, 1000 Wei and -500GWei. - -Use the [`--api-gas-price-blocks`](../cli/options.md#api-gas-price-blocks), [`--api-gas-price-percentile`](../cli/options.md#api-gas-price-percentile) -, and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max) command line -options to configure the `eth_gasPrice` default values. - -#### Parameters - -None +```json +{ "jsonrpc": "2.0", "method": "eth_gasPrice", "params": [], "id": 53 } +``` -#### Returns - -`result`: *string* - percentile gas unit price for the most recent blocks, in Wei, as a hexadecimal value - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":53}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":53} - ``` +# JSON result - === "JSON result" +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x3e8" +} +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : "0x3e8" - } - ``` +# curl GraphQL - === "curl GraphQL" +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{gasPrice}"}' http://localhost:8547/graphql +``` - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{gasPrice}"}' http://localhost:8547/graphql - ``` +# GraphQL - === "GraphQL" +```text +{ + gasPrice +} +``` - ```text - { - gasPrice - } - ``` +# GraphQL result - === "GraphQL result" +```json +{ + "data": { + "gasPrice": "0x3e8" + } +} +``` - ```json - { - "data" : { - "gasPrice" : "0x3e8" - } - } - ``` + ### `eth_getBalance` @@ -2210,67 +2332,72 @@ Returns the account balance of the specified address. #### Parameters -* `address`: *string* - 20-byte account address from which to retrieve the balance +- `address`: _string_ - 20-byte account address from which to retrieve the balance -* `blockNumber` or `blockHash`: *string* - integer representing a block number, block hash, or one -of the string tags `latest`, `earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *string* - current balance, in Wei, as a hexadecimal value +`result`: _string_ - current balance, in Wei, as a hexadecimal value -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"],"id":53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"],"id":53}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_getBalance","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"],"id":53} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBalance", + "params": ["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"], + "id": 53 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : "0x1cfe56f3795885980000" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x1cfe56f3795885980000" +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account ( address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") { balance } }"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account ( address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") { balance } }"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { - balance - } - } - ``` +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + balance + } +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data": { - "account": { - "balance": "0x1ce96a1ffe7620d00000" - } - } - } - ``` +```json +{ + "data": { + "account": { + "balance": "0x1ce96a1ffe7620d00000" + } + } +} +``` + + ### `eth_getBlockByHash` @@ -2278,126 +2405,137 @@ Returns information about the block matching the specified block hash. #### Parameters -* `hash`: *string* - 32-byte hash of a block +- `hash`: _string_ - 32-byte hash of a block -* `verbose`: *boolean* - if `true`, returns the full [transaction objects](objects.md#transaction-object); -if `false`, returns the transaction hashes +- `verbose`: _boolean_ - if `true`, returns the full [transaction objects](objects.md#transaction-object); if `false`, returns the transaction hashes #### Returns -`result`: *object* - [block object](objects.md#block-object), or `null` when there is no -block - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", false],"id":53}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", false],"id":53} - ``` - - === "JSON result" - - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : { - "number" : "0x68b3", - "hash" : "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", - "mixHash" : "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", - "parentHash" : "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", - "nonce" : "0x378da40ff335b070", - "sha3Uncles" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom" : "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", - "transactionsRoot" : "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", - "stateRoot" : "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", - "receiptsRoot" : "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", - "miner" : "0xb42b6c4a95406c78ff892d270ad20b22642e102d", - "difficulty" : "0x66e619a", - "totalDifficulty" : "0x1e875d746ae", - "extraData" : "0xd583010502846765746885676f312e37856c696e7578", - "size" : "0x334", - "gasLimit" : "0x47e7c4", - "gasUsed" : "0x37993", - "timestamp" : "0x5835c54d", - "uncles" : [ ], - "transactions" : [ "0xa0807e117a8dd124ab949f460f08c36c72b710188f01609595223b325e58e0fc", "0xeae6d797af50cb62a596ec3939114d63967c374fa57de9bc0f4e2b576ed6639d" ], - "baseFeePerGas" : "0x7" - } - } - ``` - - === "curl GraphQL" - - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (hash : \"0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92\") {number transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}}"}' http://localhost:8547/graphql - ``` - - === "GraphQL" - - ```text - { - block(hash: "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92") { - number - transactions { - hash - } - timestamp - difficulty - totalDifficulty - gasUsed - gasLimit - hash - nonce - ommerCount - logsBloom - mixHash - ommerHash - extraData - stateRoot - receiptsRoot - transactionCount - transactionsRoot - } - } - ``` - - === "GraphQL result" - - ```json - { - "data" : { - "block" : { - "number" : 17607, - "transactions" : [ ], - "timestamp" : "0x5cdbdfb5", - "difficulty" : "0x1", - "totalDifficulty" : "0x44c8", - "gasUsed" : 0, - "gasLimit" : 4700000, - "hash" : "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92", - "nonce" : "0x0000000000000000", - "ommerCount" : 0, - "logsBloom" : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "mixHash" : "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", - "ommerHash" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "extraData" : "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b841fae6d25da0b91e3e88669d0a765c98479d86d53e9ea1f3fb6b36d7ff22fa622a3da0c49c20e5562c774e90acae8ad487936f6b6019cd8a782db684693cba1e9800", - "stateRoot" : "0xa7086c266aed46cd3bc45579178f8acb36d9d147de575a3ecbf8c7e6f1c737fc", - "receiptsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "transactionCount" : 0, - "transactionsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "baseFeePerGas" : "0x7" - } - } - } - ``` +`result`: _object_ - [block object](objects.md#block-object), or `null` when there is no block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", false],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockByHash", + "params": [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + false + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": { + "number": "0x68b3", + "hash": "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "mixHash": "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", + "parentHash": "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", + "nonce": "0x378da40ff335b070", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", + "transactionsRoot": "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", + "stateRoot": "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", + "receiptsRoot": "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", + "miner": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "difficulty": "0x66e619a", + "totalDifficulty": "0x1e875d746ae", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "size": "0x334", + "gasLimit": "0x47e7c4", + "gasUsed": "0x37993", + "timestamp": "0x5835c54d", + "uncles": [], + "transactions": [ + "0xa0807e117a8dd124ab949f460f08c36c72b710188f01609595223b325e58e0fc", + "0xeae6d797af50cb62a596ec3939114d63967c374fa57de9bc0f4e2b576ed6639d" + ], + "baseFeePerGas": "0x7" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (hash : \"0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92\") {number transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92") { + number + transactions { + hash + } + timestamp + difficulty + totalDifficulty + gasUsed + gasLimit + hash + nonce + ommerCount + logsBloom + mixHash + ommerHash + extraData + stateRoot + receiptsRoot + transactionCount + transactionsRoot + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17607, + "transactions": [], + "timestamp": "0x5cdbdfb5", + "difficulty": "0x1", + "totalDifficulty": "0x44c8", + "gasUsed": 0, + "gasLimit": 4700000, + "hash": "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92", + "nonce": "0x0000000000000000", + "ommerCount": 0, + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b841fae6d25da0b91e3e88669d0a765c98479d86d53e9ea1f3fb6b36d7ff22fa622a3da0c49c20e5562c774e90acae8ad487936f6b6019cd8a782db684693cba1e9800", + "stateRoot": "0xa7086c266aed46cd3bc45579178f8acb36d9d147de575a3ecbf8c7e6f1c737fc", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "transactionCount": 0, + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "baseFeePerGas": "0x7" + } + } +} +``` + + ### `eth_getBlockByNumber` @@ -2405,152 +2543,155 @@ Returns information about the block matching the specified block number. #### Parameters -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, `pending`, `finalized`, or `safe` as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, `pending`, `finalized`, or `safe` as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) -* `verbose`: *boolean* - if `true`, returns the full [transaction objects](objects.md#transaction-object); -if `false`, returns only the hashes of the transactions. +- `verbose`: _boolean_ - if `true`, returns the full [transaction objects](objects.md#transaction-object); if `false`, returns only the hashes of the transactions. #### Returns -`result`: *object* - [block object](objects.md#block-object), or `null` when there is no -block. - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x68B3", true],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x68B3", true],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : { - "number" : "0x68b3", - "hash" : "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", - "mixHash" : "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", - "parentHash" : "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", - "nonce" : "0x378da40ff335b070", - "sha3Uncles" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom" : "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", - "transactionsRoot" : "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", - "stateRoot" : "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", - "receiptsRoot" : "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", - "miner" : "0xb42b6c4a95406c78ff892d270ad20b22642e102d", - "difficulty" : "0x66e619a", - "totalDifficulty" : "0x1e875d746ae", - "extraData" : "0xd583010502846765746885676f312e37856c696e7578", - "size" : "0x334", - "gasLimit" : "0x47e7c4", - "gasUsed" : "0x37993", - "timestamp" : "0x5835c54d", - "uncles" : [ ], - "transactions" : [ ], - "baseFeePerGas" : "0x7" - } - } - ``` - - === "curl GraphQL" - - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (number : 100) {transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot ommers{hash} ommerAt(index : 1){hash} miner{address} account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){balance} parent{hash} }}"}' http://localhost:8547/graphql - ``` - - === "GraphQL" - - ```text - { - block(number: 100) { - transactions { - hash - } - timestamp - difficulty - totalDifficulty - gasUsed - gasLimit - hash - nonce - ommerCount - logsBloom - mixHash - ommerHash - extraData - stateRoot - receiptsRoot - transactionCount - transactionsRoot - ommers { - hash - } - ommerAt(index: 1) { - hash - } - miner { - address - } - account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { - balance - } - parent { - hash - } - } - } - ``` - - === "GraphQL result" - - ```json - { - "data" : { - "block" : { - "transactions" : [ ], - "timestamp" : "0x5cd10933", - "difficulty" : "0x1", - "totalDifficulty" : "0x65", - "gasUsed" : 0, - "gasLimit" : 4700000, - "hash" : "0x63b3ea2bc37fec8f82680eb823652da6af8acebb4f6c4d0ff659c55be473c8b0", - "nonce" : "0x0000000000000000", - "ommerCount" : 0, - "logsBloom" : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "mixHash" : "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", - "ommerHash" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "extraData" : "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8414d877d8d0ced37ea138fab55a978f3740367a24a31731322ecdc3368f11e0d4966c9ce17ae59a76fb94eb436e8a386868f6bd6b0a5678e58daf49f5dd940558b00", - "stateRoot" : "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", - "receiptsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "transactionCount" : 0, - "transactionsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "ommers" : [ ], - "ommerAt" : null, - "miner" : { - "address" : "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" - }, - "account" : { - "balance" : "0xad0f47f269cbf31ac" - }, - "parent" : { - "hash" : "0x7bca25e1fa5e395fd6029eb496a70b6b5495843976bf9e49b993c723ded29d9e" - }, - "baseFeePerGas" : "0x7" - } - } - } - ``` +`result`: _object_ - [block object](objects.md#block-object), or `null` when there is no block. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x68B3", true],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": ["0x68B3", true], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "number": "0x68b3", + "hash": "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "mixHash": "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", + "parentHash": "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", + "nonce": "0x378da40ff335b070", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", + "transactionsRoot": "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", + "stateRoot": "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", + "receiptsRoot": "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", + "miner": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "difficulty": "0x66e619a", + "totalDifficulty": "0x1e875d746ae", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "size": "0x334", + "gasLimit": "0x47e7c4", + "gasUsed": "0x37993", + "timestamp": "0x5835c54d", + "uncles": [], + "transactions": [], + "baseFeePerGas": "0x7" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (number : 100) {transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot ommers{hash} ommerAt(index : 1){hash} miner{address} account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){balance} parent{hash} }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 100) { + transactions { + hash + } + timestamp + difficulty + totalDifficulty + gasUsed + gasLimit + hash + nonce + ommerCount + logsBloom + mixHash + ommerHash + extraData + stateRoot + receiptsRoot + transactionCount + transactionsRoot + ommers { + hash + } + ommerAt(index: 1) { + hash + } + miner { + address + } + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + balance + } + parent { + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactions": [], + "timestamp": "0x5cd10933", + "difficulty": "0x1", + "totalDifficulty": "0x65", + "gasUsed": 0, + "gasLimit": 4700000, + "hash": "0x63b3ea2bc37fec8f82680eb823652da6af8acebb4f6c4d0ff659c55be473c8b0", + "nonce": "0x0000000000000000", + "ommerCount": 0, + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8414d877d8d0ced37ea138fab55a978f3740367a24a31731322ecdc3368f11e0d4966c9ce17ae59a76fb94eb436e8a386868f6bd6b0a5678e58daf49f5dd940558b00", + "stateRoot": "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "transactionCount": 0, + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "ommers": [], + "ommerAt": null, + "miner": { + "address": "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + }, + "account": { + "balance": "0xad0f47f269cbf31ac" + }, + "parent": { + "hash": "0x7bca25e1fa5e395fd6029eb496a70b6b5495843976bf9e49b993c723ded29d9e" + }, + "baseFeePerGas": "0x7" + } + } +} +``` + + ### `eth_getBlockTransactionCountByHash` @@ -2558,64 +2699,72 @@ Returns the number of transactions in the block matching the specified block has #### Parameters -`hash`: *string* - 32-byte block hash +`hash`: _string_ - 32-byte block hash #### Returns -`result`: *number* - integer representing the number of transactions in the specified block, -or `null` if no matching block hash is found +`result`: _number_ - integer representing the number of transactions in the specified block, or `null` if no matching block hash is found -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":53}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":53} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockTransactionCountByHash", + "params": [ + "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238" + ], + "id": 53 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : null - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": null +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097\"){transactionCount}}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097\"){transactionCount}}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - block(hash: "0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097") { - transactionCount - } - } - ``` +```text +{ + block(hash: "0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097") { + transactionCount + } +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "block" : { - "transactionCount" : 1 - } - } - } - ``` +```json +{ + "data": { + "block": { + "transactionCount": 1 + } + } +} +``` + + ### `eth_getBlockTransactionCountByNumber` @@ -2623,135 +2772,143 @@ Returns the number of transactions in a block matching the specified block numbe #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *string* - integer representing the number of transactions in the specified block, -or `null` if no matching block number is found +`result`: _string_ - integer representing the number of transactions in the specified block, or `null` if no matching block number is found -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0xe8"],"id":51}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0xe8"],"id":51}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0xe8"],"id":51} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockTransactionCountByNumber", + "params": ["0xe8"], + "id": 51 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 51, - "result" : "0x8" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x8" +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:232){transactionCount}}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:232){transactionCount}}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - block(number: 232) { - transactionCount - } - } - ``` +```text +{ + block(number: 232) { + transactionCount + } +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "block" : { - "transactionCount" : 1 - } - } - } - ``` +```json +{ + "data": { + "block": { + "transactionCount": 1 + } + } +} +``` + + ### `eth_getCode` -Returns the code of the smart contract at the specified address. -Besu stores compiled smart contract code as a hexadecimal value. +Returns the code of the smart contract at the specified address. Besu stores compiled smart contract code as a hexadecimal value. #### Parameters -`address`: *string* - 20-byte contract address +`address`: _string_ - 20-byte contract address -`blockNumber` or `blockHash`: *string* - integer representing a block number, block hash, or one of -the string tags `latest`, `earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *data* - code stored at the specified address +`result`: _data_ - code stored at the specified address -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"],"id":53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"],"id":53}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_getCode","params":["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"],"id":53} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getCode", + "params": ["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"], + "id": 53 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 53, - "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{"query": "{account(address: \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\"){ code }}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{account(address: \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\"){ code }}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - account(address: "0xa50a51c09a5c451c52bb714527e1974b686d8e77") { - code - } - } - ``` +```text +{ + account(address: "0xa50a51c09a5c451c52bb714527e1974b686d8e77") { + code + } +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "account" : { - "code" : "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" - } - } - } - ``` +```json +{ + "data": { + "account": { + "code": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" + } + } +} +``` + + ### `eth_getFilterChanges` @@ -2759,292 +2916,326 @@ Polls the specified filter and returns an array of changes that have occurred si #### Parameters -`filterId`: *string* - filter ID +`filterId`: _string_ - filter ID #### Returns -`result`: *array* of *strings* or *objects* - if nothing changed since the last poll, an empty list; otherwise: - -* For filters created with `eth_newBlockFilter`, returns block hashes. - -* For filters created with `eth_newPendingTransactionFilter`, returns transaction hashes. - -* For filters created with `eth_newFilter`, returns [log objects](objects.md#log-object). - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0xf8bf5598d9e04fbe84523d42640b9b0e"],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0xf8bf5598d9e04fbe84523d42640b9b0e"],"id":1} - ``` - - === "JSON result" - - !!! example "Example result from a filter created with `eth_newBlockFilter`" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "0xda2bfe44bf85394f0d6aa702b5af89ae50ae22c0928c18b8903d9269abe17e0b", - "0x88cd3a37306db1306f01f7a0e5b25a9df52719ad2f87b0f88ee0e6753ed4a812", - "0x4d4c731fe129ff32b425e6060d433d3fde278b565bbd1fd624d5a804a34f8786" - ] - } - ``` - - !!! example "Example result from a filter created with `eth_newPendingTransactionFilter`" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "0x1e977049b6db09362da09491bee3949d9362080ce3f4fc19721196d508580d46", - "0xa3abc4b9a4e497fd58dc59cdff52e9bb5609136bcd499e760798aa92802769be" - ] - } - ``` - - !!! example "Example result from a filter created with `eth_newFilter`" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x233", - "blockHash": "0xfc139f5e2edee9e9c888d8df9a2d2226133a9bd87c88ccbd9c930d3d4c9f9ef5", - "transactionHash": "0x66e7a140c8fa27fe98fde923defea7562c3ca2d6bb89798aabec65782c08f63d", - "transactionIndex": "0x0", - "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", - "data": "0x0000000000000000000000000000000000000000000000000000000000000004", - "topics": [ - "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" - ] - }, - { - "logIndex": "0x0", - "removed": false, - "blockNumber": "0x238", - "blockHash": "0x98b0ec0f9fea0018a644959accbe69cd046a8582e89402e1ab0ada91cad644ed", - "transactionHash": "0xdb17aa1c2ce609132f599155d384c0bc5334c988a6c368056d7e167e23eee058", - "transactionIndex": "0x0", - "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", - "data": "0x0000000000000000000000000000000000000000000000000000000000000007", - "topics": [ - "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" - ] - } - ] - } - ``` +`result`: _array_ of _strings_ or _objects_ - if nothing changed since the last poll, an empty list; otherwise: + +- For filters created with `eth_newBlockFilter`, returns block hashes. + +- For filters created with `eth_newPendingTransactionFilter`, returns transaction hashes. + +- For filters created with `eth_newFilter`, returns [log objects](objects.md#log-object). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0xf8bf5598d9e04fbe84523d42640b9b0e"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getFilterChanges", + "params": ["0xf8bf5598d9e04fbe84523d42640b9b0e"], + "id": 1 +} +``` + +# JSON result + +```json title="Example result from a filter created with eth_newBlockFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0xda2bfe44bf85394f0d6aa702b5af89ae50ae22c0928c18b8903d9269abe17e0b", + "0x88cd3a37306db1306f01f7a0e5b25a9df52719ad2f87b0f88ee0e6753ed4a812", + "0x4d4c731fe129ff32b425e6060d433d3fde278b565bbd1fd624d5a804a34f8786" + ] +} +``` + +```json title="Example result from a filter created with eth_newPendingTransactionFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x1e977049b6db09362da09491bee3949d9362080ce3f4fc19721196d508580d46", + "0xa3abc4b9a4e497fd58dc59cdff52e9bb5609136bcd499e760798aa92802769be" + ] +} +``` + +```json title="Example result from a filter created with eth_newFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x233", + "blockHash": "0xfc139f5e2edee9e9c888d8df9a2d2226133a9bd87c88ccbd9c930d3d4c9f9ef5", + "transactionHash": "0x66e7a140c8fa27fe98fde923defea7562c3ca2d6bb89798aabec65782c08f63d", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000004", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x238", + "blockHash": "0x98b0ec0f9fea0018a644959accbe69cd046a8582e89402e1ab0ada91cad644ed", + "transactionHash": "0xdb17aa1c2ce609132f599155d384c0bc5334c988a6c368056d7e167e23eee058", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000007", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + + ### `eth_getFilterLogs` Returns an array of [logs](../../concepts/events-and-logs.md) for the specified filter. -Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) -command line option at the default value of `true` to improve log retrieval performance. +Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option at the default value of `true` to improve log retrieval performance. + +:::note -!!! note +`eth_getFilterLogs` is only used for filters created with `eth_newFilter`. To specify a filter object and get logs without creating a filter, use `eth_getLogs`. - `eth_getFilterLogs` is only used for filters created with `eth_newFilter`. To specify a filter - object and get logs without creating a filter, use `eth_getLogs`. +::: #### Parameters -`filterId`: *string* - filter ID +`filterId`: _string_ - filter ID #### Returns -`result`: *array* of *objects* - list of [log objects](objects.md#log-object) - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x5ace5de3985749b6a1b2b0d3f3e1fb69"],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x5ace5de3985749b6a1b2b0d3f3e1fb69"],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : [ { - "logIndex" : "0x0", - "removed" : false, - "blockNumber" : "0xb3", - "blockHash" : "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", - "transactionHash" : "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", - "transactionIndex" : "0x0", - "address" : "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", - "data" : "0x0000000000000000000000000000000000000000000000000000000000000003", - "topics" : [ "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" ] - }, { - "logIndex" : "0x0", - "removed" : false, - "blockNumber" : "0xb6", - "blockHash" : "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", - "transactionHash" : "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", - "transactionIndex" : "0x0", - "address" : "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", - "data" : "0x0000000000000000000000000000000000000000000000000000000000000005", - "topics" : [ "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" ] - } ] - } - ``` +`result`: _array_ of _objects_ - list of [log objects](objects.md#log-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x5ace5de3985749b6a1b2b0d3f3e1fb69"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getFilterLogs", + "params": ["0x5ace5de3985749b6a1b2b0d3f3e1fb69"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb3", + "blockHash": "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", + "transactionHash": "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000003", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb6", + "blockHash": "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", + "transactionHash": "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + + ### `eth_getLogs` Returns an array of [logs](../../concepts/events-and-logs.md) matching a specified filter object. -Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) -command line option at the default value of `true` to improve log retrieval performance. - -!!! important - Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from - its genesis block, might cause Besu to hang for an indeterminable amount of time while generating - the response. - We recommend setting a range limit using the [`--rpc-max-logs-range`](../cli/options.md#rpc-max-logs-range) - option (or leaving it at its default value of 1000). - -#### Parameters - -`filterOptions`: *object* - [filter options object](objects.md#filter-options-object) - -#### Returns - -`result`: *array* of *objects* - list of [log objects](objects.md#log-object) +Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option at the default value of `true` to improve log retrieval performance. -!!! example +:::caution - === "curl HTTP" +Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from its genesis block, might cause Besu to hang for an indeterminable amount of time while generating the response. We recommend setting a range limit using the [`--rpc-max-logs-range`](../cli/options.md#rpc-max-logs-range) option (or leaving it at its default value of 1000). - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":"earliest", "toBlock":"latest", "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", "topics":[]}], "id":1}' http://127.0.0.1:8545 - ``` +::: - === "wscat WS" +#### Parameters - ```bash - {"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":"earliest", "toBlock":"latest", "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", "topics":[]}], "id":1} - ``` +`filterOptions`: _object_ - [filter options object](objects.md#filter-options-object) - === "JSON result" +#### Returns - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : [ { - "logIndex" : "0x0", - "removed" : false, - "blockNumber" : "0xb3", - "blockHash" : "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", - "transactionHash" : "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", - "transactionIndex" : "0x0", - "address" : "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", - "data" : "0x0000000000000000000000000000000000000000000000000000000000000003", - "topics" : [ "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" ] - }, { - "logIndex" : "0x0", - "removed" : false, - "blockNumber" : "0xb6", - "blockHash" : "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", - "transactionHash" : "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", - "transactionIndex" : "0x0", - "address" : "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", - "data" : "0x0000000000000000000000000000000000000000000000000000000000000005", - "topics" : [ "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" ] - } ] +`result`: _array_ of _objects_ - list of [log objects](objects.md#log-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":"earliest", "toBlock":"latest", "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", "topics":[]}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "topics": [] + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb3", + "blockHash": "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", + "transactionHash": "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000003", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb6", + "blockHash": "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", + "transactionHash": "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{logs(filter:{fromBlock: 1486000, toBlock: 1486010, addresses: [\"0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d\"], topics: [[\"0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d\"]]}) {index topics data account{address} transaction{hash} }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + logs(filter: {fromBlock: 1486000, toBlock: 1486010, addresses: ["0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d"], topics: [["0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d"]]}) { + index + topics + data + account { + address + } + transaction { + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "logs": [ + { + "index": 0, + "topics": [ + "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000508918" + ], + "data": "0xa5a04999ec29a8bd19ce32b859280ef9dbb464d846be06f64a1b1012ec08ab03", + "account": { + "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" + }, + "transaction": { + "hash": "0x36a2186344c6a32760e7700fdf3685936220876c51ff39d071eb48c17f7e802f" } - ``` - - === "curl GraphQL" - - ```bash - curl -X POST -H "Content-Type: application/json" --data '{"query": "{logs(filter:{fromBlock: 1486000, toBlock: 1486010, addresses: [\"0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d\"], topics: [[\"0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d\"]]}) {index topics data account{address} transaction{hash} }}"}' http://localhost:8547/graphql - ``` - - === "GraphQL" - - ```text - { - logs(filter: {fromBlock: 1486000, toBlock: 1486010, addresses: ["0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d"], topics: [["0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d"]]}) { - index - topics - data - account { - address - } - transaction { - hash - } - } + }, + { + "index": 0, + "topics": [ + "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000648c72" + ], + "data": "0x0ee96b660ad82c8010c90760a03edfbb40b4af5e3634a8c214e4ac7fa1f61492", + "account": { + "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" + }, + "transaction": { + "hash": "0x9e2cc9e84a9e78839d6f4b591dfd98cc7a454a8ee3cd6ccd0a18e662e22d3818" } - ``` + } + ] + } +} +``` - === "GraphQL result" - - ```json - { - "data": { - "logs": [ - { - "index": 0, - "topics": [ - "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000508918" - ], - "data": "0xa5a04999ec29a8bd19ce32b859280ef9dbb464d846be06f64a1b1012ec08ab03", - "account": { - "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" - }, - "transaction": { - "hash": "0x36a2186344c6a32760e7700fdf3685936220876c51ff39d071eb48c17f7e802f" - } - }, - { - "index": 0, - "topics": [ - "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000648c72" - ], - "data": "0x0ee96b660ad82c8010c90760a03edfbb40b4af5e3634a8c214e4ac7fa1f61492", - "account": { - "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" - }, - "transaction": { - "hash": "0x9e2cc9e84a9e78839d6f4b591dfd98cc7a454a8ee3cd6ccd0a18e662e22d3818" - } - } - ] - } - } - ``` + ### `eth_getMinerDataByBlockHash` @@ -3052,50 +3243,59 @@ Returns miner data for the specified block. #### Parameters -`hash`: *string* - 32-byte block hash +`hash`: _string_ - 32-byte block hash #### Returns -`result`: *object* - [miner data object](objects.md#miner-data-object) - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockHash","params": ["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7"],"id": 1}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method": "eth_getMinerDataByBlockHash","params": ["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7"],"id": 1} - ``` - - === "JSON result" +`result`: _object_ - [miner data object](objects.md#miner-data-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockHash","params": ["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getMinerDataByBlockHash", + "params": [ + "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "netBlockReward": "0x47c6f3739f3da800", + "staticBlockReward": "0x4563918244f40000", + "transactionFee": "0x38456548220800", + "uncleInclusionReward": "0x22b1c8c1227a000", + "uncleRewards": [ + { + "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", + "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" + } + ], + "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "difficulty": "0x7348c20", + "totalDifficulty": "0xa57bcfdd96" + } +} +``` - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "netBlockReward": "0x47c6f3739f3da800", - "staticBlockReward": "0x4563918244f40000", - "transactionFee": "0x38456548220800", - "uncleInclusionReward": "0x22b1c8c1227a000", - "uncleRewards": [ - { - "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", - "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" - } - ], - "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", - "extraData": "0xd583010502846765746885676f312e37856c696e7578", - "difficulty": "0x7348c20", - "totalDifficulty": "0xa57bcfdd96" - } - } - ``` + ### `eth_getMinerDataByBlockNumber` @@ -3103,140 +3303,152 @@ Returns miner data for the specified block. #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *object* - [miner data object](objects.md#miner-data-object) +`result`: _object_ - [miner data object](objects.md#miner-data-object) -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockNumber","params": ["0x7689D2"],"id": 1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockNumber","params": ["0x7689D2"],"id": 1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method": "eth_getMinerDataByBlockNumber","params": ["0x7689D2"],"id": 1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getMinerDataByBlockNumber", + "params": ["0x7689D2"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "netBlockReward": "0x47c6f3739f3da800", - "staticBlockReward": "0x4563918244f40000", - "transactionFee": "0x38456548220800", - "uncleInclusionReward": "0x22b1c8c1227a000", - "uncleRewards": [ - { - "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", - "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" - } - ], - "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", - "extraData": "0xd583010502846765746885676f312e37856c696e7578", - "difficulty": "0x7348c20", - "totalDifficulty": "0xa57bcfdd96" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "netBlockReward": "0x47c6f3739f3da800", + "staticBlockReward": "0x4563918244f40000", + "transactionFee": "0x38456548220800", + "uncleInclusionReward": "0x22b1c8c1227a000", + "uncleRewards": [ + { + "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", + "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" + } + ], + "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "difficulty": "0x7348c20", + "totalDifficulty": "0xa57bcfdd96" + } +} +``` + + ### `eth_getProof` Returns the account and storage values of the specified account, including the Merkle proof. -The API allows IoT devices or mobile apps which are unable to run light clients to verify responses -from untrusted sources, by using a trusted block hash. +The API allows IoT devices or mobile apps which are unable to run light clients to verify responses from untrusted sources, by using a trusted block hash. #### Parameters -`address`: *string* - 20-byte address of the account or contract +`address`: _string_ - 20-byte address of the account or contract -`keys`: *array* of *strings* - list of 32-byte storage keys to generate proofs for +`keys`: _array_ of _strings_ - list of 32-byte storage keys to generate proofs for -`blockNumber` or `blockHash`: *string* - integer representing a block number, block hash, or one of -the string tags `latest`, `earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *object* - account details object with the following fields: +`result`: _object_ - account details object with the following fields: -* `balance`: *string* - account balance +- `balance`: _string_ - account balance -* `codeHash`: *string* - 32-byte hash of the account code +- `codeHash`: _string_ - 32-byte hash of the account code -* `nonce`: *string* - number of transactions sent from the account +- `nonce`: _string_ - number of transactions sent from the account -* `storageHash`: *string* - 32-byte SHA3 of the `storageRoot` +- `storageHash`: _string_ - 32-byte SHA3 of the `storageRoot` -* `accountProof`: *array* of *strings* - list of RLP-encoded Merkle tree nodes, starting with the `stateRoot` +- `accountProof`: _array_ of _strings_ - list of RLP-encoded Merkle tree nodes, starting with the `stateRoot` -* `storageProof`: *array* of *objects* - list of storage entry objects with the following fields: +- `storageProof`: _array_ of _objects_ - list of storage entry objects with the following fields: - * `key`: *string* - storage key + - `key`: _string_ - storage key - * `value`: *string* - storage value + - `value`: _string_ - storage value - * `proof`: *array* of *strings* - list of RLP-encoded Merkle tree nodes, starting with the `storageHash` + - `proof`: _array_ of _strings_ - list of RLP-encoded Merkle tree nodes, starting with the `storageHash` -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getProof","params": [ - "0a8156e7ee392d885d10eaa86afd0e323afdcd95", ["0x0000000000000000000000000000000000000000000000000000000000000347"], "latest"],"id": 1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getProof","params": [ +"0a8156e7ee392d885d10eaa86afd0e323afdcd95", ["0x0000000000000000000000000000000000000000000000000000000000000347"], "latest"],"id": 1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method": "eth_getProof","params": [ - "0a8156e7ee392d885d10eaa86afd0e323afdcd95", ["0x0000000000000000000000000000000000000000000000000000000000000347"], "latest"],"id": 1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getProof", + "params": [ + "0a8156e7ee392d885d10eaa86afd0e323afdcd95", + ["0x0000000000000000000000000000000000000000000000000000000000000347"], + "latest" + ], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "accountProof": [ - "0xf90211a0...608d898380", - "0xf90211a0...ec33f19580", - "0xf901d1a0...9e55584480", - "0xf8718080...18e5777142" - ], - "address": "0x0a8156e7ee392d885d10eaa86afd0e323afdcd95", - "balance": "0x0", - "codeHash": "0x2b6975dcaf69f9bb9a3b30bb6a37b305ce440250bf0dd2f23338cb18e5777142", - "nonce": "0x5f", - "storageHash": "0x917688de43091589aa58c1dfd315105bc9de4478b9ba7471616a4d8a43d46203", - "storageProof": [ - { - "key": "0x0000000000000000000000000000000000000000000000000000000000000347", - "value": "0x0", - "proof": [ - "0xf90211a0...5176779280", - "0xf901f1a0...c208d86580", - "0xf8d180a0...1ce6808080" - ] - } - ] - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "accountProof": [ + "0xf90211a0...608d898380", + "0xf90211a0...ec33f19580", + "0xf901d1a0...9e55584480", + "0xf8718080...18e5777142" + ], + "address": "0x0a8156e7ee392d885d10eaa86afd0e323afdcd95", + "balance": "0x0", + "codeHash": "0x2b6975dcaf69f9bb9a3b30bb6a37b305ce440250bf0dd2f23338cb18e5777142", + "nonce": "0x5f", + "storageHash": "0x917688de43091589aa58c1dfd315105bc9de4478b9ba7471616a4d8a43d46203", + "storageProof": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000347", + "value": "0x0", + "proof": [ + "0xf90211a0...5176779280", + "0xf901f1a0...c208d86580", + "0xf8d180a0...1ce6808080" + ] + } + ] + } +} +``` + + ### `eth_getStorageAt` @@ -3244,71 +3456,76 @@ Returns the value of a storage position at a specified address. #### Parameters -`address`: *string* - 20-byte storage address +`address`: _string_ - 20-byte storage address -`index`: *string* - integer index of the storage position +`index`: _string_ - integer index of the storage position -`blockNumber` or `blockHash`: *string* - integer representing a block number, block hash, or one of -the string tags `latest`, `earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result` : *string* - value at the specified storage position +`result` : _string_ - value at the specified storage position -!!! example +Calculating the correct position depends on the storage you want to retrieve. - Calculating the correct position depends on the storage you want to retrieve. + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getStorageAt","params": ["0x‭3B3F3Eâ€Ŧ","0x0","latest"],"id": 53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getStorageAt","params": ["0x‭3B3F3Eâ€Ŧ","0x0","latest"],"id": 53}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method": "eth_getStorageAt","params": ["0x‭3B3F3Eâ€Ŧ","0x0","latest"],"id": 53} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getStorageAt", + "params": ["0x‭3B3F3Eâ€Ŧ", "0x0", "latest"], + "id": 53 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") {storage(slot: \"0x04\")}}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") {storage(slot: \"0x04\")}}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { - storage(slot: "0x04") - } - } - ``` +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + storage(slot: "0x04") + } +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "account" : { - "storage" : "0x0000000000000000000000000000000000000000000000000000000000000000" - } - } - } - ``` +```json +{ + "data": { + "account": { + "storage": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } +} +``` + + ### `eth_getTransactionByBlockHashAndIndex` @@ -3316,92 +3533,101 @@ Returns transaction information for the specified block hash and transaction ind #### Parameters -`block`: *string* - 32-byte hash of a block +`block`: _string_ - 32-byte hash of a block -`index`: *string* - integer representing the transaction index position +`index`: _string_ - integer representing the transaction index position #### Returns -`result`: *object* - [transaction object](objects.md#transaction-object), or `null` when there is no -transaction - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", "0x2"], "id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", "0x2"], "id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : { - "blockHash" : "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", - "blockNumber" : "0x1442e", - "chainId": 2018, - "from" : "0x70c9217d814985faef62b124420f8dfbddd96433", - "gas" : "0x3d090", - "gasPrice" : "0x57148a6be", - "hash" : "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", - "input" : "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", - "nonce" : "0x2cb2", - "to" : "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", - "transactionIndex" : "0x2", - "value" : "0x0", - "v" : "0x2a", - "r" : "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", - "s" : "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" - } - } - ``` - - === "curl GraphQL" - - ```bash - curl -X POST -H "Content-Type: application/json" --data '{"query": "{ block(hash: \"0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69\") { transactionAt(index: 0) {block{hash} hash } } }"}' http://localhost:8547/graphql - ``` - - === "GraphQL" - - ```text - { - block(hash: "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69") { - transactionAt(index: 0) { - block { - hash - } - hash - } - } - } - ``` +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", "0x2"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByBlockHashAndIndex", + "params": [ + "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "0x2" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "blockNumber": "0x1442e", + "chainId": 2018, + "from": "0x70c9217d814985faef62b124420f8dfbddd96433", + "gas": "0x3d090", + "gasPrice": "0x57148a6be", + "hash": "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", + "input": "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", + "nonce": "0x2cb2", + "to": "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", + "transactionIndex": "0x2", + "value": "0x0", + "v": "0x2a", + "r": "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", + "s": "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{ block(hash: \"0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69\") { transactionAt(index: 0) {block{hash} hash } } }"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69") { + transactionAt(index: 0) { + block { + hash + } + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionAt": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" + } + } + } +} +``` - === "GraphQL result" - - ```json - { - "data" : { - "block" : { - "transactionAt" : { - "block" : { - "hash" : "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" - }, - "hash" : "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" - } - } - } - } - ``` + ### `eth_getTransactionByBlockNumberAndIndex` @@ -3409,98 +3635,100 @@ Returns transaction information for the specified block number and transaction i #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) -`index`: *string* - transaction index position +`index`: _string_ - transaction index position #### Returns -`result`: *object* - [transaction object](objects.md#transaction-object), or `null` when there is no -transaction - -!!! example - - This request returns the third transaction in the 82990 block on the Ropsten testnet. You can - also view this [block](https://ropsten.etherscan.io/txs?block=82990) and [transaction] on - Etherscan. - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["82990", "0x2"], "id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["82990", "0x2"], "id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : { - "blockHash" : "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", - "blockNumber" : "0x1442e", - "chainId": 2018, - "from" : "0x70c9217d814985faef62b124420f8dfbddd96433", - "gas" : "0x3d090", - "gasPrice" : "0x57148a6be", - "hash" : "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", - "input" : "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", - "nonce" : "0x2cb2", - "to" : "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", - "transactionIndex" : "0x2", - "value" : "0x0", - "v" : "0x2a", - "r" : "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", - "s" : "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" - } - } - ``` - - === "curl GraphQL" - - ```bash - curl -X POST -H "Content-Type: application/json" --data '{"query": "{block(number:20303) {transactionAt(index: 0) {block{hash} hash}}}"}' http://localhost:8547/graphql - ``` - - === "GraphQL" - - ```text - { - block(number: 20303) { - transactionAt(index: 0) { - block { - hash - } - hash - } - } - } - ``` +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +This request returns the third transaction in the 82990 block on the Ropsten testnet. You can also view this [block](https://ropsten.etherscan.io/txs?block=82990) and [transaction] on Etherscan. + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["82990", "0x2"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByBlockNumberAndIndex", + "params": ["82990", "0x2"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "blockNumber": "0x1442e", + "chainId": 2018, + "from": "0x70c9217d814985faef62b124420f8dfbddd96433", + "gas": "0x3d090", + "gasPrice": "0x57148a6be", + "hash": "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", + "input": "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", + "nonce": "0x2cb2", + "to": "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", + "transactionIndex": "0x2", + "value": "0x0", + "v": "0x2a", + "r": "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", + "s": "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{block(number:20303) {transactionAt(index: 0) {block{hash} hash}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 20303) { + transactionAt(index: 0) { + block { + hash + } + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionAt": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" + } + } + } +} +``` - === "GraphQL result" - - ```json - { - "data" : { - "block" : { - "transactionAt" : { - "block" : { - "hash" : "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" - }, - "hash" : "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" - } - } - } - } - ``` + ### `eth_getTransactionByHash` @@ -3508,297 +3736,315 @@ Returns transaction information for the specified transaction hash. #### Parameters -`transaction`: *string* - 32-byte transaction hash +`transaction`: _string_ - 32-byte transaction hash #### Returns -`result`: *object* - [transaction object](objects.md#transaction-object), or `null` when there is no -transaction - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44"],"id":53}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44"],"id":53} - ``` - - === "JSON result" - - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : { - "blockHash" : "0x510efccf44a192e6e34bcb439a1947e24b86244280762cbb006858c237093fda", - "blockNumber" : "0x422", - "chainId": 2018, - "from" : "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas" : "0x5208", - "gasPrice" : "0x3b9aca00", - "hash" : "0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44", - "input" : "0x", - "nonce" : "0x1", - "to" : "0x627306090abab3a6e1400e9345bc60c78a8bef57", - "transactionIndex" : "0x0", - "value" : "0x4e1003b28d9280000", - "v" : "0xfe7", - "r" : "0x84caf09aefbd5e539295acc67217563438a4efb224879b6855f56857fa2037d3", - "s" : "0x5e863be3829812c81439f0ae9d8ecb832b531d651fb234c848d1bf45e62be8b9" - } - } - ``` - - === "curl GraphQL" - - ```bash - curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash : \"0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d\") { block{hash} gas gasPrice hash nonce value from {address} to {address} status}}"}' http://localhost:8547/graphql - ``` - - === "GraphQL" - - ```text - { - transaction(hash: "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d") { - block { - hash - } - gas - gasPrice - hash - nonce - value - from { - address - } - to { - address - } - status - } - } - ``` - - === "GraphQL result" - - ```json - { - "data" : { - "transaction" : { - "block" : { - "hash" : "0xb1ef35744bade6980c3a933024b2557a8c724a19e5fdd2116bac712aa5e57198" - }, - "gas" : 21000, - "gasPrice" : "0x2540be400", - "hash" : "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d", - "nonce" : 6, - "value" : "0x8ac7230489e80000", - "from" : { - "address" : "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" - }, - "to" : { - "address" : "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" - }, - "status" : 1 - } - } - } - ``` +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByHash", + "params": [ + "0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": { + "blockHash": "0x510efccf44a192e6e34bcb439a1947e24b86244280762cbb006858c237093fda", + "blockNumber": "0x422", + "chainId": 2018, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0x3b9aca00", + "hash": "0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44", + "input": "0x", + "nonce": "0x1", + "to": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "transactionIndex": "0x0", + "value": "0x4e1003b28d9280000", + "v": "0xfe7", + "r": "0x84caf09aefbd5e539295acc67217563438a4efb224879b6855f56857fa2037d3", + "s": "0x5e863be3829812c81439f0ae9d8ecb832b531d651fb234c848d1bf45e62be8b9" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash : \"0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d\") { block{hash} gas gasPrice hash nonce value from {address} to {address} status}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + transaction(hash: "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d") { + block { + hash + } + gas + gasPrice + hash + nonce + value + from { + address + } + to { + address + } + status + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "transaction": { + "block": { + "hash": "0xb1ef35744bade6980c3a933024b2557a8c724a19e5fdd2116bac712aa5e57198" + }, + "gas": 21000, + "gasPrice": "0x2540be400", + "hash": "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d", + "nonce": 6, + "value": "0x8ac7230489e80000", + "from": { + "address": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + }, + "to": { + "address": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" + }, + "status": 1 + } + } +} +``` + + ### `eth_getTransactionCount` -Returns the number of transactions sent from a specified address. Use the `pending` tag to get the -next account nonce not used by any pending transactions. +Returns the number of transactions sent from a specified address. Use the `pending` tag to get the next account nonce not used by any pending transactions. #### Parameters -`address`: *string* - 20-byte account address +`address`: _string_ - 20-byte account address -`blockNumber` or `blockHash`: *string* - integer representing a block number, block hash, or one of -the string tags `latest`, `earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *string* - integer representing the number of transactions sent from the specified address +`result`: _string_ - integer representing the number of transactions sent from the specified address -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xc94770007dda54cF92009BFF0dE90c06F603a09f","latest"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xc94770007dda54cF92009BFF0dE90c06F603a09f","latest"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xc94770007dda54cF92009BFF0dE90c06F603a09f","latest"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionCount", + "params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f", "latest"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x1" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account (address:\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){transactionCount}}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account (address:\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){transactionCount}}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { - transactionCount - } - } - ``` +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + transactionCount + } +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "account" : { - "transactionCount" : 5 - } - } - } - ``` +```json +{ + "data": { + "account": { + "transactionCount": 5 + } + } +} +``` + + ### `eth_getTransactionReceipt` -Returns the receipt of a transaction by transaction hash. Receipts for pending transactions are not -available. +Returns the receipt of a transaction by transaction hash. Receipts for pending transactions are not available. -If you enabled [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md), the receipt includes -available revert reasons in the response. +If you enabled [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md), the receipt includes available revert reasons in the response. #### Parameters -`transaction`: *string* - 32-byte hash of a transaction +`transaction`: _string_ - 32-byte hash of a transaction #### Returns -`result`: *object* - [transaction receipt object](objects.md#transaction-receipt-object), or `null` when -there is no receipt - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f"],"id":53}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f"],"id":53} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", - "blockNumber": "0x50", - "contractAddress": null, - "cumulativeGasUsed": "0x5208", - "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", - "gasUsed": "0x5208", - "effectiveGasPrice": "0x1", - "logs": [], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "status": "0x1", - "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", - "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", - "transactionIndex": "0x0" - } - } - ``` - - === "curl GraphQL" - - ```bash - curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash: \"0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86\") {block{hash logsBloom} hash createdContract{address} cumulativeGasUsed gas gasUsed logs{topics} from{address} to{address} index}}"}' http://localhost:8547/graphql - ``` - - === "GraphQL" - - ```text - { - transaction(hash: "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86") { - block { - hash - logsBloom - } - hash - createdContract { - address - } - cumulativeGasUsed - gas - gasUsed - logs { - topics - } - from { - address - } - to { - address - } - index - } - } - ``` - - === "GraphQL result" - - ```json - { - "data" : { - "transaction" : { - "block" : { - "hash" : "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69", - "logsBloom" : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - }, - "hash" : "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86", - "createdContract" : null, - "cumulativeGasUsed" : 21000, - "gas" : 21000, - "gasUsed" : 21000, - "effectiveGasPrice": "0x1", - "logs" : [ ], - "from" : { - "address" : "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" - }, - "to" : { - "address" : "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" - }, - "index" : 0 - } - } - } - ``` +`result`: _object_ - [transaction receipt object](objects.md#transaction-receipt-object), or `null` when there is no receipt + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionReceipt", + "params": [ + "0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": null, + "cumulativeGasUsed": "0x5208", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gasUsed": "0x5208", + "effectiveGasPrice": "0x1", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", + "transactionIndex": "0x0" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash: \"0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86\") {block{hash logsBloom} hash createdContract{address} cumulativeGasUsed gas gasUsed logs{topics} from{address} to{address} index}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + transaction(hash: "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86") { + block { + hash + logsBloom + } + hash + createdContract { + address + } + cumulativeGasUsed + gas + gasUsed + logs { + topics + } + from { + address + } + to { + address + } + index + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "transaction": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86", + "createdContract": null, + "cumulativeGasUsed": 21000, + "gas": 21000, + "gasUsed": 21000, + "effectiveGasPrice": "0x1", + "logs": [], + "from": { + "address": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + }, + "to": { + "address": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" + }, + "index": 0 + } + } +} +``` + + ### `eth_getUncleByBlockHashAndIndex` @@ -3806,117 +4052,129 @@ Returns uncle specified by block hash and index. #### Parameters -`block`: *string* - 32-byte block hash +`block`: _string_ - 32-byte block hash -`uncleIndex`: *string* - index of the uncle +`uncleIndex`: _string_ - index of the uncle #### Returns -`result`: *object* - [block object](objects.md#block-object) - -!!! note - - Uncles don't contain individual transactions. - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", "0x0"],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", "0x0"],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc":"2.0", - "id":1, - "result":{ - "difficulty":"0x76b123df93230", - "extraData":"0x50505945206e616e6f706f6f6c2e6f7267", - "gasLimit":"0x7a121d", - "gasUsed":"0x7a0175", - "hash":"0xc20189c0b1a4a23116ab3b177e929137f6e826f17fc4c2e880e7258c620e9817", - "logsBloom":"0x890086c024487ca422be846a201a10e41bc2882902312116c1119609482031e9c000e2a708004a10281024028020c505727a12570c4810121c59024490b040894406a1c23c37a0094810921da3923600c71c03044b40924280038d07ab91964a008084264a01641380798840805a284cce201a8026045451002500113a00de441001320805ca2840037000111640d090442c11116d2112948084240242340400236ce81502063401dcc214b9105194d050884721c1208800b20501a4201400276004142f118e60808284506979a86e050820101c170c185e2310005205a82a2100382422104182090184800c02489e033440218142140045801c024cc1818485", - "miner":"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", - "mixHash":"0xf557cc827e058862aa3ea1bd6088fb8766f70c0eac4117c56cf85b7911f82a14", - "nonce":"0xd320b48904347cdd", - "number":"0x768964", - "parentHash":"0x98d752708b3677df8f439c4529f999b94663d5494dbfc08909656db3c90f6255", - "receiptsRoot":"0x0f838f0ceb73368e7fc8d713a7761e5be31e3b4beafe1a6875a7f275f82da45b", - "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size":"0x21a", - "stateRoot":"0xa0c7d4fca79810c89c517eff8dadb9c6d6f4bcc27c2edfb301301e1cf7dec642", - "timestamp":"0x5cdcbba6", - "totalDifficulty":"0x229ad33cabd4c40d23d", - "transactionsRoot":"0x866e38e91d01ef0387b8e07ccf35cd910224271ccf2b7477b8c8439e8b70f365", - "uncles":[] - } - } - ``` - - === "curl GraphQL" - - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\"){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql - ``` - - === "GraphQL" - - ```text - { - block(hash: "0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7") { - ommerAt(index: 0) { - difficulty - extraData - gasLimit - gasUsed - hash - logsBloom - mixHash - nonce - number - receiptsRoot - stateRoot - timestamp - totalDifficulty - transactionsRoot - } - } - } - ``` - - === "GraphQL result" - - ```json - { - "data": { - "block": { - "difficulty": "0x1", - "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8418e98ef756acdae1e510b1df4b507b7af04eb3802db7fa0f3e73e7d0721b3645e76f4eb3d0dbf0de75620c4405bd5a663247cdd9616482c883053856d857f884a01", - "gasLimit": 4700000, - "gasUsed": 0, - "hash": "0x0efe67972b982eb6be5df84e5238eb07475f86afa8a7de708f6a13ac0ff60d6c", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", - "nonce": "0x0000000000000000", - "number": 200, - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot": "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", - "timestamp": "0x5cd109fb", - "totalDifficulty": "0xc9", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" - } - } - } - ``` +`result`: _object_ - [block object](objects.md#block-object) + +:::note + +Uncles don't contain individual transactions. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", "0x0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleByBlockHashAndIndex", + "params": [ + "0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", + "0x0" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x76b123df93230", + "extraData": "0x50505945206e616e6f706f6f6c2e6f7267", + "gasLimit": "0x7a121d", + "gasUsed": "0x7a0175", + "hash": "0xc20189c0b1a4a23116ab3b177e929137f6e826f17fc4c2e880e7258c620e9817", + "logsBloom": "0x890086c024487ca422be846a201a10e41bc2882902312116c1119609482031e9c000e2a708004a10281024028020c505727a12570c4810121c59024490b040894406a1c23c37a0094810921da3923600c71c03044b40924280038d07ab91964a008084264a01641380798840805a284cce201a8026045451002500113a00de441001320805ca2840037000111640d090442c11116d2112948084240242340400236ce81502063401dcc214b9105194d050884721c1208800b20501a4201400276004142f118e60808284506979a86e050820101c170c185e2310005205a82a2100382422104182090184800c02489e033440218142140045801c024cc1818485", + "miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", + "mixHash": "0xf557cc827e058862aa3ea1bd6088fb8766f70c0eac4117c56cf85b7911f82a14", + "nonce": "0xd320b48904347cdd", + "number": "0x768964", + "parentHash": "0x98d752708b3677df8f439c4529f999b94663d5494dbfc08909656db3c90f6255", + "receiptsRoot": "0x0f838f0ceb73368e7fc8d713a7761e5be31e3b4beafe1a6875a7f275f82da45b", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "size": "0x21a", + "stateRoot": "0xa0c7d4fca79810c89c517eff8dadb9c6d6f4bcc27c2edfb301301e1cf7dec642", + "timestamp": "0x5cdcbba6", + "totalDifficulty": "0x229ad33cabd4c40d23d", + "transactionsRoot": "0x866e38e91d01ef0387b8e07ccf35cd910224271ccf2b7477b8c8439e8b70f365", + "uncles": [] + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\"){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7") { + ommerAt(index: 0) { + difficulty + extraData + gasLimit + gasUsed + hash + logsBloom + mixHash + nonce + number + receiptsRoot + stateRoot + timestamp + totalDifficulty + transactionsRoot + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "difficulty": "0x1", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8418e98ef756acdae1e510b1df4b507b7af04eb3802db7fa0f3e73e7d0721b3645e76f4eb3d0dbf0de75620c4405bd5a663247cdd9616482c883053856d857f884a01", + "gasLimit": 4700000, + "gasUsed": 0, + "hash": "0x0efe67972b982eb6be5df84e5238eb07475f86afa8a7de708f6a13ac0ff60d6c", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "nonce": "0x0000000000000000", + "number": 200, + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", + "timestamp": "0x5cd109fb", + "totalDifficulty": "0xc9", + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" + } + } +} +``` + + ### `eth_getUncleByBlockNumberAndIndex` @@ -3924,106 +4182,113 @@ Returns uncle specified by block number and index. #### Parameters -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) -* `uncleIndex`: *string* - index of the uncle +- `uncleIndex`: _string_ - index of the uncle #### Returns -`result`: *object* - [block object](objects.md#block-object) - -!!! note - - Uncles do not contain individual transactions. - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x7689D2", "0x0"],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x7689D2", "0x0"],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc":"2.0", - "id":1, - "result":{ - "difficulty":"0x77daec467bf93", - "extraData":"0x50505945206e616e6f706f6f6c2e6f7267", - "gasLimit":"0x7a121d", - "gasUsed":"0x7a0f7b", - "hash":"0x42d83ae9c0743f4b1f9c61ff7ea8b164c1bab3627decd49233760680be006ecf", - "logsBloom":"0x888200800000340120220008640200500408006100038400100581c000080240080a0014e8002010080004088040004022402a000c18010001400100002a041141a0610a0052900600041018c0002a0003090020404c00206010010513d00020005380124e08050480710000000108401012b0901c1424006000083a10a8c1040100a0440081050210124400040044304070004001100000012600806008061d0320800000b40042160600002480000000800000c0002100200940801c000820800048024904710000400640490026000a44300309000286088010c2300060003011380006400200812009144042204810209020410a84000410520c08802941", - "miner":"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", - "mixHash":"0xf977fcdb52868be410b75ef2becc35cc312f13ab0a6ce400ecd9d445f66fa3f2", - "nonce":"0x628b28403bf1e3d3", - "number":"0x7689d0", - "parentHash":"0xb32cfdfbf4adb05d30f02fcc6fe039cc6666402142954051c1a1cb9cc91aa11e", - "receiptsRoot":"0x9c7c8361d1a24ea2841432234c81974a9920d3eba2b2b1c496b5f925a95cb4ac", - "sha3Uncles":"0x7d972aa1b182b7e93f1db043f03fbdbfac6874fe7e67e162141bcc0aefa6336b", - "size":"0x21a", - "stateRoot":"0x74e97b77813146344d75acb5a52a006cc6dfaca678a10fb8a484a8443e919272", - "timestamp":"0x5cdcc0a7", - "totalDifficulty":"0x229b0583b4bd2698ca0", - "transactionsRoot":"0x1d21626afddf05e5866de66ca3fcd98f1caf5357eba0cc6ec675606e116a891b", - "uncles":[] - } - } - ``` - - === "curl GraphQL" - - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:2587){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql - ``` - - === "GraphQL" - - ```text - { - block(number: 2587) { - ommerAt(index: 0) { - difficulty - extraData - gasLimit - gasUsed - hash - logsBloom - mixHash - nonce - number - receiptsRoot - stateRoot - timestamp - totalDifficulty - transactionsRoot - } - } - } - ``` - - === "GraphQL result" - - ```json - { - "data" : { - "block" : { - "ommerAt" : null - } - } - } - ``` +`result`: _object_ - [block object](objects.md#block-object) + +:::note + +Uncles do not contain individual transactions. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x7689D2", "0x0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleByBlockNumberAndIndex", + "params": ["0x7689D2", "0x0"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x77daec467bf93", + "extraData": "0x50505945206e616e6f706f6f6c2e6f7267", + "gasLimit": "0x7a121d", + "gasUsed": "0x7a0f7b", + "hash": "0x42d83ae9c0743f4b1f9c61ff7ea8b164c1bab3627decd49233760680be006ecf", + "logsBloom": "0x888200800000340120220008640200500408006100038400100581c000080240080a0014e8002010080004088040004022402a000c18010001400100002a041141a0610a0052900600041018c0002a0003090020404c00206010010513d00020005380124e08050480710000000108401012b0901c1424006000083a10a8c1040100a0440081050210124400040044304070004001100000012600806008061d0320800000b40042160600002480000000800000c0002100200940801c000820800048024904710000400640490026000a44300309000286088010c2300060003011380006400200812009144042204810209020410a84000410520c08802941", + "miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", + "mixHash": "0xf977fcdb52868be410b75ef2becc35cc312f13ab0a6ce400ecd9d445f66fa3f2", + "nonce": "0x628b28403bf1e3d3", + "number": "0x7689d0", + "parentHash": "0xb32cfdfbf4adb05d30f02fcc6fe039cc6666402142954051c1a1cb9cc91aa11e", + "receiptsRoot": "0x9c7c8361d1a24ea2841432234c81974a9920d3eba2b2b1c496b5f925a95cb4ac", + "sha3Uncles": "0x7d972aa1b182b7e93f1db043f03fbdbfac6874fe7e67e162141bcc0aefa6336b", + "size": "0x21a", + "stateRoot": "0x74e97b77813146344d75acb5a52a006cc6dfaca678a10fb8a484a8443e919272", + "timestamp": "0x5cdcc0a7", + "totalDifficulty": "0x229b0583b4bd2698ca0", + "transactionsRoot": "0x1d21626afddf05e5866de66ca3fcd98f1caf5357eba0cc6ec675606e116a891b", + "uncles": [] + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:2587){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 2587) { + ommerAt(index: 0) { + difficulty + extraData + gasLimit + gasUsed + hash + logsBloom + mixHash + nonce + number + receiptsRoot + stateRoot + timestamp + totalDifficulty + transactionsRoot + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerAt": null + } + } +} +``` + + ### `eth_getUncleCountByBlockHash` @@ -4031,63 +4296,72 @@ Returns the number of uncles in a block from a block matching the given block ha #### Parameters -`block`: *string* - 32-byte block hash +`block`: _string_ - 32-byte block hash #### Returns -`result`: *string* - integer representing the number of uncles in the specified block +`result`: _string_ - integer representing the number of uncles in the specified block -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleCountByBlockHash", + "params": [ + "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238" + ], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : 0x0 - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 0x0 +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426\"){ommerCount}}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426\"){ommerCount}}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - block(hash: "0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426") { - ommerCount - } - } - ``` - - === "GraphQL result" - - ```json - { - "data" : { - "block" : { - "ommerCount" : 2 - } - } - } - ``` +```text +{ + block(hash: "0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426") { + ommerCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerCount": 2 + } + } +} +``` + + ### `eth_getUncleCountByBlockNumber` @@ -4095,65 +4369,70 @@ Returns the number of uncles in a block matching the specified block number. #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *string* - integer representing the number of uncles in the specified block +`result`: _string_ - integer representing the number of uncles in the specified block -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleCountByBlockNumber", + "params": ["0xe8"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "0x1" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:\"0x59fd\"){ommerCount}}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:\"0x59fd\"){ommerCount}}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - block(number: "0x59fd") { - ommerCount - } - } - ``` +```text +{ + block(number: "0x59fd") { + ommerCount + } +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "block" : { - "ommerCount" : 0 - } - } - } - ``` +```json +{ + "data": { + "block": { + "ommerCount": 0 + } + } +} +``` + + ### `eth_getWork` @@ -4165,51 +4444,52 @@ None #### Returns -`result`: *array* of *strings* - array with the following items: +`result`: _array_ of _strings_ - array with the following items: -* `header`: *string* - 32-byte hash of the current block header (PoW-hash) +- `header`: _string_ - 32-byte hash of the current block header (PoW-hash) -* `seed`: *string* - 32-byte seed hash used for the DAG +- `seed`: _string_ - 32-byte seed hash used for the DAG -* `target`: *string* - 32-byte required target boundary condition: 2^256 / difficulty +- `target`: _string_ - 32-byte required target boundary condition: 2^256 / difficulty -* `blockNumber`: *string* - hexadecimal integer representing the current block number +- `blockNumber`: _string_ - hexadecimal integer representing the current block number -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getWork","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getWork","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_getWork","params":[],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "eth_getWork", "params": [], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - "0xce5e32ca59cb86799a1879e90150b2c3b882852173e59865e9e79abb67a9d636", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3", - "0x42" - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0xce5e32ca59cb86799a1879e90150b2c3b882852173e59865e9e79abb67a9d636", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3", + "0x42" + ] +} +``` + + ### `eth_hashrate` Returns the number of hashes per second with which the node is mining. -When the stratum server is enabled, this method returns the cumulative hashrate of all sealers -reporting their hashrate. +When the stratum server is enabled, this method returns the cumulative hashrate of all sealers reporting their hashrate. #### Parameters @@ -4217,36 +4497,37 @@ None #### Returns -`result`: *string* - number of hashes per second +`result`: _string_ - number of hashes per second -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x12b" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x12b" +} +``` + + ### `eth_mining` -Whether the client is actively mining new blocks. Besu pauses mining while the client synchronizes -with the network regardless of command settings or methods called. +Whether the client is actively mining new blocks. Besu pauses mining while the client synchronizes with the network regardless of command settings or methods called. #### Parameters @@ -4254,36 +4535,37 @@ None #### Returns -`result`: *boolean* - indicates if the client is actively mining new blocks +`result`: _boolean_ - indicates if the client is actively mining new blocks -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":53}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_mining","params":[],"id":53} - ``` +```json +{ "jsonrpc": "2.0", "method": "eth_mining", "params": [], "id": 53 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": true +} +``` + + ### `eth_newBlockFilter` -Creates a filter to retrieve new block hashes. -To poll for new blocks, use [`eth_getFilterChanges`](#eth_getfilterchanges). +Creates a filter to retrieve new block hashes. To poll for new blocks, use [`eth_getFilterChanges`](#eth_getfilterchanges). #### Parameters @@ -4291,78 +4573,86 @@ None #### Returns -`result`: *string* - filter ID +`result`: _string_ - filter ID -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "eth_newBlockFilter", "params": [], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x9d78b6780f844228b96ecc65a320a825" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x9d78b6780f844228b96ecc65a320a825" +} +``` + + ### `eth_newFilter` -Creates a [log filter](../../concepts/events-and-logs.md). -To poll for logs associated with the created filter, use [`eth_getFilterChanges`](#eth_getfilterchanges). -To get all logs associated with the filter, use [`eth_getFilterLogs`](#eth_getfilterlogs). +Creates a [log filter](../../concepts/events-and-logs.md). To poll for logs associated with the created filter, use [`eth_getFilterChanges`](#eth_getfilterchanges). To get all logs associated with the filter, use [`eth_getFilterLogs`](#eth_getfilterlogs). #### Parameters -`filterOptions`: *object* - [filter options object](objects.md#filter-options-object) +`filterOptions`: _object_ - [filter options object](objects.md#filter-options-object) -!!! note +:::note - `fromBlock` and `toBlock` in the filter options object default to `latest`. +`fromBlock` and `toBlock` in the filter options object default to `latest`. + +::: #### Returns -`result`: *string* - filter ID +`result`: _string_ - filter ID -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"fromBlock":"earliest", "toBlock":"latest", "topics":[]}],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"fromBlock":"earliest", "toBlock":"latest", "topics":[]}],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_newFilter","params":[{"fromBlock":"earliest", "toBlock":"latest", "topics":[]}],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_newFilter", + "params": [{ "fromBlock": "earliest", "toBlock": "latest", "topics": [] }], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x1ddf0c00989044e9b41cc0ae40272df3" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1ddf0c00989044e9b41cc0ae40272df3" +} +``` + + ### `eth_newPendingTransactionFilter` -Creates a filter to retrieve new pending transactions hashes. -To poll for new pending transactions, use [`eth_getFilterChanges`](#eth_getfilterchanges). +Creates a filter to retrieve new pending transactions hashes. To poll for new pending transactions, use [`eth_getFilterChanges`](#eth_getfilterchanges). #### Parameters @@ -4370,31 +4660,38 @@ None #### Returns -`result`: *string* - filter ID +`result`: _string_ - filter ID -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_newPendingTransactionFilter", + "params": [], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x443d6a77c4964707a8554c92f7e4debd" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x443d6a77c4964707a8554c92f7e4debd" +} +``` + + ### `eth_protocolVersion` @@ -4406,135 +4703,144 @@ None #### Returns -`result`: *string* - Ethereum protocol version +`result`: _string_ - Ethereum protocol version -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "eth_protocolVersion", "params": [], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "0x3f" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x3f" +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{protocolVersion}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{protocolVersion}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - protocolVersion - } - ``` +```text +{ + protocolVersion +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "protocolVersion" : 63 - } - } - ``` +```json +{ + "data": { + "protocolVersion": 63 + } +} +``` + + ### `eth_sendRawTransaction` -Sends a [signed transaction](../../how-to/send-transactions.md). -A transaction can send ether, deploy a contract, or interact with a contract. -Set the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../cli/options.md#rpc-tx-feecap) CLI option. +Sends a [signed transaction](../../how-to/send-transactions.md). A transaction can send ether, deploy a contract, or interact with a contract. Set the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../cli/options.md#rpc-tx-feecap) CLI option. You can interact with contracts using `eth_sendRawTransaction` or [`eth_call`](#eth_call). -To avoid exposing your private key, create signed transactions offline and send the signed -transaction data using `eth_sendRawTransaction`. +To avoid exposing your private key, create signed transactions offline and send the signed transaction data using `eth_sendRawTransaction`. + +:::info -!!! important +Besu doesn't implement [`eth_sendTransaction`](../../how-to/send-transactions.md). - Besu doesn't implement [`eth_sendTransaction`](../../how-to/send-transactions.md). +[EthSigner](https://docs.ethsigner.consensys.net/) provides transaction signing and implements [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). - [EthSigner](https://docs.ethsigner.consensys.net/) provides transaction signing and implements - [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). +::: #### Parameters -`transaction`: *string* - signed transaction serialized to hexadecimal format +`transaction`: _string_ - signed transaction serialized to hexadecimal format -!!! note +:::note - [Creating and sending transactions](../../how-to/send-transactions.md) includes - examples of creating signed transactions using the - [web3.js](https://github.com/ethereum/web3.js/) library. +[Creating and sending transactions](../../how-to/send-transactions.md) includes examples of creating signed transactions using the [web3.js](https://github.com/ethereum/web3.js/) library. + +::: #### Returns -`result`: *string* - 32-byte transaction hash +`result`: _string_ - 32-byte transaction hash -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_sendRawTransaction", + "params": [ + "0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833" + ], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "id":1, - "jsonrpc": "2.0", - "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" - } - ``` +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation {sendRawTransaction(data: \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\")}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation {sendRawTransaction(data: \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\")}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - mutation { - sendRawTransaction(data: "0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833") - } - ``` +```text +mutation { + sendRawTransaction(data: "0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833") +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "sendRawTransaction" : "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" - } - } - ``` +```json +{ + "data": { + "sendRawTransaction": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" + } +} +``` + + ### `eth_submitHashrate` @@ -4542,86 +4848,99 @@ Submits the mining hashrate. This is used by mining software such as [Ethminer]( #### Parameters -* `hashrate`: *string* - 32-byte hexadecimal string representation of the hashrate +- `hashrate`: _string_ - 32-byte hexadecimal string representation of the hashrate -* `id`: *string* - 32-byte random hexadecimal ID identifying the client +- `id`: _string_ - 32-byte random hexadecimal ID identifying the client #### Returns -`result`: *boolean* - indicates if submission is successful +`result`: _boolean_ - indicates if submission is successful -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitHashrate", "params":["0x0000000000000000000000000000000000000000000000000000000000500000", "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitHashrate", "params":["0x0000000000000000000000000000000000000000000000000000000000500000", "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0", "method":"eth_submitHashrate", "params":["0x0000000000000000000000000000000000000000000000000000000000500000", "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_submitHashrate", + "params": [ + "0x0000000000000000000000000000000000000000000000000000000000500000", + "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c" + ], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc":"2.0", - "id":1, - "result": true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + ### `eth_submitWork` -Submits a proof of work (Ethash) solution. -This is used by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer). +Submits a proof of work (Ethash) solution. This is used by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer). #### Parameters -* `nonce`: *string* - retrieved 8-byte nonce +- `nonce`: _string_ - retrieved 8-byte nonce -* `header`: *string* - 32-byte hash of the block header (PoW-hash) +- `header`: _string_ - 32-byte hash of the block header (PoW-hash) -* `digest`: *string* - 32-bytes mix digest +- `digest`: _string_ - 32-bytes mix digest #### Returns -`result`: *boolean* - indicates if the provided solution is valid +`result`: _boolean_ - indicates if the provided solution is valid -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":73} - ``` +```bash +{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":73} +``` - === "JSON result" +# JSON result - ```json - { - "id":1, - "jsonrpc":"2.0", - "result": true - } - ``` +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": true +} +``` + + ### `eth_syncing` Returns an object with data about the synchronization status, or `false` if not synchronizing. -!!! note +:::note - Once the node reaches the head of the chain, `eth_syncing` returns false, indicating that there is no active syncing target. +Once the node reaches the head of the chain, `eth_syncing` returns false, indicating that there is no active syncing target. + +::: #### Parameters @@ -4629,225 +4948,236 @@ None #### Returns -`result`: *object* or *boolean* - synchronization status data object with the following fields, or `false` if not -synchronizing: +`result`: _object_ or _boolean_ - synchronization status data object with the following fields, or `false` if not synchronizing: -* `startingBlock`: *string* - index of the highest block on the blockchain when the network - synchronization starts +- `startingBlock`: _string_ - index of the highest block on the blockchain when the network synchronization starts -* `currentBlock`: *string* - index of the latest block (also known as the best block) for the - current node (this is the same index that [`eth_blockNumber`](#eth_blocknumber) returns.) +- `currentBlock`: _string_ - index of the latest block (also known as the best block) for the current node (this is the same index that [`eth_blockNumber`](#eth_blocknumber) returns.) -* `highestBlock`: *string* - index of the highest known block in the peer network (that is, the - highest block so far discovered among peer nodes. This is the same value as `currentBlock` if - the current node has no peers.) +- `highestBlock`: _string_ - index of the highest known block in the peer network (that is, the highest block so far discovered among peer nodes. This is the same value as `currentBlock` if the current node has no peers.) -* `pulledStates`: *string* - if fast synchronizing, the number of state entries fetched so far, - or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, this - field is not returned.) +- `pulledStates`: _string_ - if fast synchronizing, the number of state entries fetched so far, or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, this field is not returned.) -* `knownStates`: *string* - if fast synchronizing, the number of states the node knows of so - far, or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, - this field is not returned.) +- `knownStates`: _string_ - if fast synchronizing, the number of states the node knows of so far, or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, this field is not returned.) -!!! example + - === "curl HTTP" +# curl HTTP - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":51}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":51}' http://127.0.0.1:8545 +``` - === "wscat WS" +# wscat WS - ```bash - {"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":51} - ``` +```json +{ "jsonrpc": "2.0", "method": "eth_syncing", "params": [], "id": 51 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 51, - "result" : { - "startingBlock" : "0x0", - "currentBlock" : "0x1518", - "highestBlock" : "0x9567a3", - "pulledStates" : "0x203ca", - "knownStates" : "0x200636" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x1518", + "highestBlock": "0x9567a3", + "pulledStates": "0x203ca", + "knownStates": "0x200636" + } +} +``` - === "curl GraphQL" +# curl GraphQL - ```bash - curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock pulledStates knownStates}}"}' http://localhost:8547/graphql - ``` +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock pulledStates knownStates}}"}' http://localhost:8547/graphql +``` - === "GraphQL" +# GraphQL - ```text - { - syncing { - startingBlock - currentBlock - highestBlock - pulledStates - knownStates - } - } - ``` +```text +{ + syncing { + startingBlock + currentBlock + highestBlock + pulledStates + knownStates + } +} +``` - === "GraphQL result" +# GraphQL result - ```json - { - "data" : { - "syncing" : { - "startingBlock" : 0, - "currentBlock" : 5400, - "highestBlock" : 9791395, - "pullStates" : 132042, - "knownStates" : 2098742 - } - } - } - ``` +```json +{ + "data": { + "syncing": { + "startingBlock": 0, + "currentBlock": 5400, + "highestBlock": 9791395, + "pullStates": 132042, + "knownStates": 2098742 + } + } +} +``` + + ### `eth_uninstallFilter` -Uninstalls a filter with the specified ID. -When a filter is no longer required, call this method. +Uninstalls a filter with the specified ID. When a filter is no longer required, call this method. -Filters time out when not requested by [`eth_getFilterChanges`](#eth_getfilterchanges) or -[`eth_getFilterLogs`](#eth_getfilterlogs) for 10 minutes. +Filters time out when not requested by [`eth_getFilterChanges`](#eth_getfilterchanges) or [`eth_getFilterLogs`](#eth_getfilterlogs) for 10 minutes. #### Parameters -`filterId`: *string* - filter ID +`filterId`: _string_ - filter ID #### Returns -`result`: *boolean* - indicates if the filter is successfully uninstalled +`result`: _boolean_ - indicates if the filter is successfully uninstalled -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0x70355a0b574b437eaa19fe95adfedc0a"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0x70355a0b574b437eaa19fe95adfedc0a"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0x70355a0b574b437eaa19fe95adfedc0a"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "eth_uninstallFilter", + "params": ["0x70355a0b574b437eaa19fe95adfedc0a"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + ## `MINER` methods The `MINER` API methods allow you to control the node’s mining operation. -!!! note +:::note + +The `MINER` API methods are not enabled by default for JSON-RPC. To enable the `MINER` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. - The `MINER` API methods are not enabled by default for JSON-RPC. To enable the `MINER` API - methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. +::: ### `miner_changeTargetGasLimit` -Updates the target gas limit set using the [`--target-gas-limit`](../cli/options.md#target-gas-limit) -command line option. +Updates the target gas limit set using the [`--target-gas-limit`](../cli/options.md#target-gas-limit) command line option. #### Parameters -`gasPrice`: *number* - target gas price in Wei +`gasPrice`: _number_ - target gas price in Wei #### Returns -`result`: *string* - `Success` or `error` +`result`: _string_ - `Success` or `error` -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"miner_changeTargetGasLimit","params":[800000], "id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_changeTargetGasLimit","params":[800000], "id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"miner_changeTargetGasLimit","params":[800000], "id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "miner_changeTargetGasLimit", + "params": [800000], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "Success" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + ### `miner_setCoinbase` Sets the coinbase, the address for the mining rewards. -!!! note +:::note + +You can also use `miner_setEtherbase` as an alternative method. They both work the same way. Etherbase is a historic name for coinbase. - You can also use `miner_setEtherbase` as an alternative method. They both work the same way. - Etherbase is a historic name for coinbase. +::: #### Parameters -`coinbase`: *string* - Account address you pay mining rewards to +`coinbase`: _string_ - Account address you pay mining rewards to #### Returns -`result`: *boolean* - `true` when address is set +`result`: _boolean_ - `true` when address is set -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"miner_setCoinbase","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_setCoinbase","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"miner_setCoinbase","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "miner_setCoinbase", + "params": ["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + ### `miner_start` -Starts the mining process. To start mining, you must first specify a miner coinbase using the -[`--miner-coinbase`](../cli/options.md#miner-coinbase) command line option or using [`miner_setCoinbase`](#miner_setcoinbase). +Starts the mining process. To start mining, you must first specify a miner coinbase using the [`--miner-coinbase`](../cli/options.md#miner-coinbase) command line option or using [`miner_setCoinbase`](#miner_setcoinbase). #### Parameters @@ -4855,31 +5185,33 @@ None #### Returns -`result`: *boolean* - `true` if mining starts, or if the node is already mining +`result`: _boolean_ - `true` if mining starts, or if the node is already mining -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"miner_start","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_start","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"miner_start","params":[],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "miner_start", "params": [], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + ### `miner_stop` @@ -4891,31 +5223,33 @@ None #### Returns -`result`: *boolean* - `true` if mining stops, or if the node is not mining +`result`: _boolean_ - `true` if mining stops, or if the node is not mining -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"miner_stop","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_stop","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"miner_stop","params":[],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "miner_stop", "params": [], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + ## `NET` methods @@ -4931,31 +5265,33 @@ None #### Returns -`result`: *string* - [enode URL](../../concepts/node-keys.md#enode-url) of the node +`result`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of the node -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"net_enode","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_enode","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"net_enode","params":[],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"net_enode","params":[],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 1, - "result" : "enode://6a63160d0ccef5e4986d270937c6c8d60a9a4d3b25471cda960900d037c61988ea14da67f69dbfb3497c465d0de1f001bb95598f74b68a39a5156a608c42fa1b@127.0.0.1:30303" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "enode://6a63160d0ccef5e4986d270937c6c8d60a9a4d3b25471cda960900d037c61988ea14da67f69dbfb3497c465d0de1f001bb95598f74b68a39a5156a608c42fa1b@127.0.0.1:30303" +} +``` + + ### `net_listening` @@ -4967,31 +5303,33 @@ None #### Returns -`result`: *boolean* - indicates if the client is actively listening for network connections +`result`: _boolean_ - indicates if the client is actively listening for network connections -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":53}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"net_listening","params":[],"id":53} - ``` +```bash +{"jsonrpc":"2.0","method":"net_listening","params":[],"id":53} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : true - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": true +} +``` + + ### `net_peerCount` @@ -5003,40 +5341,43 @@ None #### Returns -`result`: *string* - number of connected peers in hexadecimal +`result`: _string_ - number of connected peers in hexadecimal -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":53}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":53} - ``` +```json +{ "jsonrpc": "2.0", "method": "net_peerCount", "params": [], "id": 53 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : "0x5" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5" +} +``` + + ### `net_services` Returns enabled services (for example, `jsonrpc`) and the host and port for each service. -!!! note +:::note - The [`--nat-method`](../cli/options.md#nat-method) setting affects the JSON-RPC and P2P host and - port values, but not the metrics host and port values. +The [`--nat-method`](../cli/options.md#nat-method) setting affects the JSON-RPC and P2P host and port values, but not the metrics host and port values. + +::: #### Parameters @@ -5044,44 +5385,46 @@ None #### Returns -`result`: *object* - enabled services +`result`: _object_ - enabled services -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"net_services","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_services","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"net_services","params":[],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"net_services","params":[],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "jsonrpc": { - "host": "127.0.0.1", - "port": "8545" - }, - "p2p" : { - "host" : "127.0.0.1", - "port" : "30303" - }, - "metrics" : { - "host": "127.0.0.1", - "port": "9545" - } - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "jsonrpc": { + "host": "127.0.0.1", + "port": "8545" + }, + "p2p": { + "host": "127.0.0.1", + "port": "30303" + }, + "metrics": { + "host": "127.0.0.1", + "port": "9545" + } + } +} +``` + + ### `net_version` @@ -5093,10 +5436,10 @@ None #### Returns -`result`: *string* - current network ID +`result`: _string_ - current network ID -| Network ID | Chain | Network | Description -|------------|-------|---------|-------------------------------| +| Network ID | Chain | Network | Description | +| ---------- | ----- | ------- | ----------------------------- | | `1` | ETH | Mainnet | Main Ethereum network | | `5` | ETH | Goerli | PoS test network | | `11155111` | ETH | Sepolia | PoS test network | @@ -5106,56 +5449,59 @@ None | `6` | ETC | Kotti | PoA test network using Clique | | `212` | ETC | Astor | PoW test network | -!!! note +:::note - For almost all networks, network ID and chain ID are the same. +For almost all networks, network ID and chain ID are the same. - The only networks in the table above with different network and chain IDs are - Classic with a chain ID of `61` and Mordor with a chain ID of `63`. +The only networks in the table above with different network and chain IDs are Classic with a chain ID of `61` and Mordor with a chain ID of `63`. -!!! example +::: - === "curl HTTP request" + - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":53}' http://127.0.0.1:8545 - ``` +# curl HTTP request - === "wscat WS request" +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":53}' http://127.0.0.1:8545 +``` - ```bash - {"jsonrpc":"2.0","method":"net_version","params":[],"id":53} - ``` +# wscat WS request - === "JSON result for Mainnet" +```json +{ "jsonrpc": "2.0", "method": "net_version", "params": [], "id": 53 } +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 51, - "result" : "1" - } - ``` +# JSON result for Mainnet - === "JSON result for Goerli" +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "1" +} +``` - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : "5" - } - ``` +# JSON result for Goerli + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "5" +} +``` + + ## `PLUGINS` methods The `PLUGINS` API methods provide plugin-related functionality. -!!! note +:::note + +The `PLUGINS` API methods are not enabled by default for JSON-RPC. To enable the `PLUGINS` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. - The `PLUGINS` API methods are not enabled by default for JSON-RPC. To enable the `PLUGINS` API - methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. +::: ### `plugins_reloadPluginConfig` @@ -5163,790 +5509,827 @@ Reloads specified plugin configuration. #### Parameters -`plugin`: *string* - plugin +`plugin`: _string_ - plugin #### Returns -`result`: *string* - `Success` +`result`: _string_ - `Success` -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"plugins_reloadPluginConfig","params":["tech.pegasys.plus.plugin.kafka.KafkaPlugin"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"plugins_reloadPluginConfig","params":["tech.pegasys.plus.plugin.kafka.KafkaPlugin"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"plugins_reloadPluginConfig","params":["tech.pegasys.plus.plugin.kafka.KafkaPlugin"],"id":1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "plugins_reloadPluginConfig", + "params": ["tech.pegasys.plus.plugin.kafka.KafkaPlugin"], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": "Success" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + ## `TRACE` methods The `TRACE` API is a more concise alternative to the [`DEBUG` API](#debug-methods). -!!! note +:::note + +The `TRACE` API methods are not enabled by default for JSON-RPC. To enable the `TRACE` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. - The `TRACE` API methods are not enabled by default for JSON-RPC. To enable the `TRACE` API - methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. +::: ### `trace_block` Provides transaction processing of [type `trace`](../trace-types.md#trace) for the specified block. -!!! important +:::tip - Your node must be an archive node (that is, synchronized without pruning or fast sync) or the - requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) - with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: #### Parameters -`blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *array* of *objects* - list of [calls to other contracts](../trace-types.md#trace) containing -one object per call, in transaction execution order; if revert reason is enabled with -[`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), -the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"trace_block","params":["0x6"],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"trace_block","params":["0x6"],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "result": [ - { - "action": { - "callType": "call", - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0xffad82", - "input": "0x0000000000000000000000000000000000000999", - "to": "0x0020000000000000000000000000000000000000", - "value": "0x0" - }, - "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", - "blockNumber": 6, - "result": { - "gasUsed": "0x7536", - "output": "0x" - }, - "subtraces": 1, - "traceAddress": [], - "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", - "transactionPosition": 0, - "type": "call" - }, - { - "action": { - "address": "0x0020000000000000000000000000000000000000", - "balance": "0x300", - "refundAddress": "0x0000000000000999000000000000000000000000" - }, - "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", - "blockNumber": 6, - "result": null, - "subtraces": 0, - "traceAddress": [ - 0 - ], - "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", - "transactionPosition": 0, - "type": "suicide" - }, - { - "action": { - "author": "0x0000000000000000000000000000000000000000", - "rewardType": "block", - "value": "0x1bc16d674ec80000" - }, - "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", - "blockNumber": 6, - "result": null, - "subtraces": 0, - "traceAddress": [], - "transactionHash": null, - "transactionPosition": null, - "type": "reward" - } - ], - "id": 1 - } - ``` +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_block","params":["0x6"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "trace_block", "params": ["0x6"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad82", + "input": "0x0000000000000000000000000000000000000999", + "to": "0x0020000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": { + "gasUsed": "0x7536", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "call" + }, + { + "action": { + "address": "0x0020000000000000000000000000000000000000", + "balance": "0x300", + "refundAddress": "0x0000000000000999000000000000000000000000" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": null, + "subtraces": 0, + "traceAddress": [0], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "suicide" + }, + { + "action": { + "author": "0x0000000000000000000000000000000000000000", + "rewardType": "block", + "value": "0x1bc16d674ec80000" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": null, + "subtraces": 0, + "traceAddress": [], + "transactionHash": null, + "transactionPosition": null, + "type": "reward" + } + ], + "id": 1 +} +``` + + ### `trace_call` Executes the given call and returns a number of possible traces for it. -!!! important +:::info + +The requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). - The requested transaction must be contained in a block within the number of - [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) - (by default, 1024). +::: #### Parameters -* `call`: *object* - [transaction call object](objects.md#transaction-call-object) +- `call`: _object_ - [transaction call object](objects.md#transaction-call-object) -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) -* `options`: *array* of *strings* - list of tracing options; tracing options are -[`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any -combination of the three options including none of them. +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. #### Returns -`result`: *array* of *objects* - list of [calls to other contracts](../trace-types.md#trace) containing -one object per call, in transaction execution order - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"trace_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73","to":"0x0010000000000000000000000000000000000000","gas":"0xfffff2","gasPrice":"0xef","value":"0x0","data":"0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002","nonce":"0x0"},["trace"],"latest"],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"trace_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73","to":"0x0010000000000000000000000000000000000000","gas":"0xfffff2","gasPrice":"0xef","value":"0x0","data":"0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002","nonce":"0x0"},["trace"],"latest"],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "result": { - "output" : "0x", - "stateDiff" : null, - "trace" : [ { - "action" : { - "callType" : "call", - "from" : "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas" : "0xffabba", - "input" : "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002", - "to" : "0x0010000000000000000000000000000000000000", - "value" : "0x0" - }, - "result" : { - "gasUsed" : "0x9c58", - "output" : "0x" - }, - "subtraces" : 0, - "traceAddress" : [ ], - "type" : "call" - } ], - "vmTrace" : null - }, - "id" : 2 - }, - ``` +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73","to":"0x0010000000000000000000000000000000000000","gas":"0xfffff2","gasPrice":"0xef","value":"0x0","data":"0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002","nonce":"0x0"},["trace"],"latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_call", + "params": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "to": "0x0010000000000000000000000000000000000000", + "gas": "0xfffff2", + "gasPrice": "0xef", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002", + "nonce": "0x0" + }, + ["trace"], + "latest" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas" : "0xffabba", + "input" : "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002", + "to" : "0x0010000000000000000000000000000000000000", + "value" : "0x0" + }, + "result" : { + "gasUsed" : "0x9c58", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, +"id" : 2 +}, +``` + + ### `trace_callMany` Performs multiple call traces on top of the same block. You can trace dependent transactions. -!!! important +:::info - The requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) - with [pruning enabled](../cli/options.md#pruning-enabled) - (by default, 1024). +The requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: #### Parameters -* `options`: *array* of *strings* - list of tracing options; tracing options are - [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any - combination of the three options including none of them. +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, - `earliest`, or `pending`, as described in - [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) #### Returns -`result`: *array* of *objects* - list of [calls to other contracts](../trace-types.md#trace) containing -one object per call, in transaction execution order +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"latest"],"id":1} - ``` +```json +{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"latest"],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "result": [ - { - "output" : "0x", - "stateDiff" : null, - "trace" : [ { - "action" : { - "callType" : "call", - "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "gas" : "0x1dcd12f8", - "input" : "0x", - "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "value" : "0x186a0" - }, - "result" : { - "gasUsed" : "0x0", - "output" : "0x" - }, - "subtraces" : 0, - "traceAddress" : [ ], - "type" : "call" - } ], - "vmTrace" : null - }, - { - "output" : "0x", - "stateDiff" : null, - "trace" : [ { - "action" : { - "callType" : "call", - "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "gas" : "0x1dcd12f8", - "input" : "0x", - "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "value" : "0x186a0" - }, - "result" : { - "gasUsed" : "0x0", - "output" : "0x" - }, - "subtraces" : 0, - "traceAddress" : [ ], - "type" : "call" - } ], - "vmTrace" : null - }, - ], - "id" : 1 - }, - ``` +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "gas" : "0x1dcd12f8", + "input" : "0x", + "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "0x186a0" + }, + "result" : { + "gasUsed" : "0x0", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, + { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "gas" : "0x1dcd12f8", + "input" : "0x", + "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "0x186a0" + }, + "result" : { + "gasUsed" : "0x0", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, + ], +"id" : 1 +}, +``` + + ### `trace_filter` Returns traces matching the specified filter. -!!! important +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). - Your node must be an archive node (that is, synchronized without pruning or fast sync) or the - requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) - with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). +::: #### Parameters -`traceFilterOptions`: *object* - [trace filter options object](objects.md#trace-filter-options-object) +`traceFilterOptions`: _object_ - [trace filter options object](objects.md#trace-filter-options-object) #### Returns -`result`: *array* of *objects* - list of [calls to other contracts](../trace-types.md#trace) containing -one object per call, in transaction execution order - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"trace_filter","params":[{"fromBlock":"0x1","toBlock":"0x21","after":2,"count":2,"fromAddress":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"]}],"id":415}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"trace_filter","params":[{"fromBlock":"0x1","toBlock":"0x21","after":2,"count":2,"fromAddress":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"]}],"id":415} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "result": [ - { - "action": { - "callType": "call", - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0xffad82", - "input": "0x0000000000000000000000000000000000000999", - "to": "0x0020000000000000000000000000000000000000", - "value": "0x0" - }, - "blockHash": "0xcd5d9c7acdcbd3fb4b24a39e05a38e32235751bb0c9e4f1aa16dc598a2c2a9e4", - "blockNumber": 6, - "result": { - "gasUsed": "0x7536", - "output": "0x" - }, - "subtraces": 1, - "traceAddress": [], - "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", - "transactionPosition": 0, - "type": "call" - }, - { - "action": { - "callType": "call", - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0xffad52", - "input": "0xf000000000000000000000000000000000000000000000000000000000000001", - "to": "0x0030000000000000000000000000000000000000", - "value": "0x0" - }, - "blockHash": "0xeed85fe57db751442c826cfe4fdf43b10a5c2bc8b6fd3a8ccced48eb3fb35885", - "blockNumber": 7, - "result": { - "gasUsed": "0x1b", - "output": "0xf000000000000000000000000000000000000000000000000000000000000002" - }, - "subtraces": 0, - "traceAddress": [], - "transactionHash": "0x47f4d445ea1812cb1ddd3464ab23d2bfc6ed408a8a9db1c497f94e8e06e85286", - "transactionPosition": 0, - "type": "call" - } - ], - "id": 415 - } - ``` +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_filter","params":[{"fromBlock":"0x1","toBlock":"0x21","after":2,"count":2,"fromAddress":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"]}],"id":415}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_filter", + "params": [ + { + "fromBlock": "0x1", + "toBlock": "0x21", + "after": 2, + "count": 2, + "fromAddress": ["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"] + } + ], + "id": 415 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad82", + "input": "0x0000000000000000000000000000000000000999", + "to": "0x0020000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0xcd5d9c7acdcbd3fb4b24a39e05a38e32235751bb0c9e4f1aa16dc598a2c2a9e4", + "blockNumber": 6, + "result": { + "gasUsed": "0x7536", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "call" + }, + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad52", + "input": "0xf000000000000000000000000000000000000000000000000000000000000001", + "to": "0x0030000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0xeed85fe57db751442c826cfe4fdf43b10a5c2bc8b6fd3a8ccced48eb3fb35885", + "blockNumber": 7, + "result": { + "gasUsed": "0x1b", + "output": "0xf000000000000000000000000000000000000000000000000000000000000002" + }, + "subtraces": 0, + "traceAddress": [], + "transactionHash": "0x47f4d445ea1812cb1ddd3464ab23d2bfc6ed408a8a9db1c497f94e8e06e85286", + "transactionPosition": 0, + "type": "call" + } + ], + "id": 415 +} +``` + + ### `trace_get` Returns trace at given position. -!!! important +:::info - Your node must be an archive node (that is, synchronized without pruning or fast sync) or the - requested transaction must be contained in a block within - the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with - [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: #### Parameters -* `transaction`: *string* - transaction hash +- `transaction`: _string_ - transaction hash -* `indexPositions`: *array* - Index positions of the traces +- `indexPositions`: _array_ - Index positions of the traces #### Returns -`result`: *array* of *objects* - list of [calls to other contracts](../trace-types.md#trace) containing -one object per call, in the order called by the transaction - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"trace_get","params":["0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3",["0x0"]],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"trace_get","params":["0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3",["0x0"]],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "result": { - "action" : { - "callType" : "call", - "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", - "gas" : "0x13e99", - "input" : "0x16c72721", - "to" : "0x2bd2326c993dfaef84f696526064ff22eba5b362", - "value" : "0x0" - }, - "blockHash" : "0x7eb25504e4c202cf3d62fd585d3e238f592c780cca82dacb2ed3cb5b38883add" - "blockNumber": 3068185, - "result": { - "gasUsed": "0x183", - "output" : "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - "subtraces" : 0, - "traceAddress" : [ - 0 - ], - "transactionHash": "0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3", - "transactionPosition": 2, - "type" : "call" - }, - "id" : 1 - }, - ``` +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_get","params":["0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3",["0x0"]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_get", + "params": [ + "0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3", + ["0x0"] + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "action" : { + "callType" : "call", + "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", + "gas" : "0x13e99", + "input" : "0x16c72721", + "to" : "0x2bd2326c993dfaef84f696526064ff22eba5b362", + "value" : "0x0" + }, + "blockHash" : "0x7eb25504e4c202cf3d62fd585d3e238f592c780cca82dacb2ed3cb5b38883add" + "blockNumber": 3068185, + "result": { + "gasUsed": "0x183", + "output" : "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "subtraces" : 0, + "traceAddress" : [ + 0 + ], + "transactionHash": "0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3", + "transactionPosition": 2, + "type" : "call" + }, +"id" : 1 +}, +``` + + ### `trace_rawTransaction` Traces a call to `eth_sendRawTransaction` without making the call, returning the traces. -!!! important +:::info + +The requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). - The requested transaction must be contained in a block within - the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with - [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). +::: #### Parameters -* `data` - *string* - Raw transaction data +- `data` - _string_ - Raw transaction data -* `options`: *array* of *strings* - list of tracing options; tracing options are - [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any - combination of the three options including none of them. +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. #### Returns -`result`: *array* of *objects* - list of [calls to other contracts](../trace-types.md#trace) containing -one object per call, in the order called by the transaction - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"trace_rawTransaction","params":["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",["trace"]],"id":1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc":"2.0","method":"trace_rawTransaction","params":["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",["trace"]],"id":1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "result": { - "output" : "0x" - "stateDiff": null, - "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", - "trace": [{ - "action": { ... }, - "result": { - "gasUsed": "0x0", - "output": "0x" - } - "subtraces": 0, - "traceAddress": [], - "type": "call" - }], - "vmTrace": null - }, - "id" : 1 - }, - ``` +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_rawTransaction","params":["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",["trace"]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_rawTransaction", + "params": [ + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", + ["trace"] + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "output" : "0x" + "stateDiff": null, + "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", + "trace": [{ + "action": { ... }, + "result": { + "gasUsed": "0x0", + "output": "0x" + } + "subtraces": 0, + "traceAddress": [], + "type": "call" + }], + "vmTrace": null + }, +"id" : 1 +}, +``` + + ### `trace_replayBlockTransactions` Provides transaction processing tracing per block. -!!! important +:::info - When using [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries), the requested block - must be within the number of [blocks retained](../cli/options.md#bonsai-historical-block-limit) - (by default, 512 from the head of the chain). +When using [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries), the requested block must be within the number of [blocks retained](../cli/options.md#bonsai-historical-block-limit) (by default, 512 from the head of the chain). - When using [Forest](../../concepts/data-storage-formats.md#forest-of-tries), the requested block - must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) - with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024 from head of the chain). +When using [Forest](../../concepts/data-storage-formats.md#forest-of-tries), the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024 from head of the chain). + +::: #### Parameters -* `blockNumber`: *string* - integer representing a block number or one of the string tags `latest`, -`earliest`, or `pending`, as described in -[block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) -* `options`: *array* of *strings* - list of tracing options; tracing options are -[`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any -combination of the three options including none of them. +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. #### Returns -`result`: *array* of *objects* - list of [transaction trace objects](objects.md#transaction-trace-object) containing -one object per transaction, in transaction execution order; if revert reason is enabled with -[`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), -the [`trace`](../trace-types.md#trace) list items in the returned transaction trace object include the -[revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). +`result`: _array_ of _objects_ - list of [transaction trace objects](objects.md#transaction-trace-object) containing one object per transaction, in transaction execution order; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the [`trace`](../trace-types.md#trace) list items in the returned transaction trace object include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_replayBlockTransactions","params": ["0x12",["trace","vmTrace","stateDiff"]],"id": 1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_replayBlockTransactions","params": ["0x12",["trace","vmTrace","stateDiff"]],"id": 1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc": "2.0", "method": "trace_replayBlockTransactions","params": ["0x12",["trace","vmTrace","stateDiff"]],"id": 1} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "trace_replayBlockTransactions", + "params": ["0x12", ["trace", "vmTrace", "stateDiff"]], + "id": 1 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result":[ - { - "output":"0x", - "vmTrace":{ - "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", - "ops":[ - { - "cost":3, - "ex":{ - "mem":null, - "push":[ - "0x8" - ], - "store":null, - "used":16756175 - }, - "pc":72, - "sub":null - }, - ... - ] - }, - "trace":[ - { - "action":{ - "callType":"call", - "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas":"0xffadea", - "input":"0x", - "to":"0x0100000000000000000000000000000000000000", - "value":"0x0" - }, - "result":{ - "gasUsed":"0x1e", - "output":"0x" - }, - "subtraces":0, - "traceAddress":[ - ], - "type":"call" - } +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result":[ + { + "output":"0x", + "vmTrace":{ + "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", + "ops":[ + { + "cost":3, + "ex":{ + "mem":null, + "push":[ + "0x8" ], - "stateDiff":{ - "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ - "balance":{ - "*":{ - "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", - "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" - } - }, - "code":"=", - "nonce":{ - "*":{ - "from":"0x14", - "to":"0x15" - } - }, - "storage":{ - } - } - }, - "transactionHash":"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd", + "store":null, + "used":16756175 }, - {...} - ] - } - ``` + "pc":72, + "sub":null + }, + ... + ] + }, + "trace":[ + { + "action":{ + "callType":"call", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0xffadea", + "input":"0x", + "to":"0x0100000000000000000000000000000000000000", + "value":"0x0" + }, + "result":{ + "gasUsed":"0x1e", + "output":"0x" + }, + "subtraces":0, + "traceAddress":[ + ], + "type":"call" + } + ], + "stateDiff":{ + "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ + "balance":{ + "*":{ + "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", + "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" + } + }, + "code":"=", + "nonce":{ + "*":{ + "from":"0x14", + "to":"0x15" + } + }, + "storage":{ + } + } + }, + "transactionHash":"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd", + }, + {...} + ] +} +``` + + ### `trace_transaction` Provides transaction processing of [type `trace`](../trace-types.md#trace) for the specified transaction. -!!! important +:::info - Your node must be an archive node (that is, synchronized without pruning or fast sync) or the - requested transaction must be contained in a block within - the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with - [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: #### Parameters -`transaction`: *string* - transaction hash +`transaction`: _string_ - transaction hash #### Returns -`result`: *array* of *objects* - list of [calls to other contracts](../trace-types.md#trace) containing -one object per call, in the order called by the transaction; if revert reason is enabled with -[`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), -the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). - -!!! example - - === "curl HTTP request" - - ```bash - curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_transaction","params": ["0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7"],"id": 1}' http://127.0.0.1:8545 - ``` - - === "wscat WS request" - - ```bash - {"jsonrpc": "2.0", "method": "trace_transaction","params": ["0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7"],"id": 1} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "result": [ - { - "action": { - "creationMethod": "create", - "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", - "gas": "0xff2e26", - "init": "0x60006000600060006000732c2b9c9a4a25e24b174f26114e8926a9f2128fe45af2600060006000600060007300a00000000000000000000000000000000000005af2", - "value": "0x0" - }, - "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", - "blockNumber": 19, - "result": { - "address": "0x30753e4a8aad7f8597332e813735def5dd395028", - "code": "0x", - "gasUsed": "0x1c39" - }, - "subtraces": 2, - "traceAddress": [], - "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", - "transactionPosition": 3, - "type": "create" - }, - { - "action": { - "callType": "callcode", - "from": "0x30753e4a8aad7f8597332e813735def5dd395028", - "gas": "0xfb2ea9", - "input": "0x", - "to": "0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4", - "value": "0x0" - }, - "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", - "blockNumber": 19, - "result": { - "gasUsed": "0x138e", - "output": "0x" - }, - "subtraces": 1, - "traceAddress": [ - 0 - ], - "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", - "transactionPosition": 3, - "type": "call" - }, - { - "action": { - "address": "0x30753e4a8aad7f8597332e813735def5dd395028", - "balance": "0x0", - "refundAddress": "0x0000000000000000000000000000000000000000" - }, - "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", - "blockNumber": 19, - "result": null, - "subtraces": 0, - "traceAddress": [ - 0, - 0 - ], - "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", - "transactionPosition": 3, - "type": "suicide" - }, - { - "action": { - "callType": "callcode", - "from": "0x30753e4a8aad7f8597332e813735def5dd395028", - "gas": "0xfb18a5", - "input": "0x", - "to": "0x00a0000000000000000000000000000000000000", - "value": "0x0" - }, - "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", - "blockNumber": 19, - "result": { - "gasUsed": "0x30b", - "output": "0x" - }, - "subtraces": 0, - "traceAddress": [ - 1 - ], - "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", - "transactionPosition": 3, - "type": "call" - } - ], - "id": 1 - } - ``` +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_transaction","params": ["0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_transaction", + "params": [ + "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "creationMethod": "create", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gas": "0xff2e26", + "init": "0x60006000600060006000732c2b9c9a4a25e24b174f26114e8926a9f2128fe45af2600060006000600060007300a00000000000000000000000000000000000005af2", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "address": "0x30753e4a8aad7f8597332e813735def5dd395028", + "code": "0x", + "gasUsed": "0x1c39" + }, + "subtraces": 2, + "traceAddress": [], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "create" + }, + { + "action": { + "callType": "callcode", + "from": "0x30753e4a8aad7f8597332e813735def5dd395028", + "gas": "0xfb2ea9", + "input": "0x", + "to": "0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "gasUsed": "0x138e", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [0], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "call" + }, + { + "action": { + "address": "0x30753e4a8aad7f8597332e813735def5dd395028", + "balance": "0x0", + "refundAddress": "0x0000000000000000000000000000000000000000" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": null, + "subtraces": 0, + "traceAddress": [0, 0], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "suicide" + }, + { + "action": { + "callType": "callcode", + "from": "0x30753e4a8aad7f8597332e813735def5dd395028", + "gas": "0xfb18a5", + "input": "0x", + "to": "0x00a0000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "gasUsed": "0x30b", + "output": "0x" + }, + "subtraces": 0, + "traceAddress": [1], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "call" + } + ], + "id": 1 +} +``` + + ## `TXPOOL` methods The `TXPOOL` API methods allow you to inspect the contents of the transaction pool. -!!! note +:::note - The `TXPOOL` API methods are not enabled by default for JSON-RPC. To enable the `TXPOOL` API - methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or - [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. +The `TXPOOL` API methods are not enabled by default for JSON-RPC. To enable the `TXPOOL` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: ### `txpool_besuPendingTransactions` @@ -5954,82 +6337,94 @@ Lists pending transactions that match the supplied filter conditions. #### Parameters -* `numResults`: *number* - integer representing the maximum number of results to return +- `numResults`: _number_ - integer representing the maximum number of results to return -* `fields`: *object* - object of fields used to create the filter condition +- `fields`: _object_ - object of fields used to create the filter condition -Each field in the object corresponds to a field name containing an operator, and a value for the operator. -A field name can only be specified once, and can only contain one operator. -For example, you cannot query transactions with a gas price between 8 and 9 Gwei by using both the -`gt` and `lt` operator in the same field name instance. +Each field in the object corresponds to a field name containing an operator, and a value for the operator. A field name can only be specified once, and can only contain one operator. For example, you cannot query transactions with a gas price between 8 and 9 Gwei by using both the `gt` and `lt` operator in the same field name instance. All filters must be satisfied for a transaction to be returned. -| Field name | Value | Value type | Supported operators | -|------------|-------------------------------------------|:---------------------:|---------------------| -| `from` | Address of the sender. | *Data*, 20 bytes | `eq` | -| `to` | Address of the receiver, or `"contract_creation"`.| *Data*, 20 bytes |`eq`, `action`| -| `gas` | Gas provided by the sender. | *Quantity* | `eq`, `gt`, `lt` | -| `gasPrice` | Gas price, in wei, provided by the sender.| *Quantity* | `eq`, `gt`, `lt` | -| `value` | Value transferred, in wei. | *Quantity* | `eq`, `gt`, `lt` | -| `nonce` | Number of transactions made by the sender.| *Quantity* | `eq`, `gt`, `lt` | +| Field name | Value | Value type | Supported operators | +| --- | --- | :-: | --- | +| `from` | Address of the sender. | _Data_, 20 bytes | `eq` | +| `to` | Address of the receiver, or `"contract_creation"`. | _Data_, 20 bytes | `eq`, `action` | +| `gas` | Gas provided by the sender. | _Quantity_ | `eq`, `gt`, `lt` | +| `gasPrice` | Gas price, in wei, provided by the sender. | _Quantity_ | `eq`, `gt`, `lt` | +| `value` | Value transferred, in wei. | _Quantity_ | `eq`, `gt`, `lt` | +| `nonce` | Number of transactions made by the sender. | _Quantity_ | `eq`, `gt`, `lt` | Supported operators: -* `eq` (equal to) - -* `lt` (less than) - -* `gt` (greater than) - -* `action` - -!!! note - - The only supported `action` is `"contract_creation"`. - -#### Returns +- `eq` (equal to) -`result`: *array* of *objects* - list of objects with -[details of the pending transaction](objects.md#pending-transaction-object) +- `lt` (less than) -!!! example +- `gt` (greater than) - === "curl HTTP request" +- `action` - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuPendingTransactions","params":[2,{"from":{"eq":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"},"gas":{"lt":"0x5209"},"nonce":{"gt":"0x1"}}],"id":1}' http://127.0.0.1:8545 - ``` +:::note - === "wscat WS request" +The only supported `action` is `"contract_creation"`. - ```bash - {"jsonrpc":"2.0","method":"txpool_besuPendingTransactions","params":[2,{"from":{"eq":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"},"gas":{"lt":"0x5209"},"nonce":{"gt":"0x1"}}],"id":1} - ``` +::: - === "JSON result" +#### Returns - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas": "0x5208", - "gasPrice": "0xab5d04c00", - "hash": "0xb7b2f4306c1c228ec94043da73b582594007091a7dfe024b1f8d6d772284e54b", - "input": "0x", - "nonce": "0x2", - "to": "0xf8be4ebda7f62d79a665294ec1263bfdb59aabf2", - "value": "0x0", - "v": "0xfe8", - "r": "0x5beb711e652c6cf0a589d3cea904eefc4f45ce4372652288701d08cc4412086d", - "s": "0x3af14a56e63aa5fb7dcb444a89708363a9d2c1eba1f777c67690288415080ded" - } - ] - } - ``` +`result`: _array_ of _objects_ - list of objects with [details of the pending transaction](objects.md#pending-transaction-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuPendingTransactions","params":[2,{"from":{"eq":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"},"gas":{"lt":"0x5209"},"nonce":{"gt":"0x1"}}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "txpool_besuPendingTransactions", + "params": [ + 2, + { + "from": { "eq": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" }, + "gas": { "lt": "0x5209" }, + "nonce": { "gt": "0x1" } + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0xab5d04c00", + "hash": "0xb7b2f4306c1c228ec94043da73b582594007091a7dfe024b1f8d6d772284e54b", + "input": "0x", + "nonce": "0x2", + "to": "0xf8be4ebda7f62d79a665294ec1263bfdb59aabf2", + "value": "0x0", + "v": "0xfe8", + "r": "0x5beb711e652c6cf0a589d3cea904eefc4f45ce4372652288701d08cc4412086d", + "s": "0x3af14a56e63aa5fb7dcb444a89708363a9d2c1eba1f777c67690288415080ded" + } + ] +} +``` + + ### `txpool_besuStatistics` @@ -6041,42 +6436,43 @@ None #### Returns -`result`: *object* - transaction pool statistics object with the following fields: +`result`: _object_ - transaction pool statistics object with the following fields: -* `maxSize`: *number* - maximum number of transactions kept in the transaction pool; use the - [`--tx-pool-max-size`](../cli/options.md#tx-pool-max-size) option to configure the maximum size. +- `maxSize`: _number_ - maximum number of transactions kept in the transaction pool; use the [`--tx-pool-max-size`](../cli/options.md#tx-pool-max-size) option to configure the maximum size. -* `localCount`: *number* - number of transactions submitted directly to this node +- `localCount`: _number_ - number of transactions submitted directly to this node -* `remoteCount`: *number* - number of transactions received from remote nodes +- `remoteCount`: _number_ - number of transactions received from remote nodes -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "maxSize": 4096, - "localCount": 1, - "remoteCount": 0 - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "maxSize": 4096, + "localCount": 1, + "remoteCount": 0 + } +} +``` + + ### `txpool_besuTransactions` @@ -6088,42 +6484,44 @@ None #### Returns -`result`: *array* of *objects* - list of transactions +`result`: _array_ of _objects_ - list of transactions -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuTransactions","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuTransactions","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"txpool_besuTransactions","params":[],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "txpool_besuTransactions", "params": [], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": [ - { - "hash": "0x8a66830098be4006a3f63a03b6e9b67aa721e04bd6b46d420b8f1937689fb4f1", - "isReceivedFromLocalSource": true, - "addedToPoolAt": "2019-03-21T01:35:50.911Z" - }, - { - "hash": "0x41ee803c3987ceb5bcea0fad7a76a8106a2a6dd654409007d9931032ea54579b", - "isReceivedFromLocalSource": true, - "addedToPoolAt": "2019-03-21T01:36:00.374Z" - } - ] - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "hash": "0x8a66830098be4006a3f63a03b6e9b67aa721e04bd6b46d420b8f1937689fb4f1", + "isReceivedFromLocalSource": true, + "addedToPoolAt": "2019-03-21T01:35:50.911Z" + }, + { + "hash": "0x41ee803c3987ceb5bcea0fad7a76a8106a2a6dd654409007d9931032ea54579b", + "isReceivedFromLocalSource": true, + "addedToPoolAt": "2019-03-21T01:36:00.374Z" + } + ] +} +``` + + ## `WEB3` methods @@ -6139,75 +6537,82 @@ None #### Returns -`result`: *string* - current client version +`result`: _string_ - current client version -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1} - ``` +```json +{ "jsonrpc": "2.0", "method": "web3_clientVersion", "params": [], "id": 1 } +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : "besu/" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "besu/" +} +``` + + ### `web3_sha3` -Returns a [SHA3](https://en.wikipedia.org/wiki/SHA-3) hash of the specified data. -The result value is a [Keccak-256](https://keccak.team/keccak.html) hash, not the standardized SHA3-256. +Returns a [SHA3](https://en.wikipedia.org/wiki/SHA-3) hash of the specified data. The result value is a [Keccak-256](https://keccak.team/keccak.html) hash, not the standardized SHA3-256. #### Parameters -`data`: *string* - data to convert to a SHA3 hash +`data`: _string_ - data to convert to a SHA3 hash #### Returns -`result`: *string* - SHA3 result of the input data +`result`: _string_ - SHA3 result of the input data -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c00"],"id":53}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c00"],"id":53}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c00"],"id":53} - ``` +```json +{ + "jsonrpc": "2.0", + "method": "web3_sha3", + "params": ["0x68656c6c6f20776f726c00"], + "id": 53 +} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc" : "2.0", - "id" : 53, - "result" : "0x5e39a0a66544c0668bde22d61c47a8710000ece931f13b84d3b2feb44ec96d3f" - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5e39a0a66544c0668bde22d61c47a8710000ece931f13b84d3b2feb44ec96d3f" +} +``` + + ## Miscellaneous methods ### `rpc_modules` -Lists [enabled APIs](../../how-to/use-besu-api/json-rpc.md#api-methods-enabled-by-default) -and the version of each. +Lists [enabled APIs](../../how-to/use-besu-api/json-rpc.md#api-methods-enabled-by-default) and the version of each. #### Parameters @@ -6215,37 +6620,40 @@ None #### Returns -`result`: *map* of *strings* to *strings* - enabled APIs and their versions +`result`: _map_ of _strings_ to _strings_ - enabled APIs and their versions -!!! example + - === "curl HTTP request" +# curl HTTP request - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1}' http://127.0.0.1:8545 - ``` +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1}' http://127.0.0.1:8545 +``` - === "wscat WS request" +# wscat WS request - ```bash - {"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1} - ``` +```bash +{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1} +``` - === "JSON result" +# JSON result - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "web3": "1.0", - "eth": "1.0", - "net": "1.0" - } - } - ``` +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "web3": "1.0", + "eth": "1.0", + "net": "1.0" + } +} +``` + + + [schema]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/ethereum/api/src/main/resources/schema.graphqls [eth_sendRawTransaction or eth_call]: ../../how-to/send-transactions.md#eth_call-or-eth_sendrawtransaction [transaction]: https://ropsten.etherscan.io/tx/0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6 diff --git a/docs/public-networks/reference/api/objects.md b/docs/public-networks/reference/api/objects.md index 884118bed56..1694463f148 100644 --- a/docs/public-networks/reference/api/objects.md +++ b/docs/public-networks/reference/api/objects.md @@ -1,6 +1,8 @@ --- +title: Objects description: Hyperledger Besu API objects reference tags: + - public networks - private networks --- @@ -8,269 +10,256 @@ tags: The following objects are parameters for or returned by Besu API methods. -!!! attention +:::info - This reference contains API objects that apply to both public and private networks. - For private-network-specific API objects, see the - [private network API object reference](../../../private-networks/reference/api/objects.md). +This reference contains API objects that apply to both public and private networks. For private-network-specific API objects, see the [private network API object reference](../../../private-networks/reference/api/objects.md). + +::: ## Block object -Returned by [`eth_getBlockByHash`](index.md#eth_getblockbyhash) and -[`eth_getBlockByNumber`](index.md#eth_getblockbynumber). +Returned by [`eth_getBlockByHash`](index.md#eth_getblockbyhash) and [`eth_getBlockByNumber`](index.md#eth_getblockbynumber). | Key | Type | Value | -|-----|:----:|-------| -| `number` | *Quantity*, Integer | Block number. `null` when block is pending. | -| `hash` | *Data*, 32 bytes | Hash of the block. `null` when block is pending. | -| `parentHash` | *Data*, 32 bytes | Hash of the parent block. | -| `nonce` | *Data*, 8 bytes | Hash of the generated proof of work. `null` when block is pending. | -| `sha3Uncles` | *Data*, 32 bytes | SHA3 of the uncle's data in the block. | -| `logsBloom` | *Data*, 256 bytes | Bloom filter for the block logs. `null` when block is pending. | -| `transactionsRoot` | *Data*, 32 bytes | Root of the transaction trie for the block. | -| `stateRoot` | Data, 32 bytes | Root of the final state trie for the block. | -| `receiptsRoot` | Data, 32 bytes | Root of the receipts trie for the block. | -| `miner` | Data, 20 bytes | Address to pay mining rewards to. | -| `difficulty` | Quantity, Integer | Difficulty for this block. | -| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. This value will always be `0` for an uncle block. | -| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. Stores extra data when used with [Clique](../../../private-networks/how-to/configure/consensus/clique.md#genesis-file) and [IBFT](../../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | -| `size` | Quantity, Integer | Size of block in bytes. | -| `gasLimit` | Quantity | Maximum gas allowed in this block. | -| `gasUsed` | Quantity | Total gas used by all transactions in this block. | -| `timestamp` | Quantity | Unix timestamp (milliseconds) for block assembly. | -| `transactions` | Array | Array of [transaction objects](#transaction-object), or 32 byte transaction hashes depending on the specified boolean parameter. | -| `uncles` | Array | Array of uncle hashes. | -| `baseFeePerGas` | Quantity | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | +| --- | :-: | --- | +| `number` | _Quantity_, Integer | Block number. `null` when block is pending. | +| `hash` | _Data_, 32 bytes | Hash of the block. `null` when block is pending. | +| `parentHash` | _Data_, 32 bytes | Hash of the parent block. | +| `nonce` | _Data_, 8 bytes | Hash of the generated proof of work. `null` when block is pending. | +| `sha3Uncles` | _Data_, 32 bytes | SHA3 of the uncle's data in the block. | +| `logsBloom` | _Data_, 256 bytes | Bloom filter for the block logs. `null` when block is pending. | +| `transactionsRoot` | _Data_, 32 bytes | Root of the transaction trie for the block. | +| `stateRoot` | Data, 32 bytes | Root of the final state trie for the block. | +| `receiptsRoot` | Data, 32 bytes | Root of the receipts trie for the block. | +| `miner` | Data, 20 bytes | Address to pay mining rewards to. | +| `difficulty` | Quantity, Integer | Difficulty for this block. | +| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. This value will always be `0` for an uncle block. | +| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. Stores extra data when used with [Clique](../../../private-networks/how-to/configure/consensus/clique.md#genesis-file) and [IBFT](../../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | +| `size` | Quantity, Integer | Size of block in bytes. | +| `gasLimit` | Quantity | Maximum gas allowed in this block. | +| `gasUsed` | Quantity | Total gas used by all transactions in this block. | +| `timestamp` | Quantity | Unix timestamp (milliseconds) for block assembly. | +| `transactions` | Array | Array of [transaction objects](#transaction-object), or 32 byte transaction hashes depending on the specified boolean parameter. | +| `uncles` | Array | Array of uncle hashes. | +| `baseFeePerGas` | Quantity | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | ## Fee history results object -Returned by [`eth_feeHistory`](index.md#eth_feehistory) for the requested block range. -If blocks in the specified block range are not available, then only the fee history for available blocks is returned. +Returned by [`eth_feeHistory`](index.md#eth_feehistory) for the requested block range. If blocks in the specified block range are not available, then only the fee history for available blocks is returned. | Key | Type | Value | -|-----|:----:|-------| -| `oldestBlock` | Quantity, Integer | Lowest number block of the returned range. | -| `baseFeePerGas` | Array | Array of block base fees per gas, including an extra block value. The extra value is the next block after the newest block in the returned range. Returns zeroes for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | -| `gasUsedRatio` | Array | Array of block gas used ratios. These are calculated as the ratio of `gasUsed` and `gasLimit`. | -| `reward` | Array | Array of effective priority fee per gas data points from a single block. All zeroes are returned if the block is empty. | +| --- | :-: | --- | +| `oldestBlock` | Quantity, Integer | Lowest number block of the returned range. | +| `baseFeePerGas` | Array | Array of block base fees per gas, including an extra block value. The extra value is the next block after the newest block in the returned range. Returns zeroes for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | +| `gasUsedRatio` | Array | Array of block gas used ratios. These are calculated as the ratio of `gasUsed` and `gasLimit`. | +| `reward` | Array | Array of effective priority fee per gas data points from a single block. All zeroes are returned if the block is empty. | ## Filter options object -Parameter for [`eth_newFilter`](index.md#eth_newfilter), -[`eth_getLogs`](index.md#eth_getlogs), and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). -Used to [`filter logs`](../../how-to/use-besu-api/access-logs.md). +Parameter for [`eth_newFilter`](index.md#eth_newfilter), [`eth_getLogs`](index.md#eth_getlogs), and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). Used to [`filter logs`](../../how-to/use-besu-api/access-logs.md). | Key | Type | Required/Optional | Value | -|-----|:----:|:-----------------:|-------| -| `fromBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | -| `toBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | -| `address` | Data | Array | Optional | Contract address or array of addresses from which [logs](../../concepts/events-and-logs.md) originate. | -| `topics` | Array of Data, 32 bytes each | Optional | Array of topics by which to [filter logs](../../concepts/events-and-logs.md#topic-filters). | +| --- | :-: | :-: | --- | +| `fromBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | +| `toBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | +| `address` | Data | Array | Optional | Contract address or array of addresses from which [logs](../../concepts/events-and-logs.md) originate. | +| `topics` | Array of Data, 32 bytes each | Optional | Array of topics by which to [filter logs](../../concepts/events-and-logs.md#topic-filters). | -[`eth_getLogs`](index.md#eth_getlogs) and [`priv_getLogs`](index.md#priv_getlogs) have an -extra key. +[`eth_getLogs`](index.md#eth_getlogs) and [`priv_getLogs`](index.md#priv_getlogs) have an extra key. | Key | Type | Required/Optional | Value | -|-----|:----:|:-----------------:|-------| +| --- | :-: | :-: | --- | | `blockHash` | Data, 32 bytes | Optional. | Hash of block for which to return logs. If you specify `blockHash`, you cannot specify `fromBlock` and `toBlock`. | ## Log object -Returned by [`eth_getFilterChanges`](index.md#eth_getfilterchanges) and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). -[`Transaction receipt objects`](#transaction-receipt-object) can contain an array of log objects. +Returned by [`eth_getFilterChanges`](index.md#eth_getfilterchanges) and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). [`Transaction receipt objects`](#transaction-receipt-object) can contain an array of log objects. | Key | Type | Value | -|-----|:----:|-------| -| `removed` | Tag | `true` if log removed because of a chain reorganization. `false` if a valid log. | -| `logIndex` | Quantity, Integer | Log index position in the block. `null` when log is pending. | -| `transactionIndex` | Quantity, Integer | Index position of the starting transaction for the log. `null` when log is pending. | -| `transactionHash` | Data, 32 bytes | Hash of the starting transaction for the log. `null` when log is pending. | -| `blockHash` | Data, 32 bytes | Hash of the block that includes the log. `null` when log is pending. | -| `blockNumber` | Quantity | Number of block that includes the log. `null` when log is pending. | -| `address` | Data, 20 bytes | Address the log originated from. | -| `data` | Data | Non-indexed arguments of the log. | -| `topics` | Array of Data, 32 bytes each | [Event signature hash](../../concepts/events-and-logs.md#event-signature-hash) and 0 to 3 [indexed log arguments](../../concepts/events-and-logs.md#event-parameters). | +| --- | :-: | --- | +| `removed` | Tag | `true` if log removed because of a chain reorganization. `false` if a valid log. | +| `logIndex` | Quantity, Integer | Log index position in the block. `null` when log is pending. | +| `transactionIndex` | Quantity, Integer | Index position of the starting transaction for the log. `null` when log is pending. | +| `transactionHash` | Data, 32 bytes | Hash of the starting transaction for the log. `null` when log is pending. | +| `blockHash` | Data, 32 bytes | Hash of the block that includes the log. `null` when log is pending. | +| `blockNumber` | Quantity | Number of block that includes the log. `null` when log is pending. | +| `address` | Data, 20 bytes | Address the log originated from. | +| `data` | Data | Non-indexed arguments of the log. | +| `topics` | Array of Data, 32 bytes each | [Event signature hash](../../concepts/events-and-logs.md#event-signature-hash) and 0 to 3 [indexed log arguments](../../concepts/events-and-logs.md#event-parameters). | ## Miner data object -Returned by [`eth_getMinerDataByBlockHash`](index.md#eth_getminerdatabyblockhash) and -[`eth_getMinerDataByBlockNumber`](index.md#eth_getminerdatabyblocknumber). +Returned by [`eth_getMinerDataByBlockHash`](index.md#eth_getminerdatabyblockhash) and [`eth_getMinerDataByBlockNumber`](index.md#eth_getminerdatabyblocknumber). | Key | Type | Value | -|-----|:----:|-------| -| `netBlockReward` | Quantity, Integer | The net block reward, in Wei, is `staticBlockReward + transactionFee + uncleInclusionReward`. | -| `staticBlockReward` | Quantity, Integer | The static block reward, in Wei, is preset on a hard fork. | -| `transactionFee` | Quantity, Integer | The transaction fee, in Wei, is `sum of upfront cost - refund amount for all transactions`. | -| `uncleInclusionReward` | Quantity, Integer | The uncle inclusion reward, in Wei, is `static block reward * number of ommers/32`. | -| `uncleRewards` | Map | Map of uncle block hashes and uncle miner coinbase addresses. | -| `coinbase` | Data, 20 bytes | Coinbase address. | -| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. | -| `difficulty` | Quantity, Integer | Difficulty of this block. | -| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. | +| --- | :-: | --- | +| `netBlockReward` | Quantity, Integer | The net block reward, in Wei, is `staticBlockReward + transactionFee + uncleInclusionReward`. | +| `staticBlockReward` | Quantity, Integer | The static block reward, in Wei, is preset on a hard fork. | +| `transactionFee` | Quantity, Integer | The transaction fee, in Wei, is `sum of upfront cost - refund amount for all transactions`. | +| `uncleInclusionReward` | Quantity, Integer | The uncle inclusion reward, in Wei, is `static block reward * number of ommers/32`. | +| `uncleRewards` | Map | Map of uncle block hashes and uncle miner coinbase addresses. | +| `coinbase` | Data, 20 bytes | Coinbase address. | +| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. | +| `difficulty` | Quantity, Integer | Difficulty of this block. | +| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. | ## Pending transaction object Returned by [`txpool_besuPendingTransactions`](index.md#txpool_besupendingtransactions). | Key | Type | Value | -|-----|:----:|-------| -| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | -| `from` | Data, 20 bytes | Address of the sender. | -| `gas` | Quantity | Gas provided by the sender. | -| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Not used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | -| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | -| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | -| `hash` | Data, 32 bytes | Hash of the transaction. | -| `input` | Data | Data sent with the transaction to create or invoke a contract. | -| `nonce` | Quantity | Number of transactions made by the sender before this one. | -| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | -| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | -| `value` | Quantity | Value transferred, in Wei. | -| `v` | Quantity | ECDSA Recovery ID. | -| `r` | Data, 32 bytes | ECDSA signature r. | -| `s` | Data, 32 bytes | ECDSA signature s. | +| --- | :-: | --- | +| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Not used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `hash` | Data, 32 bytes | Hash of the transaction. | +| `input` | Data | Data sent with the transaction to create or invoke a contract. | +| `nonce` | Quantity | Number of transactions made by the sender before this one. | +| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `value` | Quantity | Value transferred, in Wei. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | ## Range object Returned by [`debug_storageRangeAt`](index.md#debug_storagerangeat). | Key | Type | Value | -|-----|:----:|-------| +| --- | :-: | --- | | `storage` | Object | Key hash and value. Pre-image key is `null` if it falls outside the cache. | -| `nextKey` | Hash | Hash of next key if further storage in range. Otherwise, not included. | +| `nextKey` | Hash | Hash of next key if further storage in range. Otherwise, not included. | ### Structured log object Log information returned as part of the [Trace object](#trace-object). | Key | Type | Value | -|-----|:----:|-------| -| `pc` | Integer | Current program counter. | -| `op` | String | Current OpCode. | -| `gas` | Integer | Gas remaining. | -| `gasCost` | Integer | Cost in wei of each gas unit. | -| `depth` | Integer | Execution depth. | -| `exceptionalHaltReasons` | Array | One or more strings representing an error condition causing the EVM execution to terminate. These strings suggest that EVM execution terminated for reasons such as running out of gas or attempting to execute an unknown instruction. Generally a single exceptional halt reason returns but it's possible for more than one to occur at once. | -| `stack` | Array of 32 byte arrays | EVM execution stack before executing current operation. | -| `memory` | Array of 32 byte arrays | Memory space of the contract before executing current operation. | -| `storage` | Object | Storage entries changed by the current transaction. | +| --- | :-: | --- | +| `pc` | Integer | Current program counter. | +| `op` | String | Current OpCode. | +| `gas` | Integer | Gas remaining. | +| `gasCost` | Integer | Cost in wei of each gas unit. | +| `depth` | Integer | Execution depth. | +| `exceptionalHaltReasons` | Array | One or more strings representing an error condition causing the EVM execution to terminate. These strings suggest that EVM execution terminated for reasons such as running out of gas or attempting to execute an unknown instruction. Generally a single exceptional halt reason returns but it's possible for more than one to occur at once. | +| `stack` | Array of 32 byte arrays | EVM execution stack before executing current operation. | +| `memory` | Array of 32 byte arrays | Memory space of the contract before executing current operation. | +| `storage` | Object | Storage entries changed by the current transaction. | ## Trace object -Returned by [`debug_traceBlock`](index.md#debug_traceblock), -[`debug_traceBlockByHash`](index.md#debug_traceblockbyhash), -[`debug_traceBlockByNumber`](index.md#debug_traceblockbynumber), and -[`debug_traceTransaction`](index.md#debug_tracetransaction). +Returned by [`debug_traceBlock`](index.md#debug_traceblock), [`debug_traceBlockByHash`](index.md#debug_traceblockbyhash), [`debug_traceBlockByNumber`](index.md#debug_traceblockbynumber), and [`debug_traceTransaction`](index.md#debug_tracetransaction). | Key | Type | Value | -|-----|:----:|-------| -| `gas` | Integer | Gas used by the transaction. | -| `failed` | Boolean | True if transaction failed, otherwise, false. | -| `returnValue` | String | Bytes returned from transaction execution (without a `0x` prefix). | -| `structLogs` | Array | Array of structured log objects. | +| --- | :-: | --- | +| `gas` | Integer | Gas used by the transaction. | +| `failed` | Boolean | True if transaction failed, otherwise, false. | +| `returnValue` | String | Bytes returned from transaction execution (without a `0x` prefix). | +| `structLogs` | Array | Array of structured log objects. | ## Trace filter options object Parameter for [`trace_filter`](index.md#trace_filter). All parameters are optional. | Key | Type | Value | -|-----|:----:|-------| -| `fromBLock` | String | Tag | Trace starts at this block. | -| `toBlock` | String | Tag | Trace stops at this block. | -| `fromAddress` | String | Include only traces sent from this address. | -| `toAddress` | String | Include only traces with this destination address. | -| `after` | Quantity | The offset trace number. | -| `count` | Integer | Number of traces to display in a batch. | +| --- | :-: | --- | +| `fromBLock` | String | Tag | Trace starts at this block. | +| `toBlock` | String | Tag | Trace stops at this block. | +| `fromAddress` | String | Include only traces sent from this address. | +| `toAddress` | String | Include only traces with this destination address. | +| `after` | Quantity | The offset trace number. | +| `count` | Integer | Number of traces to display in a batch. | ## Transaction object -Returned by [`eth_getTransactionByHash`](index.md#eth_gettransactionbyhash), -[`eth_getTransactionByBlockHashAndIndex`](index.md#eth_gettransactionbyblockhashandindex), -and -[`eth_getTransactionByBlockNumberAndIndex`](index.md#eth_gettransactionbyblocknumberandindex). +Returned by [`eth_getTransactionByHash`](index.md#eth_gettransactionbyhash), [`eth_getTransactionByBlockHashAndIndex`](index.md#eth_gettransactionbyblockhashandindex), and [`eth_getTransactionByBlockNumberAndIndex`](index.md#eth_gettransactionbyblocknumberandindex). | Key | Type | Value | -|-----|:----:|-------| -| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | -| `blockHash` | Data, 32 bytes | Hash of the block containing this transaction. `null` when transaction is pending. | -| `blockNumber` | Quantity | Block number of the block containing this transaction. `null` when transaction is pending. | -| `chainId` | Quantity | [Chain ID](../../concepts/network-and-chain-id.md). | -| `from` | Data, 20 bytes | Address of the sender. | -| `gas` | Quantity | Gas provided by the sender. | -| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | -| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | -| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | -| `hash` | Data, 32 bytes | Hash of the transaction. | -| `input` | Data | Data sent with the transaction to create or invoke a contract. For [private transactions](../../../private-networks/concepts/privacy/index.md), it's a pointer to the transaction location in [Tessera](https://docs.tessera.consensys.net/). | -| `nonce` | Quantity | Number of transactions made by the sender before this one. | -| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | -| `transactionIndex` | Quantity, Integer | Index position of the transaction in the block. `null` when transaction is pending. | -| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | -| `value` | Quantity | Value transferred, in Wei. | -| `v` | Quantity | ECDSA Recovery ID. | -| `r` | Data, 32 bytes | ECDSA signature r. | -| `s` | Data, 32 bytes | ECDSA signature s. | +| --- | :-: | --- | +| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `blockHash` | Data, 32 bytes | Hash of the block containing this transaction. `null` when transaction is pending. | +| `blockNumber` | Quantity | Block number of the block containing this transaction. `null` when transaction is pending. | +| `chainId` | Quantity | [Chain ID](../../concepts/network-and-chain-id.md). | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | +| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `hash` | Data, 32 bytes | Hash of the transaction. | +| `input` | Data | Data sent with the transaction to create or invoke a contract. For [private transactions](../../../private-networks/concepts/privacy/index.md), it's a pointer to the transaction location in [Tessera](https://docs.tessera.consensys.net/). | +| `nonce` | Quantity | Number of transactions made by the sender before this one. | +| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | +| `transactionIndex` | Quantity, Integer | Index position of the transaction in the block. `null` when transaction is pending. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `value` | Quantity | Value transferred, in Wei. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | ## Transaction call object -Parameter for [`eth_call`](index.md#eth_call), [`eth_createAccessList`](index.md#eth_createAccessList), and -[`eth_estimateGas`](index.md#eth_estimategas). +Parameter for [`eth_call`](index.md#eth_call), [`eth_createAccessList`](index.md#eth_createAccessList), and [`eth_estimateGas`](index.md#eth_estimategas). All transaction call object parameters are optional. | Key | Type | Value | -|-----|:----:|-------| -| `from` | Data, 20 bytes | Address of the sender. | -| `to` | Data, 20 bytes | Address of the action receiver. | -| `gas` | Quantity, Integer | Gas provided by the sender. `eth_call` consumes zero gas, but other executions might need this parameter. `eth_estimateGas` ignores this value. | -| `gasPrice` | Quantity, Integer | Gas price, in Wei, provided by the sender. The default is `0`. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | -| `maxPriorityFeePerGas` | Quantity, Integer | Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxFeePerGas`. | -| `maxFeePerGas` | Quantity, Integer | Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxPriorityFeePerGas`. | -| `value` | Quantity, Integer | Value transferred, in Wei. | -| `data` | Data | Hash of the method signature and encoded parameters. For details, see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html). | -| `accessList` | Array | List of addresses and storage keys that the transaction plans to access. Used only in non-[`FRONTIER`](../../concepts/transactions/types.md#frontier-transactions) transactions. | -| `strict` | Tag | If `true`, checks that the `from` account’s ether balance is sufficient to cover the transaction and gas fee. If `false`, the `gasPrice` and `baseFee` are set to zero, in order to simulate a transaction without enforcing a balance check. The default is `false`. | +| --- | :-: | --- | +| `from` | Data, 20 bytes | Address of the sender. | +| `to` | Data, 20 bytes | Address of the action receiver. | +| `gas` | Quantity, Integer | Gas provided by the sender. `eth_call` consumes zero gas, but other executions might need this parameter. `eth_estimateGas` ignores this value. | +| `gasPrice` | Quantity, Integer | Gas price, in Wei, provided by the sender. The default is `0`. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | +| `maxPriorityFeePerGas` | Quantity, Integer | Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxFeePerGas`. | +| `maxFeePerGas` | Quantity, Integer | Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxPriorityFeePerGas`. | +| `value` | Quantity, Integer | Value transferred, in Wei. | +| `data` | Data | Hash of the method signature and encoded parameters. For details, see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html). | +| `accessList` | Array | List of addresses and storage keys that the transaction plans to access. Used only in non-[`FRONTIER`](../../concepts/transactions/types.md#frontier-transactions) transactions. | +| `strict` | Tag | If `true`, checks that the `from` account’s ether balance is sufficient to cover the transaction and gas fee. If `false`, the `gasPrice` and `baseFee` are set to zero, in order to simulate a transaction without enforcing a balance check. The default is `false`. | ## Transaction receipt object Returned by [`eth_getTransactionReceipt`](index.md#eth_gettransactionreceipt). -| Key | Type | Value | -|---------------------|:--------------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | -| `blockNumber` | Quantity | Block number of block containing this transaction. | -| `contractAddress` | Data, 20 bytes | Contract address created, if contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | -| `cumulativeGasUsed` | Quantity | Total amount of gas used by previous transactions in the block and this transaction. | -| `effectiveGasPrice` | Quantity | The [actual value per gas deducted](../../concepts/transactions/types.md#eip1559-transactions) from the sender's account. | -| `from` | Data, 20 bytes | Address of the sender. | -| `gasUsed` | Quantity | Amount of gas used by this specific transaction. | -| `logs` | Array | Array of [log objects](#log-object) generated by this transaction. | -| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | -| `status` | Quantity | Either `0x0` (failure), `0x1` (success), or `0x2` (invalid). | -| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | -| `transactionHash` | Data, 32 bytes | Hash of the transaction. | -| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | -| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | -| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | -| `type` | Quantity | Transaction type, `0x00` for legacy transactions, `0x01` for access list types, `0x02` for dynamic fees. | - -!!!note - - For pre-Byzantium transactions, the transaction receipt object includes the following instead - of `status`: - | Key | Type | Value | -|-----|:----:|-------| +| --- | :-: | --- | +| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | +| `blockNumber` | Quantity | Block number of block containing this transaction. | +| `contractAddress` | Data, 20 bytes | Contract address created, if contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | +| `cumulativeGasUsed` | Quantity | Total amount of gas used by previous transactions in the block and this transaction. | +| `effectiveGasPrice` | Quantity | The [actual value per gas deducted](../../concepts/transactions/types.md#eip1559-transactions) from the sender's account. | +| `from` | Data, 20 bytes | Address of the sender. | +| `gasUsed` | Quantity | Amount of gas used by this specific transaction. | +| `logs` | Array | Array of [log objects](#log-object) generated by this transaction. | +| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | +| `status` | Quantity | Either `0x0` (failure), `0x1` (success), or `0x2` (invalid). | +| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | +| `transactionHash` | Data, 32 bytes | Hash of the transaction. | +| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | +| `type` | Quantity | Transaction type, `0x00` for legacy transactions, `0x01` for access list types, `0x02` for dynamic fees. | + +:::note + +For pre-Byzantium transactions, the transaction receipt object includes the following instead of `status`: + +| Key | Type | Value | +| ------ | :-----------------: | --------------------------- | | `root` | Data, 32 bytes | Post-transaction state root | +::: + ## Transaction trace object Returned by [`trace_replayBlockTransactions`](index.md#trace_replayblocktransactions). | Key | Type | Value | -|-----|:----:|-------| -| `output` | Boolean | Transaction result. 1 for success and 0 for failure. | -| `stateDiff` | Object | [State changes in the requested block](../trace-types.md#statediff). | -| `trace` | Array | [Ordered list of calls to other contracts](../trace-types.md#trace). | -| `vmTrace` | Object | [Ordered list of EVM actions](../trace-types.md#vmtrace). | -| `transactionHash` | Data, 32 bytes | Hash of the replayed transaction. | +| --- | :-: | --- | +| `output` | Boolean | Transaction result. 1 for success and 0 for failure. | +| `stateDiff` | Object | [State changes in the requested block](../trace-types.md#statediff). | +| `trace` | Array | [Ordered list of calls to other contracts](../trace-types.md#trace). | +| `vmTrace` | Object | [Ordered list of EVM actions](../trace-types.md#vmtrace). | +| `transactionHash` | Data, 32 bytes | Hash of the replayed transaction. | diff --git a/docs/public-networks/reference/cli/_category_.json b/docs/public-networks/reference/cli/_category_.json new file mode 100644 index 00000000000..e94b0c9a474 --- /dev/null +++ b/docs/public-networks/reference/cli/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu command line", + "position": 1 +} diff --git a/docs/public-networks/reference/cli/options.md b/docs/public-networks/reference/cli/options.md index e3e4adf1d35..63a2367a32e 100644 --- a/docs/public-networks/reference/cli/options.md +++ b/docs/public-networks/reference/cli/options.md @@ -1,6 +1,9 @@ --- +title: Options description: Hyperledger Besu command line interface reference +sidebar_position: 1 tags: + - public networks - private networks --- @@ -8,34 +11,33 @@ tags: This reference describes the syntax of the Hyperledger Besu command line interface (CLI) options. -!!! attention +:::info - This reference contains options that apply to both public and private networks. - For private-network-specific options, see the - [private network options reference](../../../private-networks/reference/cli/options.md). +This reference contains options that apply to both public and private networks. For private-network-specific options, see the [private network options reference](../../../private-networks/reference/cli/options.md). + +::: ## Specify options You can specify Besu options: -* On the command line. +- On the command line. + + ```bash + besu [OPTIONS] [SUBCOMMAND] + ``` - ```bash - besu [OPTIONS] [SUBCOMMAND] - ``` +- As an environment variable. For each command line option, the equivalent environment variable is: -* As an environment variable. - For each command line option, the equivalent environment variable is: - * Uppercase. - * `_` replaces `-`. - * Has a `BESU_` prefix. + - Uppercase. + - `_` replaces `-`. + - Has a `BESU_` prefix. - For example, set `--miner-coinbase` using the `BESU_MINER_COINBASE` environment variable. + For example, set `--miner-coinbase` using the `BESU_MINER_COINBASE` environment variable. -* In a [configuration file](../../how-to/configuration-file.md). +- In a [configuration file](../../how-to/configuration-file.md). -If you specify an option in more than one place, the order of priority is command line, environment -variable, configuration file. +If you specify an option in more than one place, the order of priority is command line, environment variable, configuration file. If using Bash or Z shell, you can view option suggestions by entering `--` and pressing the Tab key twice. @@ -43,3375 +45,3689 @@ If using Bash or Z shell, you can view option suggestions by entering `--` and p besu --Tab+Tab ``` -!!! caution +:::caution - Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. - Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em - hyphens. +Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em hyphens. + +::: ## Options ### `api-gas-price-blocks` -=== "Syntax" + + +# Syntax - ```bash - --api-gas-price-blocks= - ``` +```bash +--api-gas-price-blocks= +``` -=== "Example" +# Example + +```bash +--api-gas-price-blocks=50 +``` - ```bash - --api-gas-price-blocks=50 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_API_GAS_PRICE_BLOCKS=50 +``` - ```bash - BESU_API_GAS_PRICE_BLOCKS=50 - ``` +# Example configuration file -=== "Example configuration file" +```bash +api-gas-price-blocks=50 +``` - ```bash - api-gas-price-blocks=50 - ``` + -Number of blocks back from the head block to examine for [`eth_gasPrice`](../api/index.md#eth_gasprice). -The default is `100`. +Number of blocks back from the head block to examine for [`eth_gasPrice`](../api/index.md#eth_gasprice). The default is `100`. ### `api-gas-price-max` -=== "Syntax" + + +# Syntax + +```bash +--api-gas-price-max= +``` - ```bash - --api-gas-price-max= - ``` +# Example -=== "Example" +```bash +--api-gas-price-max=20000 +``` - ```bash - --api-gas-price-max=20000 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_API_GAS_PRICE_MAX=20000 +``` - ```bash - BESU_API_GAS_PRICE_MAX=20000 - ``` +# Example configuration file -=== "Example configuration file" +```bash +api-gas-price-max=20000 +``` - ```bash - api-gas-price-max=20000 - ``` + -Maximum gas price to return for [`eth_gasPrice`](../api/index.md#eth_gasprice), regardless of the -percentile value measured. The default is `500000000000` (500 GWei). +Maximum gas price to return for [`eth_gasPrice`](../api/index.md#eth_gasprice), regardless of the percentile value measured. The default is `500000000000` (500 GWei). ### `api-gas-price-percentile` -=== "Syntax" + + +# Syntax - ```bash - --api-gas-price-percentile= - ``` +```bash +--api-gas-price-percentile= +``` -=== "Example" +# Example + +```bash +--api-gas-price-percentile=75 +``` - ```bash - --api-gas-price-percentile=75 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_API_GAS_PRICE_PERCENTILE=75 +``` - ```bash - BESU_API_GAS_PRICE_PERCENTILE=75 - ``` +# Example configuration file -=== "Example configuration file" +```bash +api-gas-price-percentile=75 +``` - ```bash - api-gas-price-percentile=75 - ``` + -Percentile value to measure for [`eth_gasPrice`](../api/index.md#eth_gasprice). -The default is `50.0`. +Percentile value to measure for [`eth_gasPrice`](../api/index.md#eth_gasprice). The default is `50.0`. For [`eth_gasPrice`](../api/index.md#eth_gasprice), to return the: -* Highest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `100`. -* Lowest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `0`. +- Highest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `100`. +- Lowest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `0`. ### `auto-log-bloom-caching-enabled` -=== "Syntax" + + +# Syntax + +```bash +--auto-log-bloom-caching-enabled[=] +``` - ```bash - --auto-log-bloom-caching-enabled[=] - ``` +# Example -=== "Example" +```bash +--auto-log-bloom-caching-enabled=false +``` - ```bash - --auto-log-bloom-caching-enabled=false - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_AUTO_LOG_BLOOM_CACHING_ENABLED=false +``` - ```bash - BESU_AUTO_LOG_BLOOM_CACHING_ENABLED=false - ``` +# Example configuration file -=== "Example configuration file" +```bash +auto-log-bloom-caching-enabled=false +``` - ```bash - auto-log-bloom-caching-enabled=false - ``` + -Enables or disables automatic log bloom caching. APIs such as -[`eth_getLogs`](../api/index.md#eth_getlogs) and -[`eth_getFilterLogs`](../api/index.md#eth_getfilterlogs) use the cache for improved performance. -The default is `true`. +Enables or disables automatic log bloom caching. APIs such as [`eth_getLogs`](../api/index.md#eth_getlogs) and [`eth_getFilterLogs`](../api/index.md#eth_getfilterlogs) use the cache for improved performance. The default is `true`. -If automatic log bloom caching is enabled and a log bloom query reaches the end of the cache, Besu -performs an uncached query for logs not yet written to the cache. +If automatic log bloom caching is enabled and a log bloom query reaches the end of the cache, Besu performs an uncached query for logs not yet written to the cache. -Automatic log bloom caching has a small impact on performance. If you are not querying logs blooms -for a large number of blocks, you might want to disable automatic log bloom caching. +Automatic log bloom caching has a small impact on performance. If you are not querying logs blooms for a large number of blocks, you might want to disable automatic log bloom caching. ### `banned-node-ids` -=== "Syntax" + + +# Syntax + +```bash +--banned-node-ids=[,...]... +``` + +# Example - ```bash - --banned-node-ids=[,...]... - ``` +```bash +--banned-node-ids=0xc35c3...d615f,0xf42c13...fc456 +``` -=== "Example" +# Environment variable - ```bash - --banned-node-ids=0xc35c3...d615f,0xf42c13...fc456 - ``` +```bash +BESU_BANNED_NODE_IDS=0xc35c3...d615f,0xf42c13...fc456 +``` -=== "Environment variable" +# Configuration file - ```bash - BESU_BANNED_NODE_IDS=0xc35c3...d615f,0xf42c13...fc456 - ``` +```bash +banned-node-ids=["0xc35c3...d615f","0xf42c13...fc456"] +``` -=== "Configuration file" + - ```bash - banned-node-ids=["0xc35c3...d615f","0xf42c13...fc456"] - ``` +A list of node IDs with which this node will not peer. The node ID is the public key of the node. You can specify the banned node IDs with or without the `0x` prefix. -A list of node IDs with which this node will not peer. The node ID is the public key of the node. -You can specify the banned node IDs with or without the `0x` prefix. +:::tip -!!!tip +The singular `--banned-node-id` and plural `--banned-node-ids` are available and are two names for the same option. - The singular `--banned-node-id` and plural `--banned-node-ids` are available and are two names - for the same option. +::: ### `bonsai-historical-block-limit` -=== "Syntax" + + +# Syntax + +```bash +--bonsai-historical-block-limit=256 +``` - ```bash - --bonsai-historical-block-limit=256 - ``` +# Example -=== "Example" +```bash +--bonsai-historical-block-limit=256 +``` - ```bash - --bonsai-historical-block-limit=256 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_BONSAI_MAXIMUM_BACK_LAYERS_TO_LOAD=256 +``` - ```bash - BESU_BONSAI_MAXIMUM_BACK_LAYERS_TO_LOAD=256 - ``` +# Example configuration file -=== "Example configuration file" +```bash +bonsai-historical-block-limit=256 +``` - ```bash - bonsai-historical-block-limit=256 - ``` + -When using [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries), the -[maximum number of previous blocks](../../concepts/data-storage-formats.md#accessing-data) for which -Bonsai can reconstruct a historical state. -The default is 512. +When using [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries), the [maximum number of previous blocks](../../concepts/data-storage-formats.md#accessing-data) for which Bonsai can reconstruct a historical state. The default is 512. ### `bootnodes` -=== "Syntax" + - ```bash - --bootnodes[=[,...]...] - ``` +# Syntax -=== "Example" +```bash +--bootnodes[=[,...]...] +``` + +# Example + +```bash +--bootnodes=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` - ```bash - --bootnodes=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_BOOTNODES=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` - ```bash - BESU_BOOTNODES=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 - ``` +# Example configuration file -=== "Example configuration file" +```bash +bootnodes=["enode://c35c3...d615f@1.2.3.4:30303","enode://f42c13...fc456@1.2.3.5:30303"] +``` - ```bash - bootnodes=["enode://c35c3...d615f@1.2.3.4:30303","enode://f42c13...fc456@1.2.3.5:30303"] - ``` + -A list of comma-separated [enode URLs](../../concepts/node-keys.md#enode-url) for -[P2P discovery bootstrap](../../../private-networks/how-to/configure/bootnodes.md). +A list of comma-separated [enode URLs](../../concepts/node-keys.md#enode-url) for [P2P discovery bootstrap](../../../private-networks/how-to/configure/bootnodes.md). When connecting to Mainnet or public testnets, the default is a predefined list of enode URLs. -In private networks defined using [`--genesis-file`](#genesis-file) or when using -[`--network=dev`](#network), the default is an empty list of bootnodes. +In private networks defined using [`--genesis-file`](#genesis-file) or when using [`--network=dev`](#network), the default is an empty list of bootnodes. ### `color-enabled` -=== "Syntax" + + +# Syntax + +```bash +--color-enabled[=] +``` - ```bash - --color-enabled[=] - ``` +# Example -=== "Example" +```bash +--color-enabled=false +``` - ```bash - --color-enabled=false - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_COLOR_ENABLED=false +``` - ```bash - BESU_COLOR_ENABLED=false - ``` +# Example configuration file -=== "Example configuration file" +```bash +color-enabled=false +``` - ```bash - color-enabled=false - ``` + -Enables or disables color output to console. -The default is `true`. +Enables or disables color output to console. The default is `true`. ### `compatibility-eth64-forkid-enabled` -=== "Syntax" + + +# Syntax + +```bash +--compatibility-eth64-forkid-enabled[=] +``` - ```bash - --compatibility-eth64-forkid-enabled[=] - ``` +# Example -=== "Example" +```bash +--compatibility-eth64-forkid-enabled=true +``` - ```bash - --compatibility-eth64-forkid-enabled=true - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_COMPATIBILITY_ETH64_FORKID_ENABLED=true +``` - ```bash - BESU_COMPATIBILITY_ETH64_FORKID_ENABLED=true - ``` +# Example configuration file -=== "Example configuration file" +```bash +compatibility-eth64-forkid-enabled=true +``` - ```bash - compatibility-eth64-forkid-enabled=true - ``` + -Enables or disables the legacy Eth/64 fork ID. For any networks with nodes using Besu v1.4 or earlier and nodes -using Besu v20.10.1 or later, either: +Enables or disables the legacy Eth/64 fork ID. For any networks with nodes using Besu v1.4 or earlier and nodes using Besu v20.10.1 or later, either: -* All nodes must be upgraded to v20.10.1 or later. -* All nodes using v20.10.1 or later must have `--compatibility-eth64-forkid-enabled` set to `true`. +- All nodes must be upgraded to v20.10.1 or later. +- All nodes using v20.10.1 or later must have `--compatibility-eth64-forkid-enabled` set to `true`. The default is `false`. -!!! caution +:::caution - If networks have Besu nodes using v1.4 or earlier and other Besu nodes using v20.10.1 or later, - the nodes on different versions cannot communicate unless `--compatibility-eth64-forkid-enabled` - is set to `true`. +If networks have Besu nodes using v1.4 or earlier and other Besu nodes using v20.10.1 or later, the nodes on different versions cannot communicate unless `--compatibility-eth64-forkid-enabled` is set to `true`. + +::: ### `config-file` -=== "Syntax" + - ```bash - --config-file= - ``` +# Syntax -=== "Example" +```bash +--config-file= +``` - ```bash - --config-file=/home/me/me_node/config.toml - ``` +# Example -=== "Environment variable" +```bash +--config-file=/home/me/me_node/config.toml +``` - ```bash - BESU_CONFIG_FILE=/home/me/me_node/config.toml - ``` +# Environment variable -The path to the [TOML configuration file](../../how-to/configuration-file.md). -The default is `none`. +```bash +BESU_CONFIG_FILE=/home/me/me_node/config.toml +``` -### `data-path` + -=== "Syntax" +The path to the [TOML configuration file](../../how-to/configuration-file.md). The default is `none`. - ```bash - --data-path= - ``` +### `data-path` -=== "Example" + - ```bash - --data-path=/home/me/me_node - ``` +# Syntax -=== "Environment variable" +```bash +--data-path= +``` - ```bash - BESU_DATA_PATH=/home/me/me_node - ``` +# Example -=== "Configuration file" +```bash +--data-path=/home/me/me_node +``` - ```bash - data-path="/home/me/me_node" - ``` +# Environment variable -The path to the Besu data directory. The default is the directory you installed Besu in, or -`/opt/besu/database` if using the [Besu Docker image](../../get-started/install/run-docker-image.md). +```bash +BESU_DATA_PATH=/home/me/me_node +``` -### `data-storage-format` +# Configuration file -=== "Syntax" +```bash +data-path="/home/me/me_node" +``` - ```bash - --data-storage-format= - ``` + -=== "Example" +The path to the Besu data directory. The default is the directory you installed Besu in, or `/opt/besu/database` if using the [Besu Docker image](../../get-started/install/run-docker-image.md). - ```bash - --data-storage-format=BONSAI - ``` +### `data-storage-format` -=== "Environment variable" + - ```bash - BESU_DATA_STORAGE_FORMAT=BONSAI - ``` +# Syntax -=== "Configuration file" +```bash +--data-storage-format= +``` - ```bash - data-storage-format="BONSAI" - ``` +# Example -The [data storage format](../../concepts/data-storage-formats.md) to use. -Set to `BONSAI` for Bonsai Tries or `FOREST` for Forest of Tries. -The default is `FOREST`. +```bash +--data-storage-format=BONSAI +``` -### `discovery-dns-url` +# Environment variable -=== "Syntax" +```bash +BESU_DATA_STORAGE_FORMAT=BONSAI +``` - ```bash - --discovery-dns-url= - ``` +# Configuration file -=== "Environment variable" +```bash +data-storage-format="BONSAI" +``` - ```bash - BESU_DISCOVERY_DNS_URL=enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org - ``` + -=== "Example configuration file" +The [data storage format](../../concepts/data-storage-formats.md) to use. Set to `BONSAI` for Bonsai Tries or `FOREST` for Forest of Tries. The default is `FOREST`. - ```bash - discovery-dns-url="enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" - ``` +### `discovery-dns-url` -The `enrtree` URL of the DNS node list for [node discovery via DNS](https://eips.ethereum.org/EIPS/eip-1459). -The default is `null`. + -### `discovery-enabled` +# Syntax -=== "Syntax" +```bash +--discovery-dns-url= +``` - ```bash - --discovery-enabled[=] - ``` +# Environment variable -=== "Example" +```bash +BESU_DISCOVERY_DNS_URL=enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org +``` - ```bash - --discovery-enabled=false - ``` +# Example configuration file -=== "Environment variable" +```bash +discovery-dns-url="enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" +``` - ```bash - BESU_DISCOVERY_ENABLED=false - ``` + -=== "Example configuration file" +The `enrtree` URL of the DNS node list for [node discovery via DNS](https://eips.ethereum.org/EIPS/eip-1459). The default is `null`. - ```bash - discovery-enabled=false - ``` +### `discovery-enabled` -Enables or disables P2P discovery. -The default is `true`. + -!!! note +# Syntax - You can override the default DNS server if it's unreliable or doesn't serve TCP DNS requests, using the - [early access option](#xhelp) `--Xp2p-dns-discovery-server=`. +```bash +--discovery-enabled[=] +``` -### `engine-host-allowlist` +# Example -=== "Syntax" +```bash +--discovery-enabled=false +``` - ```bash - --engine-host-allowlist=[,...]... or "*" - ``` +# Environment variable -=== "Example" +```bash +BESU_DISCOVERY_ENABLED=false +``` - ```bash - --engine-host-allowlist=localhost,127.0.0.1 - ``` +# Example configuration file -=== "Environment variable" +```bash +discovery-enabled=false +``` - ```bash - BESU_ENGINE_HOST_ALLOWLIST=localhost,127.0.0.1 - ``` + -=== "Configuration file" +Enables or disables P2P discovery. The default is `true`. - ```bash - engine-host-allowlist=["localhost","127.0.0.1"] - ``` +:::note -A comma-separated list of hostnames to allow for Engine API access (applies to both HTTP and WebSocket). +You can override the default DNS server if it's unreliable or doesn't serve TCP DNS requests, using the [early access option](#xhelp) `--Xp2p-dns-discovery-server=`. -!!!tip +::: - To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames in production - environments. +### `engine-host-allowlist` -### `engine-jwt-disabled` + -=== "Syntax" +# Syntax - ```bash - --engine-jwt-disabled[=] - ``` +```bash +--engine-host-allowlist=[,...]... or "*" +``` -=== "Example" +# Example - ```bash - --engine-jwt-disabled=true - ``` +```bash +--engine-host-allowlist=localhost,127.0.0.1 +``` -=== "Environment variable" +# Environment variable - ```bash - BESU_ENGINE_JWT_DISABLED=true - ``` +```bash +BESU_ENGINE_HOST_ALLOWLIST=localhost,127.0.0.1 +``` -=== "Configuration file" +# Configuration file - ```bash - engine-jwt-disabled=true - ``` -Disables or enables [authentication](../../how-to/use-engine-api.md#authentication) for Engine APIs. -The default is `false` (authentication is enabled by default). +```bash +engine-host-allowlist=["localhost","127.0.0.1"] +``` -### `engine-jwt-secret` + -=== "Syntax" +A comma-separated list of hostnames to allow for Engine API access (applies to both HTTP and WebSocket). - ```bash - --engine-jwt-secret= - ``` +:::tip -=== "Example" +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames in production environments. - ```bash - --engine-jwt-secret=jwt.hex - ``` +::: -=== "Environment variable" +### `engine-jwt-disabled` - ```bash - BESU_ENGINE_JWT_SECRET="jwt.hex" - ``` + -=== "Configuration file" +# Syntax - ```bash - engine-jwt-secret="jwt.hex" - ``` +```bash +--engine-jwt-disabled[=] +``` -Shared secret used to authenticate [consensus clients](../../concepts/the-merge.md) when using the Engine JSON-RPC API (both -HTTP and WebSocket). -Contents of file must be at least 32 hex-encoded bytes and not begin with `0x`. -May be a relative or absolute path. -See an [example of how to generate this](../../get-started/connect/mainnet.md#1-generate-the-shared-secret). +# Example -### `engine-rpc-enabled` +```bash +--engine-jwt-disabled=true +``` -=== "Syntax" +# Environment variable - ```bash - --engine-rpc-enabled[= - ``` +```bash +BESU_ENGINE_JWT_DISABLED=true +``` -=== "Example" +# Configuration file - ```bash - --engine-rpc-enabled - ``` +```bash +engine-jwt-disabled=true +``` -=== "Environment variable" + - ```bash - BESU_ENGINE_RPC_ENABLED=true - ``` +Disables or enables [authentication](../../how-to/use-engine-api.md#authentication) for Engine APIs. The default is `false` (authentication is enabled by default). -=== "Configuration file" +### `engine-jwt-secret` - ```bash - engine-rpc-enabled=true - ``` + -Enables or disables the [Engine API](../engine-api/index.md). -The default is `false`. +# Syntax -### `engine-rpc-port` +```bash +--engine-jwt-secret= +``` -=== "Syntax" +# Example - ```bash - --engine-rpc-port= - ``` +```bash +--engine-jwt-secret=jwt.hex +``` -=== "Example" +# Environment variable - ```bash - --engine-rpc-port=8551 - ``` +```bash +BESU_ENGINE_JWT_SECRET="jwt.hex" +``` -=== "Environment variable" +# Configuration file - ```bash - BESU_ENGINE_RPC_PORT=8551 - ``` +```bash +engine-jwt-secret="jwt.hex" +``` -=== "Configuration file" + - ```bash - engine-rpc-port="8551" - ``` +Shared secret used to authenticate [consensus clients](../../concepts/the-merge.md) when using the Engine JSON-RPC API (both HTTP and WebSocket). Contents of file must be at least 32 hex-encoded bytes and not begin with `0x`. May be a relative or absolute path. See an [example of how to generate this](../../get-started/connect/mainnet.md#1-generate-the-shared-secret). -The listening port for the Engine API calls (`ENGINE`, `ETH`) for JSON-RPC over HTTP and WebSocket. -The default is `8551`. +### `engine-rpc-enabled` -### `ethstats` + -=== "Syntax" +# Syntax - ```bash - --ethstats= - ``` +```bash +--engine-rpc-enabled[= +``` -=== "Example" +# Example - ```bash - --ethstats=Dev-Node-1:secret@127.0.0.1:3001 - ``` +```bash +--engine-rpc-enabled +``` -=== "Environment variable" +# Environment variable - ```bash - BESU_ETHSTATS=Dev-Node-1:secret@127.0.0.1:3001 - ``` +```bash +BESU_ENGINE_RPC_ENABLED=true +``` -=== "Configuration file" +# Configuration file - ```bash - ethstats="Dev-Node-1:secret@127.0.0.1:3001" - ``` +```bash +engine-rpc-enabled=true +``` -Reporting URL of an [Ethstats](../../../private-networks/how-to/deploy/ethstats.md) server. -If specified without a port, the default port is 443 for SSL connections and 80 for non-SSL connections. + -### `ethstats-cacert-file` +Enables or disables the [Engine API](../engine-api/index.md). The default is `false`. -=== "Syntax" +### `engine-rpc-port` - ```bash - --ethstats-cacert-file= - ``` + -=== "Example" +# Syntax - ```bash - --ethstats-cacert-file=./root.cert - ``` +```bash +--engine-rpc-port= +``` -=== "Environment variable" +# Example - ```bash - BESU_ETHSTATS_CACERT_FILE=./root.cert - ``` +```bash +--engine-rpc-port=8551 +``` -=== "Configuration file" +# Environment variable - ```bash - ethstats-cacert-file="./root.cert" - ``` +```bash +BESU_ENGINE_RPC_PORT=8551 +``` -Path to the root certificate authority (CA) certificate file of the Ethstats server specified by -[`--ethstats`](#ethstats). -This option is useful in non-production environments. +# Configuration file -### `ethstats-contact` +```bash +engine-rpc-port="8551" +``` -=== "Syntax" + - ```bash - --ethstats-contact= - ``` +The listening port for the Engine API calls (`ENGINE`, `ETH`) for JSON-RPC over HTTP and WebSocket. The default is `8551`. -=== "Example" +### `ethstats` - ```bash - --ethstats-contact=contact@mail.com - ``` + -=== "Environment variable" +# Syntax - ```bash - BESU_ETHSTATS_CONTACT=contact@mail.com - ``` +```bash +--ethstats= +``` -=== "Configuration file" +# Example - ```bash - ethstats-contact="contact@mail.com" - ``` +```bash +--ethstats=Dev-Node-1:secret@127.0.0.1:3001 +``` -Contact email address to send to the Ethstats server specified by [`--ethstats`](#ethstats). +# Environment variable -### `fast-sync-min-peers` +```bash +BESU_ETHSTATS=Dev-Node-1:secret@127.0.0.1:3001 +``` -=== "Syntax" +# Configuration file - ```bash - --fast-sync-min-peers= - ``` +```bash +ethstats="Dev-Node-1:secret@127.0.0.1:3001" +``` -=== "Example" + - ```bash - --fast-sync-min-peers=8 - ``` +Reporting URL of an [Ethstats](../../../private-networks/how-to/deploy/ethstats.md) server. If specified without a port, the default port is 443 for SSL connections and 80 for non-SSL connections. -=== "Environment variable" +### `ethstats-cacert-file` - ```bash - BESU_FAST_SYNC_MIN_PEERS=8 - ``` + -=== "Example configuration file" +# Syntax - ```bash - fast-sync-min-peers=8 - ``` +```bash +--ethstats-cacert-file= +``` -The minimum number of peers required before starting [fast synchronization](../../get-started/connect/sync-node.md#fast-synchronization) -in [proof of work](../../how-to/use-pow/mining.md) networks. -The default is 5. +# Example -!!! important +```bash +--ethstats-cacert-file=./root.cert +``` - This option only applies to proof of work networks. +# Environment variable -### `genesis-file` +```bash +BESU_ETHSTATS_CACERT_FILE=./root.cert +``` -=== "Syntax" +# Configuration file - ```bash - --genesis-file= - ``` +```bash +ethstats-cacert-file="./root.cert" +``` -=== "Example" + - ```bash - --genesis-file=/home/me/me_node/customGenesisFile.json - ``` +Path to the root certificate authority (CA) certificate file of the Ethstats server specified by [`--ethstats`](#ethstats). This option is useful in non-production environments. -=== "Environment variable" +### `ethstats-contact` - ```bash - BESU_GENESIS_FILE=/home/me/me_node/customGenesisFile.json - ``` + -=== "Configuration file" +# Syntax - ```bash - genesis-file="/home/me/me_node/customGenesisFile.json" - ``` +```bash +--ethstats-contact= +``` -The path to the [genesis file](../../concepts/genesis-file.md). +# Example -!!!important +```bash +--ethstats-contact=contact@mail.com +``` - You can't use the [`--genesis-file`](#genesis-file) and [`--network`](#network) options at the - same time. +# Environment variable -### `graphql-http-cors-origins` +```bash +BESU_ETHSTATS_CONTACT=contact@mail.com +``` -=== "Syntax" +# Configuration file - ```bash - --graphql-http-cors-origins= - ``` +```bash +ethstats-contact="contact@mail.com" +``` -=== "Example" + - ```bash - --graphql-http-cors-origins="http://medomain.com","https://meotherdomain.com" - ``` +Contact email address to send to the Ethstats server specified by [`--ethstats`](#ethstats). -=== "Environment variable" +### `fast-sync-min-peers` - ```bash - BESU_GRAPHQL_HTTP_CORS_ORIGINS="http://medomain.com","https://meotherdomain.com" - ``` + -=== "Configuration file" +# Syntax - ```bash - graphql-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] - ``` +```bash +--fast-sync-min-peers= +``` -A list of comma-separated origin domain URLs for CORS validation. The default is none. +# Example -### `graphql-http-enabled` +```bash +--fast-sync-min-peers=8 +``` -=== "Syntax" +# Environment variable - ```bash - --graphql-http-enabled[=] - ``` +```bash +BESU_FAST_SYNC_MIN_PEERS=8 +``` -=== "Example" +# Example configuration file - ```bash - --graphql-http-enabled - ``` +```bash +fast-sync-min-peers=8 +``` -=== "Environment variable" + - ```bash - BESU_GRAPHQL_HTTP_ENABLED=true - ``` +The minimum number of peers required before starting [fast synchronization](../../get-started/connect/sync-node.md#fast-synchronization) in [proof of work](../../how-to/use-pow/mining.md) networks. The default is 5. -=== "Configuration file" +:::info - ```bash - graphql-http-enabled=true - ``` +This option only applies to proof of work networks. -Enables or disables the GraphQL HTTP service. The default is `false`. +::: -The default GraphQL HTTP service endpoint is `http://127.0.0.1:8547/graphql` if set to `true`. +### `genesis-file` -### `graphql-http-host` + -=== "Syntax" +# Syntax - ```bash - --graphql-http-host= - ``` +```bash +--genesis-file= +``` -=== "Example" +# Example - ```bash - # to listen on all interfaces - --graphql-http-host=0.0.0.0 - ``` +```bash +--genesis-file=/home/me/me_node/customGenesisFile.json +``` -=== "Environment variable" +# Environment variable - ```bash - # to listen on all interfaces - BESU_GRAPHQL_HTTP_HOST=0.0.0.0 - ``` +```bash +BESU_GENESIS_FILE=/home/me/me_node/customGenesisFile.json +``` -=== "Configuration file" +# Configuration file - ```bash - graphql-http-host="0.0.0.0" - ``` +```bash +genesis-file="/home/me/me_node/customGenesisFile.json" +``` -The host on which GraphQL HTTP listens. -The default is `127.0.0.1`. + -To allow remote connections, set to `0.0.0.0`. +The path to the [genesis file](../../concepts/genesis-file.md). -### `graphql-http-port` +:::caution -=== "Syntax" +You can't use the [`--genesis-file`](#genesis-file) and [`--network`](#network) options at the same time. - ```bash - --graphql-http-port= - ``` +::: -=== "Example" +### `graphql-http-cors-origins` - ```bash - # to listen on port 6175 - --graphql-http-port=6175 - ``` + -=== "Environment variable" +# Syntax - ```bash - # to listen on port 6175 - BESU_GRAPHQL_HTTP_PORT=6175 - ``` +```bash +--graphql-http-cors-origins= +``` + +# Example + +```bash +--graphql-http-cors-origins="http://medomain.com","https://meotherdomain.com" +``` + +# Environment variable + +```bash +BESU_GRAPHQL_HTTP_CORS_ORIGINS="http://medomain.com","https://meotherdomain.com" +``` + +# Configuration file + +```bash +graphql-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] +``` + + + +A list of comma-separated origin domain URLs for CORS validation. The default is none. + +### `graphql-http-enabled` + + + +# Syntax + +```bash +--graphql-http-enabled[=] +``` + +# Example + +```bash +--graphql-http-enabled +``` + +# Environment variable + +```bash +BESU_GRAPHQL_HTTP_ENABLED=true +``` + +# Configuration file + +```bash +graphql-http-enabled=true +``` + + + +Enables or disables the GraphQL HTTP service. The default is `false`. + +The default GraphQL HTTP service endpoint is `http://127.0.0.1:8547/graphql` if set to `true`. + +### `graphql-http-host` + + + +# Syntax + +```bash +--graphql-http-host= +``` + +# Example + +```bash +# to listen on all interfaces +--graphql-http-host=0.0.0.0 +``` + +# Environment variable + +```bash +# to listen on all interfaces +BESU_GRAPHQL_HTTP_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +graphql-http-host="0.0.0.0" +``` + + + +The host on which GraphQL HTTP listens. The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0`. + +### `graphql-http-port` + + + +# Syntax + +```bash +--graphql-http-port= +``` + +# Example + +```bash +# to listen on port 6175 +--graphql-http-port=6175 +``` + +# Environment variable + +```bash +# to listen on port 6175 +BESU_GRAPHQL_HTTP_PORT=6175 +``` + +# Configuration file + +```bash +graphql-http-port="6175" +``` + + + +The port (TCP) on which GraphQL HTTP listens. The default is `8547`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `help` + + + +# Syntax + +```bash +-h, --help +``` + + + +Show the help message and exit. + +### `host-allowlist` + + + +# Syntax + +```bash +--host-allowlist=[,...]... or "*" +``` + +# Example + +```bash +--host-allowlist=medomain.com,meotherdomain.com +``` + +# Environment variable + +```bash +BESU_HOST_ALLOWLIST=medomain.com,meotherdomain.com +``` + +# Configuration file + +```bash +host-allowlist=["medomain.com", "meotherdomain.com"] +``` + + + +A comma-separated list of hostnames to [access the JSON-RPC API](../../how-to/use-besu-api/index.md#host-allowlist) and [pull Besu metrics](../../how-to/monitor/metrics.md). By default, Besu accepts requests from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the API, we recommend using the [Besu authentication mechanism](../../how-to/use-besu-api/authenticate.md) with username and password authentication or JWT public key authentication. + +::: + +:::note + +If using [Prometheus](https://prometheus.io/) to pull metrics from a node, you must specify all the other nodes you want to pull metrics from in the list of allowed hostnames. + +::: + +:::tip + +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames for production environments. + +::: + +### `identity` + + + +# Syntax + +```bash +--identity= +``` + +# Example + +```bash +--identity=MyNode +``` + +# Environment variable + +```bash +BESU_IDENTITY=MyNode +``` + +# Configuration file + +```bash +identity="MyNode" +``` + + + +The name for the node. If specified, it's the second section of the client ID provided by some Ethereum network explorers. For example, in the client ID `besu/MyNode/v1.3.4/linux-x86_64/oracle_openjdk-java-11`, the node name is `MyNode`. + +If a name is not specified, the name section is not included in the client ID. For example, `besu/v1.3.4/linux-x86_64/oracle_openjdk-java-11`. + +### `key-value-storage` + + + +# Syntax + +```bash +--key-value-storage= +``` + +# Example + +```bash +--key-value-storage=rocksdb +``` + +# Environment variable + +```bash +BESU_KEY_VALUE_STORAGE=rocksdb +``` + +# Configuration file + +```bash +key-value-storage="rocksdb" +``` + + + +The key-value storage to use. Use this option only if using a storage system provided with a plugin. The default is `rocksdb`. + +For development use only, the `memory` option provides ephemeral storage for sync testing and debugging. + +### `logging` + + + +# Syntax + +```bash +-l, --logging= +``` + +# Example + +```bash +--logging=DEBUG +``` + +# Environment variable + +```bash +BESU_LOGGING=DEBUG +``` + +# Example configuration file + +```bash +logging="DEBUG" +``` + + + +Sets logging verbosity. Log levels are `OFF`, `FATAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. The default is `INFO`. + +### `max-peers` + + + +# Syntax + +```bash +--max-peers= +``` + +# Example + +```bash +--max-peers=42 +``` + +# Environment variable + +```bash +BESU_MAX_PEERS=42 +``` + +# Configuration file + +```bash +max-peers=42 +``` + + + +The maximum number of P2P connections you can establish. The default is 25. + +:::caution + +The minimum number of peers is set by the early access option `--Xp2p-peer-lower-bound`, which also has a default of 25. If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` option to the same value or lower. For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. + +::: + +### `metrics-category` + + + +# Syntax + +```bash +--metrics-category=[,metrics-category...]... +``` + +# Example + +```bash +--metrics-category=BLOCKCHAIN,PEERS,PROCESS +``` + +# Environment variable + +```bash +BESU_METRICS_CATEGORY=BLOCKCHAIN,PEERS,PROCESS +``` + +# Configuration file + +```bash +metrics-category=["BLOCKCHAIN","PEERS","PROCESS"] +``` + + + +A comma-separated list of categories for which to track metrics. The defaults are `BLOCKCHAIN`, `ETHEREUM`, `EXECUTORS`, `JVM`, `NETWORK`, `PEERS`, `PERMISSIONING`, `PROCESS`, `PRUNER`, `RPC`, `STRATUM`, `SYNCHRONIZER`, and `TRANSACTION_POOL`. + +Other categories are `KVSTORE_ROCKSDB`, `KVSTORE_PRIVATE_ROCKSDB`, `KVSTORE_ROCKSDB_STATS`, and `KVSTORE_PRIVATE_ROCKSDB_STATS`. + +Categories containing `PRIVATE` track metrics when you enable [private transactions](../../../private-networks/concepts/privacy/index.md). + +### `metrics-enabled` + + + +# Syntax + +```bash +--metrics-enabled[=] +``` + +# Example + +```bash +--metrics-enabled +``` + +# Environment variable + +```bash +BESU_METRICS_ENABLED=true +``` + +# Configuration file + +```bash +metrics-enabled=true +``` + + + +Enables or disables the [metrics exporter](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The default is `false`. + +You can't specify `--metrics-enabled` with [`--metrics-push-enabled`](#metrics-push-enabled). That is, you can enable either Prometheus polling or Prometheus push gateway support, but not both at once. + +### `metrics-host` + + + +# Syntax + +```bash +--metrics-host= +``` + +# Example + +```bash +--metrics-host=127.0.0.1 +``` + +# Environment variable + +```bash +BESU_METRICS_HOST=127.0.0.1 +``` + +# Configuration file + +```bash +metrics-host="127.0.0.1" +``` + + + +The host on which [Prometheus](https://prometheus.io/) accesses [Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The metrics server respects the [`--host-allowlist` option](#host-allowlist). + +The default is `127.0.0.1`. + +### `metrics-port` + + + +# Syntax + +```bash +--metrics-port= +``` + +# Example + +```bash +--metrics-port=6174 +``` + +# Environment variable + +```bash +BESU_METRICS_PORT=6174 +``` + +# Configuration file + +```bash +metrics-port="6174" +``` + + + +The port (TCP) on which [Prometheus](https://prometheus.io/) accesses [Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The default is `9545`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `metrics-protocol` + + + +# Syntax + +```bash +--metrics-protocol= +``` + +# Example + +```bash +--metrics-protocol=OPENTELEMETRY +``` + +# Environment variable + +```bash +BESU_METRICS_PROTOCOL=OPENTELEMETRY +``` + +# Configuration file + +```bash +metrics-protocol="OPENTELEMETRY" +``` + + + +Metrics protocol to use: `PROMETHEUS`, `OPENTELEMETRY`, or `NONE`. The default is `PROMETHEUS`. + +### `metrics-push-enabled` + + + +# Syntax + +```bash +--metrics-push-enabled[=] +``` + +# Example + +```bash +--metrics-push-enabled=true +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_ENABLED=true +``` + +# Configuration file + +```bash +metrics-push-enabled=true +``` + + + +Enables or disables [push gateway integration]. + +You can't specify `--metrics-push-enabled` with [`--metrics-enabled`](#metrics-enabled). That is, you can enable either Prometheus polling or Prometheus push gateway support, but not both at once. + +### `metrics-push-host` + + + +# Syntax + +```bash +--metrics-push-host= +``` + +# Example + +```bash +--metrics-push-host=127.0.0.1 +``` -=== "Configuration file" +# Environment variable - ```bash - graphql-http-port="6175" - ``` +```bash +BESU_METRICS_PUSH_HOST=127.0.0.1 +``` -The port (TCP) on which GraphQL HTTP listens. The default is `8547`. Ports must be -[exposed appropriately](../../how-to/connect/configure-ports.md). +# Configuration file -### `help` +```bash +metrics-push-host="127.0.0.1" +``` -=== "Syntax" + - ```bash - -h, --help - ``` +The host of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The default is `127.0.0.1`. The metrics server respects the [`--host-allowlist` option](#host-allowlist). -Show the help message and exit. +:::note -### `host-allowlist` +When pushing metrics, ensure you set `--metrics-push-host` to the machine on which the push gateway is. Generally, this is a different machine to the machine on which Besu is running. + +::: -=== "Syntax" +### `metrics-push-interval` - ```bash - --host-allowlist=[,...]... or "*" - ``` + -=== "Example" +# Syntax - ```bash - --host-allowlist=medomain.com,meotherdomain.com - ``` +```bash +--metrics-push-interval= +``` -=== "Environment variable" +# Example - ```bash - BESU_HOST_ALLOWLIST=medomain.com,meotherdomain.com - ``` +```bash +--metrics-push-interval=30 +``` -=== "Configuration file" +# Environment variable - ```bash - host-allowlist=["medomain.com", "meotherdomain.com"] - ``` +```bash +BESU_METRICS_PUSH_INTERVAL=30 +``` -A comma-separated list of hostnames to [access the JSON-RPC API](../../how-to/use-besu-api/index.md#host-allowlist) and -[pull Besu metrics](../../how-to/monitor/metrics.md). -By default, Besu accepts requests from `localhost` and `127.0.0.1`. +# Configuration file -!!! important +```bash +metrics-push-interval=30 +``` - This isn't a permissioning feature. - To restrict access to the API, we recommend using the - [Besu authentication mechanism](../../how-to/use-besu-api/authenticate.md) with username and password - authentication or JWT public key authentication. + -!!! note +The interval, in seconds, to push metrics when in `push` mode. The default is 15. - If using [Prometheus](https://prometheus.io/) to pull metrics from a node, you must specify all - the other nodes you want to pull metrics from in the list of allowed hostnames. +### `metrics-push-port` -!!! tip + - To allow all hostnames, use `"*"`. - We don't recommend allowing all hostnames for production environments. +# Syntax -### `identity` +```bash +--metrics-push-port= +``` -=== "Syntax" +# Example - ```bash - --identity= - ``` +```bash +--metrics-push-port=6174 +``` -=== "Example" +# Environment variable - ```bash - --identity=MyNode - ``` +```bash +BESU_METRICS_PUSH_PORT=6174 +``` -=== "Environment variable" +# Configuration file - ```bash - BESU_IDENTITY=MyNode - ``` +```bash +metrics-push-port="6174" +``` -=== "Configuration file" + - ```bash - identity="MyNode" - ``` +The port (TCP) of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The default is `9001`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). -The name for the node. If specified, it's the second section of the client ID provided by some -Ethereum network explorers. For example, in the client ID -`besu/MyNode/v1.3.4/linux-x86_64/oracle_openjdk-java-11`, the node name is `MyNode`. +### `metrics-push-prometheus-job` -If a name is not specified, the name section is not included in the client ID. For example, -`besu/v1.3.4/linux-x86_64/oracle_openjdk-java-11`. + -### `key-value-storage` +# Syntax -=== "Syntax" +```bash +--metrics-push-prometheus-job= +``` - ```bash - --key-value-storage= - ``` +# Example -=== "Example" +```bash +--metrics-push-prometheus-job="my-custom-job" +``` - ```bash - --key-value-storage=rocksdb - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_METRICS_PUSH_PROMETHEUS_JOB="my-custom-job" +``` - ```bash - BESU_KEY_VALUE_STORAGE=rocksdb - ``` +# Configuration file -=== "Configuration file" +```bash +metrics-push-prometheus-job="my-custom-job" +``` - ```bash - key-value-storage="rocksdb" - ``` + -The key-value storage to use. Use this option only if using a storage system provided with a -plugin. The default is `rocksdb`. +The job name when in `push` mode. The default is `besu-client`. -For development use only, the `memory` option provides ephemeral storage for sync testing and debugging. +### `min-block-occupancy-ratio` -### `logging` + -=== "Syntax" +# Syntax - ```bash - -l, --logging= - ``` +```bash +--min-block-occupancy-ratio= +``` -=== "Example" +# Example - ```bash - --logging=DEBUG - ``` +```bash +--min-block-occupancy-ratio=0.5 +``` -=== "Environment variable" +# Environment variable - ```bash - BESU_LOGGING=DEBUG - ``` +```bash +BESU_MIN_BLOCK_OCCUPANCY_RATIO=0.5 +``` -=== "Example configuration file" +# Configuration file - ```bash - logging="DEBUG" - ``` +```bash +min-block-occupancy-ratio="0.5" +``` -Sets logging verbosity. Log levels are `OFF`, `FATAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, -`ALL`. The default is `INFO`. + -### `max-peers` +Minimum occupancy ratio for a mined block if the transaction pool is not empty. When filling a block during mining, the occupancy ratio indicates the threshold at which the node stops waiting for smaller transactions to fill the remaining space. The default is 0.8. -=== "Syntax" +### `miner-coinbase` - ```bash - --max-peers= - ``` + -=== "Example" +# Syntax - ```bash - --max-peers=42 - ``` +```bash +--miner-coinbase= +``` -=== "Environment variable" +# Example - ```bash - BESU_MAX_PEERS=42 - ``` +```bash +--miner-coinbase=fe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` -=== "Configuration file" +# Environment variable - ```bash - max-peers=42 - ``` +```bash +BESU_MINER_COINBASE=fe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` -The maximum number of P2P connections you can establish. The default is 25. +# Configuration file -!!! caution +```bash +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +``` - The minimum number of peers is set by the early access option `--Xp2p-peer-lower-bound`, which - also has a default of 25. - If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` - option to the same value or lower. - For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. + -### `metrics-category` +The account you pay mining rewards to. You must specify a valid coinbase when you enable mining using the [`--miner-enabled`](#miner-enabled) option or the [`miner_start`](../api/index.md#miner_start) JSON-RPC API method. -=== "Syntax" +:::note - ```bash - --metrics-category=[,metrics-category...]... - ``` +Besu ignores this option in networks using [Clique](../../../private-networks/how-to/configure/consensus/clique.md), [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md), or [QBFT](../../../private-networks/how-to/configure/consensus/qbft.md) consensus protocols. -=== "Example" +::: - ```bash - --metrics-category=BLOCKCHAIN,PEERS,PROCESS - ``` +### `miner-enabled` -=== "Environment variable" + - ```bash - BESU_METRICS_CATEGORY=BLOCKCHAIN,PEERS,PROCESS - ``` +# Syntax -=== "Configuration file" +```bash +--miner-enabled[=] +``` - ```bash - metrics-category=["BLOCKCHAIN","PEERS","PROCESS"] - ``` +# Example -A comma-separated list of categories for which to track metrics. The defaults are `BLOCKCHAIN`, -`ETHEREUM`, `EXECUTORS`, `JVM`, `NETWORK`, `PEERS`, `PERMISSIONING`, `PROCESS`, `PRUNER`, `RPC`, -`STRATUM`, `SYNCHRONIZER`, and `TRANSACTION_POOL`. +```bash +--miner-enabled=true +``` -Other categories are `KVSTORE_ROCKSDB`, `KVSTORE_PRIVATE_ROCKSDB`, `KVSTORE_ROCKSDB_STATS`, and -`KVSTORE_PRIVATE_ROCKSDB_STATS`. +# Environment variable -Categories containing `PRIVATE` track metrics when you enable -[private transactions](../../../private-networks/concepts/privacy/index.md). +```bash +BESU_MINER_ENABLED=true +``` -### `metrics-enabled` +# Configuration file -=== "Syntax" +```bash +miner-enabled=true +``` - ```bash - --metrics-enabled[=] - ``` + -=== "Example" +Enables or disables mining when you start the node. The default is `false`. - ```bash - --metrics-enabled - ``` +### `miner-extra-data` -=== "Environment variable" + - ```bash - BESU_METRICS_ENABLED=true - ``` +# Syntax -=== "Configuration file" +```bash +--miner-extra-data= +``` - ```bash - metrics-enabled=true - ``` +# Example -Enables or disables the -[metrics exporter](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The -default is `false`. +```bash +--miner-extra-data=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 +``` -You can't specify `--metrics-enabled` with [`--metrics-push-enabled`](#metrics-push-enabled). That is, you can enable -either Prometheus polling or Prometheus push gateway support, but not both at once. +# Environment variable -### `metrics-host` +```bash +BESU_MINER_EXTRA_DATA=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 +``` -=== "Syntax" +# Configuration file - ```bash - --metrics-host= - ``` +```bash +miner-extra-data="0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021" +``` -=== "Example" + - ```bash - --metrics-host=127.0.0.1 - ``` +A hex string representing the 32 bytes included in the extra data field of a mined block. The default is 0x. -=== "Environment variable" +### `miner-stratum-enabled` - ```bash - BESU_METRICS_HOST=127.0.0.1 - ``` + -=== "Configuration file" +# Syntax - ```bash - metrics-host="127.0.0.1" - ``` +```bash +--miner-stratum-enabled +``` -The host on which [Prometheus](https://prometheus.io/) accesses -[Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The -metrics server respects the [`--host-allowlist` option](#host-allowlist). +# Environment variable -The default is `127.0.0.1`. +```bash +BESU_MINER_STRATUM_ENABLED=true +``` -### `metrics-port` +# Configuration file + +```bash +miner-stratum-enabled=true +``` -=== "Syntax" + - ```bash - --metrics-port= - ``` +Enables a node to perform stratum mining. The default is `false`. + +### `miner-stratum-host` -=== "Example" + - ```bash - --metrics-port=6174 - ``` +# Syntax -=== "Environment variable" +```bash +--miner-stratum-host= +``` - ```bash - BESU_METRICS_PORT=6174 - ``` +# Example -=== "Configuration file" +```bash +--miner-stratum-host=192.168.1.132 +``` - ```bash - metrics-port="6174" - ``` +# Environment variable -The port (TCP) on which [Prometheus](https://prometheus.io/) accesses -[Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The -default is `9545`. Ports must be -[exposed appropriately](../../how-to/connect/configure-ports.md). +```bash +BESU_MINER_STRATUM_HOST=192.168.1.132 +``` -### `metrics-protocol` +# Configuration file -=== "Syntax" +```bash +miner-stratum-host="192.168.1.132" +``` - ```bash - --metrics-protocol= - ``` + -=== "Example" +The host of the stratum mining service. The default is `0.0.0.0`. - ```bash - --metrics-protocol=OPENTELEMETRY - ``` +### `miner-stratum-port` -=== "Environment variable" + - ```bash - BESU_METRICS_PROTOCOL=OPENTELEMETRY - ``` +# Syntax -=== "Configuration file" +```bash +--miner-stratum-port= +``` - ```bash - metrics-protocol="OPENTELEMETRY" - ``` +# Example -Metrics protocol to use: `PROMETHEUS`, `OPENTELEMETRY`, or `NONE`. -The default is `PROMETHEUS`. +```bash +--miner-stratum-port=8010 +``` -### `metrics-push-enabled` +# Environment variable -=== "Syntax" +```bash +BESU_MINER_STRATUM_PORT=8010 +``` - ```bash - --metrics-push-enabled[=] - ``` +# Configuration file -=== "Example" +```bash +miner-stratum-port="8010" +``` - ```bash - --metrics-push-enabled=true - ``` + -=== "Environment variable" +The port of the stratum mining service. The default is `8008`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). - ```bash - BESU_METRICS_PUSH_ENABLED=true - ``` +### `min-gas-price` -=== "Configuration file" + - ```bash - metrics-push-enabled=true - ``` +# Syntax -Enables or disables [push gateway integration]. +```bash +--min-gas-price= +``` -You can't specify `--metrics-push-enabled` with [`--metrics-enabled`](#metrics-enabled). That is, you can enable -either Prometheus polling or Prometheus push gateway support, but not both at once. +# Example -### `metrics-push-host` +```bash +--min-gas-price=1337 +``` -=== "Syntax" +# Environment variable - ```bash - --metrics-push-host= - ``` +```bash +BESU_MIN_GAS_PRICE=1337 +``` -=== "Example" +# Configuration file - ```bash - --metrics-push-host=127.0.0.1 - ``` +```bash +min-gas-price=1337 +``` -=== "Environment variable" + - ```bash - BESU_METRICS_PUSH_HOST=127.0.0.1 - ``` +The minimum price a transaction offers to include it in a mined block. The minimum gas price is the lowest value [`eth_gasPrice`](../api/index.md#eth_gasprice) can return. The default is 1000 Wei. -=== "Configuration file" +:::tip - ```bash - metrics-push-host="127.0.0.1" - ``` +In a [free gas network](../../../private-networks/how-to/configure/free-gas.md), ensure the minimum gas price is set to zero for every node. Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. You can query a node's gas configuration using [`eth_gasPrice`](../api/index.md#eth_gasprice). -The host of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The default -is `127.0.0.1`. The metrics server respects the [`--host-allowlist` option](#host-allowlist). +::: -!!! note +### `nat-method` - When pushing metrics, ensure you set `--metrics-push-host` to the machine on which the push - gateway is. Generally, this is a different machine to the machine on which Besu is running. + -### `metrics-push-interval` +# Syntax -=== "Syntax" +```bash +--nat-method=UPNP +``` - ```bash - --metrics-push-interval= - ``` +# Example configuration file -=== "Example" +```bash +nat-method="UPNP" +``` - ```bash - --metrics-push-interval=30 - ``` + -=== "Environment variable" +Specify the method for handling [NAT environments](../../how-to/connect/specify-nat.md). The options are: - ```bash - BESU_METRICS_PUSH_INTERVAL=30 - ``` +- [`UPNP`](../../how-to/connect/specify-nat.md#upnp) +- [`UPNPP2PONLY`](../../how-to/connect/specify-nat.md#upnp) +- [`KUBERNETES`](../../how-to/connect/specify-nat.md#kubernetes) +- [`DOCKER`](../../how-to/connect/specify-nat.md#docker) +- [`AUTO`](../../how-to/connect/specify-nat.md#auto) +- [`NONE`](../../how-to/connect/specify-nat.md#none). -=== "Configuration file" +The default is `AUTO`. `NONE` disables NAT functionality. - ```bash - metrics-push-interval=30 - ``` +:::tip -The interval, in seconds, to push metrics when in `push` mode. The default is 15. +UPnP support is often disabled by default in networking firmware. If disabled by default, explicitly enable UPnP support. -### `metrics-push-port` +::: -=== "Syntax" +:::tip - ```bash - --metrics-push-port= - ``` +Use `UPNPP2PONLY` if you wish to enable UPnP for p2p traffic but not JSON-RPC. -=== "Example" +::: - ```bash - --metrics-push-port=6174 - ``` +:::note -=== "Environment variable" +Specifying `UPNP` might introduce delays during node startup, especially on networks without a UPnP gateway device. - ```bash - BESU_METRICS_PUSH_PORT=6174 - ``` +You must specify `DOCKER` when using the [Besu Docker image](../../get-started/install/run-docker-image.md). -=== "Configuration file" +::: - ```bash - metrics-push-port="6174" - ``` +### `network` -The port (TCP) of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The -default is `9001`. Ports must be -[exposed appropriately](../../how-to/connect/configure-ports.md). + -### `metrics-push-prometheus-job` +# Syntax -=== "Syntax" +```bash +--network= +``` - ```bash - --metrics-push-prometheus-job= - ``` +# Example -=== "Example" +```bash +--network=goerli +``` - ```bash - --metrics-push-prometheus-job="my-custom-job" - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_NETWORK=goerli +``` - ```bash - BESU_METRICS_PUSH_PROMETHEUS_JOB="my-custom-job" - ``` +# Configuration file -=== "Configuration file" +```bash +network="goerli" +``` - ```bash - metrics-push-prometheus-job="my-custom-job" - ``` + -The job name when in `push` mode. The default is `besu-client`. +The predefined network configuration. The default is `mainnet`. -### `min-block-occupancy-ratio` +Possible values are: -=== "Syntax" +| Network | Chain | Type | Default Sync Mode | Description | +| :-- | :-- | :-- | :-- | :-- | +| `mainnet` | ETH | Production | [FAST](#sync-mode) | The main network | +| `goerli` | ETH | Test | [FAST](#sync-mode) | A PoA network using Clique | +| `sepolia` | ETH | Test | [FAST](#sync-mode) | A PoW network | +| `dev` | ETH | Development | [FULL](#sync-mode) | A PoW network with a low difficulty to enable local CPU mining | +| `classic` | ETC | Production | [FAST](#sync-mode) | The main Ethereum Classic network | +| `mordor ` | ETC | Test | [FAST](#sync-mode) | A PoW network | +| `kotti` | ETC | Test | [FAST](#sync-mode) | A PoA network using Clique | +| `astor` | ETC | Test | [FAST](#sync-mode) | A PoW network | - ```bash - --min-block-occupancy-ratio= - ``` +:::tip -=== "Example" +Values are case insensitive, so either `mainnet` or `MAINNET` works. - ```bash - --min-block-occupancy-ratio=0.5 - ``` +::: -=== "Environment variable" +:::info - ```bash - BESU_MIN_BLOCK_OCCUPANCY_RATIO=0.5 - ``` +- You can't use the `--network` and [`--genesis-file`](#genesis-file) options at the same time. -=== "Configuration file" +- The Ropsten, Rinkeby, and Kiln testnets are deprecated. - ```bash - min-block-occupancy-ratio="0.5" - ``` +::: -Minimum occupancy ratio for a mined block if the transaction pool is not empty. When filling a block -during mining, the occupancy ratio indicates the threshold at which the node stops waiting for smaller transactions -to fill the remaining space. The default is 0.8. +### `network-id` -### `miner-coinbase` + -=== "Syntax" +# Syntax - ```bash - --miner-coinbase= - ``` +```bash +--network-id= +``` -=== "Example" +# Example - ```bash - --miner-coinbase=fe3b557e8fb62b89f4916b721be55ceb828dbd73 - ``` +```bash +--network-id=8675309 +``` -=== "Environment variable" +# Environment variable - ```bash - BESU_MINER_COINBASE=fe3b557e8fb62b89f4916b721be55ceb828dbd73 - ``` +```bash +BESU_NETWORK_ID=8675309 +``` -=== "Configuration file" +# Configuration file - ```bash - miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" - ``` +```bash +network-id="8675309" +``` -The account you pay mining rewards to. You must specify a valid coinbase when you enable mining -using the [`--miner-enabled`](#miner-enabled) option or the -[`miner_start`](../api/index.md#miner_start) JSON-RPC API method. + -!!!note +The [P2P network identifier](../../concepts/network-and-chain-id.md). - Besu ignores this option in networks using - [Clique](../../../private-networks/how-to/configure/consensus/clique.md), - [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md), or - [QBFT](../../../private-networks/how-to/configure/consensus/qbft.md) consensus protocols. +Use this option to override the default network ID. The default value is the same as the chain ID defined in the genesis file. -### `miner-enabled` +### `node-private-key-file` -=== "Syntax" + - ```bash - --miner-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--node-private-key-file= +``` - ```bash - --miner-enabled=true - ``` +# Example -=== "Environment variable" +```bash +--node-private-key-file=/home/me/me_node/myPrivateKey +``` - ```bash - BESU_MINER_ENABLED=true - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_NODE_PRIVATE_KEY_FILE=/home/me/me_node/myPrivateKey +``` - ```bash - miner-enabled=true - ``` +# Configuration file -Enables or disables mining when you start the node. -The default is `false`. +```bash +node-private-key-file="/home/me/me_node/myPrivateKey" +``` -### `miner-extra-data` + -=== "Syntax" +The private key file for the node. The default is the key file in the [data directory](#data-path). If no key file exists, Besu creates a key file containing the generated private key, otherwise, the existing key file specifies the node private key. - ```bash - --miner-extra-data= - ``` +:::danger -=== "Example" +The private key is not encrypted. - ```bash - --miner-extra-data=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 - ``` +::: -=== "Environment variable" +This option is ignored if [`--security-module`](#security-module) is set to a non-default value. - ```bash - BESU_MINER_EXTRA_DATA=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 - ``` +### `p2p-enabled` -=== "Configuration file" + - ```bash - miner-extra-data="0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021" - ``` +# Syntax -A hex string representing the 32 bytes included in the extra data field of a mined block. The -default is 0x. +```bash +--p2p-enabled[=] +``` -### `miner-stratum-enabled` +# Example -=== "Syntax" +```bash +--p2p-enabled=false +``` - ```bash - --miner-stratum-enabled - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_P2P_ENABLED=false +``` - ```bash - BESU_MINER_STRATUM_ENABLED=true - ``` +# Configuration file -=== "Configuration file" +```bash +p2p-enabled=false +``` - ```bash - miner-stratum-enabled=true - ``` + -Enables a node to perform stratum mining. -The default is `false`. +Enables or disables all P2P communication. The default is `true`. -### `miner-stratum-host` +### `p2p-host` -=== "Syntax" + - ```bash - --miner-stratum-host= - ``` +# Syntax -=== "Example" +```bash +--p2p-host= +``` - ```bash - --miner-stratum-host=192.168.1.132 - ``` +# Example -=== "Environment variable" +```bash +# to listen on all interfaces +--p2p-host=0.0.0.0 +``` - ```bash - BESU_MINER_STRATUM_HOST=192.168.1.132 - ``` +# Environment variable -=== "Configuration file" +```bash +# to listen on all interfaces +BESU_P2P_HOST=0.0.0.0 +``` - ```bash - miner-stratum-host="192.168.1.132" - ``` +# Configuration file -The host of the stratum mining service. -The default is `0.0.0.0`. +```bash +p2p-host="0.0.0.0" +``` -### `miner-stratum-port` + -=== "Syntax" +The advertised host that can be used to access the node from outside the network in [P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). The default is `127.0.0.1`. - ```bash - --miner-stratum-port= - ``` +:::info -=== "Example" +If [`--nat-method`](#nat-method) is set to [`NONE`](../../how-to/connect/specify-nat.md), `--p2p-host` is not overridden and must be specified for the node to be accessed from outside the network. - ```bash - --miner-stratum-port=8010 - ``` +::: -=== "Environment variable" +### `p2p-interface` - ```bash - BESU_MINER_STRATUM_PORT=8010 - ``` + -=== "Configuration file" +Syntax - ```bash - miner-stratum-port="8010" - ``` +```bash +--p2p-interface= +``` -The port of the stratum mining service. The default is `8008`. You must -[expose ports appropriately](../../how-to/connect/configure-ports.md). +# Example -### `min-gas-price` +```bash +--p2p-interface=192.168.1.132 +``` -=== "Syntax" +# Environment variable - ```bash - --min-gas-price= - ``` +```bash +BESU_P2P_INTERFACE=192.168.1.132 +``` -=== "Example" +# Configuration file - ```bash - --min-gas-price=1337 - ``` +```bash +p2p-interface="192.168.1.132" +``` -=== "Environment variable" + - ```bash - BESU_MIN_GAS_PRICE=1337 - ``` +The network interface on which the node listens for [P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). Use the option to specify the required network interface when the device that Besu is running on has multiple network interfaces. The default is 0.0.0.0 (all interfaces). -=== "Configuration file" +### `p2p-port` - ```bash - min-gas-price=1337 - ``` + -The minimum price a transaction offers to include it in a mined block. The minimum gas price is the -lowest value [`eth_gasPrice`](../api/index.md#eth_gasprice) can return. The default is 1000 -Wei. +# Syntax -!!! important - In a [free gas network](../../../private-networks/how-to/configure/free-gas.md), ensure the minimum gas price is set to zero for every node. - Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. - You can query a node's gas configuration using [`eth_gasPrice`](../api/index.md#eth_gasprice). +```bash +--p2p-port= +``` -### `nat-method` +# Example -=== "Syntax" +```bash +# to listen on port 1789 +--p2p-port=1789 +``` - ```bash - --nat-method=UPNP - ``` +# Environment variable -=== "Example configuration file" +```bash +# to listen on port 1789 +BESU_P2P_PORT=1789 +``` - ```bash - nat-method="UPNP" - ``` +# Configuration file -Specify the method for handling [NAT environments](../../how-to/connect/specify-nat.md). -The options are: +```bash +p2p-port="1789" +``` -* [`UPNP`](../../how-to/connect/specify-nat.md#upnp) -* [`UPNPP2PONLY`](../../how-to/connect/specify-nat.md#upnp) -* [`KUBERNETES`](../../how-to/connect/specify-nat.md#kubernetes) -* [`DOCKER`](../../how-to/connect/specify-nat.md#docker) -* [`AUTO`](../../how-to/connect/specify-nat.md#auto) -* [`NONE`](../../how-to/connect/specify-nat.md#none). + -The default is `AUTO`. `NONE` disables NAT functionality. +The P2P listening ports (UDP and TCP). The default is `30303`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). -!!!tip +### `pruning-block-confirmations` - UPnP support is often disabled by default in networking firmware. If disabled by default, - explicitly enable UPnP support. + -!!!tip +# Syntax - Use `UPNPP2PONLY` if you wish to enable UPnP for p2p traffic but not JSON-RPC. +```bash +--pruning-block-confirmations= +``` -!!!notes +# Example - Specifying `UPNP` might introduce delays during node startup, especially on networks without a - UPnP gateway device. +```bash +--pruning-block-confirmations=5 +``` - You must specify `DOCKER` when using the - [Besu Docker image](../../get-started/install/run-docker-image.md). +# Environment variable -### `network` +```bash +BESU_PRUNING_BLOCK_CONFIRMATIONS=5 +``` -=== "Syntax" +# Configuration file - ```bash - --network= - ``` +```bash +pruning-block-confirmations=5 +``` -=== "Example" + - ```bash - --network=goerli - ``` +The minimum number of confirmations on a block before marking of newly-stored or in-use state trie nodes that cannot be pruned. The default is 10. -=== "Environment variable" +:::info - ```bash - BESU_NETWORK=goerli - ``` +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) is not supported. -=== "Configuration file" +::: - ```bash - network="goerli" - ``` +### `pruning-blocks-retained` -The predefined network configuration. -The default is `mainnet`. + -Possible values are: +# Syntax -| Network | Chain | Type | Default Sync Mode | Description | -|:----------|:------|:------------|:-------------------|:---------------------------------------------------------------| -| `mainnet` | ETH | Production | [FAST](#sync-mode) | The main network | -| `goerli` | ETH | Test | [FAST](#sync-mode) | A PoA network using Clique | -| `sepolia` | ETH | Test | [FAST](#sync-mode) | A PoW network | -| `dev` | ETH | Development | [FULL](#sync-mode) | A PoW network with a low difficulty to enable local CPU mining | -| `classic` | ETC | Production | [FAST](#sync-mode) | The main Ethereum Classic network | -| `mordor ` | ETC | Test | [FAST](#sync-mode) | A PoW network | -| `kotti` | ETC | Test | [FAST](#sync-mode) | A PoA network using Clique | -| `astor` | ETC | Test | [FAST](#sync-mode) | A PoW network | +```bash +--pruning-blocks-retained= +``` -!!! tip +# Example - Values are case insensitive, so either `mainnet` or `MAINNET` works. +```bash +--pruning-blocks-retained=10000 +``` -!!! important +# Environment variable - - You can't use the `--network` and [`--genesis-file`](#genesis-file) options at the same time. +```bash +BESU_PRUNING_BLOCKS_RETAINED=10000 +``` - - The Ropsten, Rinkeby, and Kiln testnets are deprecated. +# Configuration file -### `network-id` +```bash +pruning-blocks-retained=10000 +``` -=== "Syntax" + - ```bash - --network-id= - ``` +The minimum number of recent blocks to keep the entire world state for. The default is 1024. -=== "Example" +:::info - ```bash - --network-id=8675309 - ``` +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. -=== "Environment variable" +::: - ```bash - BESU_NETWORK_ID=8675309 - ``` +### `pruning-enabled` -=== "Configuration file" + - ```bash - network-id="8675309" - ``` +# Syntax -The [P2P network identifier](../../concepts/network-and-chain-id.md). +```bash +--pruning-enabled +``` -Use this option to override the default network ID. The default value is the same as the chain ID -defined in the genesis file. +# Example -### `node-private-key-file` +```bash +--pruning-enabled=true +``` -=== "Syntax" +# Environment variable - ```bash - --node-private-key-file= - ``` +```bash +BESU_PRUNING_ENABLED=true +``` -=== "Example" +# Configuration file - ```bash - --node-private-key-file=/home/me/me_node/myPrivateKey - ``` +```bash +pruning-enabled=true +``` -=== "Environment variable" + - ```bash - BESU_NODE_PRIVATE_KEY_FILE=/home/me/me_node/myPrivateKey - ``` +Enables [pruning](../../concepts/data-storage-formats.md#pruning) to reduce storage required for the world state. The default is `false`. -=== "Configuration file" +:::info - ```bash - node-private-key-file="/home/me/me_node/myPrivateKey" - ``` +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. -The private key file for the node. The default is the key file in the [data directory](#data-path). -If no key file exists, Besu creates a key file containing the generated private key, otherwise, the -existing key file specifies the node private key. +::: -!!!attention +:::note - The private key is not encrypted. +Pruning is being deprecated for [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries) and is currently not being updated. -This option is ignored if [`--security-module`](#security-module) is set to -a non-default value. +::: -### `p2p-enabled` +### `random-peer-priority-enabled` -=== "Syntax" + - ```bash - --p2p-enabled[=] - ``` +# Syntax -=== "Example" +```bash +--random-peer-priority-enabled[=] +``` - ```bash - --p2p-enabled=false - ``` +# Example -=== "Environment variable" +```bash +--random-peer-priority-enabled=true +``` - ```bash - BESU_P2P_ENABLED=false - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_RANDOM_PEER_PRIORITY_ENABLED=true +``` - ```bash - p2p-enabled=false - ``` +# Configuration file -Enables or disables all P2P communication. -The default is `true`. +```bash +random-peer-priority-enabled=true +``` -### `p2p-host` + -=== "Syntax" +Enables or disables random prioritization of incoming connections. Enable in small, stable networks to prevent closed groups of peers forming. The default is `false`. - ```bash - --p2p-host= - ``` +### `remote-connections-limit-enabled` -=== "Example" + - ```bash - # to listen on all interfaces - --p2p-host=0.0.0.0 - ``` +# Syntax -=== "Environment variable" +```bash +--remote-connections-limit-enabled[=] +``` - ```bash - # to listen on all interfaces - BESU_P2P_HOST=0.0.0.0 - ``` +# Example -=== "Configuration file" +```bash +--remote-connections-limit-enabled=false +``` - ```bash - p2p-host="0.0.0.0" - ``` +# Environment variable -The advertised host that can be used to access the node from outside the network in -[P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). -The default is `127.0.0.1`. +```bash +BESU_REMOTE_CONNECTIONS_LIMIT_ENABLED=false +``` -!!! info +# Configuration file - If [`--nat-method`](#nat-method) is set to [`NONE`](../../how-to/connect/specify-nat.md), - `--p2p-host` is not overridden and must be specified for the node to be accessed from outside the network. +```bash +remote-connections-limit-enabled=false +``` -### `p2p-interface` + -=== "Syntax" +Enables or disables using the [`--remote-connections-max-percentage`](#remote-connections-max-percentage) option to limit the percentage of remote P2P connections initiated by peers. The default is `true`. - ```bash - --p2p-interface= - ``` +:::tip -=== "Example" +In private and permissioned networks with a level of trust between peers, disabling the remote connection limits may increase the speed at which nodes can join the network. - ```bash - --p2p-interface=192.168.1.132 - ``` +::: -=== "Environment variable" +:::danger - ```bash - BESU_P2P_INTERFACE=192.168.1.132 - ``` +To prevent eclipse attacks, ensure you enable the remote connections limit when connecting to any public network, and especially when using [`--sync-mode`](#sync-mode) and [`--fast-sync-min-peers`](#fast-sync-min-peers). -=== "Configuration file" +::: - ```bash - p2p-interface="192.168.1.132" - ``` +### `remote-connections-max-percentage` -The network interface on which the node listens for -[P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). Use the -option to specify the required network interface when the device that Besu is running on has -multiple network interfaces. The default is 0.0.0.0 (all interfaces). + -### `p2p-port` +# Syntax -=== "Syntax" +```bash +--remote-connections-max-percentage= +``` - ```bash - --p2p-port= - ``` +# Example -=== "Example" +```bash +--remote-connections-max-percentage=25 +``` - ```bash - # to listen on port 1789 - --p2p-port=1789 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_REMOTE_CONNECTIONS_MAX_PERCENTAGE=25 +``` - ```bash - # to listen on port 1789 - BESU_P2P_PORT=1789 - ``` +# Configuration file -=== "Configuration file" +```bash +remote-connections-max-percentage=25 +``` - ```bash - p2p-port="1789" - ``` + -The P2P listening ports (UDP and TCP). The default is `30303`. You must -[expose ports appropriately](../../how-to/connect/configure-ports.md). +The percentage of remote P2P connections you can establish with the node. Must be between 0 and 100, inclusive. The default is 60. -### `pruning-block-confirmations` +### `reorg-logging-threshold` -=== "Syntax" + - ```bash - --pruning-block-confirmations= - ``` +# Syntax -=== "Example" +```bash +--reorg-logging-threshold= +``` - ```bash - --pruning-block-confirmations=5 - ``` +# Example -=== "Environment variable" +```bash +--reorg-logging-threshold=3 +``` - ```bash - BESU_PRUNING_BLOCK_CONFIRMATIONS=5 - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_REORG_LOGGING_THRESHOLD=3 +``` - ```bash - pruning-block-confirmations=5 - ``` +# Configuration file -The minimum number of confirmations on a block before marking of newly-stored or in-use state trie -nodes that cannot be pruned. The default is 10. +```bash +reorg-logging-threshold=3 +``` -!!! important - Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) is not - supported. + -### `pruning-blocks-retained` +Minimum depth of chain reorganizations to log. The default is 6. -=== "Syntax" +### `required-block` - ```bash - --pruning-blocks-retained= - ``` + -=== "Example" +# Syntax - ```bash - --pruning-blocks-retained=10000 - ``` +```bash +--required-block, --required-blocks[=BLOCK=HASH[,BLOCK=HASH...]...] +``` -=== "Environment variable" +# Example - ```bash - BESU_PRUNING_BLOCKS_RETAINED=10000 - ``` +```bash +--required-block=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 +``` -=== "Configuration file" +# Environment variable - ```bash - pruning-blocks-retained=10000 - ``` +```bash +BESU_REQUIRED_BLOCK=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 +``` -The minimum number of recent blocks to keep the entire world state for. The default is 1024. +# Configuration file -!!! important +```bash +required-block=["6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80"] +``` - Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't - supported. + -### `pruning-enabled` +Requires a peer with the specified block number to have the specified hash when connecting, or Besu rejects that peer. -=== "Syntax" +### `revert-reason-enabled` - ```bash - --pruning-enabled - ``` + -=== "Example" +# Syntax - ```bash - --pruning-enabled=true - ``` +```bash +--revert-reason-enabled[=] +``` -=== "Environment variable" +# Example - ```bash - BESU_PRUNING_ENABLED=true - ``` +```bash +--revert-reason-enabled=true +``` -=== "Configuration file" +# Environment variable - ```bash - pruning-enabled=true - ``` +```bash +BESU_REVERT_REASON_ENABLED=true +``` -Enables [pruning](../../concepts/data-storage-formats.md#pruning) to reduce storage required for the -world state. -The default is `false`. +# Configuration file -!!! important +```bash +revert-reason-enabled=true +``` - Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't - supported. + -!!! important +Enables or disables including the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md) in the transaction receipt, [`eth_estimateGas`](../api/index.md#eth_estimategas) error response, [`eth_call`](../api/index.md#eth_call) error response, and [`trace`](../trace-types.md#trace) response. The default is `false`. - Pruning is being deprecated for [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries) - and is currently not being updated. +:::caution -### `random-peer-priority-enabled` +Enabling revert reason may use a significant amount of memory. We don't recommend enabling revert reason when connected to public Ethereum networks. -=== "Syntax" +::: - ```bash - --random-peer-priority-enabled[=] - ``` +### `rpc-http-api` -=== "Example" + - ```bash - --random-peer-priority-enabled=true - ``` +# Syntax -=== "Environment variable" +```bash +--rpc-http-api=[,...]... +``` - ```bash - BESU_RANDOM_PEER_PRIORITY_ENABLED=true - ``` +# Example -=== "Configuration file" +```bash +--rpc-http-api=ETH,NET,WEB3 +``` - ```bash - random-peer-priority-enabled=true - ``` +# Environment variable -Enables or disables random prioritization of incoming connections. Enable in small, stable networks to prevent -closed groups of peers forming. The default is `false`. +```bash +BESU_RPC_HTTP_API=ETH,NET,WEB3 +``` -### `remote-connections-limit-enabled` +# Configuration file -=== "Syntax" +```bash +rpc-http-api=["ETH","NET","WEB3"] +``` - ```bash - --remote-connections-limit-enabled[=] - ``` + -=== "Example" +A comma-separated list of APIs to enable on the HTTP JSON-RPC channel. When you use this option you must also specify the `--rpc-http-enabled` option. The available API options are: `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, `TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. - ```bash - --remote-connections-limit-enabled=false - ``` +:::tip -=== "Environment variable" +The singular `--rpc-http-api` and plural `--rpc-http-apis` are available and are two names for the same option. - ```bash - BESU_REMOTE_CONNECTIONS_LIMIT_ENABLED=false - ``` +::: -=== "Configuration file" +### `rpc-http-authentication-credentials-file` - ```bash - remote-connections-limit-enabled=false - ``` + -Enables or disables using the [`--remote-connections-max-percentage`](#remote-connections-max-percentage) option to -limit the percentage of remote P2P connections initiated by peers. -The default is `true`. +# Syntax -!!! tip +```bash +--rpc-http-authentication-credentials-file= +``` - In private and permissioned networks with a level of trust between peers, disabling the remote connection limits - may increase the speed at which nodes can join the network. +# Example -!!! important +```bash +--rpc-http-authentication-credentials-file=/home/me/me_node/auth.toml +``` - To prevent eclipse attacks, ensure you enable the remote connections limit when connecting to - any public network, and especially when using [`--sync-mode`](#sync-mode) and - [`--fast-sync-min-peers`](#fast-sync-min-peers). +# Environment variable -### `remote-connections-max-percentage` +```bash +BESU_RPC_HTTP_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml +``` -=== "Syntax" +# Configuration file - ```bash - --remote-connections-max-percentage= - ``` +```bash +rpc-http-authentication-credentials-file="/home/me/me_node/auth.toml" +``` -=== "Example" + - ```bash - --remote-connections-max-percentage=25 - ``` +The [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). -=== "Environment variable" +### `rpc-http-authentication-enabled` - ```bash - BESU_REMOTE_CONNECTIONS_MAX_PERCENTAGE=25 - ``` + -=== "Configuration file" +# Syntax - ```bash - remote-connections-max-percentage=25 - ``` +```bash +--rpc-http-authentication-enabled[=] +``` -The percentage of remote P2P connections you can establish with the node. Must be between 0 and -100, inclusive. The default is 60. +# Example -### `reorg-logging-threshold` +```bash +--rpc-http-authentication-enabled=true +``` -=== "Syntax" +# Environment variable - ```bash - --reorg-logging-threshold= - ``` +```bash +BESU_RPC_HTTP_AUTHENTICATION_ENABLED=true +``` -=== "Example" +# Configuration file - ```bash - --reorg-logging-threshold=3 - ``` +```bash +rpc-http-authentication-enabled=true +``` -=== "Environment variable" + - ```bash - BESU_REORG_LOGGING_THRESHOLD=3 - ``` +Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the HTTP JSON-RPC service. -=== "Configuration file" +### `rpc-http-authentication-jwt-public-key-file` - ```bash - reorg-logging-threshold=3 - ``` + -Minimum depth of chain reorganizations to log. The default is 6. +# Syntax -### `required-block` +```bash +--rpc-http-authentication-jwt-public-key-file= +``` -=== "Syntax" +# Example - ```bash - --required-block, --required-blocks[=BLOCK=HASH[,BLOCK=HASH...]...] - ``` +```bash +--rpc-http-authentication-jwt-public-key-file=publicKey.pem +``` -=== "Example" +# Environment variable - ```bash - --required-block=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 - ``` +```bash +BESU_RPC_HTTP_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" +``` -=== "Environment variable" +# Configuration file - ```bash - BESU_REQUIRED_BLOCK=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 - ``` +```bash +rpc-http-authentication-jwt-public-key-file="publicKey.pem" +``` -=== "Configuration file" + - ```bash - required-block=["6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80"] - ``` +The [JWT provider's public key file] used for JSON-RPC HTTP authentication with an external JWT. -Requires a peer with the specified block number to have the specified hash when connecting, or Besu -rejects that peer. +### `rpc-http-cors-origins` -### `revert-reason-enabled` + -=== "Syntax" +# Syntax - ```bash - --revert-reason-enabled[=] - ``` +```bash +--rpc-http-cors-origins=[,...]... or all or "*" +``` -=== "Example" +# Example - ```bash - --revert-reason-enabled=true - ``` +```bash -=== "Environment variable" +$# You can allow one or more domains with a comma-separated list. - ```bash - BESU_REVERT_REASON_ENABLED=true - ``` +--rpc-http-cors-origins=http://medomain.com,https://meotherdomain.com +``` -=== "Configuration file" +# Environment variable - ```bash - revert-reason-enabled=true - ``` +```bash +BESU_RPC_HTTP_CORS_ORIGINS=http://medomain.com,https://meotherdomain.com +``` -Enables or disables including the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md) in the -transaction receipt, [`eth_estimateGas`](../api/index.md#eth_estimategas) error response, -[`eth_call`](../api/index.md#eth_call) error response, and [`trace`](../trace-types.md#trace) response. -The default is `false`. +# Configuration file -!!! caution +```bash +rpc-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] +``` - Enabling revert reason may use a significant amount of memory. We don't recommend enabling - revert reason when connected to public Ethereum networks. +# Remix example -### `rpc-http-api` +```bash -=== "Syntax" +$# The following allows Remix to interact with your Besu node. - ```bash - --rpc-http-api=[,...]... - ``` +--rpc-http-cors-origins=http://remix.ethereum.org +``` -=== "Example" + - ```bash - --rpc-http-api=ETH,NET,WEB3 - ``` +A list of domain URLs for CORS validation. -=== "Environment variable" +Listed domains can access the node using JSON-RPC. If your client interacts with Besu using a browser app (such as Remix or a block explorer), add the client domain to the list. - ```bash - BESU_RPC_HTTP_API=ETH,NET,WEB3 - ``` +The default value is `"none"`. If you do not list any domains, browser apps cannot interact with your Besu node. -=== "Configuration file" +:::note - ```bash - rpc-http-api=["ETH","NET","WEB3"] - ``` +To run a local Besu node with MetaMask, set `--rpc-http-cors-origins` to `chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn`. -A comma-separated list of APIs to enable on the HTTP JSON-RPC channel. When you use this option -you must also specify the `--rpc-http-enabled` option. The available API options are: `ADMIN`, -`CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, -`TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. +Remember to also include the dapp domain MetaMask interacts with, for example if your app is deployed on Remix and you're using MetaMask to interact with the contract, use `--rpc-http-cors-origins=chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn,http://remix.ethereum.org` -!!!tip +::: - The singular `--rpc-http-api` and plural `--rpc-http-apis` are available and are two names for - the same option. +:::tip -### `rpc-http-authentication-credentials-file` +For testing and development purposes, use `"all"` or `"*"` to accept requests from any domain. We don't recommend accepting requests from any domain for production environments. -=== "Syntax" +::: - ```bash - --rpc-http-authentication-credentials-file= - ``` +### `rpc-http-enabled` -=== "Example" + - ```bash - --rpc-http-authentication-credentials-file=/home/me/me_node/auth.toml - ``` +# Syntax -=== "Environment variable" +```bash +--rpc-http-enabled[=] +``` - ```bash - BESU_RPC_HTTP_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml - ``` +# Example -=== "Configuration file" +```bash +--rpc-http-enabled=true +``` - ```bash - rpc-http-authentication-credentials-file="/home/me/me_node/auth.toml" - ``` +# Environment variable -The [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC -API [authentication](../../how-to/use-besu-api/authenticate.md). +```bash +BESU_RPC_HTTP_ENABLED=true +``` -### `rpc-http-authentication-enabled` +# Configuration file -=== "Syntax" +```bash +rpc-http-enabled=true +``` - ```bash - --rpc-http-authentication-enabled[=] - ``` + -=== "Example" +Enables or disables the HTTP JSON-RPC service. The default is `false`. - ```bash - --rpc-http-authentication-enabled=true - ``` +### `rpc-http-host` -=== "Environment variable" + - ```bash - BESU_RPC_HTTP_AUTHENTICATION_ENABLED=true - ``` +# Syntax -=== "Configuration file" +```bash +--rpc-http-host= +``` - ```bash - rpc-http-authentication-enabled=true - ``` +# Example -Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the HTTP JSON-RPC -service. +```bash +# to listen on all interfaces +--rpc-http-host=0.0.0.0 +``` -### `rpc-http-authentication-jwt-public-key-file` +# Environment variable -=== "Syntax" +```bash +BESU_RPC_HTTP_HOST=0.0.0.0 +``` - ```bash - --rpc-http-authentication-jwt-public-key-file= - ``` +# Configuration file -=== "Example" +```bash +rpc-http-host="0.0.0.0" +``` - ```bash - --rpc-http-authentication-jwt-public-key-file=publicKey.pem - ``` + -=== "Environment variable" +The host on which HTTP JSON-RPC listens. The default is `127.0.0.1`. - ```bash - BESU_RPC_HTTP_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" - ``` +To allow remote connections, set to `0.0.0.0`. -=== "Configuration file" +:::caution - ```bash - rpc-http-authentication-jwt-public-key-file="publicKey.pem" - ``` +Setting the host to `0.0.0.0` exposes the RPC connection on your node to any remote connection. In a production environment, ensure you are using a firewall to avoid exposing your node to the internet. -The [JWT provider's public key file] used for JSON-RPC HTTP authentication with an external JWT. +::: -### `rpc-http-cors-origins` +### `rpc-http-max-active-connections` -=== "Syntax" + - ```bash - --rpc-http-cors-origins=[,...]... or all or "*" - ``` +# Syntax -=== "Example" +```bash +--rpc-http-max-active-connections= +``` - ```bash +# Example - $# You can allow one or more domains with a comma-separated list. +```bash +--rpc-http-max-active-connections=100 +``` - --rpc-http-cors-origins=http://medomain.com,https://meotherdomain.com - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_RPC_HTTP_MAX_ACTIVE_CONNECTIONS=100 +``` - ```bash - BESU_RPC_HTTP_CORS_ORIGINS=http://medomain.com,https://meotherdomain.com - ``` +# Configuration file -=== "Configuration file" +```toml +rpc-http-max-active-connections=100 +``` - ```bash - rpc-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] - ``` + -=== "Remix example" +The maximum number of allowed HTTP JSON-RPC connections. Once this limit is reached, incoming connections are rejected. The default is 80. - ```bash +### `rpc-http-max-batch-size` - $# The following allows Remix to interact with your Besu node. + - --rpc-http-cors-origins=http://remix.ethereum.org - ``` +# Syntax -A list of domain URLs for CORS validation. +```bash +--rpc-http-max-batch-size= +``` -Listed domains can access the node using JSON-RPC. If your client interacts with Besu using a -browser app (such as Remix or a block explorer), add the client domain to the list. +# Example -The default value is `"none"`. If you do not list any domains, browser apps cannot interact -with your Besu node. +```bash +--rpc-http-max-batch-size=1200 +``` -!!!note +# Environment variable - To run a local Besu node with MetaMask, set `--rpc-http-cors-origins` to - `chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn`. +```bash +BESU_RPC_HTTP_MAX_BATCH_SIZE=1200 +``` - Remember to also include the dapp domain MetaMask interacts with, for example if your app is deployed - on Remix and you're using MetaMask to interact with the contract, use - `--rpc-http-cors-origins=chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn,http://remix.ethereum.org` +# Configuration file -!!!tip +```toml +rpc-http-max-batch-size=1200 +``` - For testing and development purposes, use `"all"` or `"*"` to accept requests from any domain. - We don't recommend accepting requests from any domain for production environments. + -### `rpc-http-enabled` +The maximum number of allowed requests in a [RPC batch request](../../how-to/use-besu-api/json-rpc.md#http). The default limit is `1024`, and `-1` specifies no limit. -=== "Syntax" +### `rpc-http-port` - ```bash - --rpc-http-enabled[=] - ``` + -=== "Example" +# Syntax - ```bash - --rpc-http-enabled=true - ``` +```bash +--rpc-http-port= +``` -=== "Environment variable" +# Example - ```bash - BESU_RPC_HTTP_ENABLED=true - ``` +```bash +# to listen on port 3435 +--rpc-http-port=3435 +``` -=== "Configuration file" +# Environment variable - ```bash - rpc-http-enabled=true - ``` +```bash +BESU_RPC_HTTP_PORT=3435 +``` -Enables or disables the HTTP JSON-RPC service. -The default is `false`. +# Configuration file -### `rpc-http-host` +```bash +rpc-http-port="3435" +``` -=== "Syntax" + - ```bash - --rpc-http-host= - ``` +The port (TCP) on which HTTP JSON-RPC listens. The default is `8545`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). -=== "Example" +### `rpc-http-tls-ca-clients-enabled` - ```bash - # to listen on all interfaces - --rpc-http-host=0.0.0.0 - ``` + -=== "Environment variable" +# Syntax - ```bash - BESU_RPC_HTTP_HOST=0.0.0.0 - ``` +```bash +--rpc-http-tls-ca-clients-enabled[=] +``` -=== "Configuration file" +# Example - ```bash - rpc-http-host="0.0.0.0" - ``` +```bash +--rpc-http-tls-ca-clients-enabled=true +``` -The host on which HTTP JSON-RPC listens. The default is `127.0.0.1`. +# Environment variable -To allow remote connections, set to `0.0.0.0`. +```bash +BESU_RPC_HTTP_TLS_CA_CLIENTS_ENABLED=true +``` -!!! caution +# Configuration file - Setting the host to `0.0.0.0` exposes the RPC connection on your node to any remote connection. - In a production environment, ensure you are using a firewall to avoid exposing your node to the - internet. +```bash +rpc-http-tls-ca-clients-enabled=true +``` -### `rpc-http-max-active-connections` + -=== "Syntax" +Enables or disables clients with trusted CA certificates to connect. The default is `false`. - ```bash - --rpc-http-max-active-connections= - ``` +:::note -=== "Example" +You must enable client authentication using the [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. - ```bash - --rpc-http-max-active-connections=100 - ``` +::: -=== "Environment variable" +### `rpc-http-tls-client-auth-enabled` - ```bash - BESU_RPC_HTTP_MAX_ACTIVE_CONNECTIONS=100 - ``` + -=== "Configuration file" +# Syntax - ```toml - rpc-http-max-active-connections=100 - ``` +```bash +--rpc-http-tls-client-auth-enabled[=] +``` -The maximum number of allowed HTTP JSON-RPC connections. Once this limit is reached, incoming connections are rejected. The default is 80. +# Example -### `rpc-http-max-batch-size` +```bash +--rpc-http-tls-client-auth-enabled=true +``` -=== "Syntax" +# Environment variable - ```bash - --rpc-http-max-batch-size= - ``` +```bash +BESU_RPC_HTTP_TLS_CLIENT_AUTH_ENABLED=true +``` -=== "Example" +# Configuration file - ```bash - --rpc-http-max-batch-size=1200 - ``` +```bash +rpc-http-tls-client-auth-enabled=true +``` -=== "Environment variable" + - ```bash - BESU_RPC_HTTP_MAX_BATCH_SIZE=1200 - ``` +Enables or disables TLS client authentication for the JSON-RPC HTTP service. The default is `false`. -=== "Configuration file" +:::note - ```toml - rpc-http-max-batch-size=1200 - ``` +You must specify [`--rpc-http-tls-ca-clients-enabled`](#rpc-http-tls-ca-clients-enabled) and/or [`rpc-http-tls-known-clients-file`](#rpc-http-tls-known-clients-file). -The maximum number of allowed requests in a [RPC batch request](../../how-to/use-besu-api/json-rpc.md#http). -The default limit is `1024`, and `-1` specifies no limit. +::: -### `rpc-http-port` +### `rpc-http-tls-cipher-suite` -=== "Syntax" + - ```bash - --rpc-http-port= - ``` +# Syntax -=== "Example" +```bash +--rpc-http-tls-cipher-suite=[, ...] +``` - ```bash - # to listen on port 3435 - --rpc-http-port=3435 - ``` +# Example -=== "Environment variable" +```bash +--rpc-http-tls-cipher-suite=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +``` - ```bash - BESU_RPC_HTTP_PORT=3435 - ``` +# Environment variable -=== "Configuration file" +```bash +BESU_RPC_HTTP_TLS_CIPHER_SUITE=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +``` - ```bash - rpc-http-port="3435" - ``` +# Configuration file -The port (TCP) on which HTTP JSON-RPC listens. The default is `8545`. You must -[expose ports appropriately](../../how-to/connect/configure-ports.md). +```bash +rpc-http-tls-cipher-suite=["TLS_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"] +``` -### `rpc-http-tls-ca-clients-enabled` + -=== "Syntax" +A list of comma-separated TLS cipher suites to support. - ```bash - --rpc-http-tls-ca-clients-enabled[=] - ``` +:::tip -=== "Example" +The singular `--rpc-http-tls-cipher-suite` and plural `--rpc-http-tls-cipher-suites` are available and are two names for the same option. - ```bash - --rpc-http-tls-ca-clients-enabled=true - ``` +::: -=== "Environment variable" +### `rpc-http-tls-enabled` - ```bash - BESU_RPC_HTTP_TLS_CA_CLIENTS_ENABLED=true - ``` + -=== "Configuration file" +# Syntax - ```bash - rpc-http-tls-ca-clients-enabled=true - ``` +```bash +--rpc-http-tls-enabled[=] +``` -Enables or disables clients with trusted CA certificates to connect. The default is `false`. +# Example -!!! note +```bash +--rpc-http-tls-enabled=true +``` - You must enable client authentication using the - [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. +# Environment variable -### `rpc-http-tls-client-auth-enabled` +```bash +BESU_RPC_HTTP_TLS_ENABLED=true +``` -=== "Syntax" +# Configuration file - ```bash - --rpc-http-tls-client-auth-enabled[=] - ``` +```bash +rpc-http-tls-enabled=true +``` -=== "Example" + - ```bash - --rpc-http-tls-client-auth-enabled=true - ``` +Enables or disables TLS for the JSON-RPC HTTP service. The default is `false`. -=== "Environment variable" +:::note - ```bash - BESU_RPC_HTTP_TLS_CLIENT_AUTH_ENABLED=true - ``` +[`--rpc-http-enabled`](#rpc-http-enabled) must be enabled. -=== "Configuration file" +::: - ```bash - rpc-http-tls-client-auth-enabled=true - ``` +### `rpc-http-tls-keystore-file` -Enables or disables TLS client authentication for the JSON-RPC HTTP service. The default is `false`. + -!!! note +# Syntax - You must specify [`--rpc-http-tls-ca-clients-enabled`](#rpc-http-tls-ca-clients-enabled) and/or - [`rpc-http-tls-known-clients-file`](#rpc-http-tls-known-clients-file). +```bash +--rpc-http-tls-keystore-file= +``` -### `rpc-http-tls-cipher-suite` +# Example -=== "Syntax" +```bash +--rpc-http-tls-keystore-file=/home/me/me_node/keystore.pfx +``` - ```bash - --rpc-http-tls-cipher-suite=[, ...] - ``` +# Environment variable -=== "Example" +```bash +BESU_RPC_HTTP_TLS_KEYSTORE_FILE=/home/me/me_node/keystore.pfx +``` - ```bash - --rpc-http-tls-cipher-suite=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - ``` +# Configuration file -=== "Environment variable" +```bash +rpc-http-tls-keystore-file="/home/me/me_node/keystore.pfx" +``` - ```bash - BESU_RPC_HTTP_TLS_CIPHER_SUITE=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - ``` + -=== "Configuration file" +The Keystore file (in PKCS #12 format) that contains private key and the certificate presented to the client during authentication. - ```bash - rpc-http-tls-cipher-suite=["TLS_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"] - ``` +### `rpc-http-tls-keystore-password-file` -A list of comma-separated TLS cipher suites to support. + -!!!tip +# Syntax - The singular `--rpc-http-tls-cipher-suite` and plural `--rpc-http-tls-cipher-suites` are available and are two names for - the same option. +```bash +--rpc-http-tls-keystore-password-file= +``` -### `rpc-http-tls-enabled` +# Example -=== "Syntax" +```bash +--rpc-http-tls-keystore-password-file=/home/me/me_node/password +``` - ```bash - --rpc-http-tls-enabled[=] - ``` +# Environment variable -=== "Example" +```bash +BESU_RPC_HTTP_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password +``` - ```bash - --rpc-http-tls-enabled=true - ``` +# Configuration file -=== "Environment variable" +```bash +rpc-http-tls-keystore-password-file="/home/me/me_node/password" +``` - ```bash - BESU_RPC_HTTP_TLS_ENABLED=true - ``` + -=== "Configuration file" +The path to the file containing the password to decrypt the keystore. - ```bash - rpc-http-tls-enabled=true - ``` +### `rpc-http-tls-known-clients-file` -Enables or disables TLS for the JSON-RPC HTTP service. The default is `false`. + -!!! note +# Syntax - [`--rpc-http-enabled`](#rpc-http-enabled) must be enabled. +```bash +--rpc-http-tls-known-clients-file= +``` -### `rpc-http-tls-keystore-file` +# Example -=== "Syntax" +```bash +--rpc-http-tls-known-clients-file=/home/me/me_node/knownClients +``` - ```bash - --rpc-http-tls-keystore-file= - ``` +# Environment variable -=== "Example" +```bash +BESU_RPC_HTTP_TLS_KNOWN_CLIENTS_FILE=/home/me/me_node/knownClients +``` - ```bash - --rpc-http-tls-keystore-file=/home/me/me_node/keystore.pfx - ``` +# Configuration file -=== "Environment variable" +```bash +rpc-http-tls-known-clients-file="/home/me/me_node/knownClients" +``` - ```bash - BESU_RPC_HTTP_TLS_KEYSTORE_FILE=/home/me/me_node/keystore.pfx - ``` + -=== "Configuration file" +The path to the file used to [authenticate clients](../../../private-networks/how-to/configure/tls/client-and-server.md#create-the-known-clients-file) using self-signed certificates or non-public certificates. - ```bash - rpc-http-tls-keystore-file="/home/me/me_node/keystore.pfx" - ``` +Must contain the certificate's Common Name, and SHA-256 fingerprint in the format ` `. -The Keystore file (in PKCS #12 format) that contains private key and the certificate presented to -the client during authentication. +:::note -### `rpc-http-tls-keystore-password-file` +You must enable client authentication using the [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. -=== "Syntax" +::: - ```bash - --rpc-http-tls-keystore-password-file= - ``` +### `rpc-http-tls-protocol` -=== "Example" + - ```bash - --rpc-http-tls-keystore-password-file=/home/me/me_node/password - ``` +# Syntax -=== "Environment variable" +```bash +--rpc-http-tls-protocol=[, ...] +``` - ```bash - BESU_RPC_HTTP_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password - ``` +# Example -=== "Configuration file" +```bash +--rpc-http-tls-protocol=TLSv1.3,TLSv1.2 +``` - ```bash - rpc-http-tls-keystore-password-file="/home/me/me_node/password" - ``` +# Environment variable -The path to the file containing the password to decrypt the keystore. +```bash +BESU_RPC_HTTP_TLS_PROTOCOL=TLSv1.3,TLSv1.2 +``` -### `rpc-http-tls-known-clients-file` +# Configuration file -=== "Syntax" +```bash +rpc-http-tls-protocol=["TLSv1.3","TLSv1.2"] +``` - ```bash - --rpc-http-tls-known-clients-file= - ``` + -=== "Example" +A list of comma-separated TLS protocols to support. The default is `DEFAULT_TLS_PROTOCOLS`, a list which includes `TLSv1.3` and `TLSv1.2`. - ```bash - --rpc-http-tls-known-clients-file=/home/me/me_node/knownClients - ``` +:::tip -=== "Environment variable" +The singular `--rpc-http-tls-protocol` and plural `--rpc-http-tls-protocols` are available and are two names for the same option. - ```bash - BESU_RPC_HTTP_TLS_KNOWN_CLIENTS_FILE=/home/me/me_node/knownClients - ``` +::: -=== "Configuration file" +### `rpc-max-logs-range` - ```bash - rpc-http-tls-known-clients-file="/home/me/me_node/knownClients" - ``` + -The path to the file used to -[authenticate clients](../../../private-networks/how-to/configure/tls/client-and-server.md#create-the-known-clients-file) using -self-signed certificates or non-public certificates. +# Syntax -Must contain the certificate's Common Name, and SHA-256 fingerprint in the format -` `. +```bash +--rpc-max-logs-range= +``` -!!! note +# Example - You must enable client authentication using the - [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. +```bash +--rpc-max-logs-range=500 +``` -### `rpc-http-tls-protocol` +# Environment variable -=== "Syntax" +```bash +BESU_RPC_MAX_LOGS_RANGE=500 +``` - ```bash - --rpc-http-tls-protocol=[, ...] - ``` +# Configuration file -=== "Example" +```bash +rpc-max-logs-range=500 +``` - ```bash - --rpc-http-tls-protocol=TLSv1.3,TLSv1.2 - ``` + -=== "Environment variable" +When using [`eth_getLogs`](../api/index.md#eth_getlogs), the maximum number of blocks to retrieve logs from. Set to 0 to specify no limit. The default is 5000. - ```bash - BESU_RPC_HTTP_TLS_PROTOCOL=TLSv1.3,TLSv1.2 - ``` +:::caution -=== "Configuration file" +Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from its genesis block, might cause Besu to hang for an indeterminable amount of time while generating the response. - ```bash - rpc-http-tls-protocol=["TLSv1.3","TLSv1.2"] - ``` +We recommend setting a range limit or leaving this option at its default value. -A list of comma-separated TLS protocols to support. The default is `DEFAULT_TLS_PROTOCOLS`, a list which includes `TLSv1.3` and `TLSv1.2`. +::: -!!!tip +### `rpc-tx-feecap` - The singular `--rpc-http-tls-protocol` and plural `--rpc-http-tls-protocols` are available and are two names for - the same option. + -### `rpc-max-logs-range` +# Syntax -=== "Syntax" +```bash +--rpc-tx-feecap= +``` - ```bash - --rpc-max-logs-range= - ``` +# Example -=== "Example" +```bash +--rpc-tx-feecap=1200000000000000000 +``` - ```bash - --rpc-max-logs-range=500 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_RPC_TX_FEECAP=1200000000000000000 +``` - ```bash - BESU_RPC_MAX_LOGS_RANGE=500 - ``` +# Configuration file -=== "Configuration file" +```bash +rpc-tx-feecap=1200000000000000000 +``` - ```bash - rpc-max-logs-range=500 - ``` + -When using [`eth_getLogs`](../api/index.md#eth_getlogs), the maximum number of blocks to retrieve -logs from. -Set to 0 to specify no limit. -The default is 5000. +The maximum transaction fee (in Wei) accepted for transactions submitted through the [`eth_sendRawTransaction`](../api/index.md#eth_sendrawtransaction) RPC. The default is 1000000000000000000 (1 ether). -!!! warning +If set to 0, then this option is ignored and no cap is applied. - Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from - its genesis block, might cause Besu to hang for an indeterminable amount of time while generating - the response. - We recommend setting a range limit or leaving this option at its default value. +### `rpc-ws-api` -### `rpc-tx-feecap` + -=== "Syntax" +# Syntax - ```bash - --rpc-tx-feecap= - ``` +```bash +--rpc-ws-api=[,...]... +``` -=== "Example" +# Example - ```bash - --rpc-tx-feecap=1200000000000000000 - ``` +```bash +--rpc-ws-api=ETH,NET,WEB3 +``` -=== "Environment variable" +# Environment variable - ```bash - BESU_RPC_TX_FEECAP=1200000000000000000 - ``` +```bash +BESU_RPC_WS_API=ETH,NET,WEB3 +``` -=== "Configuration file" +# Configuration file - ```bash - rpc-tx-feecap=1200000000000000000 - ``` +```bash +rpc-ws-api=["ETH","NET","WEB3"] +``` -The maximum transaction fee (in Wei) accepted for transactions submitted through the -[`eth_sendRawTransaction`](../api/index.md#eth_sendrawtransaction) RPC. The default is 1000000000000000000 (1 ether). + -If set to 0, then this option is ignored and no cap is applied. +A comma-separated list of APIs to enable on the WebSockets channel. When you use this option you must also specify the `--rpc-ws-enabled` option. The available API options are: `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, `TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. -### `rpc-ws-api` +:::tip -=== "Syntax" +The singular `--rpc-ws-api` and plural `--rpc-ws-apis` options are available and are two names for the same option. - ```bash - --rpc-ws-api=[,...]... - ``` +::: -=== "Example" +### `rpc-ws-authentication-credentials-file` - ```bash - --rpc-ws-api=ETH,NET,WEB3 - ``` + -=== "Environment variable" +# Syntax - ```bash - BESU_RPC_WS_API=ETH,NET,WEB3 - ``` +```bash +--rpc-ws-authentication-credentials-file= +``` -=== "Configuration file" +# Example - ```bash - rpc-ws-api=["ETH","NET","WEB3"] - ``` +```bash +--rpc-ws-authentication-credentials-file=/home/me/me_node/auth.toml +``` -A comma-separated list of APIs to enable on the WebSockets channel. When you use this option -you must also specify the `--rpc-ws-enabled` option. The available API options are: `ADMIN`, -`CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, -`TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. +# Environment variable -!!!tip +```bash +BESU_RPC_WS_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml +``` - The singular `--rpc-ws-api` and plural `--rpc-ws-apis` options are available and are two names - for the same option. +# Configuration file -### `rpc-ws-authentication-credentials-file` +```bash +rpc-ws-authentication-credentials-file="/home/me/me_node/auth.toml" +``` -=== "Syntax" + - ```bash - --rpc-ws-authentication-credentials-file= - ``` +The path to the [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). -=== "Example" +### `rpc-ws-authentication-enabled` - ```bash - --rpc-ws-authentication-credentials-file=/home/me/me_node/auth.toml - ``` + -=== "Environment variable" +# Syntax - ```bash - BESU_RPC_WS_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml - ``` +```bash +--rpc-ws-authentication-enabled[=] +``` -=== "Configuration file" +# Example - ```bash - rpc-ws-authentication-credentials-file="/home/me/me_node/auth.toml" - ``` +```bash +--rpc-ws-authentication-enabled=true +``` -The path to the [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) -for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). +# Environment variable -### `rpc-ws-authentication-enabled` +```bash +BESU_RPC_WS_AUTHENTICATION_ENABLED=true +``` -=== "Syntax" +# Configuration file - ```bash - --rpc-ws-authentication-enabled[=] - ``` +```bash +rpc-ws-authentication-enabled=true +``` -=== "Example" + - ```bash - --rpc-ws-authentication-enabled=true - ``` +Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the WebSocket JSON-RPC service. -=== "Environment variable" +:::note - ```bash - BESU_RPC_WS_AUTHENTICATION_ENABLED=true - ``` +`wscat` doesn't support headers. [Authentication](../../how-to/use-besu-api/authenticate.md) requires you to pass an authentication token in the request header. To use authentication with WebSockets, you need an app that supports headers. -=== "Configuration file" +::: - ```bash - rpc-ws-authentication-enabled=true - ``` +### `rpc-ws-authentication-jwt-public-key-file` -Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the WebSocket JSON-RPC -service. + -!!! note +# Syntax - `wscat` doesn't support headers. [Authentication](../../how-to/use-besu-api/authenticate.md) - requires you to pass an authentication token in the request header. To use authentication with - WebSockets, you need an app that supports headers. +```bash +--rpc-ws-authentication-jwt-public-key-file= +``` -### `rpc-ws-authentication-jwt-public-key-file` +# Example -=== "Syntax" +```bash +--rpc-ws-authentication-jwt-public-key-file=publicKey.pem +``` - ```bash - --rpc-ws-authentication-jwt-public-key-file= - ``` +# Environment variable -=== "Example" +```bash +BESU_RPC_WS_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" +``` - ```bash - --rpc-ws-authentication-jwt-public-key-file=publicKey.pem - ``` +# Configuration file -=== "Environment variable" +```bash +rpc-ws-authentication-jwt-public-key-file="publicKey.pem" +``` - ```bash - BESU_RPC_WS_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" - ``` + -=== "Configuration file" +The [JWT provider's public key file] used for JSON-RPC WebSocket authentication with an external JWT. - ```bash - rpc-ws-authentication-jwt-public-key-file="publicKey.pem" - ``` +### `rpc-ws-enabled` -The [JWT provider's public key file] used for JSON-RPC WebSocket authentication with an external -JWT. + -### `rpc-ws-enabled` +# Syntax -=== "Syntax" +```bash +--rpc-ws-enabled[=] +``` - ```bash - --rpc-ws-enabled[=] - ``` +# Example -=== "Example" +```bash +--rpc-ws-enabled=true +``` - ```bash - --rpc-ws-enabled=true - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_RPC_WS_ENABLED=true +``` - ```bash - BESU_RPC_WS_ENABLED=true - ``` +# Configuration file -=== "Configuration file" +```bash +rpc-ws-enabled=true +``` - ```bash - rpc-ws-enabled=true - ``` + Enables or disables the WebSocket JSON-RPC service. The default is `false`. ### `rpc-ws-host` -=== "Syntax" + + +# Syntax - ```bash - --rpc-ws-host= - ``` +```bash +--rpc-ws-host= +``` -=== "Example" +# Example + +```bash +# to listen on all interfaces +--rpc-ws-host=0.0.0.0 +``` - ```bash - # to listen on all interfaces - --rpc-ws-host=0.0.0.0 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_RPC_WS_HOST=0.0.0.0 +``` - ```bash - BESU_RPC_WS_HOST=0.0.0.0 - ``` +# Configuration file -=== "Configuration file" +```bash +rpc-ws-host="0.0.0.0" +``` - ```bash - rpc-ws-host="0.0.0.0" - ``` + -The host on which WebSocket JSON-RPC listens. The default is `127.0.0.1`. +The host on which WebSocket JSON-RPC listens. +The default is `127.0.0.1`. To allow remote connections, set to `0.0.0.0` ### `rpc-ws-max-active-connections` -=== "Syntax" + + +# Syntax + +```bash +--rpc-ws-max-active-connections= +``` - ```bash - --rpc-ws-max-active-connections= - ``` +# Example -=== "Example" +```bash +--rpc-ws-max-active-connections=100 +``` - ```bash - --rpc-ws-max-active-connections=100 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_RPC_WS_MAX_ACTIVE_CONNECTIONS=100 +``` - ```bash - BESU_RPC_WS_MAX_ACTIVE_CONNECTIONS=100 - ``` +# Configuration file -=== "Configuration file" +```toml +rpc-ws-max-active-connections=100 +``` - ```toml - rpc-ws-max-active-connections=100 - ``` + The maximum number of WebSocket connections allowed for JSON-RPC. Once this limit is reached, incoming connections are rejected. The default is 80. ### `rpc-ws-max-frame-size` -=== "Syntax" + + +# Syntax - ```bash - --rpc-ws-max-frame-size= - ``` +```bash +--rpc-ws-max-frame-size= +``` -=== "Example" +# Example + +```bash +--rpc-ws-max-frame-size=65536 +``` - ```bash - --rpc-ws-max-frame-size=65536 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_RPC_WS_MAX_FRAME_SIZE=65536 +``` - ```bash - BESU_RPC_WS_MAX_FRAME_SIZE=65536 - ``` +# Configuration file -=== "Configuration file" +```toml +rpc-ws-max-frame-size=65536 +``` - ```toml - rpc-ws-max-frame-size=65536 - ``` + The maximum size in bytes for JSON-RPC WebSocket frames. If this limit is exceeded, the WebSocket disconnects. The default is 1048576 (or 1 MB). ### `rpc-ws-port` -=== "Syntax" + - ```bash - --rpc-ws-port= - ``` +# Syntax -=== "Example" +```bash +--rpc-ws-port= +``` + +# Example + +```bash +# to listen on port 6174 +--rpc-ws-port=6174 +``` - ```bash - # to listen on port 6174 - --rpc-ws-port=6174 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_RPC_WS_PORT=6174 +``` - ```bash - BESU_RPC_WS_PORT=6174 - ``` +# Configuration file -=== "Configuration file" +```bash +rpc-ws-port="6174" +``` - ```bash - rpc-ws-port="6174" - ``` + -The port (TCP) on which WebSocket JSON-RPC listens. The default is `8546`. You must -[expose ports appropriately](../../how-to/connect/configure-ports.md). +The port (TCP) on which WebSocket JSON-RPC listens. The default is `8546`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). ### `security-module` -=== "Syntax" + + +# Syntax + +```bash +--security-module= +``` - ```bash - --security-module= - ``` +# Example -=== "Example" +```bash +--security-module=security_module +``` - ```bash - --security-module=security_module - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_SECURITY_MODULE=security_module +``` - ```bash - BESU_SECURITY_MODULE=security_module - ``` +# Configuration file -=== "Configuration file" +```bash +security-module="security_module" +``` - ```bash - security-module="security_module" - ``` + -Name of the security module plugin to use. -For example, a Hardware Security Module (HSM) or V3 filestore plugin. +Name of the security module plugin to use. For example, a Hardware Security Module (HSM) or V3 filestore plugin. -The default is the node's local private key file specified using -[`--node-private-key-file`](#node-private-key-file). +The default is the node's local private key file specified using [`--node-private-key-file`](#node-private-key-file). ### `static-nodes-file` -=== "Syntax" + + +# Syntax + +```bash +--static-nodes-file= +``` - ```bash - --static-nodes-file= - ``` +# Example -=== "Example" +```bash +--static-nodes-file=~/besudata/static-nodes.json +``` - ```bash - --static-nodes-file=~/besudata/static-nodes.json - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_STATIC_NODES_FILE=~/besudata/static-nodes.json +``` - ```bash - BESU_STATIC_NODES_FILE=~/besudata/static-nodes.json - ``` +# Configuration file -=== "Configuration file" +```bash +static-nodes-file="~/besudata/static-nodes.json" +``` - ```bash - static-nodes-file="~/besudata/static-nodes.json" - ``` + -Static nodes JSON file containing the [static nodes](../../how-to/connect/static-nodes.md) for this node to -connect to. The default is `datapath/static-nodes.json`. +Static nodes JSON file containing the [static nodes](../../how-to/connect/static-nodes.md) for this node to connect to. The default is `datapath/static-nodes.json`. ### `strict-tx-replay-protection-enabled` -=== "Syntax" + + +# Syntax + +```bash +--strict-tx-replay-protection-enabled[=] +``` - ```bash - --strict-tx-replay-protection-enabled[=] - ``` +# Example -=== "Example" +```bash +--strict-tx-replay-protection-enabled=false +``` - ```bash - --strict-tx-replay-protection-enabled=false - ``` +# Environment variable -=== "Environment variable" +```bash +STRICT_TX_REPLAY_PROTECTION_ENABLED=false +``` - ```bash - STRICT_TX_REPLAY_PROTECTION_ENABLED=false - ``` +# Configuration file -=== "Configuration file" +```bash +strict-tx-replay-protection-enabled=false +``` - ```bash - strict-tx-replay-protection-enabled=false - ``` + -Enables or disables replay protection, in accordance with [EIP-155](https://eips.ethereum.org/EIPS/eip-155), on -transactions submitted using JSON-RPC. -The default is `false`. +Enables or disables replay protection, in accordance with [EIP-155](https://eips.ethereum.org/EIPS/eip-155), on transactions submitted using JSON-RPC. The default is `false`. ### `sync-mode` -=== "Syntax" + + +# Syntax + +```bash +--sync-mode=X_SNAP +``` + +# Example - ```bash - --sync-mode=X_SNAP - ``` +```bash +--sync-mode=X_SNAP +``` -=== "Example" +# Environment variable - ```bash - --sync-mode=X_SNAP - ``` +```bash +BESU_SYNC_MODE=X_SNAP +``` -=== "Environment variable" +# Configuration file - ```bash - BESU_SYNC_MODE=X_SNAP - ``` +```bash +sync-mode="X_SNAP" +``` -=== "Configuration file" + - ```bash - sync-mode="X_SNAP" - ``` +The synchronization mode. Use `X_SNAP` for [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), `X_CHECKPOINT` for [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), `FAST` for [fast sync](../../get-started/connect/sync-node.md#fast-synchronization), and `FULL` for [full sync](../../get-started/connect/sync-node.md#run-an-archive-node). -The synchronization mode. -Use `X_SNAP` for [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), -`X_CHECKPOINT` for [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), -`FAST` for [fast sync](../../get-started/connect/sync-node.md#fast-synchronization), and `FULL` for -[full sync](../../get-started/connect/sync-node.md#run-an-archive-node). +- The default is `FULL` when connecting to a private network by not using the [`--network`](#network) option and specifying the [`--genesis-file`](#genesis-file) option. +- The default is `FAST` when using the [`--network`](#network) option with named networks, except for the `dev` development network. `FAST` is also the default if running Besu on the default network (Ethereum Mainnet) by specifying neither [network](#network) nor [genesis file](#genesis-file). -* The default is `FULL` when connecting to a private network by not using the [`--network`](#network) - option and specifying the [`--genesis-file`](#genesis-file) option. -* The default is `FAST` when using the [`--network`](#network) option with named networks, except for the `dev` - development network. - `FAST` is also the default if running Besu on the default network (Ethereum Mainnet) by specifying neither - [network](#network) nor [genesis file](#genesis-file). +:::tip -!!! important +- We recommend using snap sync over fast sync because snap sync can be faster by several days. +- Checkpoint sync is an early access feature. +- It might become impossible to sync Ethereum Mainnet using fast sync in the future. Update Besu to a version that supports newer sync methods. +- When synchronizing in a mode other than `FULL`, most historical world state data is unavailable. Any methods attempting to access unavailable world state data return `null`. - * We recommend using snap sync over fast sync because snap sync can be faster by several days. - * Checkpoint sync is an early access feature. - * It might become impossible to sync Ethereum Mainnet using fast sync in the future. - Update Besu to a version that supports newer sync methods. - * When synchronizing in a mode other than `FULL`, most historical world state data is unavailable. - Any methods attempting to access unavailable world state data return `null`. +::: ### `target-gas-limit` -=== "Syntax" + + +# Syntax + +```bash +--target-gas-limit= +``` - ```bash - --target-gas-limit= - ``` +# Example -=== "Example" +```bash +--target-gas-limit=8000000 +``` - ```bash - --target-gas-limit=8000000 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_TARGET_GAS_LIMIT=8000000 +``` - ```bash - BESU_TARGET_GAS_LIMIT=8000000 - ``` +# Configuration file -=== "Configuration file" +```bash +target-gas-limit="8000000" +``` - ```bash - target-gas-limit="8000000" - ``` + -The gas limit toward which Besu will gradually move on an existing network, if enough miners are in -agreement. To change the block gas limit set in the genesis file without creating a new network, -use `target-gas-limit`. The gas limit between blocks can change only 1/1024th, so the target tells -the block creator how to set the gas limit in its block. If the values are the same or within -1/1024th, Besu sets the limit to the specified value. Otherwise, the limit moves as far as it can -within that constraint. +The gas limit toward which Besu will gradually move on an existing network, if enough miners are in agreement. To change the block gas limit set in the genesis file without creating a new network, use `target-gas-limit`. The gas limit between blocks can change only 1/1024th, so the target tells the block creator how to set the gas limit in its block. If the values are the same or within 1/1024th, Besu sets the limit to the specified value. Otherwise, the limit moves as far as it can within that constraint. -If a value for `target-gas-limit` is not specified, the block gas limit remains at the value -specified in the [genesis file](../genesis-items.md#genesis-block-parameters). +If a value for `target-gas-limit` is not specified, the block gas limit remains at the value specified in the [genesis file](../genesis-items.md#genesis-block-parameters). -Use the [`miner_changeTargetGasLimit`](../api/index.md#miner_changetargetgaslimit) API to update -the `target-gas-limit` while Besu is running. Alternatively restart Besu with an updated -`target-gas-limit` value. +Use the [`miner_changeTargetGasLimit`](../api/index.md#miner_changetargetgaslimit) API to update the `target-gas-limit` while Besu is running. Alternatively restart Besu with an updated `target-gas-limit` value. ### `tx-pool-disable-locals` -=== "Syntax" + + +# Syntax + +```bash +--tx-pool-disable-locals[=] +``` - ```bash - --tx-pool-disable-locals[=] - ``` +# Example -=== "Example" +```bash +--tx-pool-disable-locals=true +``` - ```bash - --tx-pool-disable-locals=true - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_TX_POOL_DISABLE_LOCALS=true +``` - ```bash - BESU_TX_POOL_DISABLE_LOCALS=true - ``` +# Configuration file -=== "Configuration file" +```bash +tx-pool-disable-locals=true +``` - ```bash - tx-pool-disable-locals=true - ``` + If this option is set to true, transactions received via RPC must have the same checks, and should not be prioritized over remote transactions. The default is `false`. ### `tx-pool-enable-save-restore` -=== "Syntax" + - ```bash - --tx-pool-enable-save-restore[=] - ``` +# Syntax -=== "Example" +```bash +--tx-pool-enable-save-restore[=] +``` + +# Example + +```bash +--tx-pool-enable-save-restore=true +``` - ```bash - --tx-pool-enable-save-restore=true - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_TX_POOL_ENABLE_SAVE_RESTORE=true +``` - ```bash - BESU_TX_POOL_ENABLE_SAVE_RESTORE=true - ``` +# Configuration file -=== "Configuration file" +```bash +tx-pool-enable-save-restore=true +``` - ```bash - tx-pool-enable-save-restore=true - ``` + Enables or disables saving the transaction pool contents to a file on shutdown and reloading it at startup. The default is `false`. @@ -3420,151 +3736,167 @@ You can define a custom path to the transaction pool file using the [`--tx-pool- ### `tx-pool-limit-by-account-percentage` -=== "Syntax" + + +# Syntax + +```bash +--tx-pool-limit-by-account-percentage= +``` + +# Example + +```bash +--tx-pool-limit-by-account-percentage=0.1 +``` - ```bash - --tx-pool-limit-by-account-percentage= - ``` +# Environment variable -=== "Example" +```bash +BESU_TX_POOL_LIMIT_BY_ACCOUNT_PERCENTAGE=0.1 +``` - ```bash - --tx-pool-limit-by-account-percentage=0.1 - ``` +# Configuration file -=== "Environment variable" +```bash +tx-pool-limit-by-account-percentage=0.4 +``` - ```bash - BESU_TX_POOL_LIMIT_BY_ACCOUNT_PERCENTAGE=0.1 - ``` + -=== "Configuration file" +The maximum percentage of future transactions kept in the transaction pool, per account. Accepted values are in the range (0–1]. The default is .001 or 0.1% of transactions from a single account to be kept in the pool. - ```bash - tx-pool-limit-by-account-percentage=0.4 - ``` +:::caution -The maximum percentage of future transactions kept in the transaction pool, per account. -Accepted values are in the range (0–1]. -The default is .001 or 0.1% of transactions from a single account to be kept in the pool. +The default value is often unsuitable for [private networks](../../../private-networks/index.md). This feature mitigates future-nonce transactions from filling the pool without ever being executable by Besu. This is important for Mainnet, but may cause issues on private networks. Please update this value or set to 1 if you know the nodes gossiping transactions in your network. -!!! warning - The default value is often unsuitable for [private networks](../../../private-networks/index.md). - This feature mitigates future-nonce transactions from filling the pool without ever being - executable by Besu. - This is important for Mainnet, but may cause issues on private networks. - Please update this value or set to 1 if you know the nodes gossiping transactions in your network. +::: ### `tx-pool-max-size` -=== "Syntax" + + +# Syntax + +```bash +--tx-pool-max-size= +``` - ```bash - --tx-pool-max-size= - ``` +# Example -=== "Example" +```bash +--tx-pool-max-size=2000 +``` - ```bash - --tx-pool-max-size=2000 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_TX_POOL_MAX_SIZE=2000 +``` - ```bash - BESU_TX_POOL_MAX_SIZE=2000 - ``` +# Configuration file -=== "Configuration file" +```bash +tx-pool-max-size="2000" +``` - ```bash - tx-pool-max-size="2000" - ``` + The maximum number of transactions kept in the transaction pool. The default is 4096. ### `tx-pool-price-bump` -=== "Syntax" + - ```bash - --tx-pool-price-bump= - ``` +# Syntax -=== "Example" +```bash +--tx-pool-price-bump= +``` + +# Example + +```bash +--tx-pool-price-bump=25 +``` - ```bash - --tx-pool-price-bump=25 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_TX_POOL_PRICE_BUMP=25 +``` - ```bash - BESU_TX_POOL_PRICE_BUMP=25 - ``` +# Configuration file -=== "Configuration file" +```bash +tx-pool-price-bump=25 +``` - ```bash - tx-pool-price-bump=25 - ``` + The price bump percentage to replace an existing transaction. The default is 10. ### `tx-pool-retention-hours` -=== "Syntax" + + +# Syntax + +```bash +--tx-pool-retention-hours= +``` - ```bash - --tx-pool-retention-hours= - ``` +# Example -=== "Example" +```bash +--tx-pool-retention-hours=5 +``` - ```bash - --tx-pool-retention-hours=5 - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_TX_POOL_RETENTION_HOURS=5 +``` - ```bash - BESU_TX_POOL_RETENTION_HOURS=5 - ``` +# Configuration file -=== "Configuration file" +```bash +tx-pool-retention-hours=5 +``` - ```bash - tx-pool-retention-hours=5 - ``` + -The maximum period, in hours, to hold pending transactions in the transaction pool. The default is -13. +The maximum period, in hours, to hold pending transactions in the transaction pool. The default is 13. ### `tx-pool-save-file` -=== "Syntax" + + +# Syntax + +```bash +--tx-pool-save-file= +``` - ```bash - --tx-pool-save-file= - ``` +# Example -=== "Example" +```bash +--tx-pool-save-file=/home/me/me_node/node_txpool.dump +``` - ```bash - --tx-pool-save-file=/home/me/me_node/node_txpool.dump - ``` +# Environment variable -=== "Environment variable" +```bash +BESU_TX_POOL_SAVE_FILE=/home/me/me_node/node_txpool.dump +``` - ```bash - BESU_TX_POOL_SAVE_FILE=/home/me/me_node/node_txpool.dump - ``` +# Configuration file -=== "Configuration file" +```bash +tx-pool-save-file="/home/me/me_node/node_txpool.dump" +``` - ```bash - tx-pool-save-file="/home/me/me_node/node_txpool.dump" - ``` + Path to the file that stores the transaction pool's content if the save and restore functionality is enabled using [`--tx-pool-enable-save-restore`](#tx-pool-enable-save-restore). The @@ -3573,28 +3905,39 @@ file is created on shutdown and reloaded during startup. The default file name i ### `Xhelp` -=== "Syntax" + + +# Syntax + +```bash +-X, --Xhelp +``` - ```bash - -X, --Xhelp - ``` + Displays the early access options and their descriptions, and exit. -!!! warning +:::caution - The displayed options are unstable and may change between releases. +The displayed options are unstable and may change between releases. + +::: ### `version` -=== "Syntax" + + +# Syntax - ```bash - -V, --version - ``` +```bash +-V, --version +``` + + Prints version information and exit. + [push gateway integration]: ../../how-to/monitor/metrics.md#running-prometheus-with-besu-in-push-mode [JWT provider's public key file]: ../../how-to/use-besu-api/authenticate.md#jwt-public-key-authentication diff --git a/docs/public-networks/reference/cli/subcommands.md b/docs/public-networks/reference/cli/subcommands.md index ae6e5fb5eb2..1a9798376bc 100644 --- a/docs/public-networks/reference/cli/subcommands.md +++ b/docs/public-networks/reference/cli/subcommands.md @@ -1,6 +1,9 @@ --- +title: Subcommands description: Hyperledger Besu command line interface subcommands +sidebar_position: 2 tags: + - public networks - private networks --- @@ -8,11 +11,11 @@ tags: This reference describes the syntax of the Hyperledger Besu command line interface (CLI) subcommands. -!!! attention +:::note - This reference contains subcommands that apply to both public and private networks. - For private-network-specific subcommands, see the - [private network subcommands reference](../../../private-networks/reference/cli/subcommands.md). +This reference contains subcommands that apply to both public and private networks. For private-network-specific subcommands, see the [private network subcommands reference](../../../private-networks/reference/cli/subcommands.md). + +::: To start a Besu node using subcommands, run: @@ -32,115 +35,121 @@ Provides blocks related actions. ### `import` -=== "Syntax" + + +# Syntax + +```bash +besu blocks import [--skip-pow-validation-enabled] [--start-block=] [--end-block=] --from= +``` - ```bash - besu blocks import [--skip-pow-validation-enabled] [--start-block=] [--end-block=] --from= - ``` +# Example -=== "Example" +```bash +besu blocks import --skip-pow-validation-enabled --start-block=100 --end-block=300 --from=/home/me/me_project/mainnet.blocks +``` - ```bash - besu blocks import --skip-pow-validation-enabled --start-block=100 --end-block=300 --from=/home/me/me_project/mainnet.blocks - ``` + Imports a block or range of blocks from the specified file into the blockchain database. -You can specify the starting index of the block range to import with `--start-block`. -If omitted, the default start block is 0 (the beginning of the chain). +You can specify the starting index of the block range to import with `--start-block`. If omitted, the default start block is 0 (the beginning of the chain). -You can specify the ending index (exclusive) of the block range to import with `--end-block`. -If omitted, all blocks after the start block will be imported. +You can specify the ending index (exclusive) of the block range to import with `--end-block`. If omitted, all blocks after the start block will be imported. Including `--skip-pow-validation-enabled` skips validation of the `mixHash` when importing blocks. -!!! note +:::note + +Use `--skip-pow-validation-enabled` when performing [Ethereum Foundation hive testing](https://github.com/ethereum/hive). - Use `--skip-pow-validation-enabled` when performing [Ethereum Foundation hive testing](https://github.com/ethereum/hive). +::: ### `export` -=== "Syntax" + - ```bash - besu blocks export [--start-block=] [--end-block=] --to= - ``` +# Syntax -=== "Example" +```bash +besu blocks export [--start-block=] [--end-block=] --to= +``` - ```bash - besu --network=goerli --data-path=/home/data/ blocks export --start-block=100 --end-block=300 --to=/home/exportblock.bin - ``` +# Example + +```bash +besu --network=goerli --data-path=/home/data/ blocks export --start-block=100 --end-block=300 --to=/home/exportblock.bin +``` + + Exports a block or range of blocks from storage to a file in RLP format. -If you omit `--start-block`, the default start block is 0 (the beginning of the chain), and if you -omit `--end-block`, the default end block is the current chain head. +If you omit `--start-block`, the default start block is 0 (the beginning of the chain), and if you omit `--end-block`, the default end block is the current chain head. -If you are not running the command against the default network (Mainnet), specify the `--network` -or `--genesis-file` parameter. +If you are not running the command against the default network (Mainnet), specify the `--network` or `--genesis-file` parameter. ## `public-key` Provides node public key related actions. -!!!caution +:::caution + +To get the public key or address of a node, ensure you use the [`--data-path`](options.md#data-path) or [`--node-private-key-file`](options.md#node-private-key-file) option with the `public-key` command. Otherwise, a new [node key](../../concepts/node-keys.md) is silently generated when starting Besu. - To get the public key or address of a node, ensure you use the - [`--data-path`](options.md#data-path) or - [`--node-private-key-file`](options.md#node-private-key-file) option with the `public-key` - command. Otherwise, a new [node key](../../concepts/node-keys.md) is silently generated when - starting Besu. +::: ### `export` -=== "Syntax" + - ```bash - besu public-key export [--node-private-key-file=] [--to=] [--ec-curve=] - ``` +# Syntax -=== "Example (to standard output)" +```bash +besu public-key export [--node-private-key-file=] [--to=] [--ec-curve=] +``` - ```bash - besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 - ``` +# Example (to standard output) -=== "Example (to file)" +```bash +besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 +``` + +# Example (to file) + +```bash +besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/not_precious_pub_key --ec-curve=secp256k1 +``` - ```bash - besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/not_precious_pub_key --ec-curve=secp256k1 - ``` + -Outputs the node public key to standard output or to the file specified by `--to=`. -You can output the public key associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. -The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between -`secp256k1` or `secp256r1`. +Outputs the node public key to standard output or to the file specified by `--to=`. You can output the public key associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between `secp256k1` or `secp256r1`. ### `export-address` -=== "Syntax" + - ```bash - besu public-key export-address [--node-private-key-file=] [--to=] [--ec-curve=] - ``` +# Syntax -=== "Example (to standard output)" +```bash +besu public-key export-address [--node-private-key-file=] [--to=] [--ec-curve=] +``` - ```bash - besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 - ``` +# Example (to standard output) -=== "Example (to file)" +```bash +besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 +``` - ```bash - besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/me_node_address --ec-curve=secp256k1 - ``` +# Example (to file) -Outputs the node address to standard output or to the file specified by `--to=`. -You can output the address associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. -The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between -`secp256k1` or `secp256r1`. +```bash +besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/me_node_address --ec-curve=secp256k1 +``` + + + +Outputs the node address to standard output or to the file specified by `--to=`. You can output the address associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between `secp256k1` or `secp256r1`. ## `password` @@ -148,21 +157,23 @@ Provides password related actions. ### `hash` -=== "Syntax" + - ```bash - besu password hash --password= - ``` +# Syntax -=== "Example" +```bash +besu password hash --password= +``` + +# Example + +```bash +besu password hash --password=myPassword123 +``` - ```bash - besu password hash --password=myPassword123 - ``` + -Generates the hash of a given password. Include the hash in the -[credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API -[authentication](../../how-to/use-besu-api/authenticate.md). +Generates the hash of a given password. Include the hash in the [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). ## `operator` @@ -170,76 +181,82 @@ Provides operator actions. ### `generate-log-bloom-cache` -=== "Syntax" + + +# Syntax + +```bash +besu operator generate-log-bloom-cache [--start-block=] [--end-block=] +``` + +# Example + +```bash +besu --network=goerli --data-path=/project/goerli operator generate-log-bloom-cache --start-block=0 --end-block=100000 +``` - ```bash - besu operator generate-log-bloom-cache [--start-block=] [--end-block=] - ``` + -=== "Example" +:::tip - ```bash - besu --network=goerli --data-path=/project/goerli operator generate-log-bloom-cache --start-block=0 --end-block=100000 - ``` +Manually executing `generate-log-bloom-cache` is not required unless you set the [`--auto-log-bloom-caching-enabled`](options.md#auto-log-bloom-caching-enabled) command line option to false. -!!! tip +::: - Manually executing `generate-log-bloom-cache` is not required unless you set the - [`--auto-log-bloom-caching-enabled`](options.md#auto-log-bloom-caching-enabled) command line - option to false. +Generates cached log bloom indexes for blocks. APIs use the cached indexes for improved log query performance. -Generates cached log bloom indexes for blocks. APIs use the cached indexes for improved log query -performance. +:::note -!!! note +Each index file contains 100000 blocks. The last fragment of blocks less that 100000 are not indexed. - Each index file contains 100000 blocks. The last fragment of blocks less that 100000 are not - indexed. +::: -To generate cached log bloom indexes while the node is running, use the -[`admin_generateLogBloomCache`](../api/index.md#admin_generatelogbloomcache) API. +To generate cached log bloom indexes while the node is running, use the [`admin_generateLogBloomCache`](../api/index.md#admin_generatelogbloomcache) API. ## `retesteth` -=== "Syntax" + - ```bash - besu retesteth [--data-path=] [--rpc-http-host=] [--rpc-http-port=] [-l=] [--host-allowlist=[,â€Ļ]â€Ļ or * or all] - ``` +# Syntax -=== "Example" +```bash +besu retesteth [--data-path=] [--rpc-http-host=] [--rpc-http-port=] [-l=] [--host-allowlist=[,â€Ļ]â€Ļ or * or all] +``` + +# Example + +```bash +besu retesteth --data-path=/home/me/me_node --rpc-http-port=8590 --host-allowlist=* +``` - ```bash - besu retesteth --data-path=/home/me/me_node --rpc-http-port=8590 --host-allowlist=* - ``` + -Runs a Retesteth-compatible server. [Retesteth](https://github.com/ethereum/retesteth/wiki) is a -developer tool that can generate and run consensus tests against any Ethereum client running such a -server. +Runs a Retesteth-compatible server. [Retesteth](https://github.com/ethereum/retesteth/wiki) is a developer tool that can generate and run consensus tests against any Ethereum client running such a server. The command accepts the following command line options: -* [`--data-path`](options.md#data-path) -* [`--host-allowlist`](options.md#host-allowlist) -* [`--rpc-http-host`](options.md#rpc-http-host) -* [`--rpc-http-port`](options.md#rpc-http-port) -* [`--logging`](options.md#logging) +- [`--data-path`](options.md#data-path) +- [`--host-allowlist`](options.md#host-allowlist) +- [`--rpc-http-host`](options.md#rpc-http-host) +- [`--rpc-http-port`](options.md#rpc-http-port) +- [`--logging`](options.md#logging) ## `validate-config` -=== "Syntax" + + +# Syntax - ```bash - besu validate-config --config-file - ``` +```bash +besu validate-config --config-file +``` -=== "Example" +# Example + +```bash +besu validate-config --config-file ../besu-local-nodes/config/besu/besu1.conf +``` - ```bash - besu validate-config --config-file ../besu-local-nodes/config/besu/besu1.conf - ``` + -Performs basic syntax validation of the specified -[TOML configuration file](../../how-to/configuration-file.md). -Checks TOML syntax (for example, valid format and unmatched quotes) and flags unknown options. -Doesn't check data types, and doesn't check dependencies between options (this is done at Besu startup). +Performs basic syntax validation of the specified [TOML configuration file](../../how-to/configuration-file.md). Checks TOML syntax (for example, valid format and unmatched quotes) and flags unknown options. Doesn't check data types, and doesn't check dependencies between options (this is done at Besu startup). diff --git a/docs/public-networks/reference/disclosure.md b/docs/public-networks/reference/disclosure.md index aaba84ab76e..3182278df61 100644 --- a/docs/public-networks/reference/disclosure.md +++ b/docs/public-networks/reference/disclosure.md @@ -1,15 +1,14 @@ --- +title: Security disclosure policy +sidebar_position: 8 description: Hyperledger Besu responsible disclosure statement tags: + - public networks - private networks --- # Security disclosure policy -At Hyperledger Besu, security is a priority. But regardless of how much effort we put into system -security, there might still be vulnerabilities present. If you discover a vulnerability, we need to -know about it so we can take steps to address it as quickly as possible. We would like you -to help us better protect our clients and our systems. +At Hyperledger Besu, security is a priority. But regardless of how much effort we put into system security, there might still be vulnerabilities present. If you discover a vulnerability, we need to know about it so we can take steps to address it as quickly as possible. We would like you to help us better protect our clients and our systems. -Please follow the process explained on -[Hyperledger defect response wiki page](https://wiki.hyperledger.org/display/SEC/Defect+Response). +Please follow the process explained on [Hyperledger defect response wiki page](https://wiki.hyperledger.org/display/SEC/Defect+Response). diff --git a/docs/public-networks/reference/engine-api/_category_.json b/docs/public-networks/reference/engine-api/_category_.json new file mode 100644 index 00000000000..0ea3b53ab2e --- /dev/null +++ b/docs/public-networks/reference/engine-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Engine API", + "position": 3 +} diff --git a/docs/public-networks/reference/engine-api/index.md b/docs/public-networks/reference/engine-api/index.md index e9ec88e4dd6..0d44ea08603 100644 --- a/docs/public-networks/reference/engine-api/index.md +++ b/docs/public-networks/reference/engine-api/index.md @@ -1,22 +1,21 @@ --- +title: Engine API description: Engine API methods reference +tags: + - public networks --- # Engine API methods -[Consensus and execution clients](../../concepts/the-merge.md#execution-and-consensus-clients) -communicate with each other using the Engine API. -When running Besu as an execution client, [use these API calls](../../how-to/use-engine-api.md) to -communicate with a consensus client. +[Consensus and execution clients](../../concepts/the-merge.md#execution-and-consensus-clients) communicate with each other using the Engine API. When running Besu as an execution client, [use these API calls](../../how-to/use-engine-api.md) to communicate with a consensus client. -!!! important +:::info - Ensure you enable the Engine API methods with the - [`--engine-rpc-enabled`](../cli/options.md#engine-rpc-enabled) CLI option. +Ensure you enable the Engine API methods with the [`--engine-rpc-enabled`](../cli/options.md#engine-rpc-enabled) CLI option. -See the [Ethereum Engine API specification](https://github.com/ethereum/execution-apis/blob/0b965fb714ccd3faa3c939fdce1726e56679cdec/src/engine/specification.md) -for more information. -Not all changes to the Engine API are documented on this page. +::: + +See the [Ethereum Engine API specification](https://github.com/ethereum/execution-apis/blob/0b965fb714ccd3faa3c939fdce1726e56679cdec/src/engine/specification.md) for more information. Not all changes to the Engine API are documented on this page. ## Methods @@ -26,94 +25,122 @@ Exchanges a list of supported Engine API methods between the consensus client an #### Parameters -`remoteCapabilities`: *array* of *strings* - Engine API method names that the consensus client supports +`remoteCapabilities`: _array_ of _strings_ - Engine API method names that the consensus client supports #### Returns -`localCapabilities`: *array* of *strings* - Engine API method names that Besu supports - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeCapabilities","params":[["engine_exchangeTransitionConfigurationV1","engine_forkchoiceUpdatedV1","engine_getPayloadBodiesByHash","engine_getPayloadBodiesByRangeV1","engine_getPayloadV1","engine_newPayloadV1"]],"id":67}' http://127.0.0.1:8550 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"engine_exchangeCapabilities","params":[["engine_exchangeTransitionConfigurationV1","engine_forkchoiceUpdatedV1","engine_getPayloadBodiesByHash","engine_getPayloadBodiesByRangeV1","engine_getPayloadV1","engine_newPayloadV1"]],"id":67} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 67, - "result": [ - "engine_getPayloadV1", - "engine_getPayloadV2", - "engine_executePayloadV1", - "engine_newPayloadV1", - "engine_newPayloadV2", - "engine_forkchoiceUpdatedV1", - "engine_forkchoiceUpdatedV2", - "engine_exchangeTransitionConfigurationV1", - "engine_getPayloadBodiesByHashV1", - "engine_getPayloadBodiesByRangeV1" - ] - } - } - ``` +`localCapabilities`: _array_ of _strings_ - Engine API method names that Besu supports + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeCapabilities","params":[["engine_exchangeTransitionConfigurationV1","engine_forkchoiceUpdatedV1","engine_getPayloadBodiesByHash","engine_getPayloadBodiesByRangeV1","engine_getPayloadV1","engine_newPayloadV1"]],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_exchangeCapabilities", + "params": [ + [ + "engine_exchangeTransitionConfigurationV1", + "engine_forkchoiceUpdatedV1", + "engine_getPayloadBodiesByHash", + "engine_getPayloadBodiesByRangeV1", + "engine_getPayloadV1", + "engine_newPayloadV1" + ] + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [ + "engine_getPayloadV1", + "engine_getPayloadV2", + "engine_executePayloadV1", + "engine_newPayloadV1", + "engine_newPayloadV2", + "engine_forkchoiceUpdatedV1", + "engine_forkchoiceUpdatedV2", + "engine_exchangeTransitionConfigurationV1", + "engine_getPayloadBodiesByHashV1", + "engine_getPayloadBodiesByRangeV1" + ] +} +``` + + ### `engine_exchangeTransitionConfigurationV1` Sends the transition configuration to the consensus client to verify the configuration between both clients. -!!! note +:::note + +The execution client runs this call every 60 seconds in the background. The log displays a warning message if the call hasn't been sent in 120 seconds. - The execution client runs this call every 60 seconds in the background. - The log displays a warning message if the call hasn't been sent in 120 seconds. +::: #### Parameters -`transitionConfiguration`: *object* - [Transition configuration object](objects.md#transition-configuration-object) +`transitionConfiguration`: _object_ - [Transition configuration object](objects.md#transition-configuration-object) #### Returns -`transitionConfiguration`: *object* - [Transition configuration object](objects.md#transition-configuration-object) - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeTransitionConfigurationV1","params":[{"terminalTotalDifficulty": 0, "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "terminalBlockNumber": "0x1"}],"id":67}' http://127.0.0.1:8550 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"engine_exchangeTransitionConfigurationV1","params":[{"terminalTotalDifficulty": 0, "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "terminalBlockNumber": "0x1"}],"id":67} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "terminalTotalDifficulty": 0, - "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "terminalBlockNumber": "0x1" - }, - "payloadId": null - } - } - ``` +`transitionConfiguration`: _object_ - [Transition configuration object](objects.md#transition-configuration-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeTransitionConfigurationV1","params":[{"terminalTotalDifficulty": 0, "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "terminalBlockNumber": "0x1"}],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_exchangeTransitionConfigurationV1", + "params": [ + { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + } + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + }, + "payloadId": null +} +``` + + ### `engine_forkchoiceUpdatedV1` @@ -121,46 +148,60 @@ Updates the fork choice with the consensus client. #### Parameters -* `forkchoiceState`: *object* - [Fork choice state object](objects.md#fork-choice-state-object) +- `forkchoiceState`: _object_ - [Fork choice state object](objects.md#fork-choice-state-object) -* `payloadAttributes`: *object* - [Payload attribute object](objects.md#payload-attributes-object). Can be `null`. +- `payloadAttributes`: _object_ - [Payload attribute object](objects.md#payload-attributes-object). Can be `null`. #### Returns -* `payloadStatus`: *object* - [Payload status object](objects.md#payload-status-object) - -* `payloadId`: *data* - identifier of the payload build process or `null` - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "payloadStatus": { - "status": "VALID", - "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", - "validationError": null - }, - "payloadId": null - } - } - ``` +- `payloadStatus`: _object_ - [Payload status object](objects.md#payload-status-object) + +- `payloadId`: _data_ - identifier of the payload build process or `null` + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_forkchoiceUpdatedV1", + "params": [ + { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + }, + null + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": null + } +} +``` + + ### `engine_getPayloadBodiesByHashV1` @@ -174,55 +215,67 @@ Returns the bodies of the execution payloads corresponding to the specified bloc `engineGetPayloadBodiesResultV1`: **array** of **objects** - Execution payload body objects -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByHashV1","params":[["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c","0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553"]],"id":1}' http://127.0.0.1:8550 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"engine_getPayloadBodiesByHashV1","params":[["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c","0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553"]],"id":67} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 67, - "result": [{ - "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], - "withdrawals": [{ - "index" : "0xf0", - "validatorIndex" : "0xf0", - "address" : "0x00000000000000000000000000000000000010f0", - "amount" : "0x1" - }, { - "index" : "0xf1", - "validatorIndex" : "0xf1", - "address" : "0x00000000000000000000000000000000000010f1", - "amount" : "0x1" - }] - }, { - "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], - "withdrawals": [{ - "index" : "0xf2", - "validatorIndex" : "0xf2", - "address" : "0x00000000000000000000000000000000000010f2", - "amount" : "0x1" - }, { - "index" : "0xf3", - "validatorIndex" : "0xf3", - "address" : "0x00000000000000000000000000000000000010f3", - "amount" : "0x1" - }] - }] - } - ``` + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByHashV1","params":[["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c","0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553"]],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadBodiesByHashV1", + "params": [ + [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553" + ] + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [{ + "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], + "withdrawals": [{ + "index" : "0xf0", + "validatorIndex" : "0xf0", + "address" : "0x00000000000000000000000000000000000010f0", + "amount" : "0x1" + }, { + "index" : "0xf1", + "validatorIndex" : "0xf1", + "address" : "0x00000000000000000000000000000000000010f1", + "amount" : "0x1" + }] + }, { + "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], + "withdrawals": [{ + "index" : "0xf2", + "validatorIndex" : "0xf2", + "address" : "0x00000000000000000000000000000000000010f2", + "amount" : "0x1" + }, { + "index" : "0xf3", + "validatorIndex" : "0xf3", + "address" : "0x00000000000000000000000000000000000010f3", + "amount" : "0x1" + }] + }] +} +``` + + ### `engine_getPayloadBodiesByRangeV1` @@ -230,63 +283,70 @@ Returns the bodies of the execution payloads corresponding to the specified rang #### Parameters -* `startBlockNumber`: *string* - Number of the starting block of the range, as a hexadecimal string +- `startBlockNumber`: _string_ - Number of the starting block of the range, as a hexadecimal string -* `count`: *string* - Number of blocks in the range (including the starting block), as a hexadecimal string +- `count`: _string_ - Number of blocks in the range (including the starting block), as a hexadecimal string #### Returns -`engineGetPayloadBodiesResultV1`: *array* of *objects* - Execution payload body objects - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByRangeV1","params":["0x20", "0x2"],"id":1}' http://127.0.0.1:8550 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"engine_getPayloadBodiesByRangeV1","params":["0x20", "0x2"],"id":67} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 67, - "result": [{ - "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], - "withdrawals": [{ - "index" : "0xf0", - "validatorIndex" : "0xf0", - "address" : "0x00000000000000000000000000000000000010f0", - "amount" : "0x1" - }, { - "index" : "0xf1", - "validatorIndex" : "0xf1", - "address" : "0x00000000000000000000000000000000000010f1", - "amount" : "0x1" - }] - }, { - "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], - "withdrawals": [{ - "index" : "0xf2", - "validatorIndex" : "0xf2", - "address" : "0x00000000000000000000000000000000000010f2", - "amount" : "0x1" - }, { - "index" : "0xf3", - "validatorIndex" : "0xf3", - "address" : "0x00000000000000000000000000000000000010f3", - "amount" : "0x1" - }] - }] - } - ``` +`engineGetPayloadBodiesResultV1`: _array_ of _objects_ - Execution payload body objects + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByRangeV1","params":["0x20", "0x2"],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadBodiesByRangeV1", + "params": ["0x20", "0x2"], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [{ + "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], + "withdrawals": [{ + "index" : "0xf0", + "validatorIndex" : "0xf0", + "address" : "0x00000000000000000000000000000000000010f0", + "amount" : "0x1" + }, { + "index" : "0xf1", + "validatorIndex" : "0xf1", + "address" : "0x00000000000000000000000000000000000010f1", + "amount" : "0x1" + }] + }, { + "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], + "withdrawals": [{ + "index" : "0xf2", + "validatorIndex" : "0xf2", + "address" : "0x00000000000000000000000000000000000010f2", + "amount" : "0x1" + }, { + "index" : "0xf3", + "validatorIndex" : "0xf3", + "address" : "0x00000000000000000000000000000000000010f3", + "amount" : "0x1" + }] + }] +} +``` + + ### `engine_getPayloadV1` @@ -294,50 +354,57 @@ Prepares the payload to send to the consensus client. #### Parameters -`payloadId`: *data* - Identifier of the payload build process +`payloadId`: _data_ - Identifier of the payload build process #### Returns -`executionPayload`: *object* - [Execution payload object](objects.md#execution-payload-object) - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x0000000021f32cc1"],"id":1}' http://127.0.0.1:8550 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x0000000021f32cc1"],"id":67} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", - "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x1", - "gasLimit": "0x1c9c380", - "gasUsed": "0x0", - "timestamp": "0x5", - "extraData": "0x", - "baseFeePerGas": "0x7", - "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", - "transactions": [] - } - } - ``` +`executionPayload`: _object_ - [Execution payload object](objects.md#execution-payload-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x0000000021f32cc1"],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadV1", + "params": ["0x0000000021f32cc1"], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +} +``` + + ### `engine_newPayloadV1` @@ -345,70 +412,77 @@ Executes the payload with the consensus client. #### Parameters -`executionPayload`: *object* - [Execution payload object](objects.md#execution-payload-object) +`executionPayload`: _object_ - [Execution payload object](objects.md#execution-payload-object) #### Returns -* `payloadStatus`: *object* - [Payload status object](objects.md#payload-status-object) - -!!! example - - === "curl HTTP" - - ```bash - curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ - { - "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", - "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x1", - "gasLimit": "0x1c9c380", - "gasUsed": "0x0", - "timestamp": "0x5", - "extraData": "0x", - "baseFeePerGas": "0x7", - "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", - "transactions": [] - } - ],"id":67}' http://127.0.0.1:8550 - ``` - - === "wscat WS" - - ```bash - {"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ - { - "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", - "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x1", - "gasLimit": "0x1c9c380", - "gasUsed": "0x0", - "timestamp": "0x5", - "extraData": "0x", - "baseFeePerGas": "0x7", - "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", - "transactions": [] - } - ],"id":67} - ``` - - === "JSON result" - - ```json - { - "jsonrpc": "2.0", - "id": 1, - "result": { - "status": "VALID", - "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", - "validationError": null - } - } - ``` +- `payloadStatus`: _object_ - [Payload status object](objects.md#payload-status-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_newPayloadV1", + "params": [ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } +} +``` + + diff --git a/docs/public-networks/reference/engine-api/objects.md b/docs/public-networks/reference/engine-api/objects.md index 092f87ab46f..ecd40054d9f 100644 --- a/docs/public-networks/reference/engine-api/objects.md +++ b/docs/public-networks/reference/engine-api/objects.md @@ -1,5 +1,8 @@ --- +title: Objects description: Engine API objects reference +tags: + - public networks --- # Engine API objects @@ -8,62 +11,61 @@ The following objects are parameters for or returned by the [Engine API methods] ## Execution payload object -Parameter for [`engine_newPayloadV1`](index.md#engine_newpayloadv1). -Returned by [`engine_getPayloadV1`](index.md#engine_getpayloadv1). +Parameter for [`engine_newPayloadV1`](index.md#engine_newpayloadv1). Returned by [`engine_getPayloadV1`](index.md#engine_getpayloadv1). | Key | Type | Value | -|-----|:----:|-------| -| `parentHash` | *Data*, 32 Bytes | Hash of the parent block. | -| `feeRecipient` | *Data*, 20 Bytes | Beneficiary of the fee. | -| `stateRoot` | *Data*, 32 Bytes | Root of the final state trie for the block. | -| `receiptsRoot` | *Data*, 32 Bytes | Root of the receipts trie for the block. | -| `logsBloom` | *Data*, 256 Bytes | Bloom filter for light clients to quickly retrieve related logs. | -| `prevRandao` | *Data*, 32 Bytes | Difficulty for this block. | -| `blockNumber` | *Quantity*, 64 Bits | Block number of block containing this transaction. | -| `gasLimit` | *Quantity*, 64 Bits | Maximum gas allowed in this block. | -| `gasUsed` | *Quantity*, 64 Bits | Total gas used by all transactions in this block. | -| `timestamp` | *Quantity*, 64 Bits | Unix timestamp (milliseconds) for block assembly. | -| `extraData` | *Data*, 0 to 32 Bytes | Extra data field for this block. | -| `baseFeePerGas` | *Quantity*, 256 Bits | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | -| `blockHash` | *Data*, 32 Bytes | Hash of the execution block. | -| `transactions` | *Array* | Array of transaction objects, each object is a list representing `TransactionType`, `TransactionPayload`, or `LegacyTransaction` as defined in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). | +| --- | :-: | --- | +| `parentHash` | _Data_, 32 Bytes | Hash of the parent block. | +| `feeRecipient` | _Data_, 20 Bytes | Beneficiary of the fee. | +| `stateRoot` | _Data_, 32 Bytes | Root of the final state trie for the block. | +| `receiptsRoot` | _Data_, 32 Bytes | Root of the receipts trie for the block. | +| `logsBloom` | _Data_, 256 Bytes | Bloom filter for light clients to quickly retrieve related logs. | +| `prevRandao` | _Data_, 32 Bytes | Difficulty for this block. | +| `blockNumber` | _Quantity_, 64 Bits | Block number of block containing this transaction. | +| `gasLimit` | _Quantity_, 64 Bits | Maximum gas allowed in this block. | +| `gasUsed` | _Quantity_, 64 Bits | Total gas used by all transactions in this block. | +| `timestamp` | _Quantity_, 64 Bits | Unix timestamp (milliseconds) for block assembly. | +| `extraData` | _Data_, 0 to 32 Bytes | Extra data field for this block. | +| `baseFeePerGas` | _Quantity_, 256 Bits | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | +| `blockHash` | _Data_, 32 Bytes | Hash of the execution block. | +| `transactions` | _Array_ | Array of transaction objects, each object is a list representing `TransactionType`, `TransactionPayload`, or `LegacyTransaction` as defined in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). | ## Fork choice state object Parameter for [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). | Key | Type | Value | -|-----|:----:|-------| -| `headBlockHash` | *Data*, 32 Bytes | Block hash of the head of the canonical chain. | -| `safeBlockHash` | *Data*, 32 Bytes | "Safe" block hash of the canonical chain under certain synchrony and honesty assumptions. This value MUST be either equal to or an ancestor of `headBlockHash`. | -| `finalizedBlockHash` | *Data*, 32 Bytes | Block hash of the most recent finalized block. | +| --- | :-: | --- | +| `headBlockHash` | _Data_, 32 Bytes | Block hash of the head of the canonical chain. | +| `safeBlockHash` | _Data_, 32 Bytes | "Safe" block hash of the canonical chain under certain synchrony and honesty assumptions. This value MUST be either equal to or an ancestor of `headBlockHash`. | +| `finalizedBlockHash` | _Data_, 32 Bytes | Block hash of the most recent finalized block. | ## Payload attributes object Parameter for [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). | Key | Type | Value | -|-----|:----:|-------| -| `timestamp` | *Quantity*, 64 Bits | Value for the `timestamp` field of the new payload. | -| `prevRandao` | *Data*, 32 Bytes | Value for the `prevRandao` field of the new payload. | -| `suggestedFeeRecipient` | *Data*, 20 Bytes | Suggested value for the `feeRecipient` field of the new payload.| +| --- | :-: | --- | +| `timestamp` | _Quantity_, 64 Bits | Value for the `timestamp` field of the new payload. | +| `prevRandao` | _Data_, 32 Bytes | Value for the `prevRandao` field of the new payload. | +| `suggestedFeeRecipient` | _Data_, 20 Bytes | Suggested value for the `feeRecipient` field of the new payload. | ## Payload status object Returned by [`engine_newPayloadV1`](index.md#engine_newpayloadv1) and [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). | Key | Type | Value | -|-----|:----:|-------| -| `status` | *Enumeration* | Either `"VALID"`, `"INVALID"`, `"SYNCING"`, `"ACCEPTED"`, `"INVALID_BLOCK_HASH"`, or `"INVALID_TERMINAL_BLOCK"`. | -| `latestValidHash` | *Data*, 32 Bytes | Hash of the most recent valid block in the branch defined by payload and its ancestors. | -| `validationError` | *String* | Message providing additional details on the validation error if the payload is classified as `INVALID`, `INVALID_BLOCK_HASH` or `INVALID_TERMINAL_BLOCK`. | +| --- | :-: | --- | +| `status` | _Enumeration_ | Either `"VALID"`, `"INVALID"`, `"SYNCING"`, `"ACCEPTED"`, `"INVALID_BLOCK_HASH"`, or `"INVALID_TERMINAL_BLOCK"`. | +| `latestValidHash` | _Data_, 32 Bytes | Hash of the most recent valid block in the branch defined by payload and its ancestors. | +| `validationError` | _String_ | Message providing additional details on the validation error if the payload is classified as `INVALID`, `INVALID_BLOCK_HASH` or `INVALID_TERMINAL_BLOCK`. | ## Transition configuration object Parameter for and returned by [`engine_exchangeTransitionConfigurationV1`](index.md#engine_exchangetransitionconfigurationv1). | Key | Type | Value | -|-----|:----:|-------| -| `terminalTotalDifficulty` | *Quantity*, 256 Bits | Maps on the `TERMINAL_TOTAL_DIFFICULTY` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | -| `terminalBlockHash` | *Data*, 32 Bytes | Maps on the `TERMINAL_BLOCK_HASH` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | -| `terminalBlockNumber` | *Quantity*, 64 Bits | Maps on the `TERMINAL_BLOCK_NUMBER` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | +| --- | :-: | --- | +| `terminalTotalDifficulty` | _Quantity_, 256 Bits | Maps on the `TERMINAL_TOTAL_DIFFICULTY` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | +| `terminalBlockHash` | _Data_, 32 Bytes | Maps on the `TERMINAL_BLOCK_HASH` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | +| `terminalBlockNumber` | _Quantity_, 64 Bits | Maps on the `TERMINAL_BLOCK_NUMBER` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | diff --git a/docs/public-networks/reference/evm-tool.md b/docs/public-networks/reference/evm-tool.md index d9c55555d70..37c8b88ea02 100644 --- a/docs/public-networks/reference/evm-tool.md +++ b/docs/public-networks/reference/evm-tool.md @@ -1,159 +1,181 @@ --- -description: Hyperledger Besu EVM tool reference +title: EVM tool options +sidebar_position: 5 +description: Besu EVM tool options reference tags: + - public networks - private networks --- # EVM tool reference -This reference describes options for running the following -[using the EVM tool](../how-to/troubleshoot/evm-tool.md): +This reference describes options for running the following [using the EVM tool](../how-to/troubleshoot/evm-tool.md): -* [Arbitrary EVM programs](#run-options) -* [Ethereum state tests](#state-test-options) -* [Ethereum object formatted code](#eof-code-validation) +- [Arbitrary EVM programs](#run-options) +- [Ethereum state tests](#state-test-options) +- [Ethereum object formatted code](#eof-code-validation) -!!! note - Option names that include `trace`, such as [`--trace`](#json-trace) and - [`--trace.[no]memory`](#nomemory-tracenomemory) exist to support - [`t8ntool`](https://ethereum-tests.readthedocs.io/en/latest/t8ntool.html) reference testing, and - are interchangeable with their standard option names. +:::note + +Option names that include `trace`, such as [`--trace`](#json-trace) and [`--trace.[no]memory`](#nomemory-tracenomemory) exist to support [`t8ntool`](https://ethereum-tests.readthedocs.io/en/latest/t8ntool.html) reference testing, and are interchangeable with their standard option names. + +::: ## Run options -The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. -Command line options specify the code and other contextual information. +The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. Command line options specify the code and other contextual information. ### `code` -=== "Syntax" + + +# Syntax + +```bash +--code= +``` - ```bash - --code= - ``` +# Example -=== "Example" +```bash +--code=5B600080808060045AFA50600056 +``` - ```bash - --code=5B600080808060045AFA50600056 - ``` + -The code to be executed, in compiled hex code form. -Execution fails if this is not set. +The code to be executed, in compiled hex code form. Execution fails if this is not set. ### `gas` -=== "Syntax" + - ```bash - --gas= - ``` +# Syntax -=== "Example" +```bash +--gas= +``` - ```bash - --gas=100000000 - ``` +# Example -Amount of gas to make available to the EVM. -The default is 10 billion, a number unlikely to be seen in any production blockchain. +```bash +--gas=100000000 +``` + + + +Amount of gas to make available to the EVM. The default is 10 billion, a number unlikely to be seen in any production blockchain. ### `price` -=== "Syntax" + + +# Syntax + +```bash +--price= +``` - ```bash - --price= - ``` +# Example -=== "Example" +```bash +--price=10 +``` - ```bash - --price=10 - ``` + -Price of gas in Gwei. -The default is `0`. -If set to a non-zero value, the sender account must have enough value to cover the gas fees. +Price of gas in Gwei. The default is `0`. If set to a non-zero value, the sender account must have enough value to cover the gas fees. ### `sender` -=== "Syntax" + - ```bash - --sender=
- ``` +# Syntax -=== "Example" +```bash +--sender=
+``` - ```bash - --sender=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 - ``` +# Example -The account the invocation is sent from. -The specified account must exist in the world state, which, unless specified by -[`--genesis`](#genesis), is the set of -[accounts used for testing](../../private-networks/reference/accounts-for-testing.md). +```bash +--sender=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + + + +The account the invocation is sent from. The specified account must exist in the world state, which, unless specified by [`--genesis`](#genesis), is the set of [accounts used for testing](../../private-networks/reference/accounts-for-testing.md). ### `receiver` -=== "Syntax" + + +# Syntax + +```bash +--receiver=
+``` - ```bash - --receiver=
- ``` +# Example -=== "Example" +```bash +--receiver=0x588108d3eab34e94484d7cda5a1d31804ca96fe7 +``` - ```bash - --receiver=0x588108d3eab34e94484d7cda5a1d31804ca96fe7 - ``` + -The account the invocation is sent to. -The specified account does not need to exist. +The account the invocation is sent to. The specified account does not need to exist. ### `input` -=== "Syntax" + - ```bash - --input= - ``` +# Syntax -=== "Example" +```bash +--input= +``` - ```bash - --input=9064129300000000000000000000000000000000000000000000000000000000 - ``` +# Example -The data passed into the call. -Corresponds to the `data` field of the transaction and is returned by the `CALLDATA` and related opcodes. +```bash +--input=9064129300000000000000000000000000000000000000000000000000000000 +``` + + + +The data passed into the call. Corresponds to the `data` field of the transaction and is returned by the `CALLDATA` and related opcodes. ### `value` -=== "Syntax" + + +# Syntax - ```bash - --value= - ``` +```bash +--value= +``` -=== "Example" +# Example - ```bash - --value=1000000000000000000 - ``` +```bash +--value=1000000000000000000 +``` -The value, in wei, attached to this transaction. -For operations that query the value or transfer it to other accounts this is the amount that is available. -The amount is not reduced to cover intrinsic cost and gas fees. + + +The value, in wei, attached to this transaction. For operations that query the value or transfer it to other accounts this is the amount that is available. The amount is not reduced to cover intrinsic cost and gas fees. ### `json`, `trace` -=== "Syntax" + + +# Syntax - ```bash - --json - ``` +```bash +--json +``` + + Provides an operation-by-operation trace of the command in JSON. @@ -161,25 +183,31 @@ Provides an operation-by-operation trace of the command in JSON. ### `json-alloc` -=== "Syntax" + + +# Syntax - ```bash - --json-alloc - ``` +```bash +--json-alloc +``` + + Outputs a JSON summary of the post-execution world state and allocations. ### `[no]memory`, `trace.[no]memory` -=== "Syntax" + + +# Syntax + +```bash +--nomemory, --memory +``` - ```bash - --nomemory, --memory - ``` + -Setting `--nomemory` disables tracing the memory output for each operation. -Setting `--memory` enables it. -Memory traces are disabled by default. +Setting `--nomemory` disables tracing the memory output for each operation. Setting `--memory` enables it. Memory traces are disabled by default. For memory heavy scripts, disabling memory traces may reduce the volume of JSON output. @@ -187,189 +215,219 @@ For memory heavy scripts, disabling memory traces may reduce the volume of JSON ### `trace.[no]stack` -=== "Syntax" + - ```bash - --trace.nostack, --trace.stack - ``` +# Syntax -Setting `--trace.nostack` disables tracing the operand stack for each operation. -Setting `--trace.stack` enables it. -Stack traces are enabled by default. +```bash +--trace.nostack, --trace.stack +``` + + + +Setting `--trace.nostack` disables tracing the operand stack for each operation. Setting `--trace.stack` enables it. Stack traces are enabled by default. ### `trace.[no]returndata` -=== "Syntax" + + +# Syntax + +```bash +--trace.noreturndata, --trace.returndata +``` - ```bash - --trace.noreturndata, --trace.returndata - ``` + -Setting `--trace.noreturndata` disables tracing the return data for each operation. -Setting `--trace.returndata` enables it. -Return data traces are enabled by default. +Setting `--trace.noreturndata` disables tracing the return data for each operation. Setting `--trace.returndata` enables it. Return data traces are enabled by default. ### `[no]time` -=== "Syntax" + - ```bash - --notime, --time - ``` +# Syntax -Setting `--notime` disables including time data in the summary output. -Setting `--time` enables it. +```bash +--notime, --time +``` + + + +Setting `--notime` disables including time data in the summary output. Setting `--time` enables it. This is useful for testing and differential evaluations. ### `genesis` -=== "Syntax" + + +# Syntax - ```bash - --genesis= - ``` +```bash +--genesis= +``` -=== "Example" +# Example - ```bash - --genesis=/opt/besu/genesis.json - ``` +```bash +--genesis=/opt/besu/genesis.json +``` -The [Besu genesis file](genesis-items.md) to use when evaluating the EVM. -Most useful are the `alloc` items that set up accounts and their stored memory states. + + +The [Besu genesis file](genesis-items.md) to use when evaluating the EVM. Most useful are the `alloc` items that set up accounts and their stored memory states. `--prestate` is a deprecated alias for `--genesis`. ### `chain` -=== "Syntax" + + +# Syntax - ```bash - --chain= - ``` +```bash +--chain= +``` -=== "Example" +# Example - ```bash - --chain=goerli - ``` +```bash +--chain=goerli +``` -The well-known network genesis file to use when evaluating the EVM. -These values are an alternative to the [`--genesis`](#genesis) option for well-known networks. + + +The well-known network genesis file to use when evaluating the EVM. These values are an alternative to the [`--genesis`](#genesis) option for well-known networks. ### `repeat` -=== "Syntax" + + +# Syntax - ```bash - --repeat= - ``` +```bash +--repeat= +``` -=== "Example" +# Example - ```bash - --repeat=1000 - ``` +```bash +--repeat=1000 +``` -Number of times to repeat the contract before gathering timing information. -This is useful when benchmarking EVM operations. -The default is `0`. + + +Number of times to repeat the contract before gathering timing information. This is useful when benchmarking EVM operations. The default is `0`. ### `revert-reason-enabled` -=== "Syntax" + + +# Syntax - ```bash - --revert-reason-enabled - ``` +```bash +--revert-reason-enabled +``` -Enables tracing the reason included in `REVERT` operations. -The revert reason is enabled by default. + + +Enables tracing the reason included in `REVERT` operations. The revert reason is enabled by default. ### `fork` -=== "Syntax" + + +# Syntax - ```bash - --fork= - ``` +```bash +--fork= +``` -=== "Example" +# Example - ```bash - --fork=FutureEips - ``` +```bash +--fork=FutureEips +``` + + Specific fork to evaluate, overriding network settings. ### `key-value-storage` -=== "Syntax" + + +# Syntax - ```bash - --key-value-storage= - ``` +```bash +--key-value-storage= +``` -=== "Example" +# Example - ```bash - --key-value-storage=rocksdb - ``` +```bash +--key-value-storage=rocksdb +``` + + Kind of key value storage to use. -It might be useful to execute isolated EVM calls in the context of an actual world state. -The default is `memory`, which executes the call only in the context of the world provided by -[`--genesis`](#genesis) or [`--chain`](#chain) at block zero. +It might be useful to execute isolated EVM calls in the context of an actual world state. The default is `memory`, which executes the call only in the context of the world provided by [`--genesis`](#genesis) or [`--chain`](#chain) at block zero. -When set to `rocksdb` and combined with [`--data-path`](#data-path), [`--block-number`](#block-number), -and [`--genesis`](#genesis), a Besu node that isn't currently running can be used to provide the -appropriate world state for a transaction. -This is useful when evaluating consensus failures. +When set to `rocksdb` and combined with [`--data-path`](#data-path), [`--block-number`](#block-number), and [`--genesis`](#genesis), a Besu node that isn't currently running can be used to provide the appropriate world state for a transaction. This is useful when evaluating consensus failures. ### `data-path` -=== "Syntax" + + +# Syntax - ```bash - --data-path= - ``` +```bash +--data-path= +``` -=== "Example" +# Example - ```bash - --data-path=/opt/besu/data - ``` +```bash +--data-path=/opt/besu/data +``` -When [`--key-value-storage`](#key-value-storage) is set to `rocksdb`, specifies the location of the -database on disk. + + +When [`--key-value-storage`](#key-value-storage) is set to `rocksdb`, specifies the location of the database on disk. ### `block-number` -=== "Syntax" + + +# Syntax + +```bash +--block-number= +``` - ```bash - --block-number= - ``` +# Example -=== "Example" +```bash +--block-number=10000000 +``` - ```bash - --block-number=10000000 - ``` + -The block number to evaluate the code against. -Used to ensure that the EVM is evaluating the code against the correct fork, or to specify the -world state when [`--key-value-storage`](#key-value-storage) is set to `rocksdb`. +The block number to evaluate the code against. Used to ensure that the EVM is evaluating the code against the correct fork, or to specify the world state when [`--key-value-storage`](#key-value-storage) is set to `rocksdb`. ### `version` -=== "Syntax" + - ```bash - --version - ``` +# Syntax + +```bash +--version +``` + + Displays the version information. @@ -377,36 +435,39 @@ Displays the version information. ## State test options -The `state-test` subcommand allows the [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) to be evaluated. -The only applicable options are `--json` and `--nomemory`. +The `state-test` subcommand allows the [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) to be evaluated. The only applicable options are `--json` and `--nomemory`. ### `json`, `trace` -=== "Syntax" + + +# Syntax + +```bash +--json +``` - ```bash - --json - ``` + Provides an operation-by-operation trace of the command in JSON. -Set this option for EVM Lab Fuzzing. -Whether or not `--json` is set, a summary JSON object is printed to standard output for each state -test executed. +Set this option for EVM Lab Fuzzing. Whether or not `--json` is set, a summary JSON object is printed to standard output for each state test executed. `--trace` is an alias for `--json`. ### `[no]memory`, `trace.[no]memory` -=== "Syntax" + - ```bash - --[no]memory - ``` +# Syntax -Setting `--nomemory` disables tracing the memory output for each operation. -Setting `--memory` enables it. -Memory traces are disabled by default. +```bash +--[no]memory +``` + + + +Setting `--nomemory` disables tracing the memory output for each operation. Setting `--memory` enables it. Memory traces are disabled by default. For memory heavy scripts, disabling memory traces may reduce the volume of JSON output. @@ -414,82 +475,88 @@ For memory heavy scripts, disabling memory traces may reduce the volume of JSON ### Use command arguments -If you use command arguments, you can list one or more state tests. -All the state tests are evaluated in the order they are specified. +If you use command arguments, you can list one or more state tests. All the state tests are evaluated in the order they are specified. + + -=== "Docker example" +# Docker example - ```bash - docker run --rm -v ${PWD}:/opt/referencetests hyperledger/besu-evmtool:develop --json state-test /opt/referencetests/GeneralStateTests/stExample/add11.json - ``` +```bash +docker run --rm -v ${PWD}:/opt/referencetests hyperledger/besu-evmtool:develop --json state-test /opt/referencetests/GeneralStateTests/stExample/add11.json +``` -=== "CLI example" +# CLI example - ```bash - evm --json state-test stExample/add11.json - ``` +```bash +evm --json state-test stExample/add11.json +``` + + ### Use standard input -If no reference tests are passed in using the command line, the EVM tool loads one complete JSON object -from standard input and executes that state test. +If no reference tests are passed in using the command line, the EVM tool loads one complete JSON object from standard input and executes that state test. + + -=== "Docker example" +# Docker example - ```bash - docker run --rm -i hyperledger/besu-evmtool:develop --json state-test < stExample/add11.json - ``` +```bash +docker run --rm -i hyperledger/besu-evmtool:develop --json state-test < stExample/add11.json +``` -=== "CLI example" +# CLI example - ```bash - evm --json state-test < stExample/add11.json - ``` +```bash +evm --json state-test < stExample/add11.json +``` + + ## EOF code validation -The `code-validate` subcommand allows -[Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. -It accepts candidate EOF containers or EVM bytecode using the `--file` option, command arguments, -or standard input. +The `code-validate` subcommand allows [Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. It accepts candidate EOF containers or EVM bytecode using the `--file` option, command arguments, or standard input. ### `file` -=== "Syntax" + + +# Syntax - ```bash - --file= - ``` +```bash +--file= +``` -=== "Example" +# Example - ```bash - --file=eof.txt - ``` +```bash +--file=eof.txt +``` -File containing one or more EOF containers or EVM bytecode. -Each line in the file is considered a separate program. + + +File containing one or more EOF containers or EVM bytecode. Each line in the file is considered a separate program. ### Use command arguments -If you use command arguments, each argument is considered a separate program. -If a code segment includes spaces, it must be contained in quotes. +If you use command arguments, each argument is considered a separate program. If a code segment includes spaces, it must be contained in quotes. + + + +# Docker example -=== "Docker example" +```bash +docker run --rm hyperledger/besu-evmtool:develop code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 +``` - ```bash - docker run --rm hyperledger/besu-evmtool:develop code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 - ``` +# CLI example -=== "CLI example" +```bash +evm code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 +``` - ```bash - evm code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 - ``` + ### Use standard input -If no reference tests are passed in using the command line, the EVM tool loads and validates code -from standard input. -Each line is considered a separate program. -Comment lines and blanks are ignored. +If no reference tests are passed in using the command line, the EVM tool loads and validates code from standard input. Each line is considered a separate program. Comment lines and blanks are ignored. diff --git a/docs/public-networks/reference/genesis-items.md b/docs/public-networks/reference/genesis-items.md index 37e9027aa33..dbf4089990c 100644 --- a/docs/public-networks/reference/genesis-items.md +++ b/docs/public-networks/reference/genesis-items.md @@ -1,165 +1,151 @@ --- -description: Configuration items specified in the Hyperledger Besu genesis file +title: Genesis file items +sidebar_position: 4 +description: Genesis file configuration items reference tags: + - public networks - private networks --- # Genesis file items -The [Besu genesis file](../concepts/genesis-file.md) contains [network configuration items](#configuration-items) -and [genesis block parameters](#genesis-block-parameters). +The [Besu genesis file](../concepts/genesis-file.md) contains [network configuration items](#configuration-items) and [genesis block parameters](#genesis-block-parameters). ## Configuration items Network configuration items are specified in the genesis file in the `config` object. -| Item | Description | -|---------------------|-:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Milestone blocks | [Milestone blocks for the network](#milestone-blocks). | -| `chainID` | [Chain ID for the network](../concepts/network-and-chain-id.md). | -| `ethash` | Specifies network uses [Ethash](../../private-networks/how-to/configure/consensus/index.md) and contains [`fixeddifficulty`](#fixed-difficulty). | -| `clique` | Specifies network uses [Clique](../../private-networks/how-to/configure/consensus/clique.md) and contains [Clique configuration items](../../private-networks/how-to/configure/consensus/clique.md#genesis-file). | -| `ibft2` | Specifies network uses [IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md) and contains [IBFT 2.0 configuration items](../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | -| `qbft` | Specifies network uses [QBFT](../../private-networks/how-to/configure/consensus/qbft.md) and contains [QBFT configuration items](../../private-networks/how-to/configure/consensus/qbft.md#genesis-file). | -| `transitions` | Specifies block at which to [change IBFT 2.0 or QBFT validators](../../private-networks/how-to/configure/consensus/add-validators-without-voting.md). | -| `contractSizeLimit` | Maximum contract size in bytes. Specify in [free gas networks](../../private-networks/how-to/configure/free-gas.md). The default is `24576` and the maximum size is `2147483647`. | -| `evmStackSize` | Maximum stack size. Specify to increase the maximum stack size in private networks with complex smart contracts. The default is `1024`. | -| `ecCurve` | Specifies [the elliptic curve to use](../../private-networks/how-to/configure/curves.md). Default is `secp256k1`. | -| `discovery` | Specifies [discovery configuration items](#discovery-configuration-items). The `discovery` object can be left empty. | +| Item | Description | +| --- | --: | +| Milestone blocks | [Milestone blocks for the network](#milestone-blocks). | +| `chainID` | [Chain ID for the network](../concepts/network-and-chain-id.md). | +| `ethash` | Specifies network uses [Ethash](../../private-networks/how-to/configure/consensus/index.md) and contains [`fixeddifficulty`](#fixed-difficulty). | +| `clique` | Specifies network uses [Clique](../../private-networks/how-to/configure/consensus/clique.md) and contains [Clique configuration items](../../private-networks/how-to/configure/consensus/clique.md#genesis-file). | +| `ibft2` | Specifies network uses [IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md) and contains [IBFT 2.0 configuration items](../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | +| `qbft` | Specifies network uses [QBFT](../../private-networks/how-to/configure/consensus/qbft.md) and contains [QBFT configuration items](../../private-networks/how-to/configure/consensus/qbft.md#genesis-file). | +| `transitions` | Specifies block at which to [change IBFT 2.0 or QBFT validators](../../private-networks/how-to/configure/consensus/add-validators-without-voting.md). | +| `contractSizeLimit` | Maximum contract size in bytes. Specify in [free gas networks](../../private-networks/how-to/configure/free-gas.md). The default is `24576` and the maximum size is `2147483647`. | +| `evmStackSize` | Maximum stack size. Specify to increase the maximum stack size in private networks with complex smart contracts. The default is `1024`. | +| `ecCurve` | Specifies [the elliptic curve to use](../../private-networks/how-to/configure/curves.md). Default is `secp256k1`. | +| `discovery` | Specifies [discovery configuration items](#discovery-configuration-items). The `discovery` object can be left empty. | ## Genesis block parameters -The purpose of some genesis block parameters varies depending on the consensus protocol (Ethash, -[Clique](../../private-networks/how-to/configure/consensus/clique.md), -[IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md), or -[QBFT](../../private-networks/how-to/configure/consensus/qbft.md)). These parameters include: +The purpose of some genesis block parameters varies depending on the consensus protocol (Ethash, [Clique](../../private-networks/how-to/configure/consensus/clique.md), [IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md), or [QBFT](../../private-networks/how-to/configure/consensus/qbft.md)). These parameters include: -* `difficulty`. -* `extraData`. -* `mixHash`. +- `difficulty`. +- `extraData`. +- `mixHash`. -The following table describes the genesis block parameters with the same purpose across all -consensus protocols. +The following table describes the genesis block parameters with the same purpose across all consensus protocols. -| Item | Description | -|---------------------|-:---------------------------------------------------------------------------------------------------------------------------------------| -| `coinbase` | Address to pay mining rewards to. Can be any value in the genesis block (commonly set to `0x0000000000000000000000000000000000000000`). | -| `gasLimit` | Block gas limit. Total gas limit for all transactions in a block. | -| `nonce` | Used in block computation. Can be any value in the genesis block (commonly set to `0x0`). | -| `timestamp` | Creation date and time of the block. Must be before the next block so we recommend specifying `0x0` in the genesis file. | -| `alloc` | Defines [accounts with balances](../../private-networks/reference/accounts-for-testing.md) or [contracts](../../private-networks/how-to/configure/contracts.md). | +| Item | Description | +| --- | --: | +| `coinbase` | Address to pay mining rewards to. Can be any value in the genesis block (commonly set to `0x0000000000000000000000000000000000000000`). | +| `gasLimit` | Block gas limit. Total gas limit for all transactions in a block. | +| `nonce` | Used in block computation. Can be any value in the genesis block (commonly set to `0x0`). | +| `timestamp` | Creation date and time of the block. Must be before the next block so we recommend specifying `0x0` in the genesis file. | +| `alloc` | Defines [accounts with balances](../../private-networks/reference/accounts-for-testing.md) or [contracts](../../private-networks/how-to/configure/contracts.md). | -!!! caution +:::caution - If a `Supplied genesis block does not match stored chain data` error occurs, use the genesis - file matching the genesis block of the data directory, or use the - [`--data-path`](../reference/cli/options.md#data-path) option to specify a different data - directory. +If a `Supplied genesis block does not match stored chain data` error occurs, use the genesis file matching the genesis block of the data directory, or use the [`--data-path`](../reference/cli/options.md#data-path) option to specify a different data directory. -## Milestone blocks - -In public networks, the milestone blocks specify the blocks at which the network changed protocol. -See a [full list of Ethereum protocol releases](https://github.com/ethereum/execution-specs#ethereum-protocol-releases) -and their corresponding milestone blocks. - -!!! example "Ethereum Mainnet milestone blocks" - - ```json - { - "config": { - ... - "homesteadBlock": 1150000, - "daoForkBlock": 1920000, - "daoForkSupport": true, - "eip150Block": 2463000, - "eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0", - "eip155Block": 2675000, - "eip158Block": 2675000, - "byzantiumBlock": 4370000, - "constantinopleBlock": 7280000, - "constantinopleFixBlock": 7280000, - "muirGlacierBlock": 9200000, - "berlinBlock": 12244000, - "londonBlock": 12965000, - "arrowGlacierBlock": 13773000, - "grayGlacierBlock": 15050000, - ... - }, - } - ``` +::: -!!! caution +## Milestone blocks - Ensure you include a milestone far enough in advance in the genesis file. - Not doing so can lead to unexpected and inconsistent behavior without specific errors. +In public networks, the milestone blocks specify the blocks at which the network changed protocol. See a [full list of Ethereum protocol releases](https://github.com/ethereum/execution-specs#ethereum-protocol-releases) and their corresponding milestone blocks. + +```json title="Ethereum Mainnet milestone blocks" +{ + "config": { + ... + "homesteadBlock": 1150000, + "daoForkBlock": 1920000, + "daoForkSupport": true, + "eip150Block": 2463000, + "eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0", + "eip155Block": 2675000, + "eip158Block": 2675000, + "byzantiumBlock": 4370000, + "constantinopleBlock": 7280000, + "constantinopleFixBlock": 7280000, + "muirGlacierBlock": 9200000, + "berlinBlock": 12244000, + "londonBlock": 12965000, + "arrowGlacierBlock": 13773000, + "grayGlacierBlock": 15050000, + ... + }, +} +``` + +:::caution + +Ensure you include a milestone far enough in advance in the genesis file. Not doing so can lead to unexpected and inconsistent behavior without specific errors. + +::: In private networks, the milestone block defines the protocol version for the network. -!!! example "Private network milestone block" +```json title="Private network milestone block" +{ + "config": { + ... + "berlinBlock": 0, + ... + }, +} +``` - ```json - { - "config": { - ... - "berlinBlock": 0, - ... - }, - } - ``` +:::note -!!! note +In private networks, we recommend specifying the latest milestone block. It's implied this includes the preceding milestones. This ensures you use the most up-to-date protocol and have access to the most recent opcodes. - In private networks, we recommend specifying the latest milestone block. - It's implied this includes the preceding milestones. - This ensures you use the most up-to-date protocol and have access to the most recent opcodes. +::: ## Fixed difficulty -Use `fixeddifficulty` to specify a fixed difficulty in private networks using Ethash. This will keep -the network's difficulty constant and override the `difficulty` parameter from the genesis file. +Use `fixeddifficulty` to specify a fixed difficulty in private networks using Ethash. This will keep the network's difficulty constant and override the `difficulty` parameter from the genesis file. -!!! example +```json +{ + "config": { + ... + "ethash": { + "fixeddifficulty": 1000 + }, - ```json - { - "config": { - ... - "ethash": { - "fixeddifficulty": 1000 - }, + }, + ... +} +``` - }, - ... - } - ``` +:::tip + +Using `fixeddifficulty` is not recommended for use with Ethash outside of test environments. For production networks using Ethash, we recommend setting a low `difficulty` value in the genesis file instead. Ethash will adjust the difficulty of the network based on hashrate to produce blocks at the targeted frequency. -!!! tip - Using `fixeddifficulty` is not recommended for use with Ethash outside of test environments. - For production networks using Ethash, we recommend setting a low `difficulty` value in the genesis file instead. - Ethash will adjust the difficulty of the network based on hashrate to produce blocks at the targeted frequency. +::: ## Discovery configuration items -Use the `discovery` configuration items to specify the [`bootnodes`](cli/options.md#bootnodes) and [`discovery-dns-url`](cli/options.md#discovery-dns-url) -in the genesis file, in place of using CLI options or listing them in the configuration file. -If either CLI option is used, it takes precedence over the genesis file. -Anything listed in the configuration file also takes precedence. - -!!! example - - ```json - { - "config": { - "discovery" : { - "bootnodes": [ - "enode://c35c3...d615f@1.2.3.4:30303", - "enode://f42c13...fc456@1.2.3.5:30303" - ], - "dns": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" - } - } +Use the `discovery` configuration items to specify the [`bootnodes`](cli/options.md#bootnodes) and [`discovery-dns-url`](cli/options.md#discovery-dns-url) in the genesis file, in place of using CLI options or listing them in the configuration file. If either CLI option is used, it takes precedence over the genesis file. Anything listed in the configuration file also takes precedence. + +```json +{ + "config": { + "discovery": { + "bootnodes": [ + "enode://c35c3...d615f@1.2.3.4:30303", + "enode://f42c13...fc456@1.2.3.5:30303" + ], + "dns": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" } - ``` + } +} +``` + [GoQuorum clients]: https://consensys.net/docs/goquorum/en/stable/ diff --git a/docs/public-networks/reference/projects-using-besu.md b/docs/public-networks/reference/projects-using-besu.md index 2942ded9cd3..7684be3a024 100644 --- a/docs/public-networks/reference/projects-using-besu.md +++ b/docs/public-networks/reference/projects-using-besu.md @@ -1,6 +1,9 @@ --- -description: Projects using Besu +title: Projects using Besu +sidebar_position: 7 +description: List of projects using Besu tags: + - public networks - private networks --- @@ -10,8 +13,6 @@ tags: The following block explorers are compatible with Besu: -- [BlockScout](https://github.com/blockscout/blockscout#readme) - See the - [project documentation](https://docs.blockscout.com/) for setup instructions. +- [BlockScout](https://github.com/blockscout/blockscout#readme) - See the [project documentation](https://docs.blockscout.com/) for setup instructions. -- [Sirato Blockchain Explorer](https://www.web3labs.com/sirato) - See how to [use Sirato with - privacy-enabled networks](../../private-networks/how-to/monitor/sirato-explorer.md). +- [Sirato Blockchain Explorer](https://www.web3labs.com/sirato) - See how to [use Sirato with privacy-enabled networks](../../private-networks/how-to/monitor/sirato-explorer.md). diff --git a/docs/public-networks/reference/trace-types.md b/docs/public-networks/reference/trace-types.md index 4e0203b58ad..2ea2b785ce9 100644 --- a/docs/public-networks/reference/trace-types.md +++ b/docs/public-networks/reference/trace-types.md @@ -1,174 +1,160 @@ --- -description: Transaction trace types +title: Transaction trace types +sidebar_position: 6 +description: Transaction trace types reference tags: + - public networks - private networks --- # Transaction trace types -When [tracing transactions](../how-to/troubleshoot/trace-transactions.md), the trace type options are -[`trace`](#trace), [`vmTrace`](#vmtrace), and [`stateDiff`](#statediff). +When [tracing transactions](../how-to/troubleshoot/trace-transactions.md), the trace type options are [`trace`](#trace), [`vmTrace`](#vmtrace), and [`stateDiff`](#statediff). ## `trace` An ordered list of calls to other contracts, excluding precompiled contracts. -!!!example "`trace` example" - - ```json - "trace":[ - { - "action":{ - "callType":"call", - "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", - "gas":"0xffadea", - "input":"0x", - "to":"0x0100000000000000000000000000000000000000", - "value":"0x0" - }, - "result":{ - "gasUsed":"0x1e", - "output":"0x" - }, - "subtraces":0, - "traceAddress":[ - ], - "type":"call" - } - ] - ``` - -| Key | Value | -|----------------| -------------------------------------------------------------------------------| -| `action` | Transaction details. -| `callType` | Whether the transaction is `call` or `create`. -| `from` | Address of the transaction sender. -| `gas` | Gas provided by sender. -| `input` | Transaction data. -| `to` | Target of the transaction. -| `value` | Value transferred in the transaction. -| `result` | Transaction result. -| `gasUsed` | Gas used by the transaction. Includes any refunds of unused gas. -| `output` | Return value of the contract call. Contains only the actual value sent by a `RETURN` operation. If a `RETURN` was not executed, the output is empty bytes. -| `subTraces` | Traces of contract calls made by the transaction. -| `traceAddress` | Tree list address of where the call occurred, address of the parents, and order of the current sub call. -| `type` | Whether the transaction is a `CALL` or `CREATE` series operation. +```json title="trace example" +"trace":[ + { + "action":{ + "callType":"call", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0xffadea", + "input":"0x", + "to":"0x0100000000000000000000000000000000000000", + "value":"0x0" + }, + "result":{ + "gasUsed":"0x1e", + "output":"0x" + }, + "subtraces":0, + "traceAddress":[ + ], + "type":"call" + } +] +``` + +| Key | Value | +| --- | --- | +| `action` | Transaction details. | +| `callType` | Whether the transaction is `call` or `create`. | +| `from` | Address of the transaction sender. | +| `gas` | Gas provided by sender. | +| `input` | Transaction data. | +| `to` | Target of the transaction. | +| `value` | Value transferred in the transaction. | +| `result` | Transaction result. | +| `gasUsed` | Gas used by the transaction. Includes any refunds of unused gas. | +| `output` | Return value of the contract call. Contains only the actual value sent by a `RETURN` operation. If a `RETURN` was not executed, the output is empty bytes. | +| `subTraces` | Traces of contract calls made by the transaction. | +| `traceAddress` | Tree list address of where the call occurred, address of the parents, and order of the current sub call. | +| `type` | Whether the transaction is a `CALL` or `CREATE` series operation. | ## `vmTrace` An ordered list of EVM actions when processing the transaction. -`vmTrace` only reports actual data returned from a `RETURN` opcode and does not return the -contents of the reserved output space for the call operations. As a result: - -* `vmTrace` reports `null` when a call operation ends because of a `STOP`, `HALT`, `REVERT`, - running out of instructions, or any exceptional halts. -* When a `RETURN` operation returns data of a different length to the space reserved by the call, - `vmTrace` reports only the data passed to the `RETURN` operation and does not include - pre-existing memory data or trim the returned data. - -For out of gas operations, `vmTrace` reports the operation that caused the out of gas exception, -including the calculated gas cost. `vmTrace` does not report `ex` values because the operation is -not executed. - -!!!example "`vmTrace` example" - - ```json - "vmTrace":{ - "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", - "ops":[ - { - "cost":3, - "ex":{ - "mem":null, - "push":[ - "0x8" - ], - "store":null, - "used":16756175 - }, - "pc":72, - "sub":null - }, - ... - ] - } - ``` - -| Key | Value | -|-----------| ------------------------------------------------------------------------------------| -| `code` | Code executed by the EVM. -| `ops` | Sequence of EVM operations (opcodes) executed in the transaction. -| `cost` | Gas cost of the opcode. Includes memory expansion costs but not gas refunds. For precompiled contract calls, reports only the actual cost. -| `ex` | Executed operations. -| `mem` | Memory read or written by the operation. -| `push` | Adjusted stack items. For swap, includes all intermediate values and the result. Otherwise, is the value pushed onto the stack. -| `store` | Account storage written by the operation. -| `used` | Remaining gas taking into account the all but 1/64th rule for calls. -| `pc` | Program counter. -| `sub` | Sub call operations. +`vmTrace` only reports actual data returned from a `RETURN` opcode and does not return the contents of the reserved output space for the call operations. As a result: + +- `vmTrace` reports `null` when a call operation ends because of a `STOP`, `HALT`, `REVERT`, running out of instructions, or any exceptional halts. +- When a `RETURN` operation returns data of a different length to the space reserved by the call, `vmTrace` reports only the data passed to the `RETURN` operation and does not include pre-existing memory data or trim the returned data. + +For out of gas operations, `vmTrace` reports the operation that caused the out of gas exception, including the calculated gas cost. `vmTrace` does not report `ex` values because the operation is not executed. + +```json title="vmTrace example" +"vmTrace":{ + "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", + "ops":[ + { + "cost":3, + "ex":{ + "mem":null, + "push":[ + "0x8" + ], + "store":null, + "used":16756175 + }, + "pc":72, + "sub":null + }, + ... + ] +} +``` + +| Key | Value | +| --- | --- | +| `code` | Code executed by the EVM. | +| `ops` | Sequence of EVM operations (opcodes) executed in the transaction. | +| `cost` | Gas cost of the opcode. Includes memory expansion costs but not gas refunds. For precompiled contract calls, reports only the actual cost. | +| `ex` | Executed operations. | +| `mem` | Memory read or written by the operation. | +| `push` | Adjusted stack items. For swap, includes all intermediate values and the result. Otherwise, is the value pushed onto the stack. | +| `store` | Account storage written by the operation. | +| `used` | Remaining gas taking into account the all but 1/64th rule for calls. | +| `pc` | Program counter. | +| `sub` | Sub call operations. | ## `stateDiff` -State changes in the requested block for each transaction represented as a map of accounts to an -object. Besu lists the balance, code, nonce, and storage changes from immediately before the -transaction to after the transaction. For the `key:value` pairs: +State changes in the requested block for each transaction represented as a map of accounts to an object. Besu lists the balance, code, nonce, and storage changes from immediately before the transaction to after the transaction. For the `key:value` pairs: -* `+` indicates the field didn’t exist before and now has the specified value -* `-` indicates a deleted value -* `*` has a `from` and a `to` value. +- `+` indicates the field didn’t exist before and now has the specified value +- `-` indicates a deleted value +- `*` has a `from` and a `to` value. An absent value is distinct from zero when creating accounts or clearing storage. -!!!example "`stateDiff` example" - - ```json - "stateDiff":{ - "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ - "balance":{ - "*":{ - "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", - "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" - } - }, - "code":"=", - "nonce":{ - "*":{ - "from":"0x14", - "to":"0x15" - } - }, - "storage":{ - } +```json title="stateDiff example" +"stateDiff":{ + "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ + "balance":{ + "*":{ + "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", + "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" + } + }, + "code":"=", + "nonce":{ + "*":{ + "from":"0x14", + "to":"0x15" } + }, + "storage":{ } - ``` - -| Key | Value | -|----------- | -------------------------------------------------------------------------------| -| `balance` | Change of balance event. -| `balance.from` | Balance before the transaction. -| `balance.to` | Balance after the transaction. -| `code` | Changes to code. None in this example. -| `nonce` | Change of nonce. -| `nonce.from` | Nonce before the transaction. -| `nonce.to` | Nonce after the transaction. -| `storage` | Changes to storage. None in this example. + } +} +``` + +| Key | Value | +| -------------- | ----------------------------------------- | +| `balance` | Change of balance event. | +| `balance.from` | Balance before the transaction. | +| `balance.to` | Balance after the transaction. | +| `code` | Changes to code. None in this example. | +| `nonce` | Change of nonce. | +| `nonce.from` | Nonce before the transaction. | +| `nonce.to` | Nonce after the transaction. | +| `storage` | Changes to storage. None in this example. | ## Applicable API methods -The trace options `trace`, `vmTrace`, and `stateDiff` are available for the following -[ad-hoc tracing API methods](../how-to/troubleshoot/trace-transactions.md#ad-hoc-tracing-apis): +The trace options `trace`, `vmTrace`, and `stateDiff` are available for the following [ad-hoc tracing API methods](../how-to/troubleshoot/trace-transactions.md#ad-hoc-tracing-apis): -* [`trace_call`](api/index.md#trace_call) -* [`trace_callMany`](api/index.md#trace_callmany) -* [`trace_rawTransaction`](api/index.md#trace_rawtransaction) -* [`trace_replayBlockTransactions`](api/index.md#trace_replayblocktransactions) +- [`trace_call`](api/index.md#trace_call) +- [`trace_callMany`](api/index.md#trace_callmany) +- [`trace_rawTransaction`](api/index.md#trace_rawtransaction) +- [`trace_replayBlockTransactions`](api/index.md#trace_replayblocktransactions) -Only the `trace` option is available for the following -[transaction-trace filtering API methods](../how-to/troubleshoot/trace-transactions.md#transaction-trace-filtering-apis): +Only the `trace` option is available for the following [transaction-trace filtering API methods](../how-to/troubleshoot/trace-transactions.md#transaction-trace-filtering-apis): -* [`trace_block`](api/index.md#trace_block) -* [`trace_filter`](api/index.md#trace_filter) -* [`trace_get`](api/index.md#trace_get) -* [`trace_transaction`](api/index.md#trace_transaction) +- [`trace_block`](api/index.md#trace_block) +- [`trace_filter`](api/index.md#trace_filter) +- [`trace_get`](api/index.md#trace_get) +- [`trace_transaction`](api/index.md#trace_transaction) diff --git a/docs/public-networks/tutorials/_category_.json b/docs/public-networks/tutorials/_category_.json new file mode 100644 index 00000000000..f72790313cd --- /dev/null +++ b/docs/public-networks/tutorials/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Tutorials", + "position": 5, + "link": { + "type": "generated-index", + "slug": "public-networks/tutorials" + } +} diff --git a/docs/public-networks/tutorials/besu-teku-mainnet.md b/docs/public-networks/tutorials/besu-teku-mainnet.md index d6c7f4e2db4..56fa7eaaa14 100644 --- a/docs/public-networks/tutorials/besu-teku-mainnet.md +++ b/docs/public-networks/tutorials/besu-teku-mainnet.md @@ -1,20 +1,20 @@ --- -Description: How to run Besu and Teku on Mainnet +title: Run Besu and Teku on Mainnet +sidebar_position: 1 +description: Run Besu and Teku on Ethereum Mainnet. +tags: + - public networks --- # Run Besu and Teku on Mainnet -Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and -[Teku](https://docs.teku.consensys.net/) -as a [consensus client](../concepts/the-merge.md#consensus-clients) on Ethereum Mainnet. +Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and [Teku](https://docs.teku.consensys.net/) as a [consensus client](../concepts/the-merge.md#consensus-clients) on Ethereum Mainnet. ## 1. Install Besu and Teku -Install [Besu](../get-started/install/binary-distribution.md) and -[Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). +Install [Besu](../get-started/install/binary-distribution.md) and [Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). -Ensure you meet the prerequisites for the installation option you use. -For example, you must have Java 17+ if using the Besu and Teku binary distributions. +Ensure you meet the prerequisites for the installation option you use. For example, you must have Java 17+ if using the Besu and Teku binary distributions. Ensure you meet the [system requirements for Besu on public networks](../get-started/system-requirements.md). @@ -26,24 +26,23 @@ Run the following command: openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex ``` -You will specify `jwtsecret.hex` when starting Besu and Teku. -This is a shared JWT secret the clients use to authenticate each other when using the -[Engine API](../how-to/use-engine-api.md). +You will specify `jwtsecret.hex` when starting Besu and Teku. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../how-to/use-engine-api.md). ## 3. Generate validator keys If you're running Teku as a beacon node only, skip to the [next step](#4-start-besu). -If you're also running Teku as a validator client, have a funded Ethereum address ready (32 ETH and -gas fees for each validator). +If you're also running Teku as a validator client, have a funded Ethereum address ready (32 ETH and gas fees for each validator). -Generate validator keys and stake your ETH for one or more validators using the -[Staking Launchpad](https://launchpad.ethereum.org/en/). +Generate validator keys and stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). -!!! important +:::info - Save the password you use to generate each key pair in a `.txt` file. - You should also have a `.json` file for each validator key pair. +Save the password you use to generate each key pair in a `.txt` file. + +You should also have a `.json` file for each validator key pair. + +::: ## 4. Start Besu @@ -65,28 +64,20 @@ besu \ Specify: -- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using - the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. -- The IP address of your Besu node using the [`--host-allowlist`](../reference/cli/options.md#host-allowlist) - and [`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) options. +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. +- The IP address of your Besu node using the [`--host-allowlist`](../reference/cli/options.md#host-allowlist) and [`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) options. Also, in the command: - [`--sync-mode`](../reference/cli/options.md#sync-mode) specifies using [snap sync](../get-started/connect/sync-node.md#snap-synchronization). - [`--data-storage-format`](../reference/cli/options.md#data-storage-format) specifies using [Bonsai Tries](../concepts/data-storage-formats.md#bonsai-tries). -- [`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC - service. -- [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow remote - RPC connections. -- [`--rpc-ws-enabled`](../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC - service. -- [`--rpc-ws-host`](../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote RPC - connections. -- [`--engine-rpc-enabled`](../reference/cli/options.md#engine-rpc-enabled) enables the - [Engine API](../reference/engine-api/index.md). - -You can modify the option values and add other [command line options](../reference/cli/options.md) -as needed. +- [`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC service. +- [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--rpc-ws-enabled`](../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC service. +- [`--rpc-ws-host`](../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--engine-rpc-enabled`](../reference/cli/options.md#engine-rpc-enabled) enables the [Engine API](../reference/engine-api/index.md). + +You can modify the option values and add other [command line options](../reference/cli/options.md) as needed. ## 5. Start Teku @@ -94,8 +85,7 @@ Open a new terminal window. ### Beacon node only -To run Teku as a beacon node only (without validator duties), run the following command or specify the -options in the [Teku configuration file]: +To run Teku as a beacon node only (without validator duties), run the following command or specify the options in the [Teku configuration file]: ```bash teku \ @@ -105,25 +95,19 @@ teku \ --rest-api-enabled=true ``` -Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using -the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) -option. +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. Also, in the command: -- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) - is set to the default URL of Besu's Engine API. -- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) - enables Teku's metrics exporter. -- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) - enables Teku's REST API service. +- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) is set to the default URL of Besu's Engine API. +- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) enables Teku's metrics exporter. +- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) enables Teku's REST API service. You can modify the option values and add other [Teku command line options] as needed. ### Beacon node and validator client -To run Teku as a beacon node and validator in a single process, run the following command or specify -the options in the [Teku configuration file]: +To run Teku as a beacon node and validator in a single process, run the following command or specify the options in the [Teku configuration file]: ```bash teku \ @@ -137,24 +121,15 @@ teku \ Specify: -- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the - [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. -- An Ethereum address you own as the default fee recipient using the - [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) - option. -- The paths to the keystore `.json` file and password `.txt` file created in - [step 3](#3-generate-validator-keys) for each validator using the - [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. - Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. +- An Ethereum address you own as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 3](#3-generate-validator-keys) for each validator using the [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. Also, in the command: -- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) - is set to the default URL of Besu's Engine API. -- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) - enables Teku's metrics exporter. -- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) - enables Teku's REST API service. +- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) is set to the default URL of Besu's Engine API. +- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) enables Teku's metrics exporter. +- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) enables Teku's REST API service. You can modify the option values and add other [Teku command line options] as needed. @@ -162,47 +137,44 @@ You can modify the option values and add other [Teku command line options] as ne After starting Besu and Teku, your node starts syncing and connecting to peers. -!!! example - - === "Besu logs" - - ```bash - {"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} - {"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} - {"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} - {"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} - {"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 - cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} - {"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} - {"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} - {"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} - {"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} - {"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} - {"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} - ``` - - === "Teku logs" - - ```bash - 2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 - 2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 - 2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 - 2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 - 2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 - ``` - -If you're running Teku as a beacon node only, you're all set. -If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before -submitting your staking deposit in the next step. -Syncing Besu can take several days. + + +# Besu logs + +```json +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running Teku as a beacon node only, you're all set. If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. ## 7. Stake ETH Stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). -You can check your validator status by searching your Ethereum address on the -[Beacon Chain explorer](https://beaconcha.in/). -It may take up to multiple days for your validator to be activated and start proposing blocks. +You can check your validator status by searching your Ethereum address on the [Beacon Chain explorer](https://beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. diff --git a/docs/public-networks/tutorials/besu-teku-testnet.md b/docs/public-networks/tutorials/besu-teku-testnet.md index 0957a5783ac..c270a234b58 100644 --- a/docs/public-networks/tutorials/besu-teku-testnet.md +++ b/docs/public-networks/tutorials/besu-teku-testnet.md @@ -1,28 +1,26 @@ --- -Description: How to run Besu and Teku on a testnet +title: Run Besu and Teku on a testnet +sidebar_position: 2 +description: Run Besu and Teku on Goerli or Sepolia testnet. +tags: + - public networks --- # Run Besu and Teku on a testnet -Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and -[Teku](https://docs.teku.consensys.net/) -as a [consensus client](../concepts/the-merge.md#consensus-clients) on the -[Goerli](https://github.com/eth-clients/goerli) and [Sepolia](https://github.com/eth-clients/sepolia) -Ethereum testnets. +Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and [Teku](https://docs.teku.consensys.net/) as a [consensus client](../concepts/the-merge.md#consensus-clients) on the [Goerli](https://github.com/eth-clients/goerli) and [Sepolia](https://github.com/eth-clients/sepolia) Ethereum testnets. -!!! note +:::note - Sepolia is a permissioned network and you can't run a validator client on it without - [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. - You can connect your consensus client using the beacon node only, without any validator duties. +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. You can connect your consensus client using the beacon node only, without any validator duties. + +::: ## 1. Install Besu and Teku -Install [Besu](../get-started/install/binary-distribution.md) and -[Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). +Install [Besu](../get-started/install/binary-distribution.md) and [Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). -Ensure you meet the prerequisites for the installation option you use. -For example, you must have Java 17+ if using the Besu and Teku binary distributions. +Ensure you meet the prerequisites for the installation option you use. For example, you must have Java 17+ if using the Besu and Teku binary distributions. Ensure you meet the [system requirements for Besu on public networks](../get-started/system-requirements.md). @@ -34,75 +32,71 @@ Run the following command: openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex ``` -You will specify `jwtsecret.hex` when starting Besu and Teku. -This is a shared JWT secret the clients use to authenticate each other when using the -[Engine API](../how-to/use-engine-api.md). +You will specify `jwtsecret.hex` when starting Besu and Teku. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../how-to/use-engine-api.md). ## 3. Generate validator keys If you're running Teku as a beacon node only, skip to the [next step](#4-start-besu). -If you're also running Teku as a validator client, create a test Ethereum address (you can do this in -[MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). -Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. -See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and -[Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). +If you're also running Teku as a validator client, create a test Ethereum address (you can do this in [MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and [Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). + +:::note -!!! note +If you can't get ETH using the faucet, you can ask for help on the [EthStaker Discord](https://discord.io/ethstaker). - If you can't get ETH using the faucet, you can ask for help on the - [EthStaker Discord](https://discord.io/ethstaker). +::: -Generate validator keys for one or more validators using the -[Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or -[request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). +Generate validator keys for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or [request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). -!!! important +:::info - Save the password you use to generate each key pair in a `.txt` file. - You should also have a `.json` file for each validator key pair. +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: ## 4. Start Besu Run the following command or specify the options in a [configuration file](../how-to/configuration-file.md): -=== "Goerli" - - ```bash - besu \ - --network=goerli \ - --rpc-http-enabled=true \ - --rpc-http-host=0.0.0.0 \ - --rpc-http-cors-origins="*" \ - --rpc-ws-enabled=true \ - --rpc-ws-host=0.0.0.0 \ - --host-allowlist="*" \ - --engine-host-allowlist="*" \ - --engine-rpc-enabled \ - --engine-jwt-secret= - ``` - -=== "Sepolia" - - ```bash - besu \ - --network=sepolia \ - --rpc-http-enabled=true \ - --rpc-http-host=0.0.0.0 \ - --rpc-http-cors-origins="*" \ - --rpc-ws-enabled=true \ - --rpc-ws-host=0.0.0.0 \ - --host-allowlist="*" \ - --engine-host-allowlist="*" \ - --engine-rpc-enabled \ - --engine-jwt-secret= - ``` - -Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the -[`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. - -You can modify the option values and add other [command line options](../reference/cli/options.md) -as needed. + + +# Goerli + +```bash +besu \ + --network=goerli \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +# Sepolia + +```bash +besu \ + --network=sepolia \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. + +You can modify the option values and add other [command line options](../reference/cli/options.md) as needed. ## 5. Start Teku @@ -110,72 +104,68 @@ Open a new terminal window. ### Beacon node only -To run Teku as a beacon node only (without validator duties), run the following command or specify the -options in the [Teku configuration file]: +To run Teku as a beacon node only (without validator duties), run the following command or specify the options in the [Teku configuration file]: -=== "Goerli" + - ```bash - teku \ - --network=goerli \ - --ee-endpoint=http://localhost:8551 \ - --ee-jwt-secret-file= \ - --metrics-enabled=true \ - --rest-api-enabled=true - ``` +# Goerli -=== "Sepolia" +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` - ```bash - teku \ - --network=sepolia \ - --ee-endpoint=http://localhost:8551 \ - --ee-jwt-secret-file= \ - --metrics-enabled=true \ - --rest-api-enabled=true - ``` +# Sepolia -Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using -the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) -option. +```bash +teku \ + --network=sepolia \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. You can modify the option values and add other [Teku command line options] as needed. ### Beacon node and validator client -To run Teku as a beacon node and validator in a single process, run the following command or specify -the options in the [Teku configuration file]: +To run Teku as a beacon node and validator in a single process, run the following command or specify the options in the [Teku configuration file]: -=== "Goerli" + + +# Goerli + +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --validators-proposer-default-fee-recipient= \ + --validator-keys=:[,:,...] +``` - ```bash - teku \ - --network=goerli \ - --ee-endpoint=http://localhost:8551 \ - --ee-jwt-secret-file= \ - --metrics-enabled=true \ - --rest-api-enabled=true \ - --validators-proposer-default-fee-recipient= \ - --validator-keys=:[,:,...] - ``` +# Sepolia -=== "Sepolia" +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. - Sepolia is a permissioned network and you can't run a validator client on it without - [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. + Specify: -- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the - [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. -- The test Ethereum address created in [step 3](#3-generate-validator-keys) as the default fee - recipient using the - [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) - option. -- The paths to the keystore `.json` file and password `.txt` file created in - [step 3](#3-generate-validator-keys) for each validator using the - [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. - Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. +- The test Ethereum address created in [step 3](#3-generate-validator-keys) as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 3](#3-generate-validator-keys) for each validator using the [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. You can modify the option values and add other [Teku command line options] as needed. @@ -183,48 +173,44 @@ You can modify the option values and add other [Teku command line options] as ne After starting Besu and Teku, your node starts syncing and connecting to peers. -!!! example - - === "Besu logs" - - ```bash - {"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} - {"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} - {"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} - {"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} - {"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 - cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} - {"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} - {"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} - {"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} - {"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} - {"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} - {"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} - ``` - - === "Teku logs" - - ```bash - 2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 - 2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 - 2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 - 2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 - 2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 - ``` - -If you're running Teku as a beacon node only, you're all set. -If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before -submitting your staking deposit in the next step. -Syncing Besu can take several days. + + +# Besu logs + +```json +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running Teku as a beacon node only, you're all set. If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. ## 7. Stake ETH -Stake your testnet ETH for one or more validators using the -[Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). +Stake your testnet ETH for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). -You can check your validator status by searching your Ethereum address on the -[Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). -It may take up to multiple days for your validator to be activated and start proposing blocks. +You can check your validator status by searching your Ethereum address on the [Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. diff --git a/docs/tags-index.md b/docs/tags-index.md deleted file mode 100644 index 48df3efc3fa..00000000000 --- a/docs/tags-index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -description: List of tagged pages in this documentation -# hide feedback on this page as it's just a generated index page -hide: -- feedback ---- - -# Tags - -List of tagged pages in this documentation: - - -[TAGS] diff --git a/docusaurus.config.js b/docusaurus.config.js new file mode 100644 index 00000000000..b2b91a09e29 --- /dev/null +++ b/docusaurus.config.js @@ -0,0 +1,312 @@ +const lightCodeTheme = require("prism-react-renderer/themes/dracula"); +const darkCodeTheme = require("prism-react-renderer/themes/dracula"); + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: "Besu documentation", + url: "https://besu.hyperledger.org", + baseUrl: "/", + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "throw", + favicon: "img/favicon.svg", + trailingSlash: false, + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: "hyperledger", // Usually your GitHub org/user name. + projectName: "besu-docs", // Usually your repo name. + deploymentBranch: "gh-pages", // Github Pages deploying branch + + // Even if you don't use internalization, you can use this field to set useful + // metadata like html lang. For example, if your site is Chinese, you may want + // to replace "en" with "zh-Hans". + i18n: { + defaultLocale: "en", + locales: ["en"], + }, + + presets: [ + [ + "classic", + { + docs: { + breadcrumbs: false, + sidebarPath: require.resolve("./sidebars.js"), + // Set a base path separate from default /docs + editUrl: "https://github.com/hyperledger/besu-docs/tree/main/", + // path: "docs", + lastVersion: "stable", + versions: { + //defaults to the ./docs folder + // using 'development' instead of 'next' as path + current: { + label: "development", + path: "development", + banner: "unreleased", + }, + //the last stable release in the versioned_docs/version-stable + // using 'stable' as path + // prettier-ignore + "stable": { + label: "stable", + path: "stable", + banner: "none", + }, + "23.4.0": { + label: "23.4.0", + path: "23.4.0", + banner: "unmaintained", + }, + }, + routeBasePath: "/", + // @ts-ignore + // eslint-disable-next-line global-require + remarkPlugins: [require("remark-docusaurus-tabs")], + include: ["**/*.md", "**/*.mdx"], + exclude: [ + "**/_*.{js,jsx,ts,tsx,md,mdx}", + "**/_*/**", + "**/*.test.{js,jsx,ts,tsx}", + "**/__tests__/**", + ], + showLastUpdateAuthor: false, + showLastUpdateTime: true, + includeCurrentVersion: true, + }, + theme: { + customCss: require.resolve("./src/css/custom.css"), + }, + }, + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + // announcementBar: { + // id: "announcement_bar", + // content: "⛔ī¸ This documentation site is still under construction! 🚧", + // backgroundColor: "#fafbfc", + // textColor: "#091E42", + // isCloseable: false, + // }, + colorMode: { + defaultMode: "light", + disableSwitch: false, + respectPrefersColorScheme: true, + }, + tableOfContents: { + minHeadingLevel: 2, + maxHeadingLevel: 5, + }, + docs: { + sidebar: { + hideable: true, + autoCollapseCategories: true, + }, + }, + navbar: { + logo: { + alt: "Besu", + src: "img/logo-reversed.svg", + srcDark: "img/logo-reversed.svg", + width: 100, + }, + items: [ + { + type: "docSidebar", + sidebarId: "publicDocSidebar", + docId: "index", + position: "left", + label: "Public networks", + }, + { + type: "docSidebar", + sidebarId: "privateDocSidebar", + docId: "index", + position: "left", + label: "Private networks", + }, + { + type: "docsVersionDropdown", + position: "right", + dropdownActiveClassDisabled: true, + }, + { + href: "https://github.com/hyperledger/besu/", + className: "header-github-link", + position: "right", + }, + { + href: "https://discord.gg/hyperledger", + className: "header-discord-link", + position: "right", + }, + { + href: "https://twitter.com/HyperledgerBesu", + className: "header-twitter-link", + position: "right", + }, + ], + }, + footer: { + copyright: + "Hyperledger Besu and its documentation are licensed under the Apache 2.0 license.", + logo: { + alt: "Hyperledger Besu logo", + src: "img/logo.svg", + srcDark: "img/logo-reversed.svg", + href: "https://www.hyperledger.org/use/besu", + width: 250, + }, + links: [ + { + title: "Public networks", + items: [ + { + label: "Introduction", + to: "/stable/public-networks", + }, + { + label: "How to guides", + to: "/stable/public-networks/how-to", + }, + { + label: "Concepts", + to: "/stable/public-networks/concepts", + }, + { + label: "Tutorials", + to: "/stable/public-networks/tutorials", + }, + { + label: "Reference", + to: "/stable/public-networks/reference", + }, + ], + }, + { + title: "Private networks", + items: [ + { + label: "Introduction", + to: "/stable/private-networks", + }, + { + label: "How to guides", + to: "/stable/private-networks/how-to", + }, + { + label: "Concepts", + to: "/stable/private-networks/concepts", + }, + { + label: "Tutorials", + to: "/stable/private-networks/tutorials", + }, + { + label: "Reference", + to: "/stable/private-networks/reference", + }, + ], + }, + { + title: "Community", + items: [ + { + label: "Hyperledger Discord", + href: "https://discord.gg/hyperledger", + }, + { + label: "Hyperledger Besu Wiki", + href: "https://wiki.hyperledger.org/display/BESU/Hyperledger+Besu", + }, + { + label: "Hyperledger Besu Twitter", + href: "https://twitter.com/HyperledgerBesu", + }, + { + label: "Hyperledger Besu GitHub", + href: "https://github.com/hyperledger/besu/", + }, + { + label: "Hyperledger Besu documentation GitHub", + href: "https://github.com/hyperledger/besu-docs", + }, + ], + }, + ], + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + additionalLanguages: ["solidity", "toml"], + }, + languageTabs: [ + { + highlight: "bash", + language: "curl", + logoClass: "bash", + }, + { + highlight: "python", + language: "python", + logoClass: "python", + }, + { + highlight: "go", + language: "go", + logoClass: "go", + }, + { + highlight: "javascript", + language: "nodejs", + logoClass: "nodejs", + }, + ], + }), + plugins: [ + [ + "@docusaurus/plugin-google-gtag", + { + trackingID: "G-KD07N5GM2B", + anonymizeIP: true, + }, + ], + [ + "@docusaurus/plugin-google-tag-manager", + { + containerId: "GTM-THG37T4", + }, + ], + [ + "@docusaurus/plugin-client-redirects", + { + redirects: [], + createRedirects(existingPath) { + if (existingPath.includes("/development")) { + return [ + existingPath.replace("/development", "/en/development"), + existingPath.replace("/development", "/en/latest"), + existingPath.replace("/development", "/latest"), + ]; + } + return undefined; // Return a falsy value: no redirect created + }, + }, + ], + ], + themes: [ + [ + require.resolve("@easyops-cn/docusaurus-search-local"), + /** @type {import("@easyops-cn/docusaurus-search-local").PluginOptions} */ + ({ + hashed: true, + docsRouteBasePath: "/", + indexBlog: false, + }), + ], + ], +}; + +module.exports = config; diff --git a/mkdocs-insider.yml b/mkdocs-insider.yml deleted file mode 100644 index 0a9164b3512..00000000000 --- a/mkdocs-insider.yml +++ /dev/null @@ -1,42 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -INHERIT: mkdocs.yml # DO NOT MODIFY THIS LINE - -plugins: - # Meta plugin to add meta content to pages in batch based on a .meta.yml file in the folder - # see - meta: - meta_file: '**/.meta.yml' - # tags plugin is not insider but has to be defined after meta plugin so has to be added here too - # to be loaded in the right order. - tags: - tags_file: tags-index.md -extra: - # indicates to the templating system that the current build uses insider - # used to display insider only features in templates and prevent build fail on the normal version. - is_insider: true - # tags ID, used for insider tag icons, see https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons - tags: - private networks: priv - public networks: pub -# The following has to be in this file and mkdocs.yml file because -# readthedocs.org is overriding it wrong if not in the initial config file but in a child file. -# The side effect is that it also allows us to have different scripts and CSS for insider theme -extra_css: - - assets/stylesheets/custom_theme.css -extra_javascript: - - assets/javascripts/custom_theme.js - -theme: - # only used with insider, see https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons - icon: - tag: - priv: material/book-lock-outline - pub: material/book-open-variant diff --git a/mkdocs.exclude.yml b/mkdocs.exclude.yml deleted file mode 100644 index 6f0f31b614f..00000000000 --- a/mkdocs.exclude.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. - -plugins: - exclude: - glob: - - global/* diff --git a/mkdocs.extensions.yml b/mkdocs.extensions.yml deleted file mode 100644 index 53d7400d0b4..00000000000 --- a/mkdocs.extensions.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -INHERIT: mkdocs.exclude.yml # DO NOT MODIFY THIS LINE - -# Extensions list requires the dashed list format -markdown_extensions: - - toc: - permalink: īƒ - toc_depth: 3 - - codehilite - - pymdownx.superfences - - pymdownx.tabbed: - alternate_style: true - - pymdownx.snippets: - base_path: docs - check_paths: true - - admonition - - footnotes - - def_list - - abbr - - pymdownx.arithmatex - - pymdownx.betterem: - smart_enable: all - - pymdownx.keys - - pymdownx.details - - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg - - pymdownx.magiclink - - pymdownx.mark - - pymdownx.smartsymbols - - pymdownx.tasklist: - custom_checkbox: true - - pymdownx.tilde - - meta - - smarty - - attr_list - - md_in_html diff --git a/mkdocs.extra.yml b/mkdocs.extra.yml deleted file mode 100644 index 34107a46759..00000000000 --- a/mkdocs.extra.yml +++ /dev/null @@ -1,73 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -INHERIT: mkdocs.extensions.yml # DO NOT MODIFY THIS LINE - -#extra project info and template customisation -extra: - # Doc Repository - code_repo_name: hyperledger/besu - code_repo_url: https://github.com/hyperledger/besu/ - latest_version_warning: - url_contains: /latest/ - text: 'You are reading Hyperledger Besu development version documentation and - some displayed features may not be available in the stable release. - You can switch to stable version using the version box at screen bottom.' - page_edit_button: yes - logo_is_text: true - support: - chat: https://discord.gg/hyperledger - email: besu@lists.hyperledger.org - website: https://www.hyperledger.org/projects/besu - issues: https://github.com/hyperledger/besu/issues - doc_issues: https://github.com/hyperledger/besu-docs/issues/new/choose - analytics: - provider: google - property: 'G-23GVTD3LEQ' - verification: 'sGzYdFR_AYDRtsC-SNxMRwjellnfTgs5ZA0q7GIM5j0' - feedback: - title: Was this page helpful? - ratings: - - icon: material/emoticon-happy-outline - name: This page was helpful - data: 1 - note: >- - Thanks for your feedback! - - icon: material/emoticon-sad-outline - name: This page could be improved - data: 0 - note: >- - Thanks for your feedback! Help us improve this page by - adding a comment in Besu discussion. - Besu discussion requires to login on Github. - logo_regular: logo.svg - logo_reversed: logo-reversed.svg - consent: - title: Cookie consent - description: >- - We use cookies to recognize your repeated visits and preferences, as well - as to measure the effectiveness of our documentation and whether users - find what they're searching for. -
- With your consent, you're helping us to make our documentation better. -
- After this initial choice, you can manage your preferences by clicking on "Change cookie settings" in the page footer. - actions: - - accept - - reject - - manage - social: - - icon: fontawesome/brands/github - link: https://github.com/hyperledger/besu/ - - icon: fontawesome/brands/discord - link: https://discord.gg/hyperledger - - icon: fontawesome/brands/docker - link: https://hub.docker.com/r/hyperledger/besu/tags - - icon: fontawesome/brands/twitter - link: https://twitter.com/HyperledgerBesu diff --git a/mkdocs.navigation.yml b/mkdocs.navigation.yml deleted file mode 100644 index 0d82d98fab6..00000000000 --- a/mkdocs.navigation.yml +++ /dev/null @@ -1,218 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -INHERIT: mkdocs.extra.yml # DO NOT MODIFY THIS LINE - -nav: - - Public networks: - - public-networks/index.md - - Get started: - - System requirements: public-networks/get-started/system-requirements.md - - Install Besu: - - public-networks/get-started/install/index.md - - Run Besu from Docker image: public-networks/get-started/install/run-docker-image.md - - Install binary distribution: public-networks/get-started/install/binary-distribution.md - - Start Besu: public-networks/get-started/start-node.md - - Connect to a network: - - public-networks/get-started/connect/index.md - - Sync Besu: public-networks/get-started/connect/sync-node.md - - Connect to Mainnet: public-networks/get-started/connect/mainnet.md - - Connect to a testnet: public-networks/get-started/connect/testnet.md - - Migrate to Besu: public-networks/get-started/migrate-to-besu.md - - How to: - - Use the Besu API: - - public-networks/how-to/use-besu-api/index.md - - Use JSON-RPC over HTTP, WS, and IPC: public-networks/how-to/use-besu-api/json-rpc.md - - Use RPC Pub/Sub over WS: public-networks/how-to/use-besu-api/rpc-pubsub.md - - Use GraphQL over HTTP: public-networks/how-to/use-besu-api/graphql.md - - Authenticate JSON-RPC requests: public-networks/how-to/use-besu-api/authenticate.md - - Access logs using JSON-RPC: public-networks/how-to/use-besu-api/access-logs.md - - Use the Engine API: public-networks/how-to/use-engine-api.md - - Use a configuration file: public-networks/how-to/configuration-file.md - - Create and send transactions: public-networks/how-to/send-transactions.md - - Find and connect to peers: - - Configure static nodes: public-networks/how-to/connect/static-nodes.md - - Configure ports: public-networks/how-to/connect/configure-ports.md - - Manage peers: public-networks/how-to/connect/manage-peers.md - - Specify NAT method: public-networks/how-to/connect/specify-nat.md - - Monitor nodes: - - public-networks/how-to/monitor/index.md - - Use metrics: public-networks/how-to/monitor/metrics.md - - Understand metrics: public-networks/how-to/monitor/understand-metrics.md - - Configure logging: public-networks/how-to/monitor/logging.md - - Configure high availability: - - public-networks/how-to/configure-ha/index.md - - Sample load balancer configurations: public-networks/how-to/configure-ha/sample-configuration.md - - Configure the Java Virtual Machine: - - public-networks/how-to/configure-jvm/index.md - - Pass JVM options: public-networks/how-to/configure-jvm/pass-jvm-options.md - - Manage JVM memory: public-networks/how-to/configure-jvm/manage-memory.md - - Use Java Flight Recorder: public-networks/how-to/configure-jvm/java-flight-recorder.md - - Develop dapps: - - Use Truffle: public-networks/how-to/develop/truffle.md - - Use client libraries: public-networks/how-to/develop/client-libraries.md - - Use proof of work: - - Configure mining: public-networks/how-to/use-pow/mining.md - - Upgrade Besu: public-networks/how-to/upgrade-node.md - - Troubleshoot: - - Use EVM tool: public-networks/how-to/troubleshoot/evm-tool.md - - Trace transactions: public-networks/how-to/troubleshoot/trace-transactions.md - - Troubleshoot performance: public-networks/how-to/troubleshoot/performance.md - - Troubleshoot peering: public-networks/how-to/troubleshoot/peering.md - - Concepts: - - The Merge: public-networks/concepts/the-merge.md - - Proof of stake consensus: - - public-networks/concepts/proof-of-stake/index.md - - Attestations: public-networks/concepts/proof-of-stake/attestations.md - - Data storage formats: public-networks/concepts/data-storage-formats.md - - Transactions: - - Transaction types: public-networks/concepts/transactions/types.md - - Transaction pool: public-networks/concepts/transactions/pool.md - - Transaction validation: public-networks/concepts/transactions/validation.md - - Network ID and chain ID: public-networks/concepts/network-and-chain-id.md - - Events and logs: public-networks/concepts/events-and-logs.md - - Genesis file: public-networks/concepts/genesis-file.md - - Node keys: public-networks/concepts/node-keys.md - - Tutorials: - - Run Besu and Teku on Mainnet: public-networks/tutorials/besu-teku-mainnet.md - - Run Besu and Teku on a testnet: public-networks/tutorials/besu-teku-testnet.md - - Reference: - - Besu command line: - - Options: public-networks/reference/cli/options.md - - Subcommands: public-networks/reference/cli/subcommands.md - - Besu API: - - public-networks/reference/api/index.md - - Objects: public-networks/reference/api/objects.md - - Engine API: - - public-networks/reference/engine-api/index.md - - Objects: public-networks/reference/engine-api/objects.md - - Genesis file items: public-networks/reference/genesis-items.md - - EVM tool options: public-networks/reference/evm-tool.md - - Transaction trace types: public-networks/reference/trace-types.md - - Projects using Besu: public-networks/reference/projects-using-besu.md - - Security disclosure policy: public-networks/reference/disclosure.md - - Private networks: - - private-networks/index.md - - Get started: - - System requirements: private-networks/get-started/system-requirements.md - - Install Besu: - - private-networks/get-started/install/index.md - - Run Besu from Docker image: private-networks/get-started/install/run-docker-image.md - - Install binary distribution: private-networks/get-started/install/binary-distribution.md - - Start Besu: private-networks/get-started/start-node.md - - How to: - - private-networks/how-to/index.md - - Configure: - - Consensus: - - private-networks/how-to/configure/consensus/index.md - - QBFT: private-networks/how-to/configure/consensus/qbft.md - - IBFT 2.0: private-networks/how-to/configure/consensus/ibft.md - - Clique: private-networks/how-to/configure/consensus/clique.md - - Add and remove validators without voting: private-networks/how-to/configure/consensus/add-validators-without-voting.md - - Free gas network: private-networks/how-to/configure/free-gas.md - - Bootnodes: private-networks/how-to/configure/bootnodes.md - - Validators: private-networks/how-to/configure/validators.md - - Pre-deploy a contract: private-networks/how-to/configure/contracts.md - - TLS: - - Client and server TLS: private-networks/how-to/configure/tls/client-and-server.md - - Peer-to-peer TLS: private-networks/how-to/configure/tls/p2p.md - - Block proposal permissioning: private-networks/how-to/configure/block-proposal-permissioning.md - - Alternative elliptic curves: private-networks/how-to/configure/curves.md - - Create and send transactions: - - private-networks/how-to/send-transactions/index.md - - Create and send private transactions: private-networks/how-to/send-transactions/private-transactions.md - - Send concurrent private transactions: private-networks/how-to/send-transactions/concurrent-private-transactions.md - - Include revert reason: private-networks/how-to/send-transactions/revert-reason.md - - Monitor nodes: - - private-networks/how-to/monitor/index.md - - Use Grafana Loki: private-networks/how-to/monitor/loki.md - - Use Elastic Stack: private-networks/how-to/monitor/elastic-stack.md - - Use Quorum Hibernate: private-networks/how-to/monitor/quorum-hibernate.md - - Use Splunk: private-networks/how-to/monitor/splunk.md - - Use OpenTelemtry: private-networks/how-to/monitor/opentelemetry.md - - Use Sirato Explorer: private-networks/how-to/monitor/sirato-explorer.md - - Use privacy: - - Use EEA-compliant privacy: private-networks/how-to/use-privacy/eea-compliant.md - - Use Besu-extended privacy: private-networks/how-to/use-privacy/besu-extended.md - - Run Tessera with Besu: private-networks/how-to/use-privacy/tessera.md - - Create and manage privacy groups: private-networks/how-to/use-privacy/privacy-groups.md - - Use flexible privacy groups: private-networks/how-to/use-privacy/flexible.md - - Access private and privacy marker transactions: private-networks/how-to/use-privacy/access-private-transactions.md - - Sign privacy marker transactions: private-networks/how-to/use-privacy/sign-pmts.md - - Use the web3js-quorum library: private-networks/how-to/use-privacy/web3js-quorum.md - - Performance best practices: private-networks/how-to/use-privacy/performance-best-practices.md - - Use permissioning: - - Use local permissioning: private-networks/how-to/use-permissioning/local.md - - Use onchain permissioning: private-networks/how-to/use-permissioning/onchain.md - - Deploy for production: - - Deploy to the cloud: private-networks/how-to/deploy/cloud.md - - Use Ansible: private-networks/how-to/deploy/ansible.md - - Use Kubernetes: private-networks/how-to/deploy/kubernetes.md - - Use Ethstats network monitor: private-networks/how-to/deploy/ethstats.md - - Backup and restore: private-networks/how-to/backup.md - - Upgrade: private-networks/how-to/upgrade.md - - Concepts: - - private-networks/concepts/index.md - - Proof of authority consensus: private-networks/concepts/poa.md - - Privacy: - - private-networks/concepts/privacy/index.md - - Private transactions: - - private-networks/concepts/privacy/private-transactions/index.md - - Private transaction processing: private-networks/concepts/privacy/private-transactions/processing.md - - Privacy groups: private-networks/concepts/privacy/privacy-groups.md - - Flexible privacy groups: private-networks/concepts/privacy/flexible-privacy.md - - Multi-tenancy: private-networks/concepts/privacy/multi-tenancy.md - - Privacy plugin: private-networks/concepts/privacy/plugin.md - - Permissioning: - - private-networks/concepts/permissioning/index.md - - Onchain permissioning: private-networks/concepts/permissioning/onchain.md - - Permissioning plugin: private-networks/concepts/permissioning/plugin.md - - Public key infrastructure: private-networks/concepts/pki.md - - Plugins: private-networks/concepts/plugins.md - - Tutorials: - - Quorum Developer Quickstart: private-networks/tutorials/quickstart.md - - Create a QBFT network: private-networks/tutorials/qbft.md - - Create an IBFT 2.0 network: - - private-networks/tutorials/ibft/index.md - - Add and remove IBFT 2.0 validators: private-networks/tutorials/ibft/validators.md - - Create a Clique network: private-networks/tutorials/clique.md - - Create an Ethash network: private-networks/tutorials/ethash.md - - Create a privacy-enabled network: - - private-networks/tutorials/privacy/index.md - - Create a privacy-enabled network using the Quickstart: private-networks/tutorials/privacy/quickstart.md - - Configure a multi-tenant network: private-networks/tutorials/privacy/multi-tenancy.md - - Use the web3js-quorum multi-node example: private-networks/tutorials/privacy/web3js-quorum.md - - Create a permissioned network: - - private-networks/tutorials/permissioning/index.md - - Get started with onchain permissioning: private-networks/tutorials/permissioning/onchain.md - - Upgrade permissioning contracts: private-networks/tutorials/permissioning/upgrade-contracts.md - - Deploy a smart contract: - - private-networks/tutorials/contracts/index.md - - Transfer account funds: private-networks/tutorials/contracts/transfer-funds.md - - Interact with a deployed contract: private-networks/tutorials/contracts/interact.md - - Deploy using Kubernetes: - - private-networks/tutorials/kubernetes/index.md - - Local playground: private-networks/tutorials/kubernetes/playground.md - - Create a cluster: private-networks/tutorials/kubernetes/cluster.md - - Deploy charts: private-networks/tutorials/kubernetes/charts.md - - Use the Quorum Explorer: private-networks/tutorials/kubernetes/quorum-explorer.md - - Maintenance: private-networks/tutorials/kubernetes/maintenance.md - - Production: private-networks/tutorials/kubernetes/production.md - - Configure Kubernetes mode in NAT manager: private-networks/tutorials/kubernetes/nat-manager.md - - Deploy using Microsoft Azure: private-networks/tutorials/azure.md - - Reference: - - private-networks/reference/index.md - - Besu command line: - - Private network options: private-networks/reference/cli/options.md - - Private network subcommands: private-networks/reference/cli/subcommands.md - - Besu API: - - private-networks/reference/api/index.md - - Private network API objects: private-networks/reference/api/objects.md - - Accounts for testing: private-networks/reference/accounts-for-testing.md - - Plugin API interfaces: private-networks/reference/plugin-api-interfaces.md diff --git a/mkdocs.plugins.yml b/mkdocs.plugins.yml deleted file mode 100644 index 1d780046abd..00000000000 --- a/mkdocs.plugins.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -INHERIT: mkdocs.navigation.yml # DO NOT MODIFY THIS LINE - -# Extensions list requires the object list format without dashes and with {} for empty entries. -plugins: - search: - lang: 'en' - separator: '[\s\-\.\_]+' - markdownextradata: {} - exclude: - glob: - - global/* - git-revision-date-localized: - locale: en - minify: - minify_html: true - minify_js: true - htmlmin_opts: - remove_comments: true diff --git a/mkdocs.redirects.yml b/mkdocs.redirects.yml deleted file mode 100644 index bb958aa249b..00000000000 --- a/mkdocs.redirects.yml +++ /dev/null @@ -1,206 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -INHERIT: mkdocs.plugins.yml # DO NOT MODIFY THIS LINE - -# Configure redirects. -# All page removed or with changed path (moved in another directory) has to be redirected here. -plugins: - redirects: - redirect_maps: - # Configure redirects using key:value pairs: - # old_path.md: new_path.md - # you can't use an already redirected path as an old_path. - # new_path can be a file inside the docs/ folder or any URL (http://...) - HowTo/Get-Started/System-Requirements-Private.md: private-networks/get-started/system-requirements.md - HowTo/Get-Started/System-Requirements-Public.md: public-networks/get-started/system-requirements.md - HowTo/Get-Started/Install-Binaries.md: public-networks/get-started/install/binary-distribution.md - HowTo/Get-Started/Build-from-source.md: public-networks/get-started/install/index.md - HowTo/Get-Started/Run-Docker-Image.md: public-networks/get-started/install/run-docker-image.md - HowTo/Deploy/index.md: public-networks/how-to/configure-ha/index.md - HowTo/Deploy/Monitoring-Performance.md: public-networks/how-to/monitor/metrics.md - HowTo/Upgrade/Upgrade-Network.md: public-networks/how-to/upgrade-node.md - HowTo/Find-and-Connect/Using-UPnP.md: public-networks/how-to/connect/specify-nat.md - HowTo/Use-Privacy/Run-Orion-With-Besu.md: private-networks/how-to/use-privacy/tessera.md - Concepts/Transactions/Trace-Types.md: public-networks/reference/trace-types.md - HowTo/Develop-Dapps/Use-web3js.md: public-networks/how-to/develop/client-libraries.md - Concepts/Client-Libraries.md: public-networks/how-to/develop/client-libraries.md - Concepts/Privacy/Onchain-PrivacyGroups.md: private-networks/concepts/privacy/flexible-privacy.md - HowTo/Use-Privacy/Use-OnChainPrivacy.md: private-networks/how-to/use-privacy/flexible.md - Tutorials/Quickstarts/Azure-Private-Network-Quickstart.md: private-networks/tutorials/azure.md - HowTo/Interact/Client-Libraries/eeajs.md: private-networks/how-to/use-privacy/web3js-quorum.md - HowTo/Interact/Client-Libraries/web3js-eea.md: private-networks/how-to/use-privacy/web3js-quorum.md - Privacy/Explanation/Privacy-Groups.md: private-networks/concepts/privacy/privacy-groups.md - Tutorials/Privacy/eeajs-Multinode-example.md: private-networks/tutorials/privacy/web3js-quorum.md - Tutorials/Privacy/web3js-eea-Multinode-example.md: private-networks/tutorials/privacy/web3js-quorum.md - HowTo/Configure/Configure-TLS.md: private-networks/how-to/configure/tls/client-and-server.md - HowTo/Deploy/Lite-Block-Explorer.md: https://github.com/Alethio/ethereum-lite-explorer - HowTo/Deploy/Lite-Network-Monitor.md: https://github.com/Alethio/ethstats-network-dashboard - HowTo/Configure/Consensus-Protocols/QuorumIBFT.md: private-networks/how-to/configure/consensus/qbft.md - HowTo/Configure/Configure-Data-Storage.md: public-networks/concepts/data-storage-formats.md - Concepts/Consensus-Protocols/Proof-of-Stake.md: public-networks/concepts/proof-of-stake/index.md - Tutorials/Examples/Private-Network-Example.md: private-networks/tutorials/quickstart.md - Tutorials/Examples/Privacy-Example.md: private-networks/tutorials/privacy/quickstart.md - Tutorials/Examples/Nat-Manager-Kubernetes.md: private-networks/tutorials/kubernetes/nat-manager.md - Tutorials/Examples/Private-Network-Example-Azure.md: private-networks/tutorials/azure.md - HowTo/Configure/Consensus-Protocols/Add-Validators.md: private-networks/how-to/configure/consensus/qbft.md - # restructure redirects: - HowTo/Get-Started/System-Requirements/System-Requirements-Private.md: private-networks/get-started/system-requirements.md - HowTo/Get-Started/System-Requirements/System-Requirements-Public.md: public-networks/get-started/system-requirements.md - HowTo/Get-Started/Installation-Options/Install-Binaries.md: public-networks/get-started/install/binary-distribution.md - HowTo/Get-Started/Installation-Options/Build-from-source.md: public-networks/get-started/install/index.md - HowTo/Get-Started/Installation-Options/Run-Docker-Image.md: public-networks/get-started/install/run-docker-image.md - HowTo/Get-Started/Installation-Options/Options.md: public-networks/get-started/install/index.md - HowTo/Get-Started/Starting-node.md: public-networks/get-started/start-node.md - HowTo/Upgrade/Prepare-for-The-Merge.md: public-networks/concepts/the-merge.md - HowTo/Interact/APIs/API.md: public-networks/how-to/use-besu-api/index.md - HowTo/Interact/APIs/Using-JSON-RPC-API.md: public-networks/how-to/use-besu-api/json-rpc.md - HowTo/Interact/APIs/RPC-PubSub.md: public-networks/how-to/use-besu-api/rpc-pubsub.md - HowTo/Interact/APIs/GraphQL.md: public-networks/how-to/use-besu-api/graphql.md - HowTo/Interact/APIs/Authentication.md: public-networks/how-to/use-besu-api/authenticate.md - HowTo/Interact/APIs/Engine-API.md: public-networks/how-to/use-engine-api.md - HowTo/Interact/Filters/Accessing-Logs-Using-JSON-RPC.md: public-networks/how-to/use-besu-api/access-logs.md - HowTo/Send-Transactions/Transactions.md: public-networks/how-to/send-transactions.md - HowTo/Send-Transactions/Account-Management.md: public-networks/how-to/send-transactions.md - HowTo/Send-Transactions/Creating-Sending-Private-Transactions.md: private-networks/how-to/send-transactions/private-transactions.md - HowTo/Send-Transactions/Concurrent-Private-Transactions.md: private-networks/how-to/send-transactions/concurrent-private-transactions.md - HowTo/Send-Transactions/Revert-Reason.md: private-networks/how-to/send-transactions/revert-reason.md - HowTo/Find-and-Connect/Bootnodes.md: private-networks/how-to/configure/bootnodes.md - HowTo/Find-and-Connect/Static-Nodes.md: public-networks/how-to/connect/static-nodes.md - HowTo/Find-and-Connect/Configuring-Ports.md: public-networks/how-to/connect/configure-ports.md - HowTo/Find-and-Connect/Managing-Peers.md: public-networks/how-to/connect/manage-peers.md - HowTo/Find-and-Connect/Specifying-NAT.md: public-networks/how-to/connect/specify-nat.md - Concepts/Node-Types.md: public-networks/get-started/connect/sync-node.md - HowTo/Monitor/Metrics.md: public-networks/how-to/monitor/metrics.md - HowTo/Monitor/Logging.md: public-networks/how-to/monitor/logging.md - HowTo/Monitor/Elastic-Stack.md: private-networks/how-to/monitor/elastic-stack.md - HowTo/Monitor/Quorum-Hibernate.md: private-networks/how-to/monitor/quorum-hibernate.md - HowTo/Monitor/Splunk-Enterprise.md: private-networks/how-to/monitor/splunk.md - HowTo/Monitor/OpenTelemetry-Collector.md: private-networks/how-to/monitor/opentelemetry.md - HowTo/Configure/Using-Configuration-File.md: public-networks/how-to/configuration-file.md - HowTo/Configure/Configure-Mining.md: public-networks/how-to/use-pow/mining.md - HowTo/Configure/Passing-JVM-Options.md: public-networks/how-to/configure-jvm/pass-jvm-options.md - Concepts/Merge.md: public-networks/concepts/the-merge.md - Concepts/NetworkID-And-ChainID.md: public-networks/concepts/network-and-chain-id.md - Concepts/Events-and-Logs.md: public-networks/concepts/events-and-logs.md - HowTo/Configure/Genesis-File.md: public-networks/concepts/genesis-file.md - HowTo/Upgrade/Upgrade-Node.md: public-networks/how-to/upgrade-node.md - HowTo/Upgrade/Upgrade-Protocol.md: private-networks/how-to/upgrade.md - HowTo/Troubleshoot/Use-EVM-Tool.md: public-networks/how-to/troubleshoot/evm-tool.md - HowTo/Troubleshoot/Java-Flight-Recording.md: public-networks/how-to/configure-jvm/java-flight-recorder.md - HowTo/Troubleshoot/Trace-Transactions.md: public-networks/how-to/troubleshoot/trace-transactions.md - Concepts/Node-Keys.md: public-networks/concepts/node-keys.md - Concepts/Data-Storage-Formats.md: public-networks/concepts/data-storage-formats.md - Tutorials/Merge-Testnet.md: public-networks/tutorials/besu-teku-testnet.md - Reference/CLI/CLI-Syntax.md: public-networks/reference/cli/options.md - Reference/CLI/CLI-Subcommands.md: public-networks/reference/cli/subcommands.md - Reference/API-Methods.md: public-networks/reference/api/index.md - Reference/API-Objects.md: public-networks/reference/api/objects.md - Reference/Engine-API-Methods.md: public-networks/reference/engine-api/index.md - Reference/Engine-API-Objects.md: public-networks/reference/engine-api/objects.md - Reference/Config-Items.md: public-networks/reference/genesis-items.md - Reference/Evm-Tool.md: public-networks/reference/evm-tool.md - Reference/Trace-Types.md: public-networks/reference/trace-types.md - Reference/Projects-Using-Besu.md: public-networks/reference/projects-using-besu.md - Reference/Responsible-Disclosure.md: public-networks/reference/disclosure.md - HowTo/Configure/Consensus-Protocols/Clique.md: private-networks/how-to/configure/consensus/clique.md - HowTo/Configure/Consensus-Protocols/IBFT.md: private-networks/how-to/configure/consensus/ibft.md - HowTo/Configure/Consensus-Protocols/QBFT.md: private-networks/how-to/configure/consensus/qbft.md - HowTo/Troubleshoot/Add-Validators-Without-Voting.md: private-networks/how-to/configure/consensus/add-validators-without-voting.md - HowTo/Configure/FreeGas.md: private-networks/how-to/configure/free-gas.md - HowTo/Deploy/Validators.md: private-networks/how-to/configure/validators.md - HowTo/Configure/Contracts-in-Genesis.md: private-networks/how-to/configure/contracts.md - HowTo/Configure/Alternative-EC-Curves.md: private-networks/how-to/configure/curves.md - HowTo/Configure/Block-Proposal-Permissioning.md: private-networks/how-to/configure/block-proposal-permissioning.md - HowTo/Deploy/Bootnodes.md: private-networks/how-to/configure/bootnodes.md - Concepts/ArchitectureOverview.md: index.md - Concepts/Mining.md: public-networks/how-to/use-pow/mining.md - HowTo/Troubleshoot/Troubleshooting.md: public-networks/how-to/troubleshoot/evm-tool.md - Concepts/Protocol-Upgrades.md: private-networks/how-to/upgrade.md - Reference/Resources.md: index.md - HowTo/Use-Privacy/EEA-compliant.md: private-networks/how-to/use-privacy/eea-compliant.md - HowTo/Use-Privacy/Privacy.md: private-networks/how-to/use-privacy/besu-extended.md - HowTo/Use-Privacy/Use-GoQuorum-compatible-privacy.md: private-networks/concepts/privacy/index.md - private-networks/how-to/use-privacy/goquorum-compatible.md: private-networks/concepts/privacy/index.md - HowTo/Use-Privacy/Run-Tessera-With-Besu.md: private-networks/how-to/use-privacy/tessera.md - HowTo/Use-Privacy/Create-Manage-Privacy-Groups.md: private-networks/how-to/use-privacy/privacy-groups.md - HowTo/Use-Privacy/Use-FlexiblePrivacy.md: private-networks/how-to/use-privacy/flexible.md - HowTo/Use-Privacy/Access-Private-Transactions.md: private-networks/how-to/use-privacy/access-private-transactions.md - HowTo/Use-Privacy/Sign-Privacy-Marker-Transactions.md: private-networks/how-to/use-privacy/sign-pmts.md - HowTo/Interact/Client-Libraries/web3js-quorum.md: private-networks/how-to/use-privacy/web3js-quorum.md - HowTo/Use-Privacy/Performance-Best-Practices.md: private-networks/how-to/use-privacy/performance-best-practices.md - HowTo/Configure/TLS/Configure-TLS.md: private-networks/how-to/configure/tls/client-and-server.md - HowTo/Configure/TLS/P2P-TLS.md: private-networks/how-to/configure/tls/p2p.md - HowTo/Limit-Access/Local-Permissioning.md: private-networks/how-to/use-permissioning/local.md - HowTo/Limit-Access/Updating-Permission-Lists.md: private-networks/how-to/use-permissioning/onchain.md - HowTo/Limit-Access/Specify-Perm-Version.md: private-networks/how-to/use-permissioning/onchain.md - HowTo/Deploy/Cloud.md: private-networks/how-to/deploy/cloud.md - HowTo/Deploy/Ansible.md: private-networks/how-to/deploy/ansible.md - HowTo/Deploy/Kubernetes.md: private-networks/how-to/deploy/kubernetes.md - HowTo/Deploy/Ethstats.md: private-networks/how-to/deploy/ethstats.md - Reference/web3js-quorum.md: private-networks/how-to/use-privacy/web3js-quorum.md - HowTo/Deploy/Production.md: private-networks/how-to/use-permissioning/onchain.md - Concepts/Network-vs-Node.md: public-networks/concepts/genesis-file.md - HowTo/Develop-Dapps/Truffle.md: public-networks/how-to/develop/truffle.md - HowTo/Develop-Dapps/Client-Libraries.md: public-networks/how-to/develop/client-libraries.md - HowTo/Backup/Backup.md: private-networks/how-to/backup.md - Concepts/Consensus-Protocols/Overview-Consensus.md: private-networks/how-to/configure/consensus/index.md - Concepts/Consensus-Protocols/Comparing-PoA.md: private-networks/concepts/poa.md - Concepts/Privacy/Private-Transactions.md: private-networks/concepts/privacy/private-transactions/index.md - Concepts/Privacy/Private-Transactions-Processing.md: private-networks/concepts/privacy/private-transactions/processing.md - Concepts/Privacy/Private-Transaction-Processing.md: private-networks/concepts/privacy/private-transactions/processing.md - Concepts/Privacy/Privacy-Groups.md: private-networks/concepts/privacy/privacy-groups.md - Concepts/Privacy/Flexible-PrivacyGroups.md: private-networks/concepts/privacy/flexible-privacy.md - Concepts/Privacy/Multi-Tenancy.md: private-networks/concepts/privacy/multi-tenancy.md - Concepts/Privacy/Plugin-Privacy.md: private-networks/concepts/privacy/plugin.md - Concepts/Privacy/Privacy-Overview.md: private-networks/concepts/privacy/index.md - Concepts/Permissioning/Permissioning-Overview.md: private-networks/concepts/permissioning/index.md - Concepts/Permissioning/Onchain-Permissioning.md: private-networks/concepts/permissioning/onchain.md - Concepts/Permissioning/Plugin-Permissioning.md: private-networks/concepts/permissioning/plugin.md - Concepts/PKI.md: private-networks/concepts/pki.md - Tutorials/Developer-Quickstart.md: private-networks/tutorials/quickstart.md - Tutorials/Private-Network/Create-QBFT-Network.md: private-networks/tutorials/qbft.md - Tutorials/Private-Network/Create-IBFT-Network.md: private-networks/tutorials/ibft/index.md - Tutorials/Private-Network/Adding-removing-IBFT-validators.md: private-networks/tutorials/ibft/validators.md - Tutorials/Private-Network/Create-Private-Clique-Network.md: private-networks/tutorials/clique.md - Tutorials/Private-Network/Create-Private-Network.md: private-networks/tutorials/ethash.md - Tutorials/Privacy/Configuring-Privacy.md: private-networks/tutorials/privacy/index.md - Tutorials/Privacy/Privacy-Example.md: private-networks/tutorials/privacy/quickstart.md - Tutorials/Privacy/Configuring-Multi-Tenancy.md: private-networks/tutorials/privacy/multi-tenancy.md - Tutorials/Privacy/web3js-quorum-Multinode-example.md: private-networks/tutorials/privacy/web3js-quorum.md - Tutorials/Permissioning/Create-Permissioned-Network.md: private-networks/tutorials/permissioning/index.md - Tutorials/Permissioning/Getting-Started-Onchain-Permissioning.md: private-networks/tutorials/permissioning/onchain.md - Tutorials/Permissioning/Upgrade-Permissioning-Contract.md: private-networks/tutorials/permissioning/upgrade-contracts.md - Tutorials/Contracts/Deploying-Contracts.md: private-networks/tutorials/contracts/index.md - Tutorials/Contracts/Account-Funds-Transfers.md: private-networks/tutorials/contracts/transfer-funds.md - Tutorials/Contracts/Calling-Contract-Functions.md: private-networks/tutorials/contracts/interact.md - Tutorials/Kubernetes/Overview.md: private-networks/tutorials/kubernetes/index.md - Tutorials/Kubernetes/Playground.md: private-networks/tutorials/kubernetes/playground.md - Tutorials/Kubernetes/Create-Cluster.md: private-networks/tutorials/kubernetes/cluster.md - Tutorials/Kubernetes/Deploy-Charts.md: private-networks/tutorials/kubernetes/charts.md - Tutorials/Kubernetes/Quorum-Explorer.md: private-networks/tutorials/kubernetes/quorum-explorer.md - Tutorials/Kubernetes/Maintenance.md: private-networks/tutorials/kubernetes/maintenance.md - Tutorials/Kubernetes/Production.md: private-networks/tutorials/kubernetes/production.md - Tutorials/Kubernetes/Nat-Manager-Kubernetes.md: private-networks/tutorials/kubernetes/nat-manager.md - Tutorials/Private-Network-Example-Azure.md: private-networks/tutorials/azure.md - Reference/Accounts-for-Testing.md: private-networks/reference/accounts-for-testing.md - Concepts/Monitoring.md: public-networks/how-to/monitor/index.md - Concepts/Transactions/Transaction-Pool.md: public-networks/concepts/transactions/pool.md - Concepts/Transactions/Transaction-Types.md: public-networks/concepts/transactions/types.md - Concepts/Transctions/Transction-Validation.md: public-networks/concepts/transactions/validation.md - Concepts/Plugins.md: private-networks/concepts/plugins.md - Reference/Plugin-API-Interfaces.md: private-networks/reference/plugin-api-interfaces.md - HowTo/Configure/Configure-HA/High-Availability.md: public-networks/how-to/configure-ha/index.md - HowTo/Configure/Configure-HA/Sample-Configuration.md: public-networks/how-to/configure-ha/sample-configuration.md - Concepts/Pruning.md: public-networks/concepts/data-storage-formats.md - Concepts/TLS.md: private-networks/how-to/configure/tls/client-and-server.md - public-networks/how-to/troubleshoot/java-flight-recorder.md: public-networks/how-to/configure-jvm/java-flight-recorder.md - public-networks/how-to/connect/sync-node.md: public-networks/get-started/connect/sync-node.md - public-networks/tutorials/merge-testnet.md: public-networks/tutorials/besu-teku-testnet.md - public-networks/how-to/prepare-for-the-merge.md: public-networks/concepts/the-merge.md diff --git a/mkdocs.theme.yml b/mkdocs.theme.yml deleted file mode 100644 index 9640b064e28..00000000000 --- a/mkdocs.theme.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -INHERIT: mkdocs.redirects.yml # DO NOT MODIFY THIS LINE - -theme: - name: material - custom_dir: custom_theme - palette: - # Palette toggle for automatic mode - - media: "(prefers-color-scheme)" - primary: blue-grey - accent: teal - toggle: - icon: material/brightness-auto - name: Switch to light mode - - # Palette toggle for light mode - - media: "(prefers-color-scheme: light)" - primary: blue-grey - accent: teal - scheme: default - toggle: - icon: material/brightness-7 - name: Switch to dark mode - - # Palette toggle for dark mode - - media: "(prefers-color-scheme: dark)" - primary: blue-grey - accent: teal - scheme: slate - toggle: - icon: material/brightness-4 - name: Switch to system preference - - font: - text: Roboto - code: Roboto Mono - favicon: favicon.svg - logo: logo-reversed.svg - features: - - content.code.annotate - - content.tooltips - - navigation.indexes - - navigation.tabs - - navigation.tabs.sticky - - navigation.top - - navigation.tracking - - search.highlight - - search.share - - search.suggest - - toc.follow - # Don't include MkDocs' JavaScript - include_search_page: false - search_index_only: true diff --git a/mkdocs.watch.yml b/mkdocs.watch.yml deleted file mode 100644 index d66bf1d949f..00000000000 --- a/mkdocs.watch.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -INHERIT: mkdocs.theme.yml # DO NOT MODIFY THIS LINE - -watch: - - mkdocs.exclude.yml - - mkdocs.extensions.yml - - mkdocs.extra.yml - - mkdocs.navigation.yml - - mkdocs.plugins.yml - - mkdocs.redirects.yml - - mkdocs.theme.yml - - mkdocs.watch.yml diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index cf6f72dd003..00000000000 --- a/mkdocs.yml +++ /dev/null @@ -1,32 +0,0 @@ ---- -# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -INHERIT: mkdocs.watch.yml # DO NOT MODIFY THIS LINE - -# Project information -site_name: Hyperledger Besu -site_url: https://besu.hyperledger.org/ -site_description: Hyperledger Besu Java Ethereum client documentation. -site_author: Hyperledger Besu community -copyright: >- - Hyperledger Besu and its documentation are licensed under Apache 2.0 license / - This Readthedocs.org documentation is maintained with love - by Hyperledger Besu community. - Change cookie settings - -# Doc Repository -repo_name: hyperledger/besu-docs -repo_url: https://github.com/hyperledger/besu-docs/ -edit_uri: edit/main/docs/ - -# The following has to be in this mkdocs.yml file because readthedocs.org is overriding it here. -extra_css: - - assets/stylesheets/custom_theme.css -extra_javascript: - - assets/javascripts/custom_theme.js diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000000..3ba9aa793e4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,25015 @@ +{ + "name": "doc.besu", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "doc.besu", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "^2.4.1", + "@docusaurus/plugin-client-redirects": "^2.4.1", + "@docusaurus/plugin-content-docs": "^2.4.1", + "@docusaurus/plugin-google-gtag": "^2.4.1", + "@docusaurus/plugin-google-tag-manager": "^2.4.1", + "@docusaurus/preset-classic": "^2.4.1", + "@docusaurus/theme-common": "^2.4.1", + "@easyops-cn/docusaurus-search-local": "^0.33.6", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "prism-react-renderer": "^1.3.5", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "redocusaurus": "^1.6.1", + "remark-docusaurus-tabs": "^0.2.0" + }, + "devDependencies": { + "@commitlint/cli": "^17.5.1", + "@commitlint/config-conventional": "^17.4.4", + "@docusaurus/module-type-aliases": "^2.4.1", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/git": "^10.0.1", + "@semantic-release/github": "^8.0.7", + "@semantic-release/npm": "^10.0.2", + "@semantic-release/release-notes-generator": "^10.0.3", + "@tsconfig/docusaurus": "^1.0.7", + "@typescript-eslint/eslint-plugin": "^5.57.0", + "@typescript-eslint/parser": "^5.57.0", + "cspell": "^6.31.1", + "cz-conventional-changelog": "^3.3.0", + "eslint": "^8.37.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-import-resolver-typescript": "^3.5.4", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "lint-staged": "^13.2.0", + "prettier": "^2.8.7", + "semantic-release": "^21.0.0", + "stylelint": "^14.16.1", + "stylelint-config-prettier": "^9.0.4", + "stylelint-config-standard": "^29.0.0", + "tsc-files": "^1.1.3", + "typescript": "^4.7.4" + }, + "engines": { + "node": ">=18.12.1" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", + "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", + "dependencies": { + "@algolia/autocomplete-shared": "1.8.2" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", + "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", + "dependencies": { + "@algolia/autocomplete-shared": "1.8.2" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", + "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.1.tgz", + "integrity": "sha512-e91Jpu93X3t3mVdQwF3ZDjSFMFIfzSc+I76G4EX8nl9RYXgqcjframoL05VTjcD2YCsI18RIHAWVCBoCXVZnrw==", + "dependencies": { + "@algolia/cache-common": "4.17.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.1.tgz", + "integrity": "sha512-fvi1WT8aSiGAKrcTw8Qg3RYgcwW8GZMHcqEm4AyDBEy72JZlFBSY80cTQ75MslINjCHXLDT+9EN8AGI9WVY7uA==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.1.tgz", + "integrity": "sha512-NbBt6eBWlsXc5geSpfPRC5dkIB/0Ptthw8r0yM5Z7D3sPlYdnTZSO9y9XWXIptRMwmZe4cM8iBMN8y0tzbcBkA==", + "dependencies": { + "@algolia/cache-common": "4.17.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.1.tgz", + "integrity": "sha512-3rL/6ofJvyL+q8TiWM3qoM9tig+SY4gB1Vbsj+UeJPnJm8Khm+7OS+r+mFraqR6pTehYqN8yGYoE7x4diEn4aA==", + "dependencies": { + "@algolia/client-common": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.1.tgz", + "integrity": "sha512-Bepr2w249vODqeBtM7i++tPmUsQ9B81aupUGbDWmjA/FX+jzQqOdhW8w1CFO5kWViNKTbz2WBIJ9U3x8hOa4bA==", + "dependencies": { + "@algolia/client-common": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.1.tgz", + "integrity": "sha512-+r7kg4EgbFnGsDnoGSVNtXZO8xvZ0vzf1WAOV7sqV9PMf1bp6cpJP/3IuPrSk4t5w2KVl+pC8jfTM7HcFlfBEQ==", + "dependencies": { + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.1.tgz", + "integrity": "sha512-gJku9DG/THJpfsSlG/az0a3QIn+VVff9kKh8PG8+7ZfxOHS+C+Y5YSeZVsC+c2cfoKLPo3CuHIiJ/p86erR3bA==", + "dependencies": { + "@algolia/client-common": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.1.tgz", + "integrity": "sha512-Q5YfT5gVkx60PZDQBqp/zH9aUbBdC7HVvxupiHUgnCKqRQsRZjOhLest7AI6FahepuZLBZS62COrO7v+JvKY7w==", + "dependencies": { + "@algolia/client-common": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "node_modules/@algolia/logger-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.1.tgz", + "integrity": "sha512-Us28Ot+fLEmX9M96sa65VZ8EyEEzhYPxfhV9aQyKDjfXbUdJlJxKt6wZpoEg9RAPSdO8IjK9nmuW2P8au3rRsg==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.1.tgz", + "integrity": "sha512-iKGQTpOjHiE64W3JIOu6dmDvn+AfYIElI9jf/Nt6umRPmP/JI9rK+OHUoW4pKrBtdG0DPd62ppeNXzSnLxY6/g==", + "dependencies": { + "@algolia/logger-common": "4.17.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.1.tgz", + "integrity": "sha512-W5mGfGDsyfVR+r4pUFrYLGBEM18gs38+GNt5PE5uPULy4uVTSnnVSkJkWeRkmLBk9zEZ/Nld8m4zavK6dtEuYg==", + "dependencies": { + "@algolia/requester-common": "4.17.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.1.tgz", + "integrity": "sha512-HggXdjvVFQR0I5l7hM5WdHgQ1tqcRWeyXZz8apQ7zPWZhirmY2E9D6LVhDh/UnWQNEm7nBtM+eMFONJ3bZccIQ==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.1.tgz", + "integrity": "sha512-NzFWecXT6d0PPsQY9L+/qoK2deF74OLcpvqCH+Vh3mh+QzPsFafcBExdguAjZsAWDn1R6JEeFW7/fo/p0SE57w==", + "dependencies": { + "@algolia/requester-common": "4.17.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.1.tgz", + "integrity": "sha512-ZM+qhX47Vh46mWH8/U9ihvy98HdTYpYQDSlqBD7IbiUbbyoCMke+qmdSX2MGhR2FCcXBSxejsJKKVAfbpaLVgg==", + "dependencies": { + "@algolia/cache-common": "4.17.1", + "@algolia/logger-common": "4.17.1", + "@algolia/requester-common": "4.17.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", + "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "dependencies": { + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", + "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", + "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", + "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", + "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz", + "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", + "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", + "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", + "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz", + "integrity": "sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz", + "integrity": "sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz", + "integrity": "sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz", + "integrity": "sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==", + "dependencies": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", + "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@commitlint/cli": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.5.1.tgz", + "integrity": "sha512-pRRgGSzdHQHehxZbGA3qF6wVPyl+EEQgTe/t321rtMLFbuJ7nRj2waS17s/v5oEbyZtiY5S8PGB6XtEIm0I+Sg==", + "dev": true, + "dependencies": { + "@commitlint/format": "^17.4.4", + "@commitlint/lint": "^17.4.4", + "@commitlint/load": "^17.5.0", + "@commitlint/read": "^17.5.1", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@commitlint/cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.4.4.tgz", + "integrity": "sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ==", + "dev": true, + "dependencies": { + "conventional-changelog-conventionalcommits": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz", + "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@commitlint/ensure": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz", + "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", + "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz", + "integrity": "sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "semver": "7.3.8" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/lint": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.4.4.tgz", + "integrity": "sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^17.4.4", + "@commitlint/parse": "^17.4.4", + "@commitlint/rules": "^17.4.4", + "@commitlint/types": "^17.4.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz", + "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.4.4", + "@commitlint/execute-rule": "^17.4.0", + "@commitlint/resolve-extends": "^17.4.4", + "@commitlint/types": "^17.4.4", + "@types/node": "*", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load/node_modules/cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@commitlint/load/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/message": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", + "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/parse": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.4.tgz", + "integrity": "sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/read": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", + "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^17.4.0", + "@commitlint/types": "^17.4.4", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/read/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz", + "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.4.4", + "@commitlint/types": "^17.4.4", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/rules": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.4.4.tgz", + "integrity": "sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^17.4.4", + "@commitlint/message": "^17.4.2", + "@commitlint/to-lines": "^17.4.0", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", + "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", + "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/types": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.1.tgz", + "integrity": "sha512-rsIev+dk1Vd8H1OKZhNhXycIVsMfeWJaeW3QUi1l4oIoGwQfJVbs1ZPZPHE5cglzyHOW1jQNStXf34UKaC6siA==", + "dev": true, + "dependencies": { + "@cspell/dict-ada": "^4.0.1", + "@cspell/dict-aws": "^3.0.0", + "@cspell/dict-bash": "^4.1.1", + "@cspell/dict-companies": "^3.0.9", + "@cspell/dict-cpp": "^5.0.2", + "@cspell/dict-cryptocurrencies": "^3.0.1", + "@cspell/dict-csharp": "^4.0.2", + "@cspell/dict-css": "^4.0.5", + "@cspell/dict-dart": "^2.0.2", + "@cspell/dict-django": "^4.0.2", + "@cspell/dict-docker": "^1.1.6", + "@cspell/dict-dotnet": "^5.0.0", + "@cspell/dict-elixir": "^4.0.2", + "@cspell/dict-en_us": "^4.3.2", + "@cspell/dict-en-common-misspellings": "^1.0.2", + "@cspell/dict-en-gb": "1.1.33", + "@cspell/dict-filetypes": "^3.0.0", + "@cspell/dict-fonts": "^3.0.1", + "@cspell/dict-fullstack": "^3.1.5", + "@cspell/dict-gaming-terms": "^1.0.4", + "@cspell/dict-git": "^2.0.0", + "@cspell/dict-golang": "^6.0.1", + "@cspell/dict-haskell": "^4.0.1", + "@cspell/dict-html": "^4.0.3", + "@cspell/dict-html-symbol-entities": "^4.0.0", + "@cspell/dict-java": "^5.0.5", + "@cspell/dict-k8s": "^1.0.1", + "@cspell/dict-latex": "^4.0.0", + "@cspell/dict-lorem-ipsum": "^3.0.0", + "@cspell/dict-lua": "^4.0.1", + "@cspell/dict-node": "^4.0.2", + "@cspell/dict-npm": "^5.0.5", + "@cspell/dict-php": "^4.0.1", + "@cspell/dict-powershell": "^5.0.1", + "@cspell/dict-public-licenses": "^2.0.2", + "@cspell/dict-python": "^4.0.2", + "@cspell/dict-r": "^2.0.1", + "@cspell/dict-ruby": "^5.0.0", + "@cspell/dict-rust": "^4.0.1", + "@cspell/dict-scala": "^5.0.0", + "@cspell/dict-software-terms": "^3.1.6", + "@cspell/dict-sql": "^2.1.0", + "@cspell/dict-svelte": "^1.0.2", + "@cspell/dict-swift": "^2.0.1", + "@cspell/dict-typescript": "^3.1.1", + "@cspell/dict-vue": "^3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/cspell-pipe": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz", + "integrity": "sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/cspell-service-bus": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz", + "integrity": "sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/cspell-types": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz", + "integrity": "sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/dict-ada": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz", + "integrity": "sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw==", + "dev": true + }, + "node_modules/@cspell/dict-aws": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", + "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==", + "dev": true + }, + "node_modules/@cspell/dict-bash": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz", + "integrity": "sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A==", + "dev": true + }, + "node_modules/@cspell/dict-companies": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.9.tgz", + "integrity": "sha512-wSkVIJjk33Sm3LhieNv9TsSvUSeP0R/h8xx06NqbMYF43w9J8hZiMHlbB3FzaSOHRpXT5eBIJBVTeFbceZdiqg==", + "dev": true + }, + "node_modules/@cspell/dict-cpp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.2.tgz", + "integrity": "sha512-Q0ZjfhrHHfm0Y1/7LMCq3Fne/bhiBeBogUw4TV1wX/1tg3m+5BtaW/7GiOzRk+rFsblVj3RFam59VJKMT3vSoQ==", + "dev": true + }, + "node_modules/@cspell/dict-cryptocurrencies": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", + "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==", + "dev": true + }, + "node_modules/@cspell/dict-csharp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz", + "integrity": "sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==", + "dev": true + }, + "node_modules/@cspell/dict-css": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.5.tgz", + "integrity": "sha512-z5vw8nJSyKd6d3i5UmMNoVcAp0wxvs9OHWOmAeJKT9fO3tok02gK24VZhcJ0NJtiKdHQ2zRuzdfWl51wdAiY6A==", + "dev": true + }, + "node_modules/@cspell/dict-dart": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz", + "integrity": "sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q==", + "dev": true + }, + "node_modules/@cspell/dict-django": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.0.2.tgz", + "integrity": "sha512-L0Yw6+Yh2bE9/FAMG4gy9m752G4V8HEBjEAGeRIQ9qvxDLR9yD6dPOtgEFTjv7SWlKSrLb9wA/W3Q2GKCOusSg==", + "dev": true + }, + "node_modules/@cspell/dict-docker": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz", + "integrity": "sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig==", + "dev": true + }, + "node_modules/@cspell/dict-dotnet": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz", + "integrity": "sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==", + "dev": true + }, + "node_modules/@cspell/dict-elixir": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.2.tgz", + "integrity": "sha512-/YeHlpZ1pE9VAyxp3V0xyUPapNyC61WwFuw2RByeoMqqYaIfS3Hw+JxtimOsAKVhUvgUH58zyKl5K5Q6FqgCpw==", + "dev": true + }, + "node_modules/@cspell/dict-en_us": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.2.tgz", + "integrity": "sha512-o8xtHDLPNzW6hK5b1TaDTWt25vVi9lWlL6/dZ9YoS+ZMj+Dy/yuXatqfOgeGyU3a9+2gxC0kbr4oufMUQXI2mQ==", + "dev": true + }, + "node_modules/@cspell/dict-en-common-misspellings": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-1.0.2.tgz", + "integrity": "sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==", + "dev": true + }, + "node_modules/@cspell/dict-en-gb": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz", + "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==", + "dev": true + }, + "node_modules/@cspell/dict-filetypes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.0.tgz", + "integrity": "sha512-Fiyp0z5uWaK0d2TfR9GMUGDKmUMAsOhGD5A0kHoqnNGswL2iw0KB0mFBONEquxU65fEnQv4R+jdM2d9oucujuA==", + "dev": true + }, + "node_modules/@cspell/dict-fonts": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.1.tgz", + "integrity": "sha512-o2zVFKT3KcIBo88xlWhG4yOD0XQDjP7guc7C30ZZcSN8YCwaNc1nGoxU3QRea8iKcwk3cXH0G53nrQur7g9DjQ==", + "dev": true + }, + "node_modules/@cspell/dict-fullstack": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz", + "integrity": "sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==", + "dev": true + }, + "node_modules/@cspell/dict-gaming-terms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.4.tgz", + "integrity": "sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==", + "dev": true + }, + "node_modules/@cspell/dict-git": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-2.0.0.tgz", + "integrity": "sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==", + "dev": true + }, + "node_modules/@cspell/dict-golang": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.1.tgz", + "integrity": "sha512-Z19FN6wgg2M/A+3i1O8qhrGaxUUGOW8S2ySN0g7vp4HTHeFmockEPwYx7gArfssNIruw60JorZv+iLJ6ilTeow==", + "dev": true + }, + "node_modules/@cspell/dict-haskell": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz", + "integrity": "sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==", + "dev": true + }, + "node_modules/@cspell/dict-html": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", + "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==", + "dev": true + }, + "node_modules/@cspell/dict-html-symbol-entities": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz", + "integrity": "sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==", + "dev": true + }, + "node_modules/@cspell/dict-java": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", + "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==", + "dev": true + }, + "node_modules/@cspell/dict-k8s": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", + "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==", + "dev": true + }, + "node_modules/@cspell/dict-latex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.0.tgz", + "integrity": "sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==", + "dev": true + }, + "node_modules/@cspell/dict-lorem-ipsum": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", + "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==", + "dev": true + }, + "node_modules/@cspell/dict-lua": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz", + "integrity": "sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg==", + "dev": true + }, + "node_modules/@cspell/dict-node": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", + "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==", + "dev": true + }, + "node_modules/@cspell/dict-npm": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.5.tgz", + "integrity": "sha512-eirZm4XpJNEcbmLGIwI2qXdRRlCKwEsH9mT3qCUytmbj6S6yn63F+8bShMW/yQBedV7+GXq9Td+cJdqiVutOiA==", + "dev": true + }, + "node_modules/@cspell/dict-php": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", + "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==", + "dev": true + }, + "node_modules/@cspell/dict-powershell": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.1.tgz", + "integrity": "sha512-lLl+syWFgfv2xdsoxHfPIB2FGkn//XahCIKcRaf52AOlm1/aXeaJN579B9HCpvM7wawHzMqJ33VJuL/vb6Lc4g==", + "dev": true + }, + "node_modules/@cspell/dict-public-licenses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz", + "integrity": "sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ==", + "dev": true + }, + "node_modules/@cspell/dict-python": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.0.2.tgz", + "integrity": "sha512-w1jSWDR1CkO23cZFbSYgnD/ZqknDZSVCI1AOE6sSszOJR8shmBkV3lMBYd+vpLsWhmkLLBcZTXDkiqFLXDGowQ==", + "dev": true + }, + "node_modules/@cspell/dict-r": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.0.1.tgz", + "integrity": "sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==", + "dev": true + }, + "node_modules/@cspell/dict-ruby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz", + "integrity": "sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A==", + "dev": true + }, + "node_modules/@cspell/dict-rust": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.1.tgz", + "integrity": "sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==", + "dev": true + }, + "node_modules/@cspell/dict-scala": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.0.tgz", + "integrity": "sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==", + "dev": true + }, + "node_modules/@cspell/dict-software-terms": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.1.6.tgz", + "integrity": "sha512-w46+pIMRVtrDuTZXK/YxDP5NL5yVoX0ImEPO0s9WbxdyyfhzAF3sGYHBGN/50OGLHExcqe6Idb9feoRC9mCLxw==", + "dev": true + }, + "node_modules/@cspell/dict-sql": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz", + "integrity": "sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg==", + "dev": true + }, + "node_modules/@cspell/dict-svelte": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz", + "integrity": "sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==", + "dev": true + }, + "node_modules/@cspell/dict-swift": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.1.tgz", + "integrity": "sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==", + "dev": true + }, + "node_modules/@cspell/dict-typescript": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", + "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==", + "dev": true + }, + "node_modules/@cspell/dict-vue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.0.tgz", + "integrity": "sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==", + "dev": true + }, + "node_modules/@cspell/dynamic-import": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz", + "integrity": "sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ==", + "dev": true, + "dependencies": { + "import-meta-resolve": "^2.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/strong-weak-map": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz", + "integrity": "sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg==", + "dev": true, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", + "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2", + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@docsearch/css": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.4.0.tgz", + "integrity": "sha512-Hg8Xfma+rFwRi6Y/pfei4FJoQ1hdVURmmNs/XPoMTCPAImU+d5yxj+M+qdLtNjWRpfWziU4dQcqY94xgFBn2dg==" + }, + "node_modules/@docsearch/react": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.4.0.tgz", + "integrity": "sha512-ufrp5879XYGojgS30ZAp8H4qIMbahRHB9M85VDBP36Xgz5QjYM54i1URKj5e219F7gqTtOivfztFTij6itc0MQ==", + "dependencies": { + "@algolia/autocomplete-core": "1.8.2", + "@algolia/autocomplete-preset-algolia": "1.8.2", + "@docsearch/css": "3.4.0", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz", + "integrity": "sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==", + "dependencies": { + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.2.1", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.0", + "cli-table3": "^0.6.2", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.23.3", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.12", + "del": "^6.1.1", + "detect-port": "^1.3.0", + "escape-html": "^1.0.3", + "eta": "^2.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "html-minifier-terser": "^6.1.0", + "html-tags": "^3.2.0", + "html-webpack-plugin": "^5.5.0", + "import-fresh": "^3.3.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.6.1", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.3", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.3", + "rtl-detect": "^1.0.4", + "semver": "^7.3.7", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.3", + "tslib": "^2.4.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^6.0.1", + "webpack": "^5.73.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-dev-server": "^4.9.3", + "webpack-merge": "^5.8.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz", + "integrity": "sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==", + "dependencies": { + "cssnano-preset-advanced": "^5.3.8", + "postcss": "^8.4.14", + "postcss-sort-media-queries": "^4.2.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/logger": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz", + "integrity": "sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz", + "integrity": "sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==", + "dependencies": { + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@mdx-js/mdx": "^1.6.22", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "image-size": "^1.0.1", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.2.0", + "stringify-object": "^3.3.0", + "tslib": "^2.4.0", + "unified": "^9.2.2", + "unist-util-visit": "^2.0.3", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz", + "integrity": "sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.4.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.4.1.tgz", + "integrity": "sha512-tp0j16gaLIJ4p+IR0P6KDOFsTOGGMY54MNPnmM61Vaqqt5omLqsuKUO8UlCGU1oW/4EIQOhXYy99XYY5MjE+7A==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "eta": "^2.0.0", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz", + "integrity": "sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz", + "integrity": "sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "@types/react-router-config": "^5.0.6", + "combine-promises": "^1.1.0", + "fs-extra": "^10.1.0", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz", + "integrity": "sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "fs-extra": "^10.1.0", + "tslib": "^2.4.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz", + "integrity": "sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "fs-extra": "^10.1.0", + "react-json-view": "^1.21.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz", + "integrity": "sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz", + "integrity": "sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz", + "integrity": "sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz", + "integrity": "sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "fs-extra": "^10.1.0", + "sitemap": "^7.1.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz", + "integrity": "sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/plugin-debug": "2.4.1", + "@docusaurus/plugin-google-analytics": "2.4.1", + "@docusaurus/plugin-google-gtag": "2.4.1", + "@docusaurus/plugin-google-tag-manager": "2.4.1", + "@docusaurus/plugin-sitemap": "2.4.1", + "@docusaurus/theme-classic": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-search-algolia": "2.4.1", + "@docusaurus/types": "2.4.1" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz", + "integrity": "sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "copy-text-to-clipboard": "^3.0.1", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.14", + "prism-react-renderer": "^1.3.5", + "prismjs": "^1.28.0", + "react-router-dom": "^5.3.3", + "rtlcss": "^3.5.0", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz", + "integrity": "sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==", + "dependencies": { + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^1.3.5", + "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz", + "integrity": "sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==", + "dependencies": { + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "algoliasearch": "^4.13.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", + "eta": "^2.0.0", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz", + "integrity": "sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==", + "dependencies": { + "fs-extra": "^10.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz", + "integrity": "sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==", + "dependencies": { + "@docusaurus/logger": "2.4.1", + "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "github-slugger": "^1.4.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.4.0", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz", + "integrity": "sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz", + "integrity": "sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==", + "dependencies": { + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", + "joi": "^17.6.0", + "js-yaml": "^4.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@easyops-cn/autocomplete.js": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", + "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", + "dependencies": { + "cssesc": "^3.0.0", + "immediate": "^3.2.3" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local": { + "version": "0.33.6", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.33.6.tgz", + "integrity": "sha512-3UqsJ42akhHDSlW9SravWQF5ZUI5VEKlzt50djbRRjDdJGefe1v9FpBKVdqHtPPFefcJoagtpfK4/R3dtDeEhw==", + "dependencies": { + "@docusaurus/plugin-content-docs": "^2.0.0-rc.1", + "@docusaurus/theme-translations": "^2.0.0-rc.1", + "@docusaurus/utils": "^2.0.0-rc.1", + "@docusaurus/utils-common": "^2.0.0-rc.1", + "@docusaurus/utils-validation": "^2.0.0-rc.1", + "@easyops-cn/autocomplete.js": "^0.38.1", + "@node-rs/jieba": "^1.6.0", + "cheerio": "^1.0.0-rc.3", + "clsx": "^1.1.1", + "debug": "^4.2.0", + "fs-extra": "^10.0.0", + "klaw-sync": "^6.0.0", + "lunr": "^2.3.9", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2.0.0-rc.1", + "react": "^16.14.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "dependencies": { + "@emotion/memoize": "^0.8.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "devOptional": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "devOptional": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "devOptional": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", + "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "devOptional": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@exodus/schemasafe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0.tgz", + "integrity": "sha512-2cyupPIZI69HQxEAPllLXBjQp4njDKkOjYRCYxvMZe3/LY9pp9fBM3Tb1wiFAdP6Emo4v3OEbCLGj6u73Q5KLw==" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "devOptional": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "devOptional": true + }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@node-rs/jieba": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.7.0.tgz", + "integrity": "sha512-Hm1JIlejxkWe1FSFZRns/g1j5hZmp357n+0n2BluABA4KLZ8EraHfPmPRmVMW6vbdMZObTYIVu5aVrPnUfBOxg==", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/jieba-android-arm-eabi": "1.7.0", + "@node-rs/jieba-android-arm64": "1.7.0", + "@node-rs/jieba-darwin-arm64": "1.7.0", + "@node-rs/jieba-darwin-x64": "1.7.0", + "@node-rs/jieba-freebsd-x64": "1.7.0", + "@node-rs/jieba-linux-arm-gnueabihf": "1.7.0", + "@node-rs/jieba-linux-arm64-gnu": "1.7.0", + "@node-rs/jieba-linux-arm64-musl": "1.7.0", + "@node-rs/jieba-linux-x64-gnu": "1.7.0", + "@node-rs/jieba-linux-x64-musl": "1.7.0", + "@node-rs/jieba-win32-arm64-msvc": "1.7.0", + "@node-rs/jieba-win32-ia32-msvc": "1.7.0", + "@node-rs/jieba-win32-x64-msvc": "1.7.0" + } + }, + "node_modules/@node-rs/jieba-android-arm-eabi": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.7.0.tgz", + "integrity": "sha512-XF4OYcZCyDiBK+jm1Zmt2o+xEO7K2K5OvUC3MTc9jd3Lwvy3EdHp8tpGvEp8PxfVFe2/JxNzX4OQQQP3Dhmk9A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-android-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.7.0.tgz", + "integrity": "sha512-9oWwFVr/37T89WC+jjiI9A6u0zUJNTJl5ZC4CMxX45MVMokWI7bBXU7t7qBmMdFBzj+OFwDd3sm1fh4vl7NSWA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.7.0.tgz", + "integrity": "sha512-9gBuxJCNITNI/gU5l8eeVGQ9MAf0BV86lfeo9TeU61vJCy6sqyx26wFMLODQgLNdiMP+q/fZme/G0hfZUjfPVA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.7.0.tgz", + "integrity": "sha512-FFUSMY4tl0Prpxa1SHy7Yzze2KfV/bZzccpO5nd+a8zCKbiX6gVkJ89FfxSAD2QrXUGkZvJYiPmu5nkZItqRZQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-freebsd-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.7.0.tgz", + "integrity": "sha512-QFz2pz0Br+621QbKkgQPqTn90j1kcCD9jaI++qTLNHJGlWLRn6sFoAjb+jQEQEy9aE7VqfIV56eaVcCoU5VO2w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm-gnueabihf": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.7.0.tgz", + "integrity": "sha512-kHJxO2sd7gMKqI1YS5DjABEcRwRemaCtgbKSuUqEaHGmUz9nAaUF6FSY8U4rXwr7HXt+kQa4NgyYDjgz+Pscrw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-gnu": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.7.0.tgz", + "integrity": "sha512-3qoCV9pF6llPBGDMu7K8JdHjI10WPkrq6P2gpZESqekcE4DatV6DcU9FWR+QL7MK/7meoE3/Zhjm7OK+qBd8gg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-musl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.7.0.tgz", + "integrity": "sha512-xv6hvzOV7iTCq7mM8SWhC3zEk6CqmBwhOSlfbb3gvPkc4U1UA1hmvcrD7oO5Qn+U+nuswysGCdVU6Z5AypLDfg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-gnu": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.7.0.tgz", + "integrity": "sha512-NpelWidMSNLoFTw+ov3y5jhJZjapHwEnh0Fyfm/7mvqkdwzVyedqNj22etRGum+nsAosMotCUWUznIMAD075gQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-musl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.7.0.tgz", + "integrity": "sha512-yG4F8sy+fW4RbhyKXmEMT/JGuQuKH0TGymCEGYgT0km2I60iys63jWf2VTzCtrx583wxN5XoHv5HN60nhtIBtw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-arm64-msvc": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.7.0.tgz", + "integrity": "sha512-R6l/BSMs6R6BwpZS6DIDZuAEjUIPdAHgyi+xptP3mICjm6U+GMsvsRTeZkIJ7a/yzYUfqvz54VpQsfE5f0psBQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-ia32-msvc": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.7.0.tgz", + "integrity": "sha512-FwibbuizEjzom02K2JM2T8tL0VlxW5xGDDy3L3dgx46xIGE85PwGYjgju+eDt4UODgxDsxGC4DUMMZf3XvCc7A==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-x64-msvc": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.7.0.tgz", + "integrity": "sha512-pJv7nluB6azhsOWvJB86Dyfg/M7n9k49bs9Bwmsylz9uhdZX9QnEShDW934RdmnjPYQ5aPgsSFrY6NXP/aovUA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@octokit/auth-token": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz", + "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==", + "dev": true, + "dependencies": { + "@octokit/types": "^8.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz", + "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^8.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz", + "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==", + "dev": true, + "dependencies": { + "@octokit/types": "^8.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/graphql": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz", + "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", + "dev": true, + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^8.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz", + "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz", + "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==", + "dev": true, + "dependencies": { + "@octokit/types": "^8.0.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz", + "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==", + "dev": true, + "dependencies": { + "@octokit/types": "^8.0.0", + "deprecation": "^2.3.1" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/request": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz", + "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^8.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz", + "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==", + "dev": true, + "dependencies": { + "@octokit/types": "^8.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/rest": { + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz", + "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==", + "dev": true, + "dependencies": { + "@octokit/core": "^4.1.0", + "@octokit/plugin-paginate-rest": "^5.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^6.7.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/types": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.1.1.tgz", + "integrity": "sha512-7tjk+6DyhYAmei8FOEwPfGKc0VE1x56CKPJ+eE44zhDbOyMT+9yan8apfQFxo8oEFsy+0O7PiBtH8w0Yo0Y9Kw==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^14.0.0" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/npm-conf": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", + "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", + "dev": true, + "dependencies": { + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "node_modules/@redocly/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/ajv/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.0.0-beta.123", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.123.tgz", + "integrity": "sha512-W6MbUWpb/VaV+Kf0c3jmMIJw3WwwF7iK5nAfcOS+ZwrlbxtIl37+1hEydFlJ209vCR9HL12PaMwdh2Vpihj6Jw==", + "dependencies": { + "@redocly/ajv": "^8.11.0", + "@types/node": "^14.11.8", + "colorette": "^1.2.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/@types/node": { + "version": "14.18.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz", + "integrity": "sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==" + }, + "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "node_modules/@redocly/openapi-core/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@semantic-release/changelog": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", + "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "fs-extra": "^11.0.0", + "lodash": "^4.17.4" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" + } + }, + "node_modules/@semantic-release/changelog/node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@semantic-release/commit-analyzer": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", + "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "import-from": "^4.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "node_modules/@semantic-release/error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", + "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", + "dev": true, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@semantic-release/git": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", + "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.0", + "p-reduce": "^2.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" + } + }, + "node_modules/@semantic-release/git/node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@semantic-release/github": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.7.tgz", + "integrity": "sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==", + "dev": true, + "dependencies": { + "@octokit/rest": "^19.0.0", + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "bottleneck": "^2.18.1", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^11.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^3.0.0", + "p-filter": "^2.0.0", + "p-retry": "^4.0.0", + "url-join": "^4.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "node_modules/@semantic-release/github/node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@semantic-release/github/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@semantic-release/npm": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-10.0.2.tgz", + "integrity": "sha512-Mo0XoBza4pUapxiBhLLYXeSZ9tkuHDUd/WvMbpilwuPRfJDnQXMqx5tBVon8d2mBk8JXmXpqB+ExhlWJmVT40A==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^4.0.1", + "execa": "^7.0.0", + "fs-extra": "^11.0.0", + "lodash-es": "^4.17.21", + "nerf-dart": "^1.0.0", + "normalize-url": "^8.0.0", + "npm": "^9.5.0", + "rc": "^1.2.8", + "read-pkg": "^7.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@semantic-release/npm/node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@semantic-release/npm/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/registry-auth-token": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", + "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^1.0.4" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/release-notes-generator": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", + "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "get-stream": "^6.0.0", + "import-from": "^4.0.0", + "into-stream": "^6.0.0", + "lodash": "^4.17.4", + "read-pkg-up": "^7.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "dependencies": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/docusaurus": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", + "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/@types/express": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.32", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", + "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz", + "integrity": "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", + "integrity": "sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "devOptional": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.1.tgz", + "integrity": "sha512-4GDQ1RhP2qUR3x8PevFRbEdqZqIARNViZYjgTJmA1T7wRNtFA3W4Aqc/RsODqa1J8IO/QDla5x4tWuUS8NV8wA==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.17.1", + "@algolia/cache-common": "4.17.1", + "@algolia/cache-in-memory": "4.17.1", + "@algolia/client-account": "4.17.1", + "@algolia/client-analytics": "4.17.1", + "@algolia/client-common": "4.17.1", + "@algolia/client-personalization": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/logger-common": "4.17.1", + "@algolia/logger-console": "4.17.1", + "@algolia/requester-browser-xhr": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/requester-node-http": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.0.tgz", + "integrity": "sha512-kV3c1jMQCvkARtGsSDvAwuht4PAMSsQILqPiH4WFiARoa3jXJ/r1TQoBWAjWyWF48rsNYCv7kzxgB4LTxrvvuw==", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.2.tgz", + "integrity": "sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", + "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-module-imports": "^7.16.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11", + "picomatch": "^2.3.0" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001472", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001472.tgz", + "integrity": "sha512-xWC/0+hHHQgj3/vrKYY0AAzeIUgr7L9wlELIcAvZdDUHlhL/kNxMdnQLOSOQfP8R51ZzPhmHdyMkI0MMpmxCfg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "dev": true, + "dependencies": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/clean-css": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/clear-module": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", + "integrity": "sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==", + "dev": true, + "dependencies": { + "parent-module": "^2.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clear-module/node_modules/parent-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "dev": true, + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clear-module/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "node_modules/combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/comment-json": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "dev": true, + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commitizen": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.2.6.tgz", + "integrity": "sha512-RyTM+EiD9GO01DJUn9MRRAet3XUHGfoUZoksLfr+1ym1Xt2q5EYJs9Fg2BtKSb5Mo53i0BtMBmWMHQXVlZ/L9w==", + "dev": true, + "dependencies": { + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.1.0", + "find-node-modules": "^2.1.2", + "find-root": "1.1.0", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.4", + "is-utf8": "^0.2.1", + "lodash": "4.17.21", + "minimist": "1.2.6", + "strip-bom": "4.0.0", + "strip-json-comments": "3.1.1" + }, + "bin": { + "commitizen": "bin/commitizen", + "cz": "bin/git-cz", + "git-cz": "bin/git-cz" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/commitizen/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/commitizen/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/commitizen/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-changelog-writer/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/conventional-changelog-writer/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "dev": true + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-commits-parser/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/conventional-commits-parser/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", + "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/core-js": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", + "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz", + "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==", + "dependencies": { + "browserslist": "^4.21.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz", + "integrity": "sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", + "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=3" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-fetch": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", + "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "dependencies": { + "node-fetch": "^2.6.11" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cspell": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.1.tgz", + "integrity": "sha512-gyCtpkOpwI/TGibbtIgMBFnAUUp2hnYdvW/9Ky4RcneHtLH0+V/jUEbZD8HbRKz0GVZ6mhKWbNRSEyP9p3Cejw==", + "dev": true, + "dependencies": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/dynamic-import": "6.31.1", + "chalk": "^4.1.2", + "commander": "^10.0.0", + "cspell-gitignore": "6.31.1", + "cspell-glob": "6.31.1", + "cspell-io": "6.31.1", + "cspell-lib": "6.31.1", + "fast-glob": "^3.2.12", + "fast-json-stable-stringify": "^2.1.0", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "imurmurhash": "^0.1.4", + "semver": "^7.3.8", + "strip-ansi": "^6.0.1", + "vscode-uri": "^3.0.7" + }, + "bin": { + "cspell": "bin.js", + "cspell-esm": "bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" + } + }, + "node_modules/cspell-dictionary": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz", + "integrity": "sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg==", + "dev": true, + "dependencies": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "cspell-trie-lib": "6.31.1", + "fast-equals": "^4.0.3", + "gensequence": "^5.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-gitignore": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.1.tgz", + "integrity": "sha512-PAcmjN6X89Z8qgjem6HYb+VmvVtKuc+fWs4sk21+jv2MiLk23Bkp+8slSaIDVR//58fxJkMx17PHyo2cDO/69A==", + "dev": true, + "dependencies": { + "cspell-glob": "6.31.1", + "find-up": "^5.0.0" + }, + "bin": { + "cspell-gitignore": "bin.mjs" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-gitignore/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-gitignore/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-gitignore/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-gitignore/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-glob": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.1.tgz", + "integrity": "sha512-ygEmr5hgE4QtO5+L3/ihfMKBhPipbapfS22ilksFSChKMc15Regds0z+z/1ZBoe+OFAPneQfIuBxMwQ/fB00GQ==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.5" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-grammar": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz", + "integrity": "sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ==", + "dev": true, + "dependencies": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-io": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.1.tgz", + "integrity": "sha512-deZcpvTYY/NmLfOdOtzcm+nDvJZozKmj4TY3pPpX0HquPX0A/w42bFRT/zZNmRslFl8vvrCZZUog7SOc6ha3uA==", + "dev": true, + "dependencies": { + "@cspell/cspell-service-bus": "6.31.1", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-lib": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.1.tgz", + "integrity": "sha512-KgSiulbLExY+z2jGwkO77+aAkyugsPAw7y07j3hTQLpd+0esPCZqrmbo2ItnkvkDNd/c34PqQCr7/044/rz8gw==", + "dev": true, + "dependencies": { + "@cspell/cspell-bundled-dicts": "6.31.1", + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "@cspell/strong-weak-map": "6.31.1", + "clear-module": "^4.1.2", + "comment-json": "^4.2.3", + "configstore": "^5.0.1", + "cosmiconfig": "8.0.0", + "cspell-dictionary": "6.31.1", + "cspell-glob": "6.31.1", + "cspell-grammar": "6.31.1", + "cspell-io": "6.31.1", + "cspell-trie-lib": "6.31.1", + "fast-equals": "^4.0.3", + "find-up": "^5.0.0", + "gensequence": "^5.0.2", + "import-fresh": "^3.3.0", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0", + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-uri": "^3.0.7" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/cspell-lib/node_modules/cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell-lib/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-lib/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-lib/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-lib/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-lib/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cspell-trie-lib": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz", + "integrity": "sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg==", + "dev": true, + "dependencies": { + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "gensequence": "^5.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cspell/node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-functions-list": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", + "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", + "dev": true, + "engines": { + "node": ">=12.22" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", + "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", + "dependencies": { + "cssnano-preset-default": "^5.2.13", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "dependencies": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/cz-conventional-changelog": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@commitlint/load": ">6.1.1" + } + }, + "node_modules/cz-conventional-changelog/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cz-conventional-changelog/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cz-conventional-changelog/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/cz-conventional-changelog/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/cz-conventional-changelog/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cz-conventional-changelog/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cz-conventional-changelog/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decko": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", + "integrity": "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==" + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "devOptional": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "devOptional": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/docusaurus-plugin-redoc": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-1.6.0.tgz", + "integrity": "sha512-bvOmVcJ9Lo6ymyaHCoXTjN6Ck7/Dog1KRsJgZilB6ukHQ7d6nJrAwAEoDF1rXto8tOvIUqVb6Zzy7qDPvBQA1Q==", + "dependencies": { + "@redocly/openapi-core": "1.0.0-beta.123", + "redoc": "2.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/utils": "^2.0.0" + } + }, + "node_modules/docusaurus-theme-redoc": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-1.6.3.tgz", + "integrity": "sha512-vOdU1WcxFOfp+7HqwEoybmU3t3hC1GN5GnYbT9rjffv5yx4m4x5fQOtTQqCmtk3L9OCFX+pDfwiBXw1EUIaOLA==", + "dependencies": { + "@redocly/openapi-core": "1.0.0-beta.123", + "clsx": "^1.2.1", + "copyfiles": "^2.4.1", + "lodash": "^4.17.21", + "mobx": "^6.8.0", + "redoc": "2.0.0", + "styled-components": "^5.3.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", + "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-ci": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-8.0.0.tgz", + "integrity": "sha512-W+3BqGZozFua9MPeXpmTm5eYEBtGgL76jGu/pwMVp/L8PdECSCEWaIp7d4Mw7kuUrbUldK0oV0bNd6ZZjLiMiA==", + "dev": true, + "dependencies": { + "execa": "^6.1.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^16.10 || >=18" + } + }, + "node_modules/env-ci/node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/env-ci/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/env-ci/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.0.tgz", + "integrity": "sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.0", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.0", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "devOptional": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.37.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz", + "integrity": "sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.4.tgz", + "integrity": "sha512-9xUpnedEmSfG57sN1UvWPiEhfJ8bPt0Wg2XysA7Mlc79iFGhmJtRUg9LxtkK81FhMUui0YuR2E8iUsVhePkh4A==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "devOptional": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "devOptional": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "devOptional": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "devOptional": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "devOptional": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "devOptional": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "devOptional": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "devOptional": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "devOptional": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.0.tgz", + "integrity": "sha512-NqE7S2VmVwgMS8yBxsH4VgNQjNjLq1gfGU0u9I6Cjh468nPRMoDfGdK9n1p/3Dvsw3ebklDkZsFAnKJ9sefjBA==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "devOptional": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "devOptional": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-node-modules": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", + "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", + "dev": true, + "dependencies": { + "findup-sync": "^4.0.0", + "merge": "^2.1.1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-versions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", + "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", + "dev": true, + "dependencies": { + "semver-regex": "^4.0.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "devOptional": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "devOptional": true + }, + "node_modules/flux": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensequence": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", + "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", + "dev": true, + "dependencies": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + } + }, + "node_modules/git-log-parser/node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "dev": true, + "dependencies": { + "through2": "~2.0.0" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-raw-commits/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/git-raw-commits/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "devOptional": true + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hook-std": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", + "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" + }, + "node_modules/immer": { + "version": "9.0.17", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.17.tgz", + "integrity": "sha512-+hBruaLSQvkPfxRiTLK/mi4vLH+/VQS6z2KJahdoxlleFOI8ARqzOF17uy12eFDlqWmPoygwc5evgwcp+dlHhg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "dev": true, + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-meta-resolve": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", + "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/internal-slot": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", + "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "devOptional": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "dependencies": { + "foreach": "^2.0.4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "devOptional": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/known-css-properties": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "dev": true + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "devOptional": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lint-staged": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", + "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", + "dev": true, + "dependencies": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "devOptional": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/log-update/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, + "node_modules/lunr-languages": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.12.0.tgz", + "integrity": "sha512-C2z02jt74ymrDocBwxYB4Cr1LNZj9rHGLTH/00+JuoT6eJOSSuPBzeqQG8kjnlPUQe+/PAWv1/KHbDT+YYYRnA==" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz", + "integrity": "sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/marked-terminal": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", + "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", + "dev": true, + "dependencies": { + "ansi-escapes": "^5.0.0", + "cardinal": "^2.1.1", + "chalk": "^5.0.0", + "cli-table3": "^0.6.1", + "node-emoji": "^1.11.0", + "supports-hyperlinks": "^2.2.0" + }, + "engines": { + "node": ">=14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/marked-terminal/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/marked-terminal/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "dev": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mobx": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.9.0.tgz", + "integrity": "sha512-HdKewQEREEJgsWnErClfbFoVebze6rGazxFLU/XUyrII8dORfVszN1V0BMRnQSzcgsNNtkX8DHj3nC6cdWE9YQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + } + }, + "node_modules/mobx-react": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz", + "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==", + "dependencies": { + "mobx-react-lite": "^3.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mobx-react-lite": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz", + "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "devOptional": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm": { + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.2.tgz", + "integrity": "sha512-TnXoXhlFkH/9wI4+aXSq0aPLwKG7Ge17t1ME4/rQt+0DZWQCRk9PwhBuX/shqdUiHeKicSLSkzWx+QZgTRE+/A==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "read-package-json", + "read-package-json-fast", + "semver", + "ssri", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^6.2.5", + "@npmcli/config": "^6.1.4", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/package-json": "^3.0.0", + "@npmcli/run-script": "^6.0.0", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^17.0.4", + "chalk": "^4.1.2", + "ci-info": "^3.8.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.3", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.1", + "glob": "^8.1.0", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^6.1.1", + "ini": "^3.0.1", + "init-package-json": "^5.0.0", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^3.0.0", + "libnpmaccess": "^7.0.2", + "libnpmdiff": "^5.0.13", + "libnpmexec": "^5.0.13", + "libnpmfund": "^4.0.13", + "libnpmhook": "^9.0.3", + "libnpmorg": "^5.0.3", + "libnpmpack": "^5.0.13", + "libnpmpublish": "^7.1.2", + "libnpmsearch": "^6.0.2", + "libnpmteam": "^5.0.3", + "libnpmversion": "^4.0.2", + "make-fetch-happen": "^11.0.3", + "minimatch": "^6.2.0", + "minipass": "^4.2.4", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^9.3.1", + "nopt": "^7.0.0", + "npm-audit-report": "^4.0.0", + "npm-install-checks": "^6.0.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.1", + "npm-profile": "^7.0.1", + "npm-registry-fetch": "^14.0.3", + "npm-user-validate": "^2.0.0", + "npmlog": "^7.0.1", + "p-map": "^4.0.0", + "pacote": "^15.1.1", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^2.0.0", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.8", + "ssri": "^10.0.1", + "tar": "^6.1.13", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^3.0.0", + "write-file-atomic": "^5.0.0" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "6.2.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^5.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^3.0.0", + "@npmcli/query": "^3.0.0", + "@npmcli/run-script": "^6.0.0", + "bin-links": "^4.0.1", + "cacache": "^17.0.4", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^6.1.6", + "nopt": "^7.0.0", + "npm-install-checks": "^6.0.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.1", + "npm-registry-fetch": "^14.0.3", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.1", + "treeverse": "^3.0.0", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "6.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ini": "^3.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "4.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^8.0.1", + "minimatch": "^6.1.6", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^17.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^15.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minimatch": "^6.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abort-controller": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/npm/node_modules/agentkeepalive": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/buffer": { + "version": "6.0.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "17.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^8.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "3.8.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/depd": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/event-target-shim": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/events": { + "version": "3.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/gauge": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/npm/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^6.1.6" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/ini": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^10.0.0", + "promzard": "^1.0.0", + "read": "^2.0.0", + "read-package-json": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.11.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "5.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^10.1.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "5.0.13", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.2.5", + "@npmcli/disparity-colors": "^3.0.0", + "@npmcli/installed-package-contents": "^2.0.2", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^6.1.6", + "npm-package-arg": "^10.1.0", + "pacote": "^15.0.8", + "tar": "^6.1.13" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "5.0.13", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.2.5", + "@npmcli/run-script": "^6.0.0", + "chalk": "^4.1.0", + "ci-info": "^3.7.1", + "npm-package-arg": "^10.1.0", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "proc-log": "^3.0.0", + "read": "^2.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "4.0.13", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.2.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "9.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "5.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "5.0.13", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^6.2.5", + "@npmcli/run-script": "^6.0.0", + "npm-package-arg": "^10.1.0", + "pacote": "^15.0.8" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "7.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^3.6.1", + "normalize-package-data": "^5.0.0", + "npm-package-arg": "^10.1.0", + "npm-registry-fetch": "^14.0.3", + "proc-log": "^3.0.0", + "semver": "^7.3.7", + "sigstore": "^1.0.0", + "ssri": "^10.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "5.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^14.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.0.1", + "@npmcli/run-script": "^6.0.0", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "11.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "6.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "4.2.8", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^4.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "9.3.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "10.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "7.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "8.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "7.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "14.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npmlog": { + "version": "7.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "15.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^4.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/process": { + "version": "0.11.10", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/readable-stream": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/sigstore": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "make-fetch-happen": "^11.0.1", + "tuf-js": "^1.0.0" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.7.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.1.13", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "1.0.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/which": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/oas-resolver/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/oas-resolver/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/oas-resolver/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/oas-resolver/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/oas-resolver/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-sampler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.3.1.tgz", + "integrity": "sha512-Ert9mvc2tLPmmInwSyGZS+v4Ogu9/YoZuq9oP3EdUklg2cad6+IGndP9yqJJwbgdXwZibiq5fpv6vYujchdJFg==", + "dependencies": { + "@types/json-schema": "^7.0.7", + "json-pointer": "0.6.2" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "devOptional": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-each-series": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", + "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/perfect-scrollbar": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/polished": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", + "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "devOptional": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "peerDependencies": { + "react": ">=0.14.9" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "dependencies": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + }, + "peerDependencies": { + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-tabs": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.3.tgz", + "integrity": "sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg==", + "dependencies": { + "clsx": "^1.1.0", + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0-0" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", + "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "dev": true, + "dependencies": { + "esprima": "~4.0.0" + } + }, + "node_modules/redoc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0.tgz", + "integrity": "sha512-rU8iLdAkT89ywOkYk66Mr+IofqaMASlRvTew0dJvopCORMIPUcPMxjlJbJNC6wsn2vvMnpUFLQ/0ISDWn9BWag==", + "dependencies": { + "@redocly/openapi-core": "^1.0.0-beta.104", + "classnames": "^2.3.1", + "decko": "^1.2.0", + "dompurify": "^2.2.8", + "eventemitter3": "^4.0.7", + "json-pointer": "^0.6.2", + "lunr": "^2.3.9", + "mark.js": "^8.11.1", + "marked": "^4.0.15", + "mobx-react": "^7.2.0", + "openapi-sampler": "^1.3.0", + "path-browserify": "^1.0.1", + "perfect-scrollbar": "^1.5.5", + "polished": "^4.1.3", + "prismjs": "^1.27.0", + "prop-types": "^15.7.2", + "react-tabs": "^3.2.2", + "slugify": "~1.4.7", + "stickyfill": "^1.1.1", + "style-loader": "^3.3.1", + "swagger2openapi": "^7.0.6", + "url-template": "^2.0.8" + }, + "engines": { + "node": ">=6.9", + "npm": ">=3.0.0" + }, + "peerDependencies": { + "core-js": "^3.1.4", + "mobx": "^6.0.4", + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0", + "styled-components": "^4.1.1 || ^5.1.1" + } + }, + "node_modules/redocusaurus": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/redocusaurus/-/redocusaurus-1.6.3.tgz", + "integrity": "sha512-RTo0HyTJwPM1t1ZB5j+yK31ta4Dy2IaGS1j/DKN2Kn2ZsahFO7m3fom/LzRYxzv2H0bd9VxYaxUrlLsMmFzmGA==", + "dependencies": { + "docusaurus-plugin-redoc": "1.6.0", + "docusaurus-theme-redoc": "1.6.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2.0.0", + "@docusaurus/utils": "^2.0.0" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-docusaurus-tabs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/remark-docusaurus-tabs/-/remark-docusaurus-tabs-0.2.0.tgz", + "integrity": "sha512-Xl8FkeQAdDqlhf7EurBxCkT7cfA5QK2PN8eoFr94g1OOuc7XsgVk897zf8yhNNnpQYR8nd/XC6JaXTZxHxX4mA==", + "dependencies": { + "mdast-util-to-string": "^2.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remark-mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global/node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "node_modules/rtlcss": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", + "dependencies": { + "find-up": "^5.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.3.11", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + } + }, + "node_modules/rtlcss/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semantic-release": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-21.0.0.tgz", + "integrity": "sha512-zks0jVk2Hbyhn014vshcwQ6e6gM9jDPr8SdujqfAzPJBvvvSXa8GHz/x+W0VaW2aBNawWFAlx6N45dp1H1XCCw==", + "dev": true, + "dependencies": { + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/error": "^3.0.0", + "@semantic-release/github": "^8.0.0", + "@semantic-release/npm": "^10.0.2", + "@semantic-release/release-notes-generator": "^10.0.0", + "aggregate-error": "^4.0.1", + "cosmiconfig": "^8.0.0", + "debug": "^4.0.0", + "env-ci": "^8.0.0", + "execa": "^7.0.0", + "figures": "^5.0.0", + "find-versions": "^5.1.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^3.0.0", + "hosted-git-info": "^6.0.0", + "lodash-es": "^4.17.21", + "marked": "^4.1.0", + "marked-terminal": "^5.1.1", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-pkg-up": "^9.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^4.0.0", + "signale": "^1.2.1", + "yargs": "^17.5.1" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semantic-release/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/semantic-release/node_modules/cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/semantic-release/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/semantic-release/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/semantic-release/node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/semantic-release/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/semantic-release/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/lru-cache": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/semantic-release/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/semantic-release/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/semantic-release/node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/semantic-release/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/semantic-release/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/semantic-release/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "dev": true, + "dependencies": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/signale/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/signale/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/signale/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slugify": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", + "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.1.tgz", + "integrity": "sha512-3H20QlwQsSm2OvAxWIYhs+j01MzzqwMwGiiO1NQaJYZgJZFPuAbf95/DiKRBSTYIJ2FeGUc+B/6mPGcWP9dO3Q==" + }, + "node_modules/stickyfill": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", + "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-combiner2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz", + "integrity": "sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-components": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.9.tgz", + "integrity": "sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylelint": { + "version": "14.16.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", + "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^7.1.0", + "css-functions-list": "^3.1.0", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^6.0.1", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.2.0", + "ignore": "^5.2.1", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.26.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.19", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^2.3.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^4.0.2" + }, + "bin": { + "stylelint": "bin/stylelint.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-prettier": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-9.0.4.tgz", + "integrity": "sha512-38nIGTGpFOiK5LjJ8Ma1yUgpKENxoKSOhbDNSemY7Ep0VsJoXIW9Iq/2hSt699oB9tReynfWicTAoIHiq8Rvbg==", + "dev": true, + "bin": { + "stylelint-config-prettier": "bin/check.js", + "stylelint-config-prettier-check": "bin/check.js" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "stylelint": ">=11.0.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", + "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", + "dev": true, + "peerDependencies": { + "stylelint": "^14.10.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", + "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^9.0.0" + }, + "peerDependencies": { + "stylelint": "^14.14.0" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/stylelint/node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/swagger2openapi/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/swagger2openapi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/swagger2openapi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger2openapi/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/swagger2openapi/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/swagger2openapi/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", + "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", + "dev": true, + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead" + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsc-files": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tsc-files/-/tsc-files-1.1.3.tgz", + "integrity": "sha512-G6uXkTNofGU9EE1fYBaCpR72x/aqXW4PDAuznWj4JYlDwhcaKnUn4CiCHBMc89lDxLmikK+hhaEWLoTPEKKvXg==", + "dev": true, + "bin": { + "tsc-files": "lib/index.js" + }, + "peerDependencies": { + "typescript": ">=3" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "devOptional": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/update-notifier/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "dev": true + }, + "node_modules/wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "dependencies": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack": { + "version": "5.77.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz", + "integrity": "sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz", + "integrity": "sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==", + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000000..bc587f7aba9 --- /dev/null +++ b/package.json @@ -0,0 +1,105 @@ +{ + "name": "doc.besu", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc", + "typecheck-staged": "tsc-files --noEmit", + "lint": "npm run lint:spelling && npm run lint:js && npm run lint:style", + "lint:js": "eslint . --ext js,jsx,ts,tsx --max-warnings=0", + "lint:spelling": "cspell \"**\" --no-progress", + "lint:style": "stylelint \"**/*.css\"", + "lint:fix": "npm run lint:js -- --fix", + "format": "prettier --write '{blog,docs,src,static}/**/*.{md,mdx,ts,js,tsx,jsx,json}'" + }, + "lint-staged": { + "**/*.{ts,tsx}": "npm run typecheck-staged", + "**/*.css": "npm run lint:style", + "**/*.{md,mdx}": "npm run lint:spelling", + "**/*.{md,mdx,ts,js,tsx,jsx,json}": "npm run format" + }, + "dependencies": { + "@docusaurus/core": "^2.4.1", + "@docusaurus/plugin-client-redirects": "^2.4.1", + "@docusaurus/plugin-content-docs": "^2.4.1", + "@docusaurus/plugin-google-gtag": "^2.4.1", + "@docusaurus/plugin-google-tag-manager": "^2.4.1", + "@docusaurus/preset-classic": "^2.4.1", + "@docusaurus/theme-common": "^2.4.1", + "@easyops-cn/docusaurus-search-local": "^0.33.6", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "prism-react-renderer": "^1.3.5", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "redocusaurus": "^1.6.1", + "remark-docusaurus-tabs": "^0.2.0" + }, + "devDependencies": { + "@commitlint/cli": "^17.5.1", + "@commitlint/config-conventional": "^17.4.4", + "@docusaurus/module-type-aliases": "^2.4.1", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/git": "^10.0.1", + "@semantic-release/github": "^8.0.7", + "@semantic-release/npm": "^10.0.2", + "@semantic-release/release-notes-generator": "^10.0.3", + "@tsconfig/docusaurus": "^1.0.7", + "@typescript-eslint/eslint-plugin": "^5.57.0", + "@typescript-eslint/parser": "^5.57.0", + "cspell": "^6.31.1", + "cz-conventional-changelog": "^3.3.0", + "eslint": "^8.37.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-import-resolver-typescript": "^3.5.4", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "lint-staged": "^13.2.0", + "prettier": "^2.8.7", + "semantic-release": "^21.0.0", + "stylelint": "^14.16.1", + "stylelint-config-prettier": "^9.0.4", + "stylelint-config-standard": "^29.0.0", + "tsc-files": "^1.1.3", + "typescript": "^4.7.4" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "engines": { + "node": ">=18.12.1" + }, + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + } + } +} diff --git a/project-words.txt b/project-words.txt new file mode 100644 index 00000000000..98cfeed9b1d --- /dev/null +++ b/project-words.txt @@ -0,0 +1,698 @@ + +Ethminer +Ethstats +Graphi +Keycloak +Metaspace +PONLY +Prysm +Randao +Sirato +Snapsync +UPNPP +Worldstate +Xdns +Xhelp +Xrpc +aaaad +abernathyca +accountkey +acef +addpeer +adminorg +adoptopenjdk +adriaan +agan +alertmanager +alethio +alexandratran +alexbdebrie +alexey +algoliasearch +alloc +allowedfutureblocktime +anonymized +anshul +aoÃģt +apfs +apos +appender +appenders +appinstalled +applanga +architecting +astro +atrule +attnets +autoconverted +autogen +autogenerating +autohide +azuredeploy +backport +backticks +bartosz +beaconcha +beaconcha.in +beaon +beforeinstallprompt +besu +besudata +bhatt +blockheader +blocklist +blockperiod +blockperiodseconds +blockquotes +blockscout +bootnode +bootnodes +browserslist +browserstack +brqyo +buble +builtins +bytecode +caabernathy +cacheable +cakeshop +callcode +callouts +callstack +camelcase +candillon +cdabcdab +cdpath +cena +certfile +chaindata +changefreq +changeit +chedeau +cheng +clÊment +clientcert +clientkey +clsx +codefi +codegen +codeql +codesandbox +codespaces +colour +commitlint +configfile +configurability +consen +consensys +containerd +contravariance +corejs +corsdomain +crawlable +creativecommons +csapo +cssnano +csvg +customisation +customizability +dabit +daemonset +daishi +datadir +datagit +datapath +datas +datatypes +dbaeumer +dÊcembre +dedup +deduplicated +dÊja +deps +devcontainers +devs +devspace +devto +discport +distinguised +divio +dmitry +dname +docgen +dockerhub +docsearch +docsify +docu +docusuarus +docz +doesn +dogfood +dogfooding +dojocat +dumpconfig +dyte +eacces +easyops +ebscsi +ecatv +eips +eksctl +emitcheckpoints +emscripten +endi +endilie +endiliey +enode +enodes +enrtree +entrypoints +envr +epochlength +errnametoolong +esbenp +esbuild +eslintcache +estree +ethash +ethclient +ethdo +etherbase +ethereumj +ethsigner +ethsignerdata +ethstaker +evaluable +eventbus +evmtool +execa +exportblock +exportcert +exportcerts +extc +externalwaiting +failfast +failovers +fbid +fÊvrier +fienny +filebeat +fixeddifficulty +flac +fontawesome +foofoo +forkchoice +formik +fouc +freezerdb +froms +fromscratchistanbul +funboxteam +gabrielcsapo +gantt +gcmode +gcnodes +gcsize +gctime +genkey +genkeypair +getopts +getwork +gitgraph +gitpod +glibc +globbing +globby +goquorum +goss +goyal +gradlew +gruntfuggly +gtag +hahaha +hamel +hardcoding +hashrate +hasura +hdwallet +heavener +hÊctor +hÊllô +helloworld +helmfile +heuristical +hideable +hids +hola +horiz +hostman +hostnames +hoverable +husain +hyperledger +iamserviceaccount +ianad +ibft +idempotency +immer +immutabilitythreshold +importcert +importcerts +incentivizes +infima +inlines +inproc +insecureskipverify +intelli +interactiveness +interpolatable +investec +jakepartusch +jamstack +janvier +javadoc +javalin +jdbc +jemalloc +jfernandes +jmarcey +jmeter +jodyheavener +joshcena +jscodeshift +jssdk +jwtsecret +kaszubowski +katex +kato +keccak +keyalg +keyfile +keyid +keymanager +keyscan +keysize +keystorstore +keytar +keytool +keyvault +kinsta +knapen +kotti +koyeb +kubeconfig +kubenet +kubernetes +kumu +kvstore +lamana +libp +librocksdbjni +lifecycles +lightchaindata +lighthouserc +linenums +linkify +livenodes +livesize +localappdata +localizable +localport +localverify +longpaths +lorber +lowercased +lqip +lunrjs +mapbox +marcey +marocchino +massoud +mathjax +maxlynch +maxpeers +maxresdefault +mdast +mdxa +mdxast +mdxhast +medomain +meotherdomain +merkle +merkleroot +metadatum +metastring +metrica +metricbeat +metrika +microdata +middlewares +minerthreads +minifier +mitm +mixhash +mkcert +mkdir +mkdirs +mkdocs +mmvv +moesif +mordor +msapplication +multiaddresses +multikey +multitenancy +mycomputer +mydirectory +mydomain +mynode +mypath +mysecretfile +nabors +nakagawa +nand +navigations +navlink +nerdctl +netrc +netrestrict +networkid +newkey +newnode +nextra +ngryman +nisarag +nodekey +nodekeyhex +nodekeys +nodiscover +noexec +noflash +noicon +noindex +nojekyll +nomemory +nonheap +noninteractive +noreply +noreturndata +nostack +notime +nousb +npmjs +npmrc +nprogress +ntfs +nuxt +nwgi +offchain +offences +omitempty +onboarded +openapi +opensearch +opensearchdescription +opensource +optane +optimizt +optind +orgadmin +orta +outerbounds +overrideable +o’shannessy +pageview +palenight +paletton +palo +paraiso +passout +passwordfile +pathinfo +pathnames +paularmstrong +pbcopy +pcss +peaceiris +pega +pegasys +permissioned +permissioning +petstore +philpl +photoshop +pico +picocolors +picomatch +playbtn +pluggable +plushie +plushies +pnpm +posthog +pprof +preactjs +preauthenticated +precache +precached +precaching +preconfigured +preconnect +predeploy +prefetch +prefetching +preloads +prepended +preprocess +preprocessors +prerendered +prerendering +prerequest +prestate +previewlanguage +println +prismjs +privacymarker +privatefor +privatefrom +profilo +promtail +protobuf +protobuffet +prpl +pubkey +publickey +puppeth +pyltsyn +qbft +qdata +qjpuv +qlight +qlighttokenmanager +qnode +qovery +qpeers +quasis +quddus +quddÃēs +querystring +quickstart +quickwit +quorumengineering +quotify +rachelnabors +raftblocktime +raftdnsenable +raftjoinexisting +raftport +ramÃŗn +rawkey +reactjs +rearchitecture +recrawl +redirections +redoc +redocly +redocusaurus +redwoodjs +refactorings +referencetests +regexes +rehype +releaserc +remotekey +reponame +reqs +requesttimeout +requesttimeoutseconds +requireindex +resyncs +retesteth +retrocompatibility +retrocompatible +returndata +revertreason +rmiz +roadmap +rocketvalidator +rocksdb +rootca +rpcapi +rpcprefix +rtcts +rtlcss +saurus +scaleway +searchbar +sebastien +sÊbastien +sebastienlorber +secp +sensical +sepolia +serializers +serviceaccounts +setaf +setext +shiki +showinfo +sida +sighup +simen +simplestorage +skipverify +slashable +slashprotection +slorber +sluggified +sluggifies +sluggify +smartcard +solana +spÃĸce +ssszzz +stackblitz +stackblitzrc +staker +statefulset +storepass +storeraw +storetype +strikethrough +strikethroughs +styl +stylelint +stylelintignore +stylelintrc +subadmin +subdir +sublabel +sublicensable +sublist +subpage +subroute +subroutes +subsetting +subsubcategory +subsubfolder +subsubsection +subsubsubfolder +subtraces +sucipto +supabase +svgr +swizzlable +syncmode +teik +teku +tekudata +templating +temurin +thanos +therox +tmpdir +toolset +toplevel +tplh +tpms +transifex +transpiles +treeified +treeifies +treeify +treosh +triaging +trustcacerts +trustcerts +truststore +tses +twoslash +txnode +txpool +typecheck +typechecks +typedoc +typesense +uncompress +undergreen +unflat +unist +unlinkable +unlisteds +unlocalized +unmatch +unnormalized +unoptimized +unprefixed +unswizzle +unversioned +upcheck +upgr +upnp +upstreams +upvotes +urlset +userland +utilised +validatorcontractaddress +validatorselectionmode +vannicatte +vercel +verifymethod +vertx +vetter +vfile +vhosts +vicenti +vieira +viet +viewports +vinnik +vjeux +vyper +waivable +wcag +weab +webfactory +webp +webpackbar +webservice +websigner +wolcott +workdir +writeups +wsapi +wscat +xbeacon +xclip +xdoppelganger +xirzc +xlarge +xplorer +xsoar +yacop +yangshun +yangshunz +zhou +zoomable +zpao diff --git a/sidebars.js b/sidebars.js new file mode 100644 index 00000000000..5a8c0575d4a --- /dev/null +++ b/sidebars.js @@ -0,0 +1,7 @@ +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + publicDocSidebar: [{ type: "autogenerated", dirName: "public-networks" }], + privateDocSidebar: [{ type: "autogenerated", dirName: "private-networks" }], +}; + +module.exports = sidebars; diff --git a/src/components/HomepageCards/index.tsx b/src/components/HomepageCards/index.tsx new file mode 100644 index 00000000000..ddea4e11859 --- /dev/null +++ b/src/components/HomepageCards/index.tsx @@ -0,0 +1,94 @@ +import React from "react"; +import clsx from "clsx"; +import Link from "@docusaurus/Link"; +// import styles from "./styles.module.css"; + +type CardItem = { + title: string; + link: string; + description: JSX.Element; + buttonName: string; + buttonType: + | "primary" + | "secondary" + | "success" + | "info" + | "warning" + | "danger" + | "link"; +}; + +const CardList: CardItem[] = [ + { + title: "🌐 Public networks", + link: "/stable/public-networks", + // prettier-ignore + description: ( + <> + Run Besu as an execution client on Ethereum Mainnet and Ethereum public testnets, such as Goerli and Sepolia. + + ), + buttonName: "Get started", + buttonType: "secondary", + }, + { + title: "🔐 Private networks", + link: "/stable/private-networks", + // prettier-ignore + description: ( + <> + Use private networks for enterprise applications requiring secure, high-performance transaction processing. + + ), + buttonName: "Get started", + buttonType: "secondary", + }, +]; + +function Card({ title, link, description, buttonName, buttonType }: CardItem) { + return ( +
+
+
+
+

{title}

+
+
+

{description}

+
+
+ + {buttonName} + +
+
+
+
+ ); +} + +export default function HomepageCards(): JSX.Element { + return ( +
+
+

Hyperledger Besu Ethereum client

+

+ Hyperledger Besu is an open source Ethereum client developed under the + Apache 2.0 license and written in Java. It runs on public and private + networks: +

+
+ {CardList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 00000000000..1179c912ee0 --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,352 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-code-font-size: 95%; + --ifm-color-primary-lightest: #fff; + --ifm-color-primary-lighter: #fff; + --ifm-color-primary-light: #feffff; + --ifm-color-primary: #0056DD; + --ifm-color-primary-dark: #0056DD; + --ifm-color-primary-darker: #0056DD; + --ifm-color-primary-darkest: #0056DD; + --docusaurus-highlighted-code-line-bg: rgb(0 0 0 / 10%); + --ifm-navbar-link-color: #fff; +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme="dark"] { + --ifm-color-primary-lightest: #fff; + --ifm-color-primary-lighter: #fff; + --ifm-color-primary-light: #feffff; + --ifm-color-primary: #8BB8FF; + --ifm-color-primary-dark: #0056DD; + --ifm-color-primary-darker: #0056DD; + --ifm-color-primary-darkest: #0056DD; + --docusaurus-highlighted-code-line-bg: rgb(66 66 66 / 35%); +} + +/* github */ +.header-github-link:hover { + opacity: 0.6; +} + +.header-github-link::before { + content: ""; + width: 28px; + height: 28px; + display: flex; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme="light"] .header-github-link::before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme="dark"] .header-github-link::before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +/* discord */ +.header-discord-link:hover { + opacity: 0.6; +} + +.header-discord-link::before { + content: ""; + width: 28px; + height: 28px; + display: flex; + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAAq1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NbREAAAAOHRSTlMAAwUiKPrtBgqyF6NpLhsR9ec4DuG48Qh/cEPOXDNAHhRJV1Gel8lM3XmrhophwDvE2ZKDdKeP1JJ/9KAAABQfSURBVHja7MGBAAAAAICg/akXqQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYPDgQAAAAAgPxfG0FVVVVVVVVVVVVVVVVVVYVde91OFAYCABwIhXCTBqFSRFRQUeqlWs/uvP+T7Z7tj721TVSEtM73ABwyZMhMziCEEEIIIYQQQkhRWp/m3tx17T0MU9KVkt/t49mLV6SjMdMIasHAGRWJbcKfPNKNI/zFjJPKCHAfXMuAVuvv8KacdKGANy2/lQYjqEnMz1wTPuCQ9uXwgXs7oxZBDejvnjgIDHPSOgeEYs8YEHSBID+YIDIPu0g1PQIp0crAquAsGj1yEJqFFunG+GiCJLsKCDpJf2qD0H1CSaecbA+S+MrQCZLDqi2IuaEKEe09cvjl07yx6gZpDGL1Tp1Y9lYPuAcawspnEJv7qpVVNLkDWXaO7eE7jBmIxamS8bPSLUibGQT9i2URCC1ShfvqfhaBrKhQeCEd0MIYhHim/AVr4HGQZYcEvbIyDkK1cgf/xeUAz/A38FPw8iWS/zerWoKs9YTcOFqDkGuQhuiDwKH+rtqsDu5/5sljNt35tBcwXbtwVS7Iqim5YeEQRPhl5ZIe0HBaeMncXkRwir198Moddc6c82AbEyQtRuQ2aRUHke3o/O+erbcmNCGqV6U/sciJjFq+GFCytb0urTJB5Mk5+alsHBaJzeEaFodNThmRN5EuCB82N3ZDqJWmMCYnpQXrvU6KtSByPV928EsvTNktUH6OLqcRmjgs0VQyHozm3mwJrXtOUkeTWWsagRz+g707UUschqIAfFr2fSkigkIVWQQdEZnP8/5PNp/ODjQNM9Im6f1foUuSm5ObIbLBu24zxqiLeF74vNswVW+vOm9Bd0Q9nVtkwM2SMb7kEcOrDgcjGuLtoRtALX9BPUvny4P5EWPcV6EUdM159r+076dNDwrNGvVsmnBYs8IYtWbMw1/SWJuniYdI4Yx6Hp0tEHsPjDELEeny5rVI460WIaKENWpp38FJ4yLVtgEi+PlBh7bob58vo/+AWnoOTgXKK6pVJjguWKxom5eriDB4dUUtF67tEg3bVNrkcNSkbvCgr9R/vClFTIO11F0qDDVHVBrlcUR5XCvQavNp699fgV4DjvCeqNRfHE0HV+iCzSLAgXGHOgZu/AQaPaq0rz3sq9Zf6I7RXevwmyhQQ9GByaC/ptKsjD3BdE7XLOst/K00oI572zeKu0WqzCf7f/5b88p8n6Oyf5aluaGGotVxkVKNKsUh/uLdfKXL9k+0DIuO/wQaRarsfPwpt7Z8zq+hvwvxB39ADUVLlwPeK1XmVfwheLKn1Pd/5kMfv1W/UMPaxuXApEeF9i1+82/dm/Zpx5y7fcbrTWCbIVUqAX4Jd21mTW9awk+X99RgW1zojgr9MX7yxtn6+I8mXhs9xpvCJiEVZiX8EFy5P++LNn/2tDfKyYJFh6OArzpz2lyNGVf8lXzO9RhnBns0GWnm44M/7VGQryE+eGvGsSgsVmOEwi0++E99iu9WE3zId6i2gi2qjLBp4d1lPctD/6GLPN75M1d+Afc8ro535QeKPfMG3g0LVKnBDiGPWk4AIHilOOKtCwDhG1UsyYlteczMAxA8UkToDT3A29q/EGhF1jGCNYVCZ+rFDANWtJzd8tCyCrRmFBoHRMMeIz3CfAEPVUooDyj0Doj6FUYKYLw1DzzI13+C5dgbMMoapivzQF0Wfqd5eb5mFON3BHbcV5HHf7KLr4ywg9l8qfGdV8HwhOATxXk9wWSe7PGcW9vofmK3FOe2gMFkj//8OjDXDcX5GXxgMKsBz2SNYKoJRRKMvXHG7ZN95jA1GxZQfBobgyE7imQMYCKpAifHyHrwguJT2HpOTIpAaq4Xg/IUyTGwccwFRXI2ME2LIobbK0FZA8ZyeiXoZa/LR7oKhsUCxhSfx8KeMa62dzSXWXuCTYqkGdU4TA79nYsdx8RKFMkzaBooWdATuJgOdam7vz3eYAqZAp6FPW3DpOvLKdyrBkoS5BQOVgOfKdLxDCN8oTiBc5vCEgY+M9ObRtUp0lKHASy409tZJmQDJQuYphxSt6U4lUs7Qj5Figqp3ycmRYB/4k6zADfu+LZXBekqUyTC1M6RciDw3ziTCpAwaNpekKaQIm1VnErKwE65wumkDOyQItKTo0hfDieTLJhL1kiLJ1kwE7Q9nEQ2Al2TR0rkEkAzPEKXjABOSmtLsEFhhgZOIFEQ92yhR0YAR2mOATICOKuBFMhloOaYQZeEAd3kQ5PcD+SmG8STEcBhMyTNozCJh3iyBnBYHpqkMZybXpEw6Q1slj50SBbIXRMk6orCLHUkqkNhlh5iyXkAp4VI0DWFae6QoDcK04wQRxqDua0MNekO7rghdEhXCGetoCRRAOf5UJKNINflkZABhYkeEEMOhbutg2hSBsyCFhIxpTDTAipyUbzzKoggi8CM8BFBFoHZkEc06QuTAQ84ThaBGdHBcbIIzIoWjpPuwBmxwNmtKL6xdydKiQNRFEBvAkkQIYRRYVAWBVQURRmXuv//ZVPg7jikAyG5rTlfYElX5/VbunVd4j+KkbAfwsGWDVhQNsCWDZmz6PK6Xl66GdWmE+Zq8jjslcIwLPduuldnFDDEV75LHji66lXwkRsOb5mLy2Ho4AOnOsq9V+oAX/geeeBWbYCvtW92mLFx3cGX3F87TM6eIKDEnMwPHaxQGTaZmajrYoW9TsSkrLk7/Jq5OCojjnPSZCaiaxcx3JrHvFzjaza/EdQ6hAln5HH77lwYaJ8yJ2f4zPoQYLcNQ+0xt6xZhqFyk0lYUhIuM3NeHwnUfW7TbgBj7pgJWFIS7jBrzSoSCS65PSc2DFDV8C97h0JvA52XzLw6EvrFBGwYEnWZsR0HgMi/vTVAYmWPhuwIAkrM1hhrKUVMX1SV+VMSBwG23guxI7RQvZI1YfM1/mHnVPCtI7RV1bGmPo3plwOYJb+NZwJxwLlNJycHW1KlEYnKdo0LEu9yXdKU+nPSh4wnc5w9YHomLjYQ+DSif1XIH64m9SEL9klq3MDWoznpN6RazM6e0IsWNWxol0bU3xPfY3a62NwD07HvYEPtiCbU7wv7xXgy/3MAFY+p+GVdJ2UPW3HBzPSFSle32JzjM0sdvGNjM8gEqQg8mR6rEU1o14McZuZEaM86A+zbAly8sDINFDlCYeuNjfMUA7yxMA1UEype+EhHQBMCmWuFZ6IaSEtfp7S2yww9YgsmjCcTdj8LdBZjnWZknw9xuYpiCLgw42bmSIsTMY52FDhgLJks8JtrmXAEU8bRjgLPuZJcEiCdhpwQsPK17XOk7pHx9G66anMjHtJTYTzlKLDJ1UQT2UJXb865mnYUGHAF2RAAmKuEAAZ5SekosMQYoh1tDzq70Q0NyEaB5zQlc/BautLZjUqMpxsFTpmRUzyReN3EQYoajCUcBR4xhlIv0Dv3Om+yB4wjHAU6NKJTfXtRy78U/IpxhKPABldTPQXidwqzidZVU96GAyxMY5WRqlOZnJRxcVqmkzFxTl3xlqsDod66KeNINlXEV7OVt6650ALo0JDgtdE+44hM4XwWcQP3ACASkK7XymThCWYAQCXyvgAAkSNpYgFSFHI12SDQVVoAj0xEp5Id3xAqG71WKHQM3KEJreEa80KWYkMY0FAasJjTgOZ40AFXk00Fl2T6QQDQkOAzoh4NKA6394VK0xVmKgJUGquSVjF0Tl57WLCurfZJYOUh4LWKIdEW3gMA61oq3h2obexlqQIyn90aAGj0piTXl9lI1zgHijxzeosU7dOIYjVglxn6rRMDko6dgdTSKWBdS/iCD6GVG1r6HV2YW9gOtNQQ+sPv7Q0BSEDonoUEutCZyPUtHQ5damuk0xI7AnQ6MAY6izGx0MJSUKoHQacllFF/pBnF81SHprTGQ/vcXORa11HxqisTSycUOUIvHJ0D9t0T9+TR1gwGR0KhS9PClvBnZyL51OSaShtXz7Jrdt94dpYxF0YyGwB5ZuUmuhTAshsiX7VcbOyMlBm07dOU4nGqzuxNhTKvUYANuT4Tyf2lK4EXUENsxtknSYEXgxbumIzQ3pWsGCwUwU5JUqS1osrklPpC/zAPd0LDrM0AG3AmTESuIDyjMZUPWCXii/yfsPrDNShduttiLrxjoRGMjkI0mlgkUlRf09yVCACe1G3pBf7AsTQP9OzMFZpjKmMtDZ9rkHo+rMrcXDo6p5aoat/vz9DWPNCLmatTd/NKSGyvycQkPly554FezAKd1ruohITqEdclNGlbY578EpIIDrhFXSsqAO/U7M0DvfLOYa5xxK16dGDMHTN3fyzOA715aOtM300GMDSYMH8HFueB3olGMHE8YwYuXBhw76jAt7If6AtHZcSp3DEb/gniOIc+NeR+zVJqbstYpXHB7DRPHKzgDlV+ftK1ORH4yWQU4GtO75LZiu6r+I/BFYVUrE4E/uNgdIzPgt6jxxzsd+ptfOIMagqh3zsNnd7KtMwu+vXBcdutVMOwPJruM0f++Lpfr1ZctxLWz2unYj/+QmhpQ3NB59rNcxbs9cv2THAh92KARkajsJ6uzIBVIQmFVrYXtyzYa2rTUxGF9O1+j1JAYV2z71IKKKxn8n1KAYV1eBa9GFl4I1QPVqoFFZJzrbopvvCOyGWRasXAQjINm8dCCgL14KIabLey0PVG+bcX/0A9oXaA1k3uIwa2uNphSg6xoSHTM0O9yUKsZjlkWobY0DVTNIQ7ZSHGb9eZ60wH3jNNA6BafAdWOgpfxzHzv2sLwG+mya8AqO+z8B/eMOXP7lhsNngGAO49C1+6agMoc0nkBeEx0zXFwvEZC/84qAJAo8UlkfngHaasi6Whx8IH+z0sBBNKLYBbpq2PpaDDwhuv62DBmVFrAcyZuhKeNASu0FBx0caTB4otAJ/Gkl+31XhggWSnjWcPVFsA3IJWFS/KR/zxxg28uCJ/wgKgf4xX9R++BMaNj0euH7EAPl65Fx7wx/pL3p2oJwoDcQCfBBDwABTFC23dtq5HPbqt+n//J9uvX/fQKgpqYoK/J2g1xGFmkln59A9bAcB9LABYJm3xXNylnXtv2ASf7mQBwKrQNuMOd4FSkbbwJb7cyQLYO7lc/IW7MnmgbXyOL6otgAjCjGlXM76fc4ivRdoRbrBFpVpACeKs6Rv+dBcNI0G5SbuMCPvUKAd7EKhh03e93AcDmwFLM59fmdmRUwhUf6Q9/keA3LLevbRNN2qMPBQ99Myq0T62yGm1eFJhtMdZQpg3ptAQ5gQtOqTYyl25OGo/0gFGFeIY9EmlxuADlg4dwmq5yg65PZbpw1VmCPunFwhlJf2d9mCDXCiUw4T/cIUkqoyL+MTrEKtkUwKjpX9EuKpQgkoB36kWAHx5DCBWoUeJzKnO4UD3h0MJ2BQiRSH9oX4gCODZpmRGS89zhaPYp0TGCCJZHv2lx+y4qklHsMov3faBzVNIyewXJFDnluAdYwi3CokoJ/tAvezTMYMAidQ4E7jnGcJZM0ZHMXOqwxoIWgYdFa6QQKEM4HdsDvEKfTrFH6idH4haHh3HWxBtRQLwISRwfTrJWTwrGhBYLxVGJyyqEM1lJALvQoZxk05jD7Fyt1jPY49OMpbYp8f3T2R3IcVrk9JgXqxM0agbe4xOM5cQr8FIlOYIUgQzTuk4vY+bt5WPWouQjpJ6FKrLSRxnBDmsNqe0WHHwEuE23JlpUzreM2RocBLJHkKSQmxTBn7tYwip6utOkVIzGzhBkQshTuENSPNapExYsd8aQjzLLVdCyoAtujhK5ff/79gK8nT7jLKyvX7btSBGYdWuPTLKpDkrQJIPOkKnnOB/1TikM7DQ6JSfN7ie7vpH5ZFTZg+/kIIyI6JSaUOq5aBJ52p6tXjaqOJsm0lr1jeLDp3F+VGHPH2SZWFBLrfG6SI8LJr9H+OXeQFp1N3X8qDihZzSUaGprfBA8hSrkC0pyZodtx3fM8xa5ylu/zeLB51az/R8h1MWqvQydR2SqTmHdMG7QXpg8ivXJUYZqXWDZEoPpD6nU7KQksLl/9PMCOkpctBNBj+AbKMi3YIzh1xD0kIPkk1sug22hkyWT3poQyarT7fTiyBPhXThQp55SLfEf0GWGWnDrkOWD0Y3VolwhEZlri3ajNt8U+G1yJlAgjdOOnmCDO2bP/5fzCqSKXjOSYZ3CDf0SBX8FQfcZwD4BxtCrGhAKjE22KN5outCzSpEmtqkmFoVwqxJQx7EmaiYEmGxBTHmpKU+BHkzSU1+CSJEDunpHSJET4rE/mk63xW66SgTdTOChYHCX7+YXeAnaYu/4bqCmQbpEMPFp7sqAcspDdf7ij/9f4VtC4Ait12fRcXS8Ej1zX9bsxzgKurKve5mFOM6JtpFQqarxl3HZ1PoFIX1ruXnELYDXKhD2rs8J7ysabT372K1CS4xpRwII1wgGKtT8jkLr6xwLpdywcDZSj1tH/4tTse9hxaAazcHRC0jD9/+F157CZCRpWXgc9AaWRXG2kX9J/mDErLoUX40kMVwpvnvfiJulrs57AG9Zpdo6cnLz8aftAgaeesBvdJ968OykZew5zd797JDMABEAdQrElrvxKMJYWFDS0LQ//8yC0u0EhbanvMJk8xqbu7kqHej6yjNcivbJMZpluklXA5KvvlPGt3jYtdOXxoWLQOaL3zXRDDfNGe16qpPmo/ihpJEAD58vDPq7JNVa130S8dPNSb9XpScT0Gw/dfI03fCwy6I4zBqrau88QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBvDw4JAAAAAAT9f+0MCwAAAAAAAAAAAAAAAAAAAAAAAPAK8EICyXknp24AAAAASUVORK5CYII="); + background-size: cover; +} + +html[data-theme="light"] .header-discord-link::before { + filter: invert(100%); +} + +html[data-theme="dark"] .header-discord-link::before { + filter: invert(100%); +} + +/* twitter */ +.header-twitter-link:hover { + opacity: 0.6; +} + +.header-twitter-link::before { + content: ""; + width: 28px; + height: 28px; + display: flex; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M22.46 6c-.77.35-1.6.58-2.46.69.88-.53 1.56-1.37 1.88-2.38-.83.5-1.75.85-2.72 1.05C18.37 4.5 17.26 4 16 4c-2.35 0-4.27 1.92-4.27 4.29 0 .34.04.67.11.98C8.28 9.09 5.11 7.38 3 4.79c-.37.63-.58 1.37-.58 2.15 0 1.49.75 2.81 1.91 3.56-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.22 4.22 0 0 1-1.93.07 4.28 4.28 0 0 0 4 2.98 8.521 8.521 0 0 1-5.33 1.84c-.34 0-.68-.02-1.02-.06C3.44 20.29 5.7 21 8.12 21 16 21 20.33 14.46 20.33 8.79c0-.19 0-.37-.01-.56.84-.6 1.56-1.36 2.14-2.23z'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme="light"] .header-twitter-link::before { + content: ""; + width: 28px; + height: 28px; + display: flex; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M22.46 6c-.77.35-1.6.58-2.46.69.88-.53 1.56-1.37 1.88-2.38-.83.5-1.75.85-2.72 1.05C18.37 4.5 17.26 4 16 4c-2.35 0-4.27 1.92-4.27 4.29 0 .34.04.67.11.98C8.28 9.09 5.11 7.38 3 4.79c-.37.63-.58 1.37-.58 2.15 0 1.49.75 2.81 1.91 3.56-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.22 4.22 0 0 1-1.93.07 4.28 4.28 0 0 0 4 2.98 8.521 8.521 0 0 1-5.33 1.84c-.34 0-.68-.02-1.02-.06C3.44 20.29 5.7 21 8.12 21 16 21 20.33 14.46 20.33 8.79c0-.19 0-.37-.01-.56.84-.6 1.56-1.36 2.14-2.23z'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme="dark"] .header-twitter-link::before { + content: ""; + width: 28px; + height: 28px; + display: flex; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M22.46 6c-.77.35-1.6.58-2.46.69.88-.53 1.56-1.37 1.88-2.38-.83.5-1.75.85-2.72 1.05C18.37 4.5 17.26 4 16 4c-2.35 0-4.27 1.92-4.27 4.29 0 .34.04.67.11.98C8.28 9.09 5.11 7.38 3 4.79c-.37.63-.58 1.37-.58 2.15 0 1.49.75 2.81 1.91 3.56-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.22 4.22 0 0 1-1.93.07 4.28 4.28 0 0 0 4 2.98 8.521 8.521 0 0 1-5.33 1.84c-.34 0-.68-.02-1.02-.06C3.44 20.29 5.7 21 8.12 21 16 21 20.33 14.46 20.33 8.79c0-.19 0-.37-.01-.56.84-.6 1.56-1.36 2.14-2.23z'/%3E%3C/svg%3E") + no-repeat; +} + +/* dockerhub */ +.header-dockerhub-link:hover { + opacity: 0.6; +} + +.header-dockerhub-link::before { + content: ""; + width: 28px; + height: 28px; + display: flex; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' id='Layer_1' data-name='Layer 1' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M507 211.16c-1.42-1.19-14.25-10.94-41.79-10.94a132.55 132.55 0 0 0-21.61 1.9c-5.22-36.4-35.38-54-36.57-55l-7.36-4.28-4.75 6.9a101.65 101.65 0 0 0-13.06 30.45c-5 20.7-1.9 40.2 8.55 56.85-12.59 7.14-33 8.8-37.28 9H15.94A15.93 15.93 0 0 0 0 262.07 241.25 241.25 0 0 0 14.75 348.9C26.39 379.35 43.72 402 66 415.74 91.22 431.2 132.3 440 178.6 440a344.23 344.23 0 0 0 62.45-5.71 257.44 257.44 0 0 0 81.69-29.73 223.55 223.55 0 0 0 55.57-45.67c26.83-30.21 42.74-64 54.38-94h4.75c29.21 0 47.26-11.66 57.23-21.65a63.31 63.31 0 0 0 15.2-22.36l2.14-6.18Z'/%3E%3Cpath d='M47.29 236.37H92.4a4 4 0 0 0 4-4h0V191.89a4 4 0 0 0-4-4H47.29a4 4 0 0 0-4 4h0v40.44a4.16 4.16 0 0 0 4 4h0'/%3E%3Cpath d='M109.5 236.37h45.12a4 4 0 0 0 4-4h0V191.89a4 4 0 0 0-4-4H109.5a4 4 0 0 0-4 4v40.44a4.16 4.16 0 0 0 4 4'/%3E%3Cpath d='M172.9 236.37H218a4 4 0 0 0 4-4h0V191.89a4 4 0 0 0-4-4H172.9a4 4 0 0 0-4 4h0v40.44a3.87 3.87 0 0 0 4 4h0'/%3E%3Cpath d='M235.36 236.37h45.12a4 4 0 0 0 4-4V191.89a4 4 0 0 0-4-4H235.36a4 4 0 0 0-4 4h0v40.44a4 4 0 0 0 4 4h0'/%3E%3Cpath d='M109.5 178.57h45.12a4.16 4.16 0 0 0 4-4V134.09a4 4 0 0 0-4-4H109.5a4 4 0 0 0-4 4v40.44a4.34 4.34 0 0 0 4 4'/%3E%3Cpath d='M172.9 178.57H218a4.16 4.16 0 0 0 4-4V134.09a4 4 0 0 0-4-4H172.9a4 4 0 0 0-4 4h0v40.44a4 4 0 0 0 4 4'/%3E%3Cpath d='M235.36 178.57h45.12a4.16 4.16 0 0 0 4-4V134.09a4.16 4.16 0 0 0-4-4H235.36a4 4 0 0 0-4 4h0v40.44a4.16 4.16 0 0 0 4 4'/%3E%3Cpath d='M235.36 120.53h45.12a4 4 0 0 0 4-4V76a4.16 4.16 0 0 0-4-4H235.36a4 4 0 0 0-4 4h0v40.44a4.17 4.17 0 0 0 4 4'/%3E%3Cpath d='M298.28 236.37H343.4a4 4 0 0 0 4-4V191.89a4 4 0 0 0-4-4H298.28a4 4 0 0 0-4 4h0v40.44a4.16 4.16 0 0 0 4 4'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme="dark"] .header-dockerhub-link::before { + filter: invert(100%); +} + + +@media only screen and (max-width: 525px) { + .menu__link { + display: flex; + justify-content: flex-start; + align-items: center; + } + + .header-github-link::after { + margin-left: 20px; + content: "Github "; + } + + .header-twitter-link::after { + margin-left: 20px; + content: "Twitter "; + } + + .header-discord-link::after { + margin-left: 20px; + content: "Discord "; + } + + .header-dockerhub-link::after { + margin-left: 20px; + content: "DockerHub "; + } +} + +/* Make navbar looks friendly on small devices. */ +@media only screen and (max-width: 400px) { + .nav_src-pages-index-module .linkItem_src-pages-index-module { + padding-right: 0 !important; + } + + .nav_src-pages-index-module { + width: 100% !important; + } + + .socialLinks_src-pages-index-module { + display: none !important; + } +} +/* Sidebar Method labels */ +.api-method > .menu__link { + align-items: center; + justify-content: start; +} + +.api-method > .menu__link::before { + width: 50px; + height: 20px; + font-size: 12px; + line-height: 20px; + text-transform: uppercase; + font-weight: 600; + border-radius: 0.25rem; + border: 1px solid; + border-inline-start-width: 5px; + margin-right: var(--ifm-spacing-horizontal); + text-align: center; + flex-shrink: 0; +} + +.get > .menu__link::before { + content: "get"; + background-color: var(--ifm-color-info-contrast-background); + color: var(--ifm-color-info-contrast-foreground); + border-color: var(--ifm-color-info-dark); +} + +.post > .menu__link::before { + content: "post"; + background-color: var(--ifm-color-success-contrast-background); + color: var(--ifm-color-success-contrast-foreground); + border-color: var(--ifm-color-success-dark); +} + +.delete > .menu__link::before { + content: "del"; + background-color: var(--ifm-color-danger-contrast-background); + color: var(--ifm-color-danger-contrast-foreground); + border-color: var(--ifm-color-danger-dark); +} + +.put > .menu__link::before { + content: "put"; + background-color: var(--ifm-color-warning-contrast-background); + color: var(--ifm-color-warning-contrast-foreground); + border-color: var(--ifm-color-warning-dark); +} + +.patch > .menu__link::before { + content: "patch"; + background-color: var(--ifm-color-success-contrast-background); + color: var(--ifm-color-success-contrast-foreground); + border-color: var(--ifm-color-success-dark); +} + +.head > .menu__link::before { + content: "head"; + background-color: var(--ifm-color-secondary-contrast-background); + color: var(--ifm-color-secondary-contrast-foreground); + border-color: var(--ifm-color-secondary-dark); +} + +.event > .menu__link::before { + content: "event"; + background-color: var(--ifm-color-secondary-contrast-background); + color: var(--ifm-color-secondary-contrast-foreground); + border-color: var(--ifm-color-secondary-dark); +} + +/* Algolia Search Styling */ + +.DocSearch-Logo { + display: none !important; +} + +.DocSearch-Footer { + justify-content: flex-start !important; +} + +[data-theme="light"] .DocSearch { + /* --docsearch-primary-color: var(--ifm-color-primary); */ + /* --docsearch-text-color: var(--ifm-font-color-base); */ + --docsearch-muted-color: var(--ifm-color-secondary-darkest); + --docsearch-container-background: rgba(94 100 112 70%); + /* Modal */ + --docsearch-modal-background: var(--ifm-color-secondary-lighter); + /* Search box */ + --docsearch-searchbox-background: var(--ifm-color-secondary); + --docsearch-searchbox-focus-background: var(--ifm-color-white); + /* Hit */ + --docsearch-hit-color: var(--ifm-font-color-base); + --docsearch-hit-active-color: var(--ifm-color-white); + --docsearch-hit-background: var(--ifm-color-white); + /* Footer */ + --docsearch-footer-background: var(--ifm-color-white); +} + +[data-theme="dark"] .DocSearch { + --docsearch-text-color: var(--ifm-font-color-base); + --docsearch-muted-color: var(--ifm-color-secondary-darkest); + --docsearch-container-background: rgba(47 55 69 70%); + /* Modal */ + --docsearch-modal-background: var(--ifm-background-color); + /* Search box */ + --docsearch-searchbox-background: var(--ifm-background-color); + --docsearch-searchbox-focus-background: var(--ifm-color-black); + /* Hit */ + --docsearch-hit-color: var(--ifm-font-color-base); + --docsearch-hit-active-color: var(--ifm-color-white); + --docsearch-hit-background: var(--ifm-color-emphasis-100); + /* Footer */ + --docsearch-footer-background: var(--ifm-background-surface-color); + --docsearch-key-gradient: linear-gradient( + -26.5deg, + var(--ifm-color-emphasis-200) 0%, + var(--ifm-color-emphasis-100) 100% + ); +} + +h1 { + font-size: 32px; + padding-top: 5px; +} + +h2 { + font-size: 24px; +} + +h3 { + font-size: 18px; +} + +h4 { + font-size: 16px; +} + +.homepageContainer { + max-width: 1030px; +} + +.homepageTitle { + font-size: 40px; + padding-top: 20px; + padding-bottom: 5px; +} + +img { + border-radius: 0.4rem; +} + +.footer__copyright { + font-size: 13px; +} + +.footer__item { + font-size: 14px; +} + +.navbar { + background-color: #3D5C6B; + box-shadow: var(--ifm-navbar-shadow); + display: flex; + height: var(--ifm-navbar-height); + padding: var(--ifm-navbar-padding-vertical) + var(--ifm-navbar-padding-horizontal); +} + +.clean-btn { + background: none; + border: none; + color: #fff; + cursor: pointer; + font-family: inherit; + padding: 0; +} + +.navbar__link { + color: var(--ifm-navbar-link-color); + font-weight: var(--ifm-font-weight-semibold); +} diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 00000000000..f39fb8631f3 --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,69 @@ +import React from "react"; +import Layout from "@theme/Layout"; +import HomepageCards from "@site/src/components/HomepageCards"; + +function HomepageText() { + return ( +
+

What does Besu support?

+

+ Besu includes a{" "} + + command line interface + {" "} + and{" "} + + JSON-RPC API + {" "} + for running, maintaining, debugging, and monitoring nodes in an Ethereum + network. You can use the API via RPC over HTTP or via WebSocket. Besu + also supports Pub/Sub. +

+

+ Besu supports common smart contract and dapp development, deployment, + and operational use cases, using tools such as{" "} + Truffle + Remix, and{" "} + web3js. The client supports common + JSON-RPC API methods such as eth, net,{" "} + web3, debug, and miner. +

+

+ Besu doesn't support key management inside the client. You can use{" "} + Ethsigner{" "} + with Besu to access your keystore and sign transactions. +

+ +

Questions?

+

+ If you have any questions about Besu, ask on the besu channel on{" "} + Hyperledger Discord. +

+

+ Learn more about the{" "} + Hyperledger Foundation. + You can{" "} + + contribute to the documentation + {" "} + or to{" "} + + Besu itself + + . +

+
+ ); +} + +export default function Home(): JSX.Element { + // const { siteConfig } = useDocusaurusContext(); + return ( + +
+ + +
+
+ ); +} diff --git a/src/theme/DocItem/Footer/index.jsx b/src/theme/DocItem/Footer/index.jsx new file mode 100644 index 00000000000..e36894d137c --- /dev/null +++ b/src/theme/DocItem/Footer/index.jsx @@ -0,0 +1,52 @@ +import React from "react"; +import clsx from "clsx"; +import { ThemeClassNames } from "@docusaurus/theme-common"; +import { useDoc } from "@docusaurus/theme-common/internal"; +import LastUpdated from "@theme/LastUpdated"; +import EditThisPage from "@theme/EditThisPage"; +import styles from "./styles.module.css"; + +function EditMetaRow({ + editUrl, + lastUpdatedAt, + lastUpdatedBy, + formattedLastUpdatedAt, +}) { + return ( +
+
{editUrl && }
+ +
+ {(lastUpdatedAt || lastUpdatedBy) && ( + + )} +
+
+ ); +} +export default function DocItemFooter() { + const { metadata } = useDoc(); + const { editUrl, lastUpdatedAt, formattedLastUpdatedAt, lastUpdatedBy } = + metadata; + const canDisplayEditMetaRow = !!(editUrl || lastUpdatedAt || lastUpdatedBy); + if (!canDisplayEditMetaRow) { + return null; + } + return ( +
+ {canDisplayEditMetaRow && ( + + )} +
+ ); +} diff --git a/src/theme/DocItem/Footer/styles.module.css b/src/theme/DocItem/Footer/styles.module.css new file mode 100644 index 00000000000..7c1e9644191 --- /dev/null +++ b/src/theme/DocItem/Footer/styles.module.css @@ -0,0 +1,11 @@ +.lastUpdated { + margin-top: 0.2rem; + font-style: italic; + font-size: smaller; +} + +@media (min-width: 997px) { + .lastUpdated { + text-align: right; + } +} diff --git a/src/theme/DocItem/Layout/index.jsx b/src/theme/DocItem/Layout/index.jsx new file mode 100644 index 00000000000..0b446d92616 --- /dev/null +++ b/src/theme/DocItem/Layout/index.jsx @@ -0,0 +1,53 @@ +import React from "react"; +import clsx from "clsx"; +import { useWindowSize } from "@docusaurus/theme-common"; +import { useDoc } from "@docusaurus/theme-common/internal"; +import DocItemPaginator from "@theme/DocItem/Paginator"; +import DocVersionBanner from "@theme/DocVersionBanner"; +import DocItemFooter from "@theme/DocItem/Footer"; +import DocItemTags from "@theme/DocItem/Tags"; +import DocItemTOCMobile from "@theme/DocItem/TOC/Mobile"; +import DocItemTOCDesktop from "@theme/DocItem/TOC/Desktop"; +import DocItemContent from "@theme/DocItem/Content"; +import DocBreadcrumbs from "@theme/DocBreadcrumbs"; +import styles from "./styles.module.css"; +/** + * Decide if the toc should be rendered, on mobile or desktop viewports + */ +function useDocTOC() { + const { frontMatter, toc } = useDoc(); + const windowSize = useWindowSize(); + const hidden = frontMatter.hide_table_of_contents; + const canRender = !hidden && toc.length > 0; + const mobile = canRender ? : undefined; + const desktop = + canRender && (windowSize === "desktop" || windowSize === "ssr") ? ( + + ) : undefined; + return { + hidden, + mobile, + desktop, + }; +} +export default function DocItemLayout({ children }) { + const docTOC = useDocTOC(); + return ( +
+
+ +
+
+ + + {docTOC.mobile} + {children} + +
+ +
+
+ {docTOC.desktop &&
{docTOC.desktop}
} +
+ ); +} diff --git a/src/theme/DocItem/Layout/styles.module.css b/src/theme/DocItem/Layout/styles.module.css new file mode 100644 index 00000000000..d5aaec1322c --- /dev/null +++ b/src/theme/DocItem/Layout/styles.module.css @@ -0,0 +1,10 @@ +.docItemContainer header + *, +.docItemContainer article > *:first-child { + margin-top: 0; +} + +@media (min-width: 997px) { + .docItemCol { + max-width: 75% !important; + } +} diff --git a/src/theme/DocItem/Tags/index.jsx b/src/theme/DocItem/Tags/index.jsx new file mode 100644 index 00000000000..97cd855cf86 --- /dev/null +++ b/src/theme/DocItem/Tags/index.jsx @@ -0,0 +1,35 @@ +import React from "react"; +import clsx from "clsx"; +import { ThemeClassNames } from "@docusaurus/theme-common"; +import { useDoc } from "@docusaurus/theme-common/internal"; +import TagsListInline from "@theme/TagsListInline"; + +function TagsRow(props) { + return ( +
+
+ +
+
+ ); +} + +export default function DocItemTags() { + const { metadata } = useDoc(); + const { tags } = metadata; + const canDisplayTagsRow = tags.length > 0; + return ( +
+ {canDisplayTagsRow && } +
+ ); +} diff --git a/src/theme/DocVersionBadge/index.jsx b/src/theme/DocVersionBadge/index.jsx new file mode 100644 index 00000000000..2cd5a09ecd2 --- /dev/null +++ b/src/theme/DocVersionBadge/index.jsx @@ -0,0 +1,3 @@ +export default function DocVersionBadge({ className }) { + return null; +} diff --git a/src/theme/DocVersionBanner/index.jsx b/src/theme/DocVersionBanner/index.jsx new file mode 100644 index 00000000000..112265955a4 --- /dev/null +++ b/src/theme/DocVersionBanner/index.jsx @@ -0,0 +1,119 @@ +import React from "react"; +import clsx from "clsx"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import Link from "@docusaurus/Link"; +import Translate from "@docusaurus/Translate"; +import { + useActivePlugin, + useDocVersionSuggestions, +} from "@docusaurus/plugin-content-docs/client"; +import { ThemeClassNames } from "@docusaurus/theme-common"; +import { + useDocsPreferredVersion, + useDocsVersion, +} from "@docusaurus/theme-common/internal"; +function UnreleasedVersionLabel({ siteTitle, versionMetadata }) { + return ( + {versionMetadata.label}, + }}> + { + "This is the development version of the documentation and some features may not yet be available in the stable release." + } + + ); +} +function UnmaintainedVersionLabel({ siteTitle, versionMetadata }) { + return ( + {versionMetadata.label}, + }}> + { + "This is documentation for Besu version {versionLabel}, which is no longer actively maintained." + } + + ); +} +const BannerLabelComponents = { + unreleased: UnreleasedVersionLabel, + unmaintained: UnmaintainedVersionLabel, +}; +function BannerLabel(props) { + const BannerLabelComponent = + BannerLabelComponents[props.versionMetadata.banner]; + return ; +} +function LatestVersionSuggestionLabel({ versionLabel, to, onClick }) { + return ( + + + stable version + + + ), + }}> + {" You can switch to the {latestVersionLink} ({versionLabel})."} + + ); +} +function DocVersionBannerEnabled({ className, versionMetadata }) { + const { + siteConfig: { title: siteTitle }, + } = useDocusaurusContext(); + const { pluginId } = useActivePlugin({ failfast: true }); + const getVersionMainDoc = (version) => + version.docs.find((doc) => doc.id === version.mainDocId); + const { savePreferredVersionName } = useDocsPreferredVersion(pluginId); + const { latestDocSuggestion, latestVersionSuggestion } = + useDocVersionSuggestions(pluginId); + // Try to link to same doc in latest version (not always possible), falling + // back to main doc of latest version + const latestVersionSuggestedDoc = + latestDocSuggestion ?? getVersionMainDoc(latestVersionSuggestion); + return ( +
+
+ + savePreferredVersionName(latestVersionSuggestion.name)} + /> +
+
+ ); +} +export default function DocVersionBanner({ className }) { + const versionMetadata = useDocsVersion(); + if (versionMetadata.banner) { + return ( + + ); + } + return null; +} diff --git a/static/.nojekyll b/static/.nojekyll new file mode 100644 index 00000000000..e69de29bb2d diff --git a/custom_theme/favicon.svg b/static/img/favicon.svg similarity index 100% rename from custom_theme/favicon.svg rename to static/img/favicon.svg diff --git a/custom_theme/logo-reversed.svg b/static/img/logo-reversed.svg similarity index 100% rename from custom_theme/logo-reversed.svg rename to static/img/logo-reversed.svg diff --git a/custom_theme/logo.svg b/static/img/logo.svg similarity index 100% rename from custom_theme/logo.svg rename to static/img/logo.svg diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000000..6f4756980d4 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@tsconfig/docusaurus/tsconfig.json", + "compilerOptions": { + "baseUrl": "." + } +} diff --git a/versioned_docs/version-23.4.0/assets/images/Besu-Tessera-High-Availability.png b/versioned_docs/version-23.4.0/assets/images/Besu-Tessera-High-Availability.png new file mode 100644 index 00000000000..12c9f0c36f6 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/Besu-Tessera-High-Availability.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/Besu_TLS.png b/versioned_docs/version-23.4.0/assets/images/Besu_TLS.png new file mode 100644 index 00000000000..fafefc057b4 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/Besu_TLS.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/Bonsai_tries.png b/versioned_docs/version-23.4.0/assets/images/Bonsai_tries.png new file mode 100644 index 00000000000..7e15f349bc4 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/Bonsai_tries.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/CliqueOneIntialSigner.png b/versioned_docs/version-23.4.0/assets/images/CliqueOneIntialSigner.png new file mode 100644 index 00000000000..a04c660f776 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/CliqueOneIntialSigner.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/CliqueTwoIntialSigners.png b/versioned_docs/version-23.4.0/assets/images/CliqueTwoIntialSigners.png new file mode 100644 index 00000000000..57831af0240 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/CliqueTwoIntialSigners.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/EnodeStartup.png b/versioned_docs/version-23.4.0/assets/images/EnodeStartup.png new file mode 100644 index 00000000000..a0aea823b83 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/EnodeStartup.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/Execution-Consensus-Clients.png b/versioned_docs/version-23.4.0/assets/images/Execution-Consensus-Clients.png new file mode 100644 index 00000000000..97c7962619c Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/Execution-Consensus-Clients.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/GraphiQL.png b/versioned_docs/version-23.4.0/assets/images/GraphiQL.png new file mode 100644 index 00000000000..3a8f9705ff1 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/GraphiQL.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/Hyperledger-Besu-Client-Libraries.png b/versioned_docs/version-23.4.0/assets/images/Hyperledger-Besu-Client-Libraries.png new file mode 100644 index 00000000000..85bb59af754 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/Hyperledger-Besu-Client-Libraries.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/Hyperledger-Besu-Plugin-API.png b/versioned_docs/version-23.4.0/assets/images/Hyperledger-Besu-Plugin-API.png new file mode 100644 index 00000000000..b5c4e56ac98 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/Hyperledger-Besu-Plugin-API.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/JWT.png b/versioned_docs/version-23.4.0/assets/images/JWT.png new file mode 100644 index 00000000000..069e6488897 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/JWT.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/KibanaQuickstart.png b/versioned_docs/version-23.4.0/assets/images/KibanaQuickstart.png new file mode 100644 index 00000000000..395337842c8 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/KibanaQuickstart.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/LoadBalancer.png b/versioned_docs/version-23.4.0/assets/images/LoadBalancer.png new file mode 100644 index 00000000000..4c4c4aaf5f4 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/LoadBalancer.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/Multi-tenancy.png b/versioned_docs/version-23.4.0/assets/images/Multi-tenancy.png new file mode 100644 index 00000000000..cbc3b537074 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/Multi-tenancy.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/OrionNodes.png b/versioned_docs/version-23.4.0/assets/images/OrionNodes.png new file mode 100644 index 00000000000..a8fd413ccff Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/OrionNodes.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/PermissioningFlow.png b/versioned_docs/version-23.4.0/assets/images/PermissioningFlow.png new file mode 100644 index 00000000000..dafa2f6a94e Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/PermissioningFlow.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/PortConfiguration.png b/versioned_docs/version-23.4.0/assets/images/PortConfiguration.png new file mode 100644 index 00000000000..7522147db46 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/PortConfiguration.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/PrivacyGroups.png b/versioned_docs/version-23.4.0/assets/images/PrivacyGroups.png new file mode 100644 index 00000000000..8d01cfa2720 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/PrivacyGroups.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/PrivateTransactionProcessing.png b/versioned_docs/version-23.4.0/assets/images/PrivateTransactionProcessing.png new file mode 100644 index 00000000000..d8a2eecaa5f Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/PrivateTransactionProcessing.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/TesseraNodes.png b/versioned_docs/version-23.4.0/assets/images/TesseraNodes.png new file mode 100644 index 00000000000..5e195f403c5 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/TesseraNodes.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/alethio-light-explorer-screenshot.png b/versioned_docs/version-23.4.0/assets/images/alethio-light-explorer-screenshot.png new file mode 100644 index 00000000000..b3bf1125004 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/alethio-light-explorer-screenshot.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/besu-cpu-pattern-during-sync.png b/versioned_docs/version-23.4.0/assets/images/besu-cpu-pattern-during-sync.png new file mode 100644 index 00000000000..e345bb212dc Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/besu-cpu-pattern-during-sync.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/block-time.png b/versioned_docs/version-23.4.0/assets/images/block-time.png new file mode 100644 index 00000000000..914c186237d Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/block-time.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/create-resource-button-screenshot.png b/versioned_docs/version-23.4.0/assets/images/create-resource-button-screenshot.png new file mode 100644 index 00000000000..85de6d9eced Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/create-resource-button-screenshot.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/dapp-explorer-tx.png b/versioned_docs/version-23.4.0/assets/images/dapp-explorer-tx.png new file mode 100644 index 00000000000..700f5c47e74 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/dapp-explorer-tx.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/dapp-metamask-tx.png b/versioned_docs/version-23.4.0/assets/images/dapp-metamask-tx.png new file mode 100644 index 00000000000..766a6eb59a5 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/dapp-metamask-tx.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/dapp-ui.png b/versioned_docs/version-23.4.0/assets/images/dapp-ui.png new file mode 100644 index 00000000000..fc730254492 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/dapp-ui.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/dashboard.png b/versioned_docs/version-23.4.0/assets/images/dashboard.png new file mode 100644 index 00000000000..761579ac613 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/dashboard.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/deployment-complete-screenshot.png b/versioned_docs/version-23.4.0/assets/images/deployment-complete-screenshot.png new file mode 100644 index 00000000000..d16683d37bc Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/deployment-complete-screenshot.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/enterprise-ethereum-account-permissioning.png b/versioned_docs/version-23.4.0/assets/images/enterprise-ethereum-account-permissioning.png new file mode 100644 index 00000000000..684e01ccd8c Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/enterprise-ethereum-account-permissioning.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/ethstats.png b/versioned_docs/version-23.4.0/assets/images/ethstats.png new file mode 100644 index 00000000000..c491b24398a Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/ethstats.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/explorer.png b/versioned_docs/version-23.4.0/assets/images/explorer.png new file mode 100644 index 00000000000..6a3eb733ea5 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/explorer.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/fastsync.png b/versioned_docs/version-23.4.0/assets/images/fastsync.png new file mode 100644 index 00000000000..7ab329c8769 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/fastsync.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/forest_of_tries.png b/versioned_docs/version-23.4.0/assets/images/forest_of_tries.png new file mode 100644 index 00000000000..e6e73bbb954 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/forest_of_tries.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/grafana.png b/versioned_docs/version-23.4.0/assets/images/grafana.png new file mode 100644 index 00000000000..c9339f249a7 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/grafana.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/grafana_loki.png b/versioned_docs/version-23.4.0/assets/images/grafana_loki.png new file mode 100644 index 00000000000..7fcdbc9637d Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/grafana_loki.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/io-utilization.png b/versioned_docs/version-23.4.0/assets/images/io-utilization.png new file mode 100644 index 00000000000..fab930dd5d6 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/io-utilization.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kuberenetes-genesis-secrets.png b/versioned_docs/version-23.4.0/assets/images/kuberenetes-genesis-secrets.png new file mode 100644 index 00000000000..8b2b52441a9 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kuberenetes-genesis-secrets.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-1.jpeg b/versioned_docs/version-23.4.0/assets/images/kubernetes-1.jpeg new file mode 100644 index 00000000000..18ede0c091f Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-1.jpeg differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-2.jpeg b/versioned_docs/version-23.4.0/assets/images/kubernetes-2.jpeg new file mode 100644 index 00000000000..1e2c856f3c7 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-2.jpeg differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-3.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-3.png new file mode 100644 index 00000000000..8621c72f83d Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-3.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-bootnode-logs.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-bootnode-logs.png new file mode 100644 index 00000000000..a11a61f2df0 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-bootnode-logs.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-elastic.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-elastic.png new file mode 100644 index 00000000000..46c99465e65 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-elastic.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-contracts-1.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-contracts-1.png new file mode 100644 index 00000000000..d27681af61b Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-contracts-1.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-contracts-set.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-contracts-set.png new file mode 100644 index 00000000000..530c68deb13 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-contracts-set.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-explorer.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-explorer.png new file mode 100644 index 00000000000..9b169a4b7af Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-explorer.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-validators.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-validators.png new file mode 100644 index 00000000000..58fb91cd849 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-validators.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-wallet.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-wallet.png new file mode 100644 index 00000000000..2f9eba7b253 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer-wallet.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer.png new file mode 100644 index 00000000000..ecde2ef11c0 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-explorer.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-genesis-configmaps.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-genesis-configmaps.png new file mode 100644 index 00000000000..71318e36c65 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-genesis-configmaps.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-grafana.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-grafana.png new file mode 100644 index 00000000000..545dfd89bd7 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-grafana.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-ingress-ip.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-ingress-ip.png new file mode 100644 index 00000000000..f14f4d895d2 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-ingress-ip.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-monitoring.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-monitoring.png new file mode 100644 index 00000000000..185e8b0f6f7 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-monitoring.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-tx-Besu-logs.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-tx-Besu-logs.png new file mode 100644 index 00000000000..8227a8a11e2 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-tx-Besu-logs.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-tx-tessera-logs.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-tx-tessera-logs.png new file mode 100644 index 00000000000..a146712cdf2 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-tx-tessera-logs.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/kubernetes-validator-logs.png b/versioned_docs/version-23.4.0/assets/images/kubernetes-validator-logs.png new file mode 100644 index 00000000000..3b815e96012 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/kubernetes-validator-logs.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_0_landing.png b/versioned_docs/version-23.4.0/assets/images/mp_0_landing.png new file mode 100644 index 00000000000..4b44acaf580 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_0_landing.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_10_ssh.png b/versioned_docs/version-23.4.0/assets/images/mp_10_ssh.png new file mode 100644 index 00000000000..1229060dba3 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_10_ssh.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_1_basics.png b/versioned_docs/version-23.4.0/assets/images/mp_1_basics.png new file mode 100644 index 00000000000..ed6e98a9d24 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_1_basics.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_2_size.png b/versioned_docs/version-23.4.0/assets/images/mp_2_size.png new file mode 100644 index 00000000000..f0f41a0cafe Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_2_size.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_4_deployment.png b/versioned_docs/version-23.4.0/assets/images/mp_4_deployment.png new file mode 100644 index 00000000000..858b2a4b53d Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_4_deployment.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_5_deployment_complete.png b/versioned_docs/version-23.4.0/assets/images/mp_5_deployment_complete.png new file mode 100644 index 00000000000..b10380c738b Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_5_deployment_complete.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_6_resource.png b/versioned_docs/version-23.4.0/assets/images/mp_6_resource.png new file mode 100644 index 00000000000..8307edc60ae Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_6_resource.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_7_vm.png b/versioned_docs/version-23.4.0/assets/images/mp_7_vm.png new file mode 100644 index 00000000000..b9519fa6fa0 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_7_vm.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_8_block_explorer.png b/versioned_docs/version-23.4.0/assets/images/mp_8_block_explorer.png new file mode 100644 index 00000000000..c898b1ba5de Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_8_block_explorer.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/mp_9_grafana.png b/versioned_docs/version-23.4.0/assets/images/mp_9_grafana.png new file mode 100644 index 00000000000..e37c0b9bade Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/mp_9_grafana.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/node-permissioning-bad-actor.png b/versioned_docs/version-23.4.0/assets/images/node-permissioning-bad-actor.png new file mode 100644 index 00000000000..b5e8952b51f Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/node-permissioning-bad-actor.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/postman-logo.svg b/versioned_docs/version-23.4.0/assets/images/postman-logo.svg new file mode 100644 index 00000000000..8ca967adafd --- /dev/null +++ b/versioned_docs/version-23.4.0/assets/images/postman-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/versioned_docs/version-23.4.0/assets/images/private-architecture.jpeg b/versioned_docs/version-23.4.0/assets/images/private-architecture.jpeg new file mode 100644 index 00000000000..3d31c1a325f Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/private-architecture.jpeg differ diff --git a/versioned_docs/version-23.4.0/assets/images/public-architecture.jpeg b/versioned_docs/version-23.4.0/assets/images/public-architecture.jpeg new file mode 100644 index 00000000000..f96066ee909 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/public-architecture.jpeg differ diff --git a/versioned_docs/version-23.4.0/assets/images/sampleNetworks-poa.png b/versioned_docs/version-23.4.0/assets/images/sampleNetworks-poa.png new file mode 100644 index 00000000000..64ecea2a8c8 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sampleNetworks-poa.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-block-details.png b/versioned_docs/version-23.4.0/assets/images/sirato-block-details.png new file mode 100644 index 00000000000..6b8922515fd Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-block-details.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-blocks.png b/versioned_docs/version-23.4.0/assets/images/sirato-blocks.png new file mode 100644 index 00000000000..9d90941ce7e Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-blocks.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-contract-details.png b/versioned_docs/version-23.4.0/assets/images/sirato-contract-details.png new file mode 100644 index 00000000000..a662d4da7ab Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-contract-details.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-contracts.png b/versioned_docs/version-23.4.0/assets/images/sirato-contracts.png new file mode 100644 index 00000000000..a46eecbfb6d Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-contracts.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-dashboard.png b/versioned_docs/version-23.4.0/assets/images/sirato-dashboard.png new file mode 100644 index 00000000000..5a2effaadd2 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-dashboard.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-events.png b/versioned_docs/version-23.4.0/assets/images/sirato-events.png new file mode 100644 index 00000000000..ad40a9fdfcc Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-events.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-loading.png b/versioned_docs/version-23.4.0/assets/images/sirato-loading.png new file mode 100644 index 00000000000..e15bf4cc6d8 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-loading.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-network.png b/versioned_docs/version-23.4.0/assets/images/sirato-network.png new file mode 100644 index 00000000000..5d649b5eb5f Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-network.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-token-details.png b/versioned_docs/version-23.4.0/assets/images/sirato-token-details.png new file mode 100644 index 00000000000..d2b125df12e Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-token-details.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-tokens.png b/versioned_docs/version-23.4.0/assets/images/sirato-tokens.png new file mode 100644 index 00000000000..ba7d1fc5b48 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-tokens.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-transaction-details.png b/versioned_docs/version-23.4.0/assets/images/sirato-transaction-details.png new file mode 100644 index 00000000000..abbb4f650ab Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-transaction-details.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/sirato-transactions.png b/versioned_docs/version-23.4.0/assets/images/sirato-transactions.png new file mode 100644 index 00000000000..49ec42ae607 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/sirato-transactions.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/splunk-ui.png b/versioned_docs/version-23.4.0/assets/images/splunk-ui.png new file mode 100644 index 00000000000..d40b2b32ac8 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/splunk-ui.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/system-load.png b/versioned_docs/version-23.4.0/assets/images/system-load.png new file mode 100644 index 00000000000..f3b15ec8e09 Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/system-load.png differ diff --git a/versioned_docs/version-23.4.0/assets/images/transaction-validation.png b/versioned_docs/version-23.4.0/assets/images/transaction-validation.png new file mode 100644 index 00000000000..523139d8f9d Binary files /dev/null and b/versioned_docs/version-23.4.0/assets/images/transaction-validation.png differ diff --git a/versioned_docs/version-23.4.0/assets/postman/postman_collection.json b/versioned_docs/version-23.4.0/assets/postman/postman_collection.json new file mode 100644 index 00000000000..55bfdfcf814 --- /dev/null +++ b/versioned_docs/version-23.4.0/assets/postman/postman_collection.json @@ -0,0 +1,5780 @@ +{ + "info": { + "_postman_id": "f334929f-c8c3-43ed-bb73-69a6f0d728d8", + "name": "Hyperledger Besu JSON-RPC API", + "description": "Hyperledger Besu JSON-RPC API enables interaction with a Besu Ethereum node.\n\nRefer to [Besu documentation how to page](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API/) to learn how to use this API.\n", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "ADMIN", + "item": [ + { + "name": "admin_addPeer", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Result should be true\", () => {", + " //parse the response json", + " const responseJson = pm.response.json();", + " pm.expect(responseJson.id).to.eql(1);", + " pm.expect(responseJson.result).is.true;", + "});" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "content-length": true, + "host": true + } + }, + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_addPeer\",\n \"params\": [\n \"enode://c93f69ddd83d3db3e93e5165d60b4f5d93a9731df776beee94c5f8a0c770e41bdea69094136402db0cef7af63f0aa636ff676d4a88c6d37276dfa4160c21ed5f@127.0.0.1:30303\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Adds a static node\n\n> **Caution**\n>\n> If connections are timing out, ensure the node ID in the enode URL is correct.\n\n#### Parameters\n\n`string` : Enode URL of peer to add\n\n#### Returns\n\n`result` : `boolean` - `true` if peer added or `false` if peer already a static node." + }, + "response": [ + { + "name": "admin_addPeer", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_addPeer\",\n \"params\": [\n \"enode://c93f69ddd83d3db3e93e5165d60b4f5d93a9731df776beee94c5f8a0c770e41bdea69094136402db0cef7af63f0aa636ff676d4a88c6d37276dfa4160c21ed5f@127.0.0.1:30303\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "admin_changeLogLevel", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_changeLogLevel\",\n \"params\": [\n \"DEBUG\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Changes the log level without restarting Besu. You can change the log level for all logs, or you\ncan change the log level for specific packages or classes.\n\nYou can specify only one log level per RPC call.\n\n#### Parameters\n\n`level` - [Log level](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#logging)\n\n`log_filter`: `Array` - Packages or classes to change the log level for. Optional.\n\n#### Returns\n\n`result` : `Success` if the log level has changed, otherwise `error`." + }, + "response": [ + { + "name": "admin_changeLogLevel", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_changeLogLevel\",\n \"params\": [\n \"DEBUG\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "admin_generateLogBloomCache", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_generateLogBloomCache\",\n \"params\": [\n \"0x0\",\n \"0x10000\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Generates cached log bloom indexes for blocks. APIs such as [`eth_getLogs`](#eth_getlogs) and\n[`eth_getFilterLogs`](#eth_getfilterlogs) use the cache for improved performance.\n\n> **note**\n>\n> Each index file contains 100000 blocks. The last fragment of blocks less than 100000 are not indexed.\n\n> **tip**\n>\n> Manually executing `admin_generateLogBloomCache` is not required unless the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#auto-log-bloom-caching-enabled) command line option was set to false.\n\n#### Parameters\n\n`integer` - Block to start generating indexes.\n\n`integer` - Block to stop generating indexes.\n\n#### Returns\n\n`result` : *object* - Log bloom index details:\n\n* `quantity` : `startBlock` - Starting block for the last requested cache generation.\n* `quantity` : `endBlock` - Ending block for the last requested cache generation.\n* `quantity` : `currentBlock` - The most recent block added to the cache.\n* `boolean` : `indexing` - `true` if indexing is in progress.\n* `boolean` : `true` indicates acceptance of the request from this call to generate the cache." + }, + "response": [ + { + "name": "admin_generateLogBloomCache", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_generateLogBloomCache\",\n \"params\": [\n \"0x0\",\n \"0x10000\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"startBlock\": \"0x0\",\n \"endBlock\": \"0x10000\",\n \"currentBlock\": \"0x0\",\n \"indexing\": true,\n \"requestAccepted\": true\n }\n}" + } + ] + }, + { + "name": "admin_logsRepairCache", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_logsRepairCache\",\n \"params\": [\n \"1200\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Repairs cached logs by fixing all segments starting with the specified block number.\n\n#### Parameters\n\n`quantity` - Decimal index of the starting block to fix. If left empty, the head block\nis used as the starting point.\n\n#### Returns\n\n`result` - Status of the repair request. Either `Started`, or `Already running`." + }, + "response": [ + { + "name": "admin_logsRepairCache", + "originalRequest": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_logsRepairCache\",\n \"params\": [\n \"1200\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"Status\": \"Started\"\n }\n}" + } + ] + }, + { + "name": "admin_nodeInfo", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_nodeInfo\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns networking information about the node. The information includes general information about\nthe node and specific information from each running Ethereum sub-protocol (for example, `eth`).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : Node object\n\nProperties of the node object are:\n\n* `enode` - [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of the node.\n* `listenAddr` - Host and port for the node.\n* `name` - Client name.\n* `id` - [Node public key](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#node-public-key).\n* `ports` - Peer discovery and listening\n [ports](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Managing-Peers#port-configuration).\n* `protocols` - List of objects containing information for each Ethereum sub-protocol.\n\n> **note**\n>\n> If the node is running locally, the host of the `enode` and `listenAddr` display as `[::]` in the result. When advertising externally, the external address displayed for the `enode` and `listenAddr` is defined by [`--nat-method`](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Specifying-NAT).\n" + }, + "response": [ + { + "name": "admin_nodeInfo", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_nodeInfo\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"enode\": \"enode://87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3@[::]:30303\",\n \"listenAddr\": \"[::]:30303\",\n \"name\": \"besu/v1.0.1-dev-0d2294a5/osx-x86_64/oracle-java-1.8\",\n \"id\": \"87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3\",\n \"ports\": {\n \"discovery\": 30303,\n \"listener\": 30303\n },\n \"protocols\": {\n \"eth\": {\n \"config\": {\n \"chainId\": 2018,\n \"homesteadBlock\": 0,\n \"daoForkBlock\": 0,\n \"daoForkSupport\": true,\n \"eip150Block\": 0,\n \"eip155Block\": 0,\n \"eip158Block\": 0,\n \"byzantiumBlock\": 0,\n \"constantinopleBlock\": 0,\n \"constantinopleFixBlock\": 0,\n \"ethash\": {\n \"fixeddifficulty\": 100\n }\n },\n \"difficulty\": 78536,\n \"genesis\": \"0x43ee12d45470e57c86a0dfe008a5b847af9e372d05e8ba8f01434526eb2bea0f\",\n \"head\": \"0xc6677651f16d07ae59cab3a5e1f0b814ed2ec27c00a93297b2aa2e29707844d9\",\n \"network\": 2018\n }\n }\n }\n}" + } + ] + }, + { + "name": "admin_peers", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_peers\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns networking information about connected remote nodes.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *array* of *objects* - Object returned for each remote node.\n\nProperties of the remote node object are:\n\n* `version` - P2P protocol version.\n* `name` - Client name.\n* `caps` - List of Ethereum sub-protocol capabilities.\n* `network` - Local and remote addresses established at time of bonding with the peer. The remote\n address might not match the hex value for `port`. The remote address depends on which node\n initiated the connection.\n* `port` - Port on the remote node on which P2P discovery is listening.\n* `id` - Node public key. Excluding the `0x` prefix, the node public key is the ID in the enode\n URL `enode://@:`.\n* `protocols` - [Current state of peer](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Managing-Peers#monitoring-peer-connections)\n including `difficulty` and `head`. `head` is the hash of the highest known block for the peer." + }, + "response": [ + { + "name": "admin_peers", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_peers\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"version\": \"0x5\",\n \"name\": \"besu/v20.10.4-dev-0905d1b2/osx-x86_64/adoptopenjdk-java-11\",\n \"caps\": [\n \"eth/62\",\n \"eth/63\",\n \"eth/64\",\n \"eth/65\",\n \"IBF/1\"\n ],\n \"network\": {\n \"localAddress\": \"192.168.1.229:50115\",\n \"remoteAddress\": \"168.61.153.255:40303\"\n },\n \"port\": \"0x765f\",\n \"id\": \"0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc\",\n \"protocols\": {\n \"eth\": {\n \"difficulty\": \"0x1ac\",\n \"head\": \"0x964090ae9277aef43f47f1b8c28411f162243d523118605f0b1231dbfdf3611a\",\n \"version\": 65\n }\n }\n }\n ]\n}" + } + ] + }, + { + "name": "admin_removePeer", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_removePeer\",\n \"params\": [\n \"enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Removes a [static node](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Static-Nodes).\n\n#### Parameters\n\n`string` : [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of peer to remove.\n\n#### Returns\n\n`result` : `boolean` - `true` if peer removed or `false` if peer not a\n[static node](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Static-Nodes))." + }, + "response": [ + { + "name": "admin_removePeer", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_removePeer\",\n \"params\": [\n \"enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `ADMIN` API methods are not enabled by default for JSON-RPC. To enable the `ADMIN` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or\n[`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options.", + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [""] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [""] + } + } + ] + }, + { + "name": "CLIQUE", + "item": [ + { + "name": "clique_discard", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_discard\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Discards a proposal to [add or remove a signer with the specified address].\n\n#### Parameters\n\n`data` - 20-byte address of proposed signer.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "clique_discard", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_discard\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "clique_getSignerMetrics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides validator metrics for the specified range:\n\n* Number of blocks from each validator.\n* Block number of the last block proposed by each validator (if any proposed in the specified\n range).\n* All validators present in the last block.\n\n#### Parameters\n\n`fromBlockNumber` - Integer representing a block number or the string tag `earliest`, as described\nin [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`toBlockNumber` - Integer representing a block number or one of the string tags `latest` or\n`pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter)\n\nIf you specify:\n\n* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less\n than 100 blocks.\n* Only the first parameter, the call provides metrics for all blocks from the block specified to\n the latest block.\n\n#### Returns\n\n`result`: _object_ - List of validator objects.\n\n> **Note**\n>\n> The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`." + }, + "response": [ + { + "name": "clique_getSignerMetrics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"address\": \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x61\"\n },\n {\n \"address\": \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x63\"\n },\n {\n \"address\": \"0xb279182d99e65703f0076e4812653aab85fca0f0\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x62\"\n }\n ]\n}" + } + ] + }, + { + "name": "clique_getSigners", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSigners\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists [signers for the specified block].\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result: array of data` - List of 20-byte addresses of signers." + }, + "response": [ + { + "name": "clique_getSigners", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSigners\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"0xb279182d99e65703f0076e4812653aab85fca0f0\"\n ]\n}" + } + ] + }, + { + "name": "clique_getSignersAtHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignersAtHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists signers for the specified block.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result: array of data` - List of 20-byte addresses of signers." + }, + "response": [ + { + "name": "clique_getSignersAtHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignersAtHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"0xb279182d99e65703f0076e4812653aab85fca0f0\"\n ]\n}" + } + ] + }, + { + "name": "clique_proposals", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_proposals\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns\n[current proposals](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/Clique#adding-and-removing-signers).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`:_object_ - Map of account addresses to corresponding boolean values indicating the\nproposal for each account.\n\nIf the boolean value is `true`, the proposal is to add a signer. If `false`, the proposal is to\nremove a signer." + }, + "response": [ + { + "name": "clique_proposals", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_proposals\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"0x42eb768f2244c8811c63729a21a3569731535f07\": false,\n \"0x12eb759f2222d7711c63729a45c3585731521d01\": true\n }\n}" + } + ] + }, + { + "name": "clique_propose", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_propose\",\n \"params\": [\n \"0x12eb759f2222d7711c63729a45c3585731521d01\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Propose to [add or remove a signer with the specified address].\n\n#### Parameters\n\n`data` - 20-byte address.\n\n`boolean` - `true` to propose adding signer or `false` to propose removing signer.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "clique_propose", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_propose\",\n \"params\": [\n \"0x12eb759f2222d7711c63729a45c3585731521d01\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> Note\n>\n> The `CLIQUE` API methods are not enabled by default for JSON-RPC.\n>\n> To enable the `CLIQUE` API methods use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "DEBUG", + "item": [ + { + "name": "debug_accountRange", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_accountRange\",\n \"params\": [\n \"12345\",\n 0,\n \"0\",\n 5\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "[Retesteth](https://github.com/ethereum/retesteth/wiki/Retesteth-Overview) uses\n`debug_accountRange` to implement debugging.\n\nReturns the accounts for a specified block.\n\n#### Parameters\n\n`blockHashOrNumber` : `data` - Block hash or number.\n\n`txIndex` : `integer` - Transaction index from which to start.\n\n`address` : `data` - Address hash from which to start.\n\n`limit` : `integer` - Maximum number of account entries to return.\n\n#### Returns\n\n`result`:`object` - Account details:\n\n* `addressMap`:`object` - List of address hashes and account addresses.\n* `nextKey`:`data` - Hash of the next address if any addresses remain in the state, otherwise\n zero.\n" + }, + "response": [ + { + "name": "debug_accountRange", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_accountRange\",\n \"params\": [\n \"12345\",\n 0,\n \"0\",\n 5\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"addressMap\": {\n \"0x005e5...86960\": \"0x0000000000000000000000000000000000000000\",\n \"0x021fe...6ffe3\": \"0x0000000000000000000000000000000000000000\",\n \"0x028e6...ab776\": \"0x0000000000000000000000000000000000000000\",\n \"0x02cb5...bc4d8\": \"0x0000000000000000000000000000000000000000\",\n \"0x03089...23fd5\": \"0x0000000000000000000000000000000000000000\"\n },\n \"nextKey\": \"0x04242954a5cb9748d3f66bcd4583fd3830287aa585bebd9dd06fa6625976be49\"\n }\n}" + } + ] + }, + { + "name": "debug_metrics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_metrics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns metrics providing information on the internal operation of Besu.\n\nThe available metrics might change over time. The JVM metrics might vary based on the JVM\nimplementation used.\n\nThe metric types are:\n\n* Timer\n* Counter\n* Gauge.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`:`object`" + }, + "response": [ + { + "name": "debug_metrics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_metrics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"jvm\": {\n \"memory_bytes_init\": {\n \"heap\": 268435456,\n \"nonheap\": 2555904\n },\n \"threads_current\": 41,\n \"memory_bytes_used\": {\n \"heap\": 696923976,\n \"nonheap\": 63633456\n },\n \"memory_pool_bytes_used\": {\n \"PS Eden Space\": 669119360,\n \"Code Cache\": 19689024,\n \"Compressed Class Space\": 4871144,\n \"PS Survivor Space\": 2716320,\n \"PS Old Gen\": 25088296,\n \"Metaspace\": 39073288\n },\n \"other properties...\":\"values...\"\n },\n \"process\": {\n \"open_fds\": 546,\n \"cpu_seconds_total\": 67.148992,\n \"start_time_seconds\": 1543897699.589,\n \"max_fds\": 10240\n },\n \"rpc\": {\n \"request_time\": {\n \"debug_metrics\": {\n \"bucket\": {\n \"+Inf\": 2,\n \"0.01\": 1,\n \"0.075\": 2,\n \"0.75\": 2,\n \"0.005\": 1,\n \"0.025\": 2,\n \"0.1\": 2,\n \"1.0\": 2,\n \"0.05\": 2,\n \"10.0\": 2,\n \"0.25\": 2,\n \"0.5\": 2,\n \"5.0\": 2,\n \"2.5\": 2,\n \"7.5\": 2\n },\n \"count\": 2,\n \"sum\": 0.015925392\n }\n }\n },\n \"blockchain\": {\n \"difficulty_total\": 3533501,\n \"announcedBlock_ingest\": {\n \"bucket\": {\n \"+Inf\": 0,\n \"0.01\": 0,\n \"0.075\": 0,\n \"0.75\": 0,\n \"0.005\": 0,\n \"0.025\": 0,\n \"0.1\": 0,\n \"1.0\": 0,\n \"0.05\": 0,\n \"10.0\": 0,\n \"0.25\": 0,\n \"0.5\": 0,\n \"5.0\": 0,\n \"2.5\": 0,\n \"7.5\": 0\n },\n \"count\": 0,\n \"sum\": 0\n },\n \"height\": 1908793\n },\n \"peers\": {\n \"disconnected_total\": {\n \"remote\": {\n \"SUBPROTOCOL_TRIGGERED\": 5\n },\n \"local\": {\n \"TCP_SUBSYSTEM_ERROR\": 1,\n \"SUBPROTOCOL_TRIGGERED\": 2,\n \"USELESS_PEER\": 3\n }\n },\n \"peer_count_current\": 2,\n \"connected_total\": 10\n }\n }\n}" + } + ] + }, + { + "name": "debug_storageRangeAt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_storageRangeAt\",\n \"params\": [\n \"0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c\",\n 0,\n \"0x0e0d2c8f7794e82164f11798276a188147fbd415\",\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n 1\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "[Remix](https://remix.ethereum.org/) uses `debug_storageRangeAt` to implement debugging. Use the\n_Debugger_ tab in Remix instead of calling `debug_storageRangeAt` directly.\n\nReturns the contract storage for the specified range.\n\n#### Parameters\n\n`blockHash` : `data` - Block hash.\n\n`txIndex` : `integer` - Transaction index from which to start.\n\n`address` : `data` - Contract address.\n\n`startKey` : `hash` - Start key.\n\n`limit` : `integer` - Number of storage entries to return.\n\n#### Returns\n\n`result`:`object` - [Range object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#range-object).\n" + }, + "response": [ + { + "name": "debug_storageRangeAt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_storageRangeAt\",\n \"params\": [\n \"0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c\",\n 0,\n \"0x0e0d2c8f7794e82164f11798276a188147fbd415\",\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n 1\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"storage\": {\n \"0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563\": {\n \"key\": null,\n \"value\": \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n }\n },\n \"nextKey\": \"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6\"\n }\n}" + } + ] + }, + { + "name": "debug_traceBlock", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlock\",\n \"params\": [\n \"0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`Block` : `data` - RLP of the block.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`object` - [Trace object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object).\n" + }, + "response": [ + { + "name": "debug_traceBlock", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlock\",\n \"params\": [\n \"0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": null\n }\n ]\n }\n}" + } + ] + }, + { + "name": "debug_traceBlockByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByHash\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`block hash` : `data` - Block hash.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`array of objects` - [Trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object)." + }, + "response": [ + { + "name": "debug_traceBlockByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByHash\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": {},\n \"reason\": null\n }\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "debug_traceBlockByNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByNumber\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`array of objects` - [Trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object)." + }, + "response": [ + { + "name": "debug_traceBlockByNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByNumber\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": null,\n \"reason\": null\n }\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "debug_traceTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceTransaction\",\n \"params\": [\n \"0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e\",\n {\n \"disableStorage\": true\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "[Remix](https://remix.ethereum.org/) uses `debug_traceTransaction` to implement debugging. Use the\n_Debugger_ tab in Remix instead of calling `debug_traceTransaction` directly.\n\nReruns the transaction with the same state as when the transaction executed.\n\n#### Parameters\n\n`transactionHash` : `data` - Transaction hash.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`object` - [Trace object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object).\n" + }, + "response": [ + { + "name": "debug_traceTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceTransaction\",\n \"params\": [\n \"0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e\",\n {\n \"disableStorage\": true\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": null\n }\n ]\n }\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `DEBUG` API methods are not enabled by default for JSON-RPC. To enable the `DEBUG` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options.\n\nThe DEBUG API is a more verbose alternative to the TRACE API whose main purpose is compatibility with tools such as [Remix](https://remix.ethereum.org/). We recommend using the TRACE API for production use over the DEBUG API." + }, + { + "name": "EEA", + "item": [ + { + "name": "eea_sendRawTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eea_sendRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Distributes the\n[private transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions),\ngenerates the [privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing)\nand submits it to the transaction pool, and returns the transaction hash of the\n[privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing).\n\nThe signed transaction passed as an input parameter includes the `privateFrom`,\n[`privateFor` or `privacyGroupId`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions#eea-compliant-or-besu-extended-privacy),\nand `restriction` fields.\n\nThe `gas` and `gasPrice` are used by the [privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing)\nnot the private transaction itself.\n\nTo avoid exposing your private key, create signed transactions offline and send the signed\ntransaction data using `eea_sendRawTransaction`.\n\n> **Important**\n>\n> For production systems requiring private transactions, use a network with a consensus mechanism\n> supporting transaction finality to make sure the private state does not become inconsistent\n> with the chain. For example, [IBFT 2.0](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT)\n> provides the required finality.\n>\n> Using private transactions with [pruning](https://besu.hyperledger.org/en/stable/Concepts/Pruning) or\n> [fast sync](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#sync-mode) is not supported.\n> \n> Besu does not implement\n> [`eea_sendTransaction`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management).\n> \n> [EthSigner](https://docs.ethsigner.consensys.net/en/latest/) provides transaction signing and\n>implements [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction).\n\n#### Parameters\n\n`data` - Signed RLP-encoded private transaction. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n#### Returns\n\n`result` : `data` - 32-byte transaction hash of the\n[Privacy Marker Transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing).\n\n> **Tip**\n>\n> If creating a contract, use [priv_getTransactionReceipt](#priv_gettransactionreceipt) to\n> retrieve the contract address after the transaction is finalized." + }, + "response": [ + { + "name": "eea_sendRawTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eea_sendRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"result\": \"0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331\"\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `EEA` API methods are not enabled by default for JSON-RPC. To enable the `EEA` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "ETH", + "item": [ + { + "name": "eth_accounts", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_accounts\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a list of account addresses a client owns.\n\n> **note**\n> \n> This method returns an empty object because Besu [doesn't support key management](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management) inside the client.\n> \n> To provide access to your key store and and then sign transactions, use [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`Array of data` : List of 20-byte account addresses owned by the client.\n" + }, + "response": [ + { + "name": "eth_accounts", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_accounts\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": []\n}" + } + ] + }, + { + "name": "eth_blockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_blockNumber\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the index corresponding to the block number of the current chain head.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *QUANTITY* - Hexadecimal integer representing the index corresponding to the block\nnumber of the current chain head.\n" + }, + "response": [ + { + "name": "eth_blockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_blockNumber\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": \"0x2377\"\n}" + } + ] + }, + { + "name": "eth_call", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_call\",\n \"params\": [\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Invokes a contract function locally and does not change the state of the blockchain.\n\nYou can interact with contracts using `eth_sendRawTransaction` or `eth_call`.\n\n#### Parameters\n\n*OBJECT* - [Transaction call object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object).\n\n*QUANTITY|TAG* - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` - `data` - Return value of the executed contract.\n" + }, + "response": [ + { + "name": "eth_call", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_call\",\n \"params\": [\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x\"\n}" + } + ] + }, + { + "name": "eth_chainId", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_chainId\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the [chain ID](https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *quantity* - Chain ID, in hexadecimal." + }, + "response": [ + { + "name": "eth_chainId", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_chainId\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": \"0x7e2\"\n}" + } + ] + }, + { + "name": "eth_coinbase", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_coinbase\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the client coinbase address. The coinbase address is the account to pay mining rewards to.\n\nTo set a coinbase address, start Besu with the `--miner-coinbase` option set to a valid Ethereum\naccount address. You can get the Ethereum account address from a client such as MetaMask or\nEtherscan. For example:\n\n**Example**\n\n```bash\nbesu --miner-coinbase=\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\" --rpc-http-enabled\n```\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *data* - Coinbase address." + }, + "response": [ + { + "name": "eth_coinbase", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_coinbase\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"\n}" + } + ] + }, + { + "name": "eth_estimateGas", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_estimateGas\",\n \"params\": [\n {\n \"from\": \"0x687422eea2cb73b5d3e242ba5456b782919afc85\",\n \"to\": \"0xdd37f65db31c107f773e82a4f85c693058fef7a9\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an estimate of the gas required for a transaction to complete. The estimation process\ndoes not use gas and the transaction is not added to the blockchain. The resulting estimate can be\ngreater than the amount of gas the transaction ends up using, for reasons including EVM mechanics\nand node performance.\n\nThe `eth_estimateGas` call does not send a transaction. You must call\n[`eth_sendRawTransaction`](#eth_sendrawtransaction) to execute the transaction.\n\n#### Parameters\n\nThe transaction call object parameters are the same as those for [`eth_call`](#eth_call) except for the\n[`strict` parameter](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object). If `strict` is set to `true`, the sender\naccount balance is checked for value transfer and transaction fees. The default for `strict` is `false`.\n\nFor `eth_estimateGas`, all fields are optional because setting a gas limit\nis irrelevant to the estimation process (unlike transactions, in which gas limits apply).\n\n`object` - [Transaction call object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object).\n\n#### Returns\n\n`result` : `quantity` - Amount of gas used." + }, + "response": [ + { + "name": "eth_estimateGas", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_estimateGas\",\n \"params\": [\n {\n \"from\": \"0x687422eea2cb73b5d3e242ba5456b782919afc85\",\n \"to\": \"0xdd37f65db31c107f773e82a4f85c693058fef7a9\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x5208\"\n}" + } + ] + }, + { + "name": "eth_gasPrice", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_gasPrice\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a percentile gas unit price for the most recent blocks, in Wei. By default,\nthe last 100 blocks are examined and the 50th percentile gas unit price (that is, the median value)\nis returned.\n\nIf there are no blocks, the value for [`--min-gas-price`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#min-gas-price) is returned.\nThe value returned is restricted to values between [`--min-gas-price`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#min-gas-price)\nand [`--api-gas-price-max`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-max). By default, 1000 Wei and\n500GWei.\n\nUse the [`--api-gas-price-blocks`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-blocks), [`--api-gas-price-percentile`](CLI/CLI-Syntax#api-gas-price-percentile)\n, and [`--api-gas-price-max`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-max) command line\noptions to configure the `eth_gasPrice` default values.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `quantity` - Percentile gas unit price for the most recent blocks, in Wei, as a hexadecimal value." + }, + "response": [ + { + "name": "eth_gasPrice", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_gasPrice\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x3e8\"\n}" + } + ] + }, + { + "name": "eth_getBalance", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBalance\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the account balance of the specified address.\n\n#### Parameters\n\n`DATA` - 20-byte account address from which to retrieve the balance.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Current balance, in wei, as a hexadecimal value." + }, + "response": [ + { + "name": "eth_getBalance", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBalance\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x1cfe56f3795885980000\"\n}" + } + ] + }, + { + "name": "eth_getBlockByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByHash\",\n \"params\": [\n \"0xaf5526fcb88b2f0d163c9a78ee678bf95b20115dc3d4e2b7b1f5fc4a308724a0\",\n false\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns information about the block by hash.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a block.\n\n`Boolean` - If `true`, returns the full [transaction objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object);\nif `false`, returns the transaction hashes.\n\n#### Returns\n\n`result` : *OBJECT* - [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object) , or `null` when there is no block." + }, + "response": [ + { + "name": "eth_getBlockByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByHash\",\n \"params\": [\n \"0xaf5526fcb88b2f0d163c9a78ee678bf95b20115dc3d4e2b7b1f5fc4a308724a0\",\n false\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": {\n \"number\": \"0x68b3\",\n \"hash\": \"0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c\",\n \"mixHash\": \"0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d\",\n \"parentHash\": \"0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d\",\n \"nonce\": \"0x378da40ff335b070\",\n \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n \"logsBloom\": \"0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000\",\n \"transactionsRoot\": \"0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126\",\n \"stateRoot\": \"0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233\",\n \"receiptsRoot\": \"0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a\",\n \"miner\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"difficulty\": \"0x66e619a\",\n \"totalDifficulty\": \"0x1e875d746ae\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"size\": \"0x334\",\n \"gasLimit\": \"0x47e7c4\",\n \"gasUsed\": \"0x37993\",\n \"timestamp\": \"0x5835c54d\",\n \"uncles\": [],\n \"transactions\": [\n \"0xa0807e117a8dd124ab949f460f08c36c72b710188f01609595223b325e58e0fc\",\n \"0xeae6d797af50cb62a596ec3939114d63967c374fa57de9bc0f4e2b576ed6639d\"\n ]\n }\n}" + } + ] + }, + { + "name": "eth_getBlockByNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByNumber\",\n \"params\": [\n \"0xF\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns information about a block by block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`Boolean` - If `true`, returns the full [transaction objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object);\nif `false`, returns only the hashes of the transactions.\n\n#### Returns\n\n`result` : *OBJECT* - [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object) , or `null` when there is no\nblock." + }, + "response": [ + { + "name": "eth_getBlockByNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByNumber\",\n \"params\": [\n \"0xF\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"number\": \"0x68b3\",\n \"hash\": \"0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c\",\n \"mixHash\": \"0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d\",\n \"parentHash\": \"0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d\",\n \"nonce\": \"0x378da40ff335b070\",\n \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n \"logsBloom\": \"0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000\",\n \"transactionsRoot\": \"0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126\",\n \"stateRoot\": \"0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233\",\n \"receiptsRoot\": \"0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a\",\n \"miner\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"difficulty\": \"0x66e619a\",\n \"totalDifficulty\": \"0x1e875d746ae\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"size\": \"0x334\",\n \"gasLimit\": \"0x47e7c4\",\n \"gasUsed\": \"0x37993\",\n \"timestamp\": \"0x5835c54d\",\n \"uncles\": [],\n \"transactions\": []\n }\n}" + } + ] + }, + { + "name": "eth_getBlockTransactionCountByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of transactions in the block matching the given block hash.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result` : `quantity` - Integer representing the number of transactions in the specified block." + }, + "response": [ + { + "name": "eth_getBlockTransactionCountByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "eth_getBlockTransactionCountByNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByNumber\",\n \"params\": [\n \"0xe8\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of transactions in a block matching the specified block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of transactions in the specified block." + }, + "response": [ + { + "name": "eth_getBlockTransactionCountByNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByNumber\",\n \"params\": [\n \"0xe8\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": \"0x8\"\n}" + } + ] + }, + { + "name": "eth_getCode", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getCode\",\n \"params\": [\n \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the code of the smart contract at the specified address. Besu stores compiled smart\ncontract code as a hexadecimal value.\n\n#### Parameters\n\n`DATA` - 20-byte contract address.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *DATA* - Code stored at the specified address." + }, + "response": [ + { + "name": "eth_getCode", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getCode\",\n \"params\": [\n \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029\"\n}" + } + ] + }, + { + "name": "eth_getFilterChanges", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Polls the specified filter and returns an array of changes that have occurred since the last poll.\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`result` : `Array of Object` - If nothing changed since the last poll, an empty list. Otherwise:\n\n* For filters created with `eth_newBlockFilter`, returns block hashes.\n* For filters created with `eth_newPendingTransactionFilter`, returns transaction hashes.\n* For filters created with `eth_newFilter`, returns [log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "filter created with eth_newPendingTransactionFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x1e977049b6db09362da09491bee3949d9362080ce3f4fc19721196d508580d46\",\n \"0xa3abc4b9a4e497fd58dc59cdff52e9bb5609136bcd499e760798aa92802769be\"\n ]\n}" + }, + { + "name": "Filter created with eth_newFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x233\",\n \"blockHash\": \"0xfc139f5e2edee9e9c888d8df9a2d2226133a9bd87c88ccbd9c930d3d4c9f9ef5\",\n \"transactionHash\": \"0x66e7a140c8fa27fe98fde923defea7562c3ca2d6bb89798aabec65782c08f63d\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x42699a7612a82f1d9c36148af9c77354759b210b\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000004\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x238\",\n \"blockHash\": \"0x98b0ec0f9fea0018a644959accbe69cd046a8582e89402e1ab0ada91cad644ed\",\n \"transactionHash\": \"0xdb17aa1c2ce609132f599155d384c0bc5334c988a6c368056d7e167e23eee058\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x42699a7612a82f1d9c36148af9c77354759b210b\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000007\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n }\n ]\n}" + }, + { + "name": "Filter created with eth_newBlockFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0xda2bfe44bf85394f0d6aa702b5af89ae50ae22c0928c18b8903d9269abe17e0b\",\n \"0x88cd3a37306db1306f01f7a0e5b25a9df52719ad2f87b0f88ee0e6753ed4a812\",\n \"0x4d4c731fe129ff32b425e6060d433d3fde278b565bbd1fd624d5a804a34f8786\"\n ]\n}" + } + ] + }, + { + "name": "eth_getFilterLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterLogs\",\n \"params\": [\n \"0x5ace5de3985749b6a1b2b0d3f3e1fb69\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for the specified filter.\n\nLeave the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\ncommand line option at the default value of `true` to improve log retrieval performance.\n\n> **note**\n\n `eth_getFilterLogs` is only used for filters created with `eth_newFilter`. To specify a filter\n object and get logs without creating a filter, use `eth_getLogs` .\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "eth_getFilterLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterLogs\",\n \"params\": [\n \"0x5ace5de3985749b6a1b2b0d3f3e1fb69\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb3\",\n \"blockHash\": \"0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998\",\n \"transactionHash\": \"0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000003\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb6\",\n \"blockHash\": \"0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc\",\n \"transactionHash\": \"0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000005\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "eth_getLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getLogs\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) matching a specified filter object.\n\nLeave the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\ncommand line option at the default value of `true` to improve log retrieval performance.\n\n> **Attention**\n>\n> Using `eth_getLogs` to get the logs from a large range of blocks, especially an entire chain from its genesis block, can cause Besu to hang and never return a response. We recommend splitting one large query into multiple ones for better performance.\n\n#### Parameters\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "eth_getLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getLogs\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb3\",\n \"blockHash\": \"0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998\",\n \"transactionHash\": \"0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000003\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb6\",\n \"blockHash\": \"0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc\",\n \"transactionHash\": \"0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000005\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "eth_getMinerDataByBlockHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockHash\",\n \"params\": [\n \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns miner data for the specified block.\n\n#### Parameters\n\n`data` - 32 byte block hash.\n\n#### Returns\n\n`result`: `object` - [Miner data](https://besu.hyperledger.org/en/stable/Reference/API-Objects#miner-data-object)." + }, + "response": [ + { + "name": "eth_getMinerDataByBlockHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockHash\",\n \"params\": [\n \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"netBlockReward\": \"0x47c6f3739f3da800\",\n \"staticBlockReward\": \"0x4563918244f40000\",\n \"transactionFee\": \"0x38456548220800\",\n \"uncleInclusionReward\": \"0x22b1c8c1227a000\",\n \"uncleRewards\": [\n {\n \"hash\": \"0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974\",\n \"coinbase\": \"0x0c062b329265c965deef1eede55183b3acb8f611\"\n }\n ],\n \"coinbase\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"difficulty\": \"0x7348c20\",\n \"totalDifficulty\": \"0xa57bcfdd96\"\n }\n}" + } + ] + }, + { + "name": "eth_getMinerDataByBlockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockNumber\",\n \"params\": [\n \"0x7689D2\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns miner data for the specified block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result`: `object` - [Miner data](https://besu.hyperledger.org/en/stable/Reference/API-Objects#miner-data-object)." + }, + "response": [ + { + "name": "eth_getMinerDataByBlockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockHash\",\n \"params\": [\n \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"netBlockReward\": \"0x47c6f3739f3da800\",\n \"staticBlockReward\": \"0x4563918244f40000\",\n \"transactionFee\": \"0x38456548220800\",\n \"uncleInclusionReward\": \"0x22b1c8c1227a000\",\n \"uncleRewards\": [\n {\n \"hash\": \"0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974\",\n \"coinbase\": \"0x0c062b329265c965deef1eede55183b3acb8f611\"\n }\n ],\n \"coinbase\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"difficulty\": \"0x7348c20\",\n \"totalDifficulty\": \"0xa57bcfdd96\"\n }\n}" + } + ] + }, + { + "name": "eth_getProof", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"params\": [\n \"0a8156e7ee392d885d10eaa86afd0e323afdcd95\",\n [\n \"0x0000000000000000000000000000000000000000000000000000000000000347\"\n ],\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the account and storage values of the specified account, including the Merkle proof.\n\nThe API allows IoT devices or mobile apps which are unable to run light clients to verify responses\nfrom untrusted sources, by using a trusted block hash.\n\n#### Parameters\n\n`DATA` - 20-byte address of the account or contract.\n\n`ARRAY` - Array of 32-byte storage keys to generate proofs for.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result`: *Object* - Account details:\n\n* `balance`:`Quantity` - Account balance.\n* `codeHash`:`Data, 32-byte` - Hash of the account code.\n* `nonce`:`Quantity` - Number of transactions sent from the account.\n* `storageHash`:`Data, 32-byte` - SHA3 of the `storageRoot`.\n* `accountProof`:`Array` - RLP-encoded Merkle tree nodes, starting with the `stateRoot`.\n* `storageProof`:`Array`- Storage entries. Each entry is an object that displays:\n * `key`:`Quantity` - Storage key.\n * `value`:`Quantity` - Storage value.\n * `proof`:`Array` - RLP-encoded Merkle tree nodes, starting with the `storageHash`." + }, + "response": [ + { + "name": "eth_getProof", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"params\": [\n \"0a8156e7ee392d885d10eaa86afd0e323afdcd95\",\n [\n \"0x0000000000000000000000000000000000000000000000000000000000000347\"\n ],\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"accountProof\": [\n \"0xf90211a0...608d898380\",\n \"0xf90211a0...ec33f19580\",\n \"0xf901d1a0...9e55584480\",\n \"0xf8718080...18e5777142\"\n ],\n \"address\": \"0x0a8156e7ee392d885d10eaa86afd0e323afdcd95\",\n \"balance\": \"0x0\",\n \"codeHash\": \"0x2b6975dcaf69f9bb9a3b30bb6a37b305ce440250bf0dd2f23338cb18e5777142\",\n \"nonce\": \"0x5f\",\n \"storageHash\": \"0x917688de43091589aa58c1dfd315105bc9de4478b9ba7471616a4d8a43d46203\",\n \"storageProof\": [\n {\n \"key\": \"0x0000000000000000000000000000000000000000000000000000000000000347\",\n \"value\": \"0x0\",\n \"proof\": [\n \"0xf90211a0...5176779280\",\n \"0xf901f1a0...c208d86580\",\n \"0xf8d180a0...1ce6808080\"\n ]\n }\n ]\n }\n}" + } + ] + }, + { + "name": "eth_getStorageAt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getStorageAt\",\n \"params\": [\n \"0x3B3F3E\",\n \"0x0\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the value of a storage position at a specified address.\n\n#### Parameters\n\n`DATA` - A 20-byte storage address.\n\n`QUANTITY` - Integer index of the storage position.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *DATA* - The value at the specified storage position." + }, + "response": [ + { + "name": "eth_getStorageAt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getStorageAt\",\n \"params\": [\n \"0x3B3F3E\",\n \"0x0\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n}" + } + ] + }, + { + "name": "eth_getTransactionByBlockHashAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockHashAndIndex\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\",\n \"0x1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns transaction information for the specified block hash and transaction index position.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a block.\n\n`QUANTITY` - Integer representing the transaction index position.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." + }, + "response": [ + { + "name": "eth_getTransactionByBlockHashAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockHashAndIndex\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\",\n \"0x1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"blockHash\": \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\",\n \"blockNumber\": \"0x1442e\",\n \"from\": \"0x70c9217d814985faef62b124420f8dfbddd96433\",\n \"gas\": \"0x3d090\",\n \"gasPrice\": \"0x57148a6be\",\n \"hash\": \"0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6\",\n \"input\": \"0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000\",\n \"nonce\": \"0x2cb2\",\n \"to\": \"0xcfdc98ec7f01dab1b67b36373524ce0208dc3953\",\n \"transactionIndex\": \"0x2\",\n \"value\": \"0x0\",\n \"v\": \"0x2a\",\n \"r\": \"0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a\",\n \"s\": \"0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484\"\n }\n}" + } + ] + }, + { + "name": "eth_getTransactionByBlockNumberAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockNumberAndIndex\",\n \"params\": [\n \"latest\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns transaction information for the specified block number and transaction index position.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`QUANTITY` - The transaction index position.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." + }, + "response": [ + { + "name": "eth_getTransactionByBlockNumberAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockNumberAndIndex\",\n \"params\": [\n \"latest\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"blockHash\": \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\",\n \"blockNumber\": \"0x1442e\",\n \"from\": \"0x70c9217d814985faef62b124420f8dfbddd96433\",\n \"gas\": \"0x3d090\",\n \"gasPrice\": \"0x57148a6be\",\n \"hash\": \"0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6\",\n \"input\": \"0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000\",\n \"nonce\": \"0x2cb2\",\n \"to\": \"0xcfdc98ec7f01dab1b67b36373524ce0208dc3953\",\n \"transactionIndex\": \"0x2\",\n \"value\": \"0x0\",\n \"v\": \"0x2a\",\n \"r\": \"0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a\",\n \"s\": \"0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484\"\n }\n}" + } + ] + }, + { + "name": "eth_getTransactionByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByHash\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns transaction information for the specified transaction hash.\n\n#### Parameters\n\n`DATA` - 32-byte transaction hash.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." + }, + "response": [ + { + "name": "eth_getTransactionByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByHash\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": {\n \"blockHash\": \"0x510efccf44a192e6e34bcb439a1947e24b86244280762cbb006858c237093fda\",\n \"blockNumber\": \"0x422\",\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\": \"0x5208\",\n \"gasPrice\": \"0x3b9aca00\",\n \"hash\": \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\",\n \"input\": \"0x\",\n \"nonce\": \"0x1\",\n \"to\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n \"transactionIndex\": \"0x0\",\n \"value\": \"0x4e1003b28d9280000\",\n \"v\": \"0xfe7\",\n \"r\": \"0x84caf09aefbd5e539295acc67217563438a4efb224879b6855f56857fa2037d3\",\n \"s\": \"0x5e863be3829812c81439f0ae9d8ecb832b531d651fb234c848d1bf45e62be8b9\"\n }\n}" + } + ] + }, + { + "name": "eth_getTransactionCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionCount\",\n \"params\": [\n \"0x9d8f8572f345e1ae53db1dFA4a7fce49B467bD7f\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of transactions sent from a specified address. Use the `pending` tag to get the\nnext account nonce not used by any pending transactions.\n\n#### Parameters\n\n`data` - 20-byte account address.\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *quantity* - Integer representing the number of transactions sent from the specified\naddress." + }, + "response": [ + { + "name": "eth_getTransactionCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionCount\",\n \"params\": [\n \"0x9d8f8572f345e1ae53db1dFA4a7fce49B467bD7f\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "eth_getTransactionReceipt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionReceipt\",\n \"params\": [\n \"0x96c6830efd87a70020d4d1647c93402d747c05ecf6beeb068dee621f8d13d8d1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the receipt of a transaction by transaction hash. Receipts for pending transactions are not\navailable.\n\nIf you enabled [revert reason](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Revert-Reason), the receipt includes\navailable revert reasons in the response.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a transaction.\n\n#### Returns\n\n`Object` - [Transaction receipt object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-receipt-object), or `null` when\nthere is no receipt." + }, + "response": [ + { + "name": "eth_getTransactionReceipt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionReceipt\",\n \"params\": [\n \"0x96c6830efd87a70020d4d1647c93402d747c05ecf6beeb068dee621f8d13d8d1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"blockHash\": \"0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a\",\n \"blockNumber\": \"0x50\",\n \"contractAddress\": null,\n \"cumulativeGasUsed\": \"0x5208\",\n \"from\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n \"gasUsed\": \"0x5208\",\n \"logs\": [],\n \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n \"status\": \"0x1\",\n \"to\": \"0xf17f52151ebef6c7334fad080c5704d77216b732\",\n \"transactionHash\": \"0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3\",\n \"transactionIndex\": \"0x0\"\n }\n}" + } + ] + }, + { + "name": "eth_getUncleByBlockHashAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockHashAndIndex\",\n \"params\": [\n \"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns uncle specified by block hash and index.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n`quantity` - Index of the uncle.\n\n#### Returns\n\n`result` : [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object)\n\n> **note**\n>\n> Uncles do not contain individual transactions." + }, + "response": [ + { + "name": "eth_getUncleByBlockHashAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockHashAndIndex\",\n \"params\": [\n \"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"difficulty\": \"0x76b123df93230\",\n \"extraData\": \"0x50505945206e616e6f706f6f6c2e6f7267\",\n \"gasLimit\": \"0x7a121d\",\n \"gasUsed\": \"0x7a0175\",\n \"hash\": \"0xc20189c0b1a4a23116ab3b177e929137f6e826f17fc4c2e880e7258c620e9817\",\n \"logsBloom\": \"0x890086c024487ca422be846a201a10e41bc2882902312116c1119609482031e9c000e2a708004a10281024028020c505727a12570c4810121c59024490b040894406a1c23c37a0094810921da3923600c71c03044b40924280038d07ab91964a008084264a01641380798840805a284cce201a8026045451002500113a00de441001320805ca2840037000111640d090442c11116d2112948084240242340400236ce81502063401dcc214b9105194d050884721c1208800b20501a4201400276004142f118e60808284506979a86e050820101c170c185e2310005205a82a2100382422104182090184800c02489e033440218142140045801c024cc1818485\",\n \"miner\": \"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5\",\n \"mixHash\": \"0xf557cc827e058862aa3ea1bd6088fb8766f70c0eac4117c56cf85b7911f82a14\",\n \"nonce\": \"0xd320b48904347cdd\",\n \"number\": \"0x768964\",\n \"parentHash\": \"0x98d752708b3677df8f439c4529f999b94663d5494dbfc08909656db3c90f6255\",\n \"receiptsRoot\": \"0x0f838f0ceb73368e7fc8d713a7761e5be31e3b4beafe1a6875a7f275f82da45b\",\n \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n \"size\": \"0x21a\",\n \"stateRoot\": \"0xa0c7d4fca79810c89c517eff8dadb9c6d6f4bcc27c2edfb301301e1cf7dec642\",\n \"timestamp\": \"0x5cdcbba6\",\n \"totalDifficulty\": \"0x229ad33cabd4c40d23d\",\n \"transactionsRoot\": \"0x866e38e91d01ef0387b8e07ccf35cd910224271ccf2b7477b8c8439e8b70f365\",\n \"uncles\": []\n }\n}" + } + ] + }, + { + "name": "eth_getUncleByBlockNumberAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockNumberAndIndex\",\n \"params\": [\n \"0x7689D2\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns uncle specified by block number and index.\n\n#### Parameters\n\n`quantity|tag` - Index of the block, or one of the string tags `latest`, `earliest`, or `pending`,\nas described in [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`quantity` - Index of the uncle.\n\n#### Returns\n\n`result` : [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object)\n\n> **note**\n>\n> Uncles do not contain individual transactions." + }, + "response": [ + { + "name": "eth_getUncleByBlockNumberAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockNumberAndIndex\",\n \"params\": [\n \"0x7689D2\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"difficulty\": \"0x77daec467bf93\",\n \"extraData\": \"0x50505945206e616e6f706f6f6c2e6f7267\",\n \"gasLimit\": \"0x7a121d\",\n \"gasUsed\": \"0x7a0f7b\",\n \"hash\": \"0x42d83ae9c0743f4b1f9c61ff7ea8b164c1bab3627decd49233760680be006ecf\",\n \"logsBloom\": \"0x888200800000340120220008640200500408006100038400100581c000080240080a0014e8002010080004088040004022402a000c18010001400100002a041141a0610a0052900600041018c0002a0003090020404c00206010010513d00020005380124e08050480710000000108401012b0901c1424006000083a10a8c1040100a0440081050210124400040044304070004001100000012600806008061d0320800000b40042160600002480000000800000c0002100200940801c000820800048024904710000400640490026000a44300309000286088010c2300060003011380006400200812009144042204810209020410a84000410520c08802941\",\n \"miner\": \"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5\",\n \"mixHash\": \"0xf977fcdb52868be410b75ef2becc35cc312f13ab0a6ce400ecd9d445f66fa3f2\",\n \"nonce\": \"0x628b28403bf1e3d3\",\n \"number\": \"0x7689d0\",\n \"parentHash\": \"0xb32cfdfbf4adb05d30f02fcc6fe039cc6666402142954051c1a1cb9cc91aa11e\",\n \"receiptsRoot\": \"0x9c7c8361d1a24ea2841432234c81974a9920d3eba2b2b1c496b5f925a95cb4ac\",\n \"sha3Uncles\": \"0x7d972aa1b182b7e93f1db043f03fbdbfac6874fe7e67e162141bcc0aefa6336b\",\n \"size\": \"0x21a\",\n \"stateRoot\": \"0x74e97b77813146344d75acb5a52a006cc6dfaca678a10fb8a484a8443e919272\",\n \"timestamp\": \"0x5cdcc0a7\",\n \"totalDifficulty\": \"0x229b0583b4bd2698ca0\",\n \"transactionsRoot\": \"0x1d21626afddf05e5866de66ca3fcd98f1caf5357eba0cc6ec675606e116a891b\",\n \"uncles\": []\n }\n}" + } + ] + }, + { + "name": "eth_getUncleCountByBlockHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of uncles in a block from a block matching the given block hash.\n\n#### Parameters\n\n`DATA` - 32-byte block hash.\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of uncles in the specified block." + }, + "response": [ + { + "name": "eth_getUncleCountByBlockHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x0\"\n}" + } + ] + }, + { + "name": "eth_getUncleCountByBlockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockNumber\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of uncles in a block matching the specified block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing either the index of the block within the blockchain, or one\nof the string tags `latest`, `earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of uncles in the specified block." + }, + "response": [ + { + "name": "eth_getUncleCountByBlockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockNumber\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "eth_getWork", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getWork\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the hash of the current block, the seed hash, and the required target boundary condition.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : Array with the following fields:\n\n* `DATA`, 32 Bytes - Hash of the current block header (pow-hash).\n* `DATA`, 32 Bytes - The seed hash used for the DAG.\n* `DATA`, 32 Bytes - The required target boundary condition: 2^256 / difficulty.\n* `QUANTITY` - Hexadecimal integer representing the current block number." + }, + "response": [ + { + "name": "eth_getWork", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getWork\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0xce5e32ca59cb86799a1879e90150b2c3b882852173e59865e9e79abb67a9d636\",\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n \"0x00a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3\",\n \"0x42\"\n ]\n}" + } + ] + }, + { + "name": "eth_hashrate", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_hashrate\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of hashes per second with which the node is mining.\n\nWhen the stratum server is enabled, this method returns the cumulative hashrate of all sealers\nreporting their hashrate.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `quantity` - Number of hashes per second.\n" + }, + "response": [ + { + "name": "eth_hashrate", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_hashrate\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x12b\"\n}" + } + ] + }, + { + "name": "eth_mining", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_mining\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Whether the client is actively mining new blocks. Besu pauses mining while the client synchronizes\nwith the network regardless of command settings or methods called.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` (*BOOLEAN*) - `true` if the client is actively mining new blocks, otherwise `false`." + }, + "response": [ + { + "name": "eth_mining", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_mining\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": true\n}" + } + ] + }, + { + "name": "eth_newBlockFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newBlockFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a filter to retrieve new block hashes. To poll for new blocks, use\n[`eth_getFilterChanges`](#eth_getfilterchanges).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`data` - Filter ID." + }, + "response": [ + { + "name": "eth_newBlockFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newBlockFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x9d78b6780f844228b96ecc65a320a825\"\n}" + } + ] + }, + { + "name": "eth_newFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newFilter\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a [log filter](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs). To poll for logs associated with the\ncreated filter, use [`eth_getFilterChanges`](#eth_getfilterchanges). To get all logs associated with\nthe filter, use [`eth_getFilterLogs`](#eth_getfilterlogs).\n\n#### Parameters\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n> **note**\n>\n> `fromBlock` and `toBlock` in the filter options object default to `latest`.\n\n#### Returns\n\n`data` - Filter ID." + }, + "response": [ + { + "name": "eth_newFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newFilter\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1ddf0c00989044e9b41cc0ae40272df3\"\n}" + } + ] + }, + { + "name": "eth_newPendingTransactionFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newPendingTransactionFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a filter to retrieve new pending transactions hashes. To poll for new pending transactions,\nuse [`eth_getFilterChanges`](#eth_getfilterchanges).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`data` - Filter ID." + }, + "response": [ + { + "name": "eth_newPendingTransactionFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newPendingTransactionFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x443d6a77c4964707a8554c92f7e4debd\"\n}" + } + ] + }, + { + "name": "eth_protocolVersion", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_protocolVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns current Ethereum protocol version.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *quantity* - Ethereum protocol version." + }, + "response": [ + { + "name": "eth_protocolVersion", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_protocolVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x3f\"\n}" + } + ] + }, + { + "name": "eth_sendRawTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_sendRawTransaction\",\n \"params\": [\n \"0xf86a018203e882520894f17f52151ebef6c7334fad080c5704d77216b732896c6b935b8bbd400000801ba093129415f03b4794fd1512e79ee7f097e4271f66721020f8407aac92179893a5a0451b875d89721ec98be55201092980b0a87bb1c48507fccb86da713596b2a09e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Sends a [signed transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Transactions).\nA transaction can send ether, deploy a contract, or interact with a contract.\nSet the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-tx-feecap) CLI option.\n\nYou can interact with contracts using [`eth_sendRawTransaction` or `eth_call`].\n\nTo avoid exposing your private key, create signed transactions offline and send the signed\ntransaction data using `eth_sendRawTransaction`.\n\n> **important**\n>\n> Besu does not implement [`eth_sendTransaction`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management).\n>\n> [EthSigner](https://docs.ethsigner.consensys.net/) provides transaction signing and implements\n> [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction).\n\n#### Parameters\n\n`data` - Signed transaction serialized to hexadecimal format. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n> **note**\n>\n> [Creating and Sending Transactions](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Transactions) includes examples of creating signed transactions using the [web3.js](https://github.com/ethereum/web3.js/) library.\n\n#### Returns\n\n`result` : `data` - 32-byte transaction hash." + }, + "response": [ + { + "name": "eth_sendRawTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendRawTransaction\",\"params\" :[\"0xf85f808203e8832dc6c08080914f785b6f626a656374204f626a6563745d1ba004193142058b4fe6802677a939e76f93e7fa30e91835a911e206f9855330929ca055ce11a262c804a168c8a801e55a68b3d578a4b52b9dfbed98c4aa47f88a0adf\"], \"id\":1}" + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Length", + "value": "118", + "name": "Content-Length", + "description": "The length of the response body in octets (8-bit bytes)" + }, + { + "key": "Content-Type", + "value": "application/json", + "name": "Content-Type", + "description": "The mime type of this content" + } + ], + "cookie": [], + "body": "{\n \"jsonrpc\" : \"2.0\",\n \"id\" : 1,\n \"result\" : \"0xac182cc23bb94696217aa17ca15bd466106af9ba7ea7420aae24ff37338d6e3b\"\n}" + } + ] + }, + { + "name": "eth_submitHashrate", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitHashrate\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000500000\",\n \"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Submits the mining hashrate.\n\nUsed by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer).\n\n#### Parameters\n\n* DATA, 32 Bytes - Hexadecimal string representation of the hash rate.\n* DATA, 32 Bytes - Random hexadecimal ID identifying the client.\n\n#### Returns\n\n`result: Boolean`, `true` if submission is successful, otherwise `false`." + }, + "response": [ + { + "name": "eth_submitHashrate", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitHashrate\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000500000\",\n \"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "eth_submitWork", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitWork\",\n \"params\": [\n \"0x0000000000000001\",\n \"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n \"0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Submits a Proof of Work (Ethash) solution.\n\nUsed by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer).\n\n#### Parameters\n\n* DATA, 8 Bytes - Retrieved nonce.\n* DATA, 32 Bytes - Hash of the block header (PoW-hash).\n* DATA, 32 Bytes - Mix digest.\n\n#### Returns\n\n`result: Boolean`, `true` if the provided solution is valid, otherwise `false`." + }, + "response": [ + { + "name": "eth_submitHashrate", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitHashrate\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000500000\",\n \"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"result\": true\n}" + } + ] + }, + { + "name": "eth_syncing", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_syncing\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an object with data about the synchronization status, or `false` if not synchronizing.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *Object|Boolean* - Object with synchronization status data or `false` if not\nsynchronizing:\n\n* `startingBlock` : *quantity* - Index of the highest block on the blockchain when the network\n synchronization starts.\n* `currentBlock` : *quantity* - Index of the latest block (also known as the best block) for the\n current node. This is the same index that [`eth_blockNumber`](#eth_blocknumber) returns.\n* `highestBlock`: *quantity* - Index of the highest known block in the peer network (that is, the\n highest block so far discovered among peer nodes). This is the same value as `currentBlock` if\n the current node has no peers.\n* `pulledStates`: *quantity* - If fast synchronizing, the number of state entries fetched so far,\n or `null` if this is not known or not relevant. If full synchronizing or fully synchronized, this\n field is not returned.\n* `knownStates`: *quantity* - If fast synchronizing, the number of states the node knows of so\n far, or `null` if this is not known or not relevant. If full synchronizing or fully synchronized,\n this field is not returned." + }, + "response": [ + { + "name": "eth_syncing", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_syncing\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": {\n \"startingBlock\": \"0x0\",\n \"currentBlock\": \"0x1518\",\n \"highestBlock\": \"0x9567a3\",\n \"pulledStates\": \"0x203ca\",\n \"knownStates\": \"0x200636\"\n }\n}" + } + ] + }, + { + "name": "eth_uninstallFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_uninstallFilter\",\n \"params\": [\n \"0x70355a0b574b437eaa19fe95adfedc0a\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Uninstalls a filter with the specified ID. When a filter is no longer required, call this method.\n\nFilters time out when not requested by [`eth_getFilterChanges`](#eth_getfilterchanges) or [`eth_getFilterLogs`](#eth_getfilterlogs) for 10\nminutes.\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`." + }, + "response": [ + { + "name": "eth_uninstallFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_uninstallFilter\",\n \"params\": [\n \"0x70355a0b574b437eaa19fe95adfedc0a\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> Methods with an equivalent [GraphQL](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/GraphQL) query include a GraphQL\n request and result in the method example. The parameter and result descriptions apply to the\n JSON-RPC requests. The GraphQL specification is defined in the [schema](https://github.com/hyperledger/besu/blob/master/ethereum/api/src/main/resources/schema.graphqls)." + }, + { + "name": "IBFT", + "item": [ + { + "name": "ibft_discardValidatorVote", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_discardValidatorVote\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Discards a proposal to [add or remove a validator] with the specified address.\n\n#### Parameters\n\n`data` - 20-byte address of proposed validator.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "ibft_discardValidatorVote", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_discardValidatorVote\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "ibft_getPendingVotes", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getPendingVotes\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns [votes](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT#adding-and-removing-validators)\ncast in the current [epoch](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT#genesis-file).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`: `object` - Map of account addresses to corresponding boolean values indicating the vote\nfor each account.\n\nIf the boolean value is `true`, the vote is to add a validator. If `false`, the proposal is to\nremove a validator." + }, + "response": [ + { + "name": "ibft_getPendingVotes", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getPendingVotes\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"0xef1bfb6a12794615c9b0b5a21e6741f01e570185\": true,\n \"0x42d4287eac8078828cf5f3486cfe601a275a49a5\": true\n }\n}" + } + ] + }, + { + "name": "ibft_getSignerMetrics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides validator metrics for the specified range:\n\n* Number of blocks from each validator.\n* Block number of the last block proposed by each validator (if any proposed in the specified\n range).\n* All validators present in the last block of the range.\n\n#### Parameters\n\n`fromBlockNumber` - Integer representing a block number or the string tag `earliest` as described\nin [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`toBlockNumber` - Integer representing a block number or one of the string tags `latest` or\n`pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter)\n\nIf you specify:\n\n* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less\n than 100 blocks.\n* Only the first parameter, the call provides metrics for all blocks from the block specified to\n the latest block.\n\n#### Returns\n\n`result`: _object_ - List of validator objects\n\n> **Note**\n>\n> The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`." + }, + "response": [ + { + "name": "ibft_getSignerMetrics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"address\": \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x61\"\n },\n {\n \"address\": \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x63\"\n },\n {\n \"address\": \"0xb279182d99e65703f0076e4812653aab85fca0f0\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x62\"\n }\n ]\n}" + } + ] + }, + { + "name": "ibft_getValidatorsByBlockHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists the validators defined in the specified block.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result: array of data` - List of validator addresses." + }, + "response": [ + { + "name": "ibft_getValidatorsByBlockHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42d4287eac8078828cf5f3486cfe601a275a49a5\",\n \"0xb1b2bc9582d2901afdc579f528a35ca41403fa85\",\n \"0xef1bfb6a12794615c9b0b5a21e6741f01e570185\"\n ]\n}" + } + ] + }, + { + "name": "ibft_getValidatorsByBlockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockNumber\",\n \"params\": [\n \"0x09\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists the validators defined in the specified block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result: array of data` - List of validator addresses." + }, + "response": [ + { + "name": "ibft_getValidatorsByBlockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockNumber\",\n \"params\": [\n \"0x09\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42d4287eac8078828cf5f3486cfe601a275a49a5\",\n \"0xb1b2bc9582d2901afdc579f528a35ca41403fa85\",\n \"0xef1bfb6a12794615c9b0b5a21e6741f01e570185\"\n ]\n}" + } + ] + }, + { + "name": "ibft_proposeValidatorVote", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_proposeValidatorVote\",\n \"params\": [\n \"42d4287eac8078828cf5f3486cfe601a275a49a5\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Propose to [add or remove a validator] with the specified address.\n\n#### Parameters\n\n`data` - Account address\n\n`boolean` - `true` to propose adding validator or `false` to propose removing validator.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "ibft_proposeValidatorVote", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_proposeValidatorVote\",\n \"params\": [\n \"42d4287eac8078828cf5f3486cfe601a275a49a5\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `IBFT` API methods are not enabled by default for JSON-RPC. To enable the `IBFT` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "MINER", + "item": [ + { + "name": "miner_start", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_start\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Starts the mining process. To start mining, you must first specify a miner coinbase using the\n[`--miner-coinbase`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#miner-coinbase) command line option.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `boolean` - `true` if mining starts, or if the node was already mining." + }, + "response": [ + { + "name": "miner_start", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_start\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "miner_stop", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_stop\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Stops the mining process on the client.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `boolean` - `true` if mining stops, or if the node was not mining.\n" + }, + "response": [ + { + "name": "miner_stop", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_stop\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `MINER` API methods are not enabled by default for JSON-RPC. To enable the `MINER` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "Miscellaneous", + "item": [ + { + "name": "rpc_modules", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"rpc_modules\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists [enabled APIs](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#api-methods-enabled-by-default)\nand the version of each.\n\n#### Parameters\n\nNone\n\n#### Returns\n\nEnabled APIs." + }, + "response": [ + { + "name": "rpc_modules", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"rpc_modules\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"web3\": \"1.0\",\n \"eth\": \"1.0\",\n \"net\": \"1.0\"\n }\n}" + } + ] + } + ] + }, + { + "name": "NET", + "item": [ + { + "name": "net_version", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_version\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the [network ID](https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - Current network ID.\n\n| Network ID | Chain | Network | Description\n|------------|-------|---------|-------------------------------|\n| `1` | ETH | Mainnet | Main Ethereum network |\n| `3` | ETH | Ropsten | PoW test network |\n| `4` | ETH | Rinkeby | PoA test network using Clique |\n| `5` | ETH | Goerli | PoA test network using Clique |\n| `2018` | ETH | Dev | PoW development network |\n| `1` | ETC | Classic | Main Ethereum Classic network |\n| `6` | ETC | Kotti | PoA test network using Clique |\n| `7` | ETC | Mordor | PoW test network |\n\n> **note**\n>\n> For almost all networks network ID and chain ID are the same.\nThe only networks in the table above with different network and chain IDs are\nClassic with a chain ID of `61` and Mordor with a chain ID of `63`." + }, + "response": [ + { + "name": "net_version", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_version\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"3\"\n}" + } + ] + }, + { + "name": "net_listening", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_listening\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Whether the client is actively listening for network connections.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` (*BOOLEAN*) - `true` if the client is actively listening for network connections;\notherwise `false`." + }, + "response": [ + { + "name": "net_listening", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_listening\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": true\n}" + } + ] + }, + { + "name": "net_peerCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_peerCount\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of peers currently connected to the client.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *integer* - Number of connected peers in hexadecimal." + }, + "response": [ + { + "name": "net_peerCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_peerCount\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://127.0.0.1:8545", + "protocol": "http", + "host": ["127", "0", "0", "1"], + "port": "8545" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x5\"\n}" + } + ] + }, + { + "name": "net_enode", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_enode\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the [enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of the node." + }, + "response": [ + { + "name": "net_enode", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_enode\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"enode://6a63160d0ccef5e4986d270937c6c8d60a9a4d3b25471cda960900d037c61988ea14da67f69dbfb3497c465d0de1f001bb95598f74b68a39a5156a608c42fa1b@127.0.0.1:30303\"\n}" + } + ] + }, + { + "name": "net_services", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_services\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns enabled services (for example, `jsonrpc`) and the host and port for each service.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *objects* - Enabled services." + }, + "response": [ + { + "name": "net_services", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_services\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"jsonrpc\": {\n \"host\": \"127.0.0.1\",\n \"port\": \"8545\"\n },\n \"p2p\": {\n \"host\": \"127.0.0.1\",\n \"port\": \"30303\"\n },\n \"metrics\": {\n \"host\": \"127.0.0.1\",\n \"port\": \"9545\"\n }\n }\n}" + } + ] + } + ] + }, + { + "name": "PERM (permissioning)", + "item": [ + { + "name": "perm_addAccountsToAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addAccountsToAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Adds accounts (participants) to the\n[accounts permission list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\n`list of strings` - List of account addresses.\n\n> **Note**\n>\n> The parameters list contains a list which is why the account addresses are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to add accounts already on the\nallowlist or including invalid account addresses.\n" + }, + "response": [ + { + "name": "perm_addAccountsToAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addAccountsToAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_addNodesToAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addNodesToAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Adds nodes to the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\n`list of strings` - List of [enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url).\n\n> **Note**\n>\n> The parameters list contains a list which is why the enode URLs are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to add nodes already on the allowlist or\nincluding invalid enode URLs." + }, + "response": [ + { + "name": "perm_addNodesToAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addNodesToAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_getAccountsAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getAccountsAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists accounts (participants) in the\n[accounts permissions list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result: list` - Accounts (participants) in the accounts allowlist." + }, + "response": [ + { + "name": "perm_getAccountsAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getAccountsAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x0000000000000000000000000000000000000009\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462033\"\n ]\n}" + } + ] + }, + { + "name": "perm_getNodesAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getNodesAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists nodes in the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result: list` - [Enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of nodes in the nodes allowlist." + }, + "response": [ + { + "name": "perm_getNodesAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getNodesAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n}" + } + ] + }, + { + "name": "perm_reloadPermissionsFromFile", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_reloadPermissionsFromFile\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Reloads the accounts and nodes allowlists from the [permissions configuration file].\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - `Success`, or `error` if the permissions configuration file is not valid." + }, + "response": [ + { + "name": "perm_reloadPermissionsFromFile", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_reloadPermissionsFromFile\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_removeAccountsFromAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeAccountsFromAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Removes accounts (participants) from the\n[accounts permissions list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\n`list of strings` - List of account addresses.\n\n> **Note**\n>\n> The parameters list contains a list which is why the account addresses are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to remove accounts not on the allowlist\nor including invalid account addresses." + }, + "response": [ + { + "name": "perm_removeAccountsFromAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeAccountsFromAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_removeNodesFromAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeNodesFromAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Removes nodes from the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\n`list of strings` - List of [enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url)\n\n> **Note**\n>\n> The parameters list contains a list which is why the enode URLs are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to remove nodes not on the allowlist\nor including invalid enode URLs." + }, + "response": [ + { + "name": "perm_removeNodesFromAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeNodesFromAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + } + ], + "description": "Use the permissioning API methods for [local](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning)\npermissioning only.\n\n> **Note**\n>\n>The `PERM` API methods are not enabled by default for JSON-RPC. To enable the `PERM` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) CLI options." + }, + { + "name": "PLUGINS", + "item": [ + { + "name": "plugins_reloadPluginConfig", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"plugins_reloadPluginConfig\",\n \"params\": [\n \"tech.pegasys.plus.plugin.kafka.KafkaPlugin\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": null, + "description": "Reloads specified plugin configuration.\n\n#### Parameters\n\n`string` - Plugin\n\n#### Returns\n\n`string` - `Success`" + }, + "response": [ + { + "name": "plugins_reloadPluginConfig", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"plugins_reloadPluginConfig\",\n \"params\": [\n \"tech.pegasys.plus.plugin.kafka.KafkaPlugin\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": null + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `PLUGINS` API methods are not enabled by default for JSON-RPC. To enable the `PLUGINS` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "PRIV", + "item": [ + { + "name": "priv_call", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_call\",\n \"params\": [\n \"tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=\",\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"data\": \"0x3fa4f245\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "response": [ + { + "name": "priv_call", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_call\",\n \"params\": [\n \"tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=\",\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"data\": \"0x3fa4f245\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n}" + } + ] + }, + { + "name": "priv_createPrivacyGroup", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_createPrivacyGroup\",\n \"params\": [\n {\n \"addresses\": [\n \"sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=\",\n \"quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=\"\n ],\n \"name\": \"Group A\",\n \"description\": \"Description Group A\"\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a group of nodes, specified by their [Tessera](https://docs.tessera.consensys.net/) public key.\n\n#### Parameters\n\n`Object` - Request options:\n\n* `addresses`: `array of data` - Array of nodes, specified by\n [Tessera](https://docs.tessera.consensys.net/) public keys.\n* `name`: `string` - Privacy group name. Optional.\n* `description`: `string` - Privacy group description. Optional.\n\n#### Returns\n\nPrivacy group ID" + }, + "response": [ + { + "name": "priv_createPrivacyGroup", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_createPrivacyGroup\",\n \"params\": [\n {\n \"addresses\": [\n \"sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=\",\n \"quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=\"\n ],\n \"name\": \"Group A\",\n \"description\": \"Description Group A\"\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n}" + } + ] + }, + { + "name": "priv_deletePrivacyGroup", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_deletePrivacyGroup\",\n \"params\": [\n \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Deletes the specified privacy group.\n\n#### Parameters\n\n`data` - Privacy group ID\n\n#### Returns\n\nPrivacy group ID that was deleted." + }, + "response": [ + { + "name": "priv_deletePrivacyGroup", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_deletePrivacyGroup\",\n \"params\": [\n \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n}" + } + ] + }, + { + "name": "priv_distributeRawTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_distributeRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Distributes a signed, RLP encoded\n[private transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions).\n\n> **tip**\n\n If you want to sign the Privacy Marker Transaction outside of Besu,\n use [`priv_distributeRawTransaction`](https://besu.hyperledger.org/en/stable//HowTo/Send-Transactions/Creating-Sending-Private-Transactions#priv_distributerawtransaction)\n instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction).\n\n#### Parameters\n\n`data` - Signed RLP-encoded private transaction. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n#### Returns\n\n`result` : `data` - 32-byte enclave key. The enclave key is a pointer to the private transaction in\n[Tessera](https://docs.tessera.consensys.net/)." + }, + "response": [ + { + "name": "priv_distributeRawTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_distributeRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b\"\n}" + } + ] + }, + { + "name": "priv_findPrivacyGroup", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_findPrivacyGroup\",\n \"params\": [\n [\n \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a list of privacy groups containing only the listed members. For example, if the listed\nmembers are A and B, a privacy group containing A, B, and C is not returned.\n\n#### Parameters\n\n`array of data` - Members specified by [Tessera](https://docs.tessera.consensys.net/) public keys.\n\n#### Returns\n\nPrivacy groups containing only the specified members. Privacy groups are\n[EEA-compliant](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups#enterprise-ethereum-alliance-privacy)\nor [Besu-extended](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups#besu-extended-privacy) with types:\n\n* `LEGACY` for EEA-compliant groups.\n* `PANTHEON` for Besu-extended groups." + }, + "response": [ + { + "name": "priv_findPrivacyGroup", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_findPrivacyGroup\",\n \"params\": [\n [\n \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"privacyGroupId\": \"GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=\",\n \"name\": \"Group B\",\n \"description\": \"Description of Group B\",\n \"type\": \"PANTHEON\",\n \"members\": [\n \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getCode", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getCode\",\n \"params\": [\n \"1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=\",\n \"0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the code of the private smart contract at the specified address. Compiled smart contract code\nis stored as a hexadecimal value.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - 20-byte contract address.\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`, `earliest`,\nor `pending`, as described in [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : `data` - Code stored at the specified address." + }, + "response": [ + { + "name": "priv_getCode", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getCode\",\n \"params\": [\n \"1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=\",\n \"0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029\"\n}" + } + ] + }, + { + "name": "priv_getEeaTransactionCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getEeaTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=\",\n [\n \"KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=\",\n \"eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the private transaction count for the specified account and\n[group of sender and recipients].\n\n> **Important**\n\n> If sending more than one transaction to be mined in the same block (that is, you are not\n> waiting for the transaction receipt), you must calculate the private transaction nonce outside\n> Besu instead of using `priv_getEeaTransactionCount`.\n\n#### Parameters\n\n`data` - Account address.\n\n`data` - Base64 encoded Tessera address of the sender.\n\n`array of data` - Base64 encoded Tessera addresses of recipients.\n\n#### Returns\n\n`quantity` - Integer representing the number of private transactions sent from the address to the\nspecified group of sender and recipients.\n" + }, + "response": [ + { + "name": "priv_getEeaTransactionCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getEeaTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=\",\n [\n \"KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=\",\n \"eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "priv_getFilterChanges", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterChanges\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Polls the specified filter for a private contract and returns an array of changes that have occurred\nsince the last poll.\n\nFilters for private contracts can only be created by [`priv_newFilter`](#priv_newfilter) so unlike\n[`eth_getFilterChanges`](#eth_getfilterchanges), `priv_getFilterChanges` always returns an array\nof log objects or an empty list.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object). If nothing has changed since the last poll, an\nempty list." + }, + "response": [ + { + "name": "priv_getFilterChanges", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterChanges\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x4d0\",\n \"blockHash\": \"0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb\",\n \"transactionHash\": \"0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x991cc548c154b2953cc48c02f782e1314097dfbb\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000002\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getFilterLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterLogs\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for the specified filter for a private\ncontract.\n\nFor private contracts, `priv_getFilterLogs` is the same as [`eth_getFilterLogs`](#eth_getfilterlogs)\nfor public contracts except there is no [automatic log bloom caching](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\nfor private contracts.\n\n> **Note**\n>\n> `priv_getFilterLogs` is only used for filters created with [`priv_newFilter`](#priv_newfilter).\n> To specify a filter object and get logs without creating a filter, use [`priv_getLogs`](#priv_getlogs).\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "priv_getFilterLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterLogs\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x493\",\n \"blockHash\": \"0xd9cb3a852e1e02c95f035a2e32d57f82c10cab61faa3e8f5c010adf979bb4786\",\n \"transactionHash\": \"0x78866dc51fdf189d8cca74f6a8fe54f172348fbd2163bbe80fa8b106cfc7deb4\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x991cc548c154b2953cc48c02f782e1314097dfbb\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x4d0\",\n \"blockHash\": \"0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb\",\n \"transactionHash\": \"0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x991cc548c154b2953cc48c02f782e1314097dfbb\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000002\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getLogs\",\n \"params\": [\n \"vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x630c507ff633312087dc33c513b66276abcd2fc3\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) matching a specified filter object.\n\nFor private contracts, `priv_getLogs` is the same as [`eth_getLogs`](#eth_getlogs) for public contracts\nexcept there is no [automatic log bloom caching](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\nfor private contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "priv_getLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getLogs\",\n \"params\": [\n \"vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x630c507ff633312087dc33c513b66276abcd2fc3\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x342\",\n \"blockHash\": \"0xf5954f068fa2f2f7741281e8c753a8e92047e27ab3c4971836d2c89fab86d92b\",\n \"transactionHash\": \"0xa9ba5cffde9d4ad8997c5c4352d5d49eeea0e9def8a4ea69991b8837c49d4e4f\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x630c507ff633312087dc33c513b66276abcd2fc3\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x383\",\n \"blockHash\": \"0x91b73a47d53e3a88d62ed091a89a4be7557ad91b552e7ff7d86bf78977d5d45d\",\n \"transactionHash\": \"0xc2a185faf00e87434e55b7f70cc4c38be354c2128b4b96b5f5def0b54a2173ec\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x630c507ff633312087dc33c513b66276abcd2fc3\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000002\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getPrivacyPrecompileAddress", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivacyPrecompileAddress\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the address of the\n[privacy precompiled contract](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing). The address\nis derived and based on the value of the [`privacy-onchain-groups-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#privacy-onchain-groups-enabled)\noption.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `data` - Address of the privacy precompile." + }, + "response": [ + { + "name": "priv_getPrivacyPrecompileAddress", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivacyPrecompileAddress\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x000000000000000000000000000000000000007e\"\n}" + } + ] + }, + { + "name": "priv_getPrivateTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivateTransaction\",\n \"params\": [\n \"0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the private transaction if you are a participant, otherwise, `null`.\n\n#### Parameters\n\n`data` - Transaction hash returned by [`eea_sendRawTransaction`](#eea_sendrawtransaction) or\n[`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction).\n\n#### Returns\n\nObject - [Private transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#private-transaction-object), or `null` if not\na participant in the private transaction." + }, + "response": [ + { + "name": "priv_getPrivateTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivateTransaction\",\n \"params\": [\n \"0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\": \"0x2dc6c0\",\n \"gasPrice\": \"0x0\",\n \"hash\": \"0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498\",\n \"input\": \"0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610221806100606000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f2451461005c5780636057361d1461008757806367e404ce146100b4575b600080fd5b34801561006857600080fd5b5061007161010b565b6040518082815260200191505060405180910390f35b34801561009357600080fd5b506100b260048036038101908080359060200190929190505050610115565b005b3480156100c057600080fd5b506100c96101cb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600254905090565b7fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f53382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18060028190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050905600a165627a7a723058208efaf938851fb2d235f8bf9a9685f149129a30fe0f4b20a6c1885dc02f639eba0029\",\n \"nonce\": \"0x0\",\n \"to\": null,\n \"value\": \"0x0\",\n \"v\": \"0xfe8\",\n \"r\": \"0x654a6a9663ca70bb13e27cca14b3777cc92da184e19a151cdeef2ccbbd5c6405\",\n \"s\": \"0x5dd4667b020c8a5af7ae28d4c3126f8dcb1187f49dcf0de9d7a39b1651892eef\",\n \"privateFrom\": \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"privateFor\": [\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ],\n \"restriction\": \"restricted\"\n }\n}" + } + ] + }, + { + "name": "priv_getTransactionCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the private transaction count for specified account and privacy group.\n\n> **important**\n\n> If sending more than one transaction to be mined in the same block (that is, you are not waiting for the transaction receipt), you must calculate the private transaction nonce outside Besu instead of using `priv_getTransactionCount`.\n\n#### Parameters\n\n`data` - Account address.\n\n`data` - Privacy group ID.\n\n#### Returns\n\n`quantity` - Integer representing the number of private transactions sent from the address to the\nspecified privacy group." + }, + "response": [ + { + "name": "priv_getTransactionCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "priv_getTransactionReceipt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionReceipt\",\n \"params\": [\n \"0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns information about the private transaction after mining the transaction. Receipts for\npending transactions are not available.\n\n#### Parameters\n\n`data` - 32-byte hash of a transaction.\n\n#### Returns\n\n`Object` - [Private Transaction receipt object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#private-transaction-receipt-object),\nor `null` if no receipt found." + }, + "response": [ + { + "name": "priv_getTransactionReceipt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionReceipt\",\n \"params\": [\n \"0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"contractAddress\": \"0x493b76031593402e24e16faa81f677b58e2d53f3\",\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"output\": \"0x6080604052600436106049576000357c010000000000000000000000000000000000000000000\\n 0000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b3480156059\\n 57600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b\\n 50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b8060008190555050560\\n 0a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029\",\n \"commitmentHash\": \"0x79b9e6b0856db398ad7dc208f15b1d38c0c0b0c5f99e4a443a2c5a85510e96a5\",\n \"transactionHash\": \"0x36219e92b5f53d4150aa9ef7d2d793118cced523de6724100da5b534e3ceb4b8\",\n \"privateFrom\": \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"privacyGroupId\": \"cD636RZlcqVSpoxT/ExbkWQfBO7kPAZO0QlWHErNSL8=\",\n \"status\": \"0x1\",\n \"logs\": []\n }\n}" + } + ] + }, + { + "name": "priv_newFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_newFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x991cc548c154b2953cc48c02f782e1314097dfbb\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a [log filter](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for a private contract. To poll for logs associated with the\ncreated filter, use [`priv_getFilterChanges`](#priv_getfilterchanges). To get all logs associated with\nthe filter, use [`priv_getFilterLogs`](#priv_getfilterlogs).\n\nFor private contracts, `priv_newFilter` is the same as [`eth_newFilter`](#eth_newfilter)\nfor public contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n> **Note**\n>\n> `fromBlock` and `toBlock` in the filter options object default to `latest`." + }, + "response": [ + { + "name": "priv_newFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_newFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x991cc548c154b2953cc48c02f782e1314097dfbb\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x4a35b92809d73f4f53a2355d62125442\"\n}" + } + ] + }, + { + "name": "priv_uninstallFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_uninstallFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Uninstalls a filter for a private contract with the specified ID. When a filter is no longer required,\ncall this method.\n\nFilters time out when not requested by [`priv_getFilterChanges`](#priv_getfilterchanges) or [`priv_getFilterLogs`](#priv_getfilterlogs) for 10\nminutes.\n\nFor private contracts, `priv_uninstallFilter` is the same as [`eth_uninstallFilter`](#eth_uninstallfilter)\nfor public contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`." + }, + "response": [ + { + "name": "priv_uninstallFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_uninstallFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `PRIV` API methods are not enabled by default for JSON-RPC. To enable the `PRIV` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "TRACE", + "item": [ + { + "name": "trace_replayBlockTransactions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"trace_replayBlockTransactions\",\n \"params\": [\n \"0x12\",\n [\n \"trace\",\n \"vmTrace\",\n \"stateDiff\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides transaction processing tracing per block.\n\n> **important**\n\n Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n requested block must be within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained)\n (by default, 1024).\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`array of strings` - Tracing options are\n[`trace`, `vmTrace`, and `stateDiff`](Trace-Types). Specify any\ncombination of the three options including none of them.\n\n#### Returns\n\n`result` - Array of [transaction trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-trace-object) containing\none object per transaction, in transaction execution order." + }, + "response": [ + { + "name": "trace_replayBlockTransactions", + "originalRequest": { + "method": "POST", + "header": [], + "url": null + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\":[\n {\n \"output\":\"0x\",\n \"vmTrace\":{\n \"code\":\"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851\",\n \"ops\":[\n {\n \"cost\":3,\n \"ex\":{\n \"mem\":null,\n \"push\":[\n \"0x8\"\n ],\n \"store\":null,\n \"used\":16756175\n },\n \"pc\":72,\n \"sub\":null\n },\n {\"other properties...\":\"values...\"}\n ]\n },\n \"trace\":[\n {\n \"action\":{\n \"callType\":\"call\",\n \"from\":\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\":\"0xffadea\",\n \"input\":\"0x\",\n \"to\":\"0x0100000000000000000000000000000000000000\",\n \"value\":\"0x0\"\n },\n \"result\":{\n \"gasUsed\":\"0x1e\",\n \"output\":\"0x\"\n },\n \"subtraces\":0,\n \"traceAddress\":[\n ],\n \"type\":\"call\"\n }\n ],\n \"stateDiff\":{\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\":{\n \"balance\":{\n \"*\":{\n \"from\":\"0xffffffffffffffffffffffffffffffffc3e12a20b\",\n \"to\":\"0xffffffffffffffffffffffffffffffffc3dc5f091\"\n }\n },\n \"code\":\"=\",\n \"nonce\":{\n \"*\":{\n \"from\":\"0x14\",\n \"to\":\"0x15\"\n }\n },\n \"storage\":{\n }\n }\n },\n \"transactionHash\":\"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd\",\n },\n {\"other properties...\":\"values...\"}\n ]\n}" + } + ] + }, + { + "name": "trace_block", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"trace_block\",\n \"params\": [\n \"0x6\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides transaction processing of [type `trace`](Trace-Types#trace) for the specified block.\n\n> **Important**\n>\n> Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n> requested block must be within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained) (by default, 1024).\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` - Array of [calls to other contracts](Trace-Types#trace) containing\none object per call, in transaction execution order." + }, + "response": [ + { + "name": "trace_block", + "originalRequest": { + "method": "POST", + "header": [], + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "trace_transaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"trace_transaction\",\n \"params\": [\n \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides transaction processing of [type `trace`](Trace-Types#trace) for the specified transaction.\n\n> **Important**\n>\n> Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n> requested transaction must be contained in a block within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained) (by default, 1024).\n\n#### Parameters\n\n`data` : Transaction hash\n\n#### Returns\n\n`result` - Array of [calls to other contracts](Trace-Types#trace) containing\none object per call, in the order called by the transaction.\n" + }, + "response": [ + { + "name": "trace_transaction", + "originalRequest": { + "method": "POST", + "header": [], + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"result\": [\n {\n \"action\": {\n \"creationMethod\": \"create\",\n \"from\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n \"gas\": \"0xff2e26\",\n \"init\": \"0x60006000600060006000732c2b9c9a4a25e24b174f26114e8926a9f2128fe45af2600060006000600060007300a00000000000000000000000000000000000005af2\",\n \"value\": \"0x0\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": {\n \"address\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"code\": \"0x\",\n \"gasUsed\": \"0x1c39\"\n },\n \"subtraces\": 2,\n \"traceAddress\": [],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"create\"\n },\n {\n \"action\": {\n \"callType\": \"callcode\",\n \"from\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"gas\": \"0xfb2ea9\",\n \"input\": \"0x\",\n \"to\": \"0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4\",\n \"value\": \"0x0\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": {\n \"gasUsed\": \"0x138e\",\n \"output\": \"0x\"\n },\n \"subtraces\": 1,\n \"traceAddress\": [\n 0\n ],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"call\"\n },\n {\n \"action\": {\n \"address\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"balance\": \"0x0\",\n \"refundAddress\": \"0x0000000000000000000000000000000000000000\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": null,\n \"subtraces\": 0,\n \"traceAddress\": [\n 0,\n 0\n ],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"suicide\"\n },\n {\n \"action\": {\n \"callType\": \"callcode\",\n \"from\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"gas\": \"0xfb18a5\",\n \"input\": \"0x\",\n \"to\": \"0x00a0000000000000000000000000000000000000\",\n \"value\": \"0x0\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": {\n \"gasUsed\": \"0x30b\",\n \"output\": \"0x\"\n },\n \"subtraces\": 0,\n \"traceAddress\": [\n 1\n ],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"call\"\n }\n ],\n \"id\": 1\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `TRACE` API methods are not enabled by default for JSON-RPC. To enable the `TRACE` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options.\n\nThe TRACE API is a more concise alternative to the DEBUG API." + }, + { + "name": "TXPOOL", + "item": [ + { + "name": "txpool_besuPendingTransactions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuPendingTransactions\",\n \"params\": [\n 2,\n {\n \"from\": {\n \"eq\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"\n },\n \"gas\": {\n \"lt\": \"0x5209\"\n },\n \"nonce\": {\n \"gt\": \"0x1\"\n }\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists pending transactions that match the supplied filter conditions.\n\n#### Parameters\n\n* `QUANTITY` - Integer representing the maximum number of results to return.\n* Object of fields used to create the filter condition.\n\nEach field in the object corresponds to a field name containing an operator, and a value for the\noperator. A field name can only be specified once, and can only contain one operator.\nFor example, you cannot query transactions with a gas price between 8 and 9 Gwei by using both the\n`gt` and `lt` operator in the same field name instance.\n\nAll filters must be satisfied for a transaction to be returned.\n\n| Field name | Value | Value type | Supported operators |\n|--------------|-------------------------------------------|:---------------------:|---------------------|\n| **from** | Address of the sender. | *Data*, 20 bytes | `eq` |\n| **to** | Address of the receiver, or `\"contract_creation\"`.| *Data*, 20 bytes |`eq`, `action`|\n| **gas** | Gas provided by the sender. | *Quantity* | `eq`, `gt`, `lt` |\n| **gasPrice** | Gas price, in wei, provided by the sender.| *Quantity* | `eq`, `gt`, `lt` |\n| **value** | Value transferred, in wei. | *Quantity* | `eq`, `gt`, `lt` |\n| **nonce** | Number of transactions made by the sender.| *Quantity* | `eq`, `gt`, `lt` |\n|\n\nSupported operators:\n\n* `eq` (Equal to)\n* `lt` (Less than)\n* `gt` (Greater than)\n* `action`\n\n> **Note**\n>\n> The only supported `action` is `\"contract_creation\"`.\n\n#### Returns\n\n`result` - Array of objects with [details of the pending transaction](https://besu.hyperledger.org/en/stable/Reference/API-Objects#pending-transaction-object)." + }, + "response": [ + { + "name": "txpool_besuPendingTransactions", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuPendingTransactions\",\n \"params\": [\n 2,\n {\n \"from\": {\n \"eq\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"\n },\n \"gas\": {\n \"lt\": \"0x5209\"\n },\n \"nonce\": {\n \"gt\": \"0x1\"\n }\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\": \"0x5208\",\n \"gasPrice\": \"0xab5d04c00\",\n \"hash\": \"0xb7b2f4306c1c228ec94043da73b582594007091a7dfe024b1f8d6d772284e54b\",\n \"input\": \"0x\",\n \"nonce\": \"0x2\",\n \"to\": \"0xf8be4ebda7f62d79a665294ec1263bfdb59aabf2\",\n \"value\": \"0x0\",\n \"v\": \"0xfe8\",\n \"r\": \"0x5beb711e652c6cf0a589d3cea904eefc4f45ce4372652288701d08cc4412086d\",\n \"s\": \"0x3af14a56e63aa5fb7dcb444a89708363a9d2c1eba1f777c67690288415080ded\"\n }\n ]\n}" + } + ] + }, + { + "name": "txpool_besuStatistics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuStatistics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists statistics about the node transaction pool.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - Transaction pool statistics:\n\n* `maxSize` - Maximum number of transactions kept in the transaction pool. Use the\n [`--tx-pool-max-size`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#tx-pool-max-size) option to configure the maximum size.\n* `localCount` - Number of transactions submitted directly to this node.\n* `remoteCount` - Number of transactions received from remote nodes." + }, + "response": [ + { + "name": "txpool_besuStatistics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuStatistics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"maxSize\": 4096,\n \"localCount\": 1,\n \"remoteCount\": 0\n }\n}" + } + ] + }, + { + "name": "txpool_besuTransactions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuTransactions\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists transactions in the node transaction pool.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - List of transactions." + }, + "response": [ + { + "name": "txpool_besuTransactions", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuTransactions\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"hash\": \"0x8a66830098be4006a3f63a03b6e9b67aa721e04bd6b46d420b8f1937689fb4f1\",\n \"isReceivedFromLocalSource\": true,\n \"addedToPoolAt\": \"2019-03-21T01:35:50.911Z\"\n },\n {\n \"hash\": \"0x41ee803c3987ceb5bcea0fad7a76a8106a2a6dd654409007d9931032ea54579b\",\n \"isReceivedFromLocalSource\": true,\n \"addedToPoolAt\": \"2019-03-21T01:36:00.374Z\"\n }\n ]\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `TXPOOL` API methods are not enabled by default for JSON-RPC. To enable the `TXPOOL` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "WEB3", + "item": [ + { + "name": "web3_clientVersion", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the current client version.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - Current client version." + }, + "response": [ + { + "name": "web3_clientVersion", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"besu/\"\n}" + } + ] + }, + { + "name": "web3_sha3", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_sha3\",\n \"params\": [\n \"0x68656c6c6f20776f726c00\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a [SHA3](https://en.wikipedia.org/wiki/SHA-3) hash of the specified data. The result value\nis a [Keccak-256](https://keccak.team/keccak.html) hash, not the standardized SHA3-256.\n\n#### Parameters\n\n`DATA` - Data to convert to a SHA3 hash.\n\n#### Returns\n\n`result` (*DATA*) - SHA3 result of the input data." + }, + "response": [ + { + "name": "web3_sha3", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_sha3\",\n \"params\": [\n \"0x68656c6c6f20776f726c00\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x5e39a0a66544c0668bde22d61c47a8710000ece931f13b84d3b2feb44ec96d3f\"\n}" + } + ] + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [""] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [""] + } + } + ] +} diff --git a/versioned_docs/version-23.4.0/global/config-options.md b/versioned_docs/version-23.4.0/global/config-options.md new file mode 100644 index 00000000000..5cac2fd0135 --- /dev/null +++ b/versioned_docs/version-23.4.0/global/config-options.md @@ -0,0 +1,8 @@ +### Optional configuration options + +Optional configuration options in the genesis file are: + +- `messageQueueLimit` - In large networks with limited resources, increasing the message queue limit might help with message activity surges. The default is 1000. +- `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate message limit might reduce the number of retransmissions. A value of two to three times the number of validators is usually enough. The default is 100. +- `futureMessagesLimit` - The future messages buffer holds messages for a future chain height. For large networks, increasing the future messages limit might be useful. The default is 1000. +- `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering messages in the future messages buffer. The default is 10. diff --git a/versioned_docs/version-23.4.0/global/postman.md b/versioned_docs/version-23.4.0/global/postman.md new file mode 100644 index 00000000000..a9afe58649b --- /dev/null +++ b/versioned_docs/version-23.4.0/global/postman.md @@ -0,0 +1,15 @@ +:::info Besu JSON-RPC APIs documentation in Postman format + +View the [Besu JSON-RPC APIs documentation](https://www.postman.com/hyperledger/workspace/hyperledger-besu/collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8) in the Postman format and obtain example requests in multiple coding languages. + +#### Run in Postman + +Click the following button to fork the collection and run requests directly on your local network. + +[![Run in Postman](https://run.pstmn.io/button.svg)](https://god.gw.postman.com/run-collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8?action=collection%2Ffork&collection-url=entityId%3D11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8%26entityType%3Dcollection%26workspaceId%3Dc4b60b6f-9f15-42d0-8327-7ebabca6f0fd#?env%5BBesu%20node%20on%20local%20host%5D=W3sia2V5IjoicnBjLWh0dHAtaG9zdCIsInZhbHVlIjoibG9jYWxob3N0IiwiZW5hYmxlZCI6ZmFsc2V9LHsia2V5IjoicnBjLWh0dHAtcG9ydCIsInZhbHVlIjoiODU0NSIsImVuYWJsZWQiOmZhbHNlfV0=). + +#### Download collection + +Alternatively you can [download the JSON collection file](../assets/postman/postman_collection.json). + +::: diff --git a/versioned_docs/version-23.4.0/global/test_accounts.md b/versioned_docs/version-23.4.0/global/test_accounts.md new file mode 100644 index 00000000000..ae819b23ed3 --- /dev/null +++ b/versioned_docs/version-23.4.0/global/test_accounts.md @@ -0,0 +1,51 @@ +:::danger **Do not use the test accounts on Ethereum Mainnet or any production network.** + +The following accounts are test accounts and their private keys are publicly visible in this documentation and in publicly available source code. + +They are not secure and everyone can use them. + +**Using test accounts on Ethereum Mainnet and production networks can lead to loss of funds and identity fraud.** + +In this documentation, we only provide test accounts for ease of testing and learning purposes; never use them for other purposes. + +**Always secure your Ethereum Mainnet and any production account properly.** + +See for instance [MyCrypto "Protecting Yourself and Your Funds" guide](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds). + +::: + +:::info "Test Account 1 (address `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`)" + +Private key to copy : + +```text +0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63 +``` + +Initial balance : 200 Eth _(200000000000000000000 Wei)_ + +::: + +:::info "Test Account 2 (address `0x627306090abaB3A6e1400e9345bC60c78a8BEf57`)" + +Private key to copy : + +```text +0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 +``` + +Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ + +::: + +:::info "Test Account 3 (address `0xf17f52151EbEF6C7334FAD080c5704D77216b732`)" + +Private key to copy : + +```text +0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f +``` + +Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/_category_.json b/versioned_docs/version-23.4.0/private-networks/_category_.json new file mode 100644 index 00000000000..865a111a8b4 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Private networks", + "position": 1 +} diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/_category_.json b/versioned_docs/version-23.4.0/private-networks/concepts/_category_.json new file mode 100644 index 00000000000..d373a29254a --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Concepts", + "position": 4 +} diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/index.md b/versioned_docs/version-23.4.0/private-networks/concepts/index.md new file mode 100644 index 00000000000..5b5f92108b0 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/index.md @@ -0,0 +1,20 @@ +--- +title: Concepts +description: private networks concepts overview +sidebar_position: 3 +--- + +# Concepts + +This section provides background information and context about private network features. + +The following features are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: + +- Transactions: + - [Transaction types](../../public-networks/concepts/transactions/types.md) + - [Transaction pool](../../public-networks/concepts/transactions/pool.md) + - [Transaction validation](../../public-networks/concepts/transactions/validation.md) +- [Network ID and chain ID](../../public-networks/concepts/network-and-chain-id.md) +- [Events and logs](../../public-networks/concepts/events-and-logs.md) +- [Genesis file](../../public-networks/concepts/genesis-file.md) +- [Node keys](../../public-networks/concepts/node-keys.md) diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/_category_.json b/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/_category_.json new file mode 100644 index 00000000000..7299170da97 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Permissioning", + "position": 3 +} diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/index.md b/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/index.md new file mode 100644 index 00000000000..3779030300b --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/index.md @@ -0,0 +1,63 @@ +--- +title: Permissioning +sidebar_position: 1 +description: Besu permissioning feature +--- + +# Permissioning + +A permissioned network enables node permissioning and account permissioning, allowing only specified nodes and accounts to access the network. + +:::caution Permissioning is not privacy + +In peer-to-peer networks, node permissioning enforces rules on nodes you control. + +Permissioning requires a distributed network of trust across the network where participants agree to follow the rules. One bad actor can decide not to follow the rules. Nodes can take action to prevent the bad actor adding to the chain but they cannot prevent the bad actor from allowing access to the chain. + +Besu also implements [privacy](../privacy/index.md). + +::: + +## Node permissioning + +Use node permissioning to restrict access to known participants only. + +![Node Permissioning](../../../assets/images/node-permissioning-bad-actor.png) + +## Account permissioning + +Use account permissioning to: + +- Enforce onboarding or identity requirements. +- Suspend accounts. +- Restrict the actions an account can perform. + +![Account Permissioning](../../../assets/images/enterprise-ethereum-account-permissioning.png) + +## Specify permissioning + +You can specify permissioning [locally](#local) or [onchain](#onchain). + +### Local + +[Local permissioning](../../how-to/use-permissioning/local.md) works at the node level. Each node in the network has a [permissions configuration file]. + +Local permissioning affects your node but not the rest of the network. Use local permissioning to restrict use of your node (that is, the resources under your control). For example, customers able to access your node. + +Local permissioning does not require coordination with the rest of the network and you can act immediately to protect your node. Your rules are not enforced in blocks produced by other nodes. + +### Onchain + +[Onchain permissioning](onchain.md) works through a smart contract on the network. Specifying permissioning onchain enables all nodes to read and update permissioning configuration from one location. + +Onchain permissioning requires coordination to update the rules. The network might not be able to act immediately (for example, the smart contract might enforce a minimum of number of votes before changing permissioning rules). + +When you update onchain permissioning, the update applies across the network and new blocks abide by the updated rules. For example, blocked accounts can no longer add transactions to the chain. + +The following diagram illustrates applying local and onchain permissioning rules. + +![Permissioning Flow](../../../assets/images/PermissioningFlow.png) + + + +[permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/onchain.md b/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/onchain.md new file mode 100644 index 00000000000..c34d9f09b67 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/onchain.md @@ -0,0 +1,71 @@ +--- +title: Onchain permissioning +description: Onchain permissioning +sidebar_position: 1 +--- + +# Onchain permissioning + +Onchain [permissioning](index.md) uses smart contracts to store and administer the node, account, and admin allowlists. Using onchain permissioning enables all nodes to read the allowlists from a single source, the blockchain. + +:::danger + +When using onchain account permissioning, a node checks permissions when importing blocks. Meaning, a node only imports blocks in which all transactions are from authorized senders. If you disable onchain account permissioning and your node accepts blocks without enforcing this rule, your node cannot re-synchronize with other nodes that enforce onchain account permissioning rules (your node goes into forked state). + +::: + +:::note + +Custom smart contracts and dapps can be implemented to work with onchain permissioning. + +::: + +## Permissioning contracts + +:::caution + +The permissioning contract has multiple interfaces, and each interface maps to a specific version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). Ensure that you [specify the permissioning contract interface] being used when starting Besu. + +::: + +### Allowlists + +Permissioning implements three allowlists: + +- Accounts, which can submit transactions to the network. +- Nodes, which can join the network. +- Admins, which are accounts able to update the accounts and nodes allowlists. + +:::caution Using account permissioning and privacy + +Account permissioning is incompatible with [random key signing](../../how-to/use-privacy/sign-pmts.md) for [privacy marker transactions](../privacy/private-transactions/processing.md). + +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: + +:::tip + +If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) and search for messages containing `Node permissioning` to identify the issue. + +Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been correctly configured for all nodes with the externally accessible address. + +If you change your network configuration, you may need to update the node allowlist. + +::: + +## Bootnodes + +When a node joins the network, the node connects to the [bootnodes](../../how-to/configure/bootnodes.md) until it synchronizes to the chain head, regardless of node permissions. After synchronization, the Account Rules and Node Rules smart contracts apply the permissioning rules. + +If a synchronized node loses all peer connections (that is, it has zero peers), it reconnects to the bootnodes to rediscover peers. + +:::info + +All bootnodes must be on the nodes allowlist. + +::: + + + +[specify the permissioning contract interface]: ../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/plugin.md b/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/plugin.md new file mode 100644 index 00000000000..a3f710b0b45 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/permissioning/plugin.md @@ -0,0 +1,51 @@ +--- +title: Permissioning plugin +description: Plugin based permissioning +sidebar_position: 2 +--- + +# Permissioning plugin + +You can define complex [permissioning](index.md) solutions by building a plugin that extends Hyperledger Besu functionality. + +The plugin API provides a `PermissioningService` interface that currently supports connection permissioning and message permissioning. + +## Connection permissioning + +Use connection permissioning when deciding whether to restrict node access to known participants only. + +## Message permissioning + +Use message permissioning to propagate different types of devP2P messages to particular nodes. For example, this can be used to prevent pending transactions from being forwarded to other nodes. + +## Register your plugin + +To enable permissioning in your plugin, implement the `PermissioningService` interface and register your providers. + +```java +@AutoService(BesuPlugin.class) +public class TestPermissioningPlugin implements BesuPlugin { + PermissioningService service; + + @Override + public void register(final BesuContext context) { + service = context.getService(PermissioningService.class).get(); + } + + @Override + public void start() { + service.registerNodePermissioningProvider((sourceEnode, destinationEnode) -> { + // perform logic for node permissioning + return true; + }); + + service.registerNodeMessagePermissioningProvider((destinationEnode, code) -> { + // perform logic for message permissioning + return true; + }); + } + + @Override + public void stop() {} +} +``` diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/pki.md b/versioned_docs/version-23.4.0/private-networks/concepts/pki.md new file mode 100644 index 00000000000..0c1106d99e9 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/pki.md @@ -0,0 +1,43 @@ +--- +title: Public key infrastructure +sidebar_position: 5 +description: Public key infrastructure +--- + +# Public key infrastructure + +:::warning + +Public key infrastructure (PKI) support is an early access feature, and functionality and options may be updated between releases. + +::: + +Hyperledger Besu's public key infrastructure allows you to use certificates issued by a trusted authority to manage node and account identities in the following ways: + +- Node permissioning - Only authorized nodes can connect to other nodes in the network using TLS for the P2P communication. +- Block proposal permissioning - Only blocks proposed by authorized validators are accepted. + +Supported keystore and truststore formats used to store the certificates include PKCS11, PKCS12, and JKS. + +## Node permissioning + +Allow TLS communication between nodes by using certificates issued by a trusted authority to connect to other authorized nodes in the network. + +When receiving connection requests, the incoming connection must be from another authorized node. Similarly, when connecting to a node the initiator ensures that the remote node is authorized to participate in the network. + +[Configure TLS for the P2P communication using the Besu command line options](../how-to/configure/tls/p2p.md). + +## Block proposal permissioning + +:::caution + +Only private networks using the [QBFT consensus protocol] support block proposal permissioning. + +::: + +Use certificates issued by a trusted authority to ensure only authorized validator nodes can propose new blocks in the network. The block hash is signed by the validator private certificate and included in the header of the proposed block as a [CMS (Cryptographic Message Syntax)]. This is used by other validators to verify that the proposer is authorized to create a block in the network. + +[Configure block proposal permissioning using the Besu command line options](../how-to/configure/block-proposal-permissioning.md). + +[QBFT consensus protocol]: ../how-to/configure/consensus/qbft.md +[CMS (Cryptographic Message Syntax)]: https://en.wikipedia.org/wiki/Cryptographic_Message_Syntax diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/plugins.md b/versioned_docs/version-23.4.0/private-networks/concepts/plugins.md new file mode 100644 index 00000000000..02c3d4a2673 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/plugins.md @@ -0,0 +1,53 @@ +--- +title: Plugins +sidebar_position: 6 +description: Plugins overview +--- + +# Plugins + +You can extend Hyperledger Besu functionality by building Java plugins or using existing open source Besu plugins. Use the Plugin API to take data from any Besu network, public or permissioned, and feed it into an application or system. + +For example, create a plugin to add more monitoring functionality or stream event data to a third-party application. The API exposes data about the following components: + +- Blocks +- Balances +- Transactions +- Smart contracts +- Execution results +- Logs +- Syncing state. + +![Besu plugin API](../../assets/images/Hyperledger-Besu-Plugin-API.png) + +The plugin API provides access to [interfaces](../reference/plugin-api-interfaces.md) allowing you to build the plugin. + +:::info + +View the [plugin API webinar](https://youtu.be/78sa2WuA1rg) for an example of how to build a plugin. + +For more information about the available interfaces, see the [Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). + +::: + +## Install plugins + +To allow Besu to access and use the plugin, copy the plugin (`.jar`) to the `plugins` directory. + +:::caution + +If not already present, you must create the `plugins` directory one directory level below (`../`) the `besu` executable. + +::: + +Each plugin in the directory has the following lifecycle events: + +- **Register** - Executed when Besu starts. Besu checks plugin compatibility and registers plugins. +- **Start** - Plugins start after being successfully registered. +- **Stop** - Besu stops plugins. + +:::note + +The order in which Besu calls plugins during lifecycle events is not guaranteed. + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/poa.md b/versioned_docs/version-23.4.0/private-networks/concepts/poa.md new file mode 100644 index 00000000000..8a432630848 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/poa.md @@ -0,0 +1,67 @@ +--- +title: Proof of authority consensus +sidebar_position: 1 +description: Besu proof of authority consensus protocols comparison +--- + +# Proof of authority consensus + +Besu implements the QBFT, IBFT 2.0, and Clique proof of authority (PoA) [consensus protocols](../how-to/configure/consensus/index.md). PoA consensus protocols work when participants know each other and there is a level of trust between them. For example, in a permissioned consortium network. + +PoA consensus protocols have faster block times and a much greater transaction throughput than the Ethash proof of work consensus protocol used on the Ethereum Mainnet. + +In QBFT, IBFT 2.0, or Clique, a group of nodes in the network act as validators (QBFT and IBFT 2.0) or signers (Clique). The existing nodes in the signer/validator pool vote to add nodes to or remove nodes from the pool. + +:::note + +For the rest of this page, the term validator is used to refer to signers and validators. + +::: + +## Properties + +Properties to consider when comparing QBFT, IBFT 2.0, and Clique are: + +- Immediate finality. +- Minimum number of validators. +- Liveness. +- Speed. + +### Immediate finality + +QBFT and IBFT 2.0 have immediate finality; there are no forks and all valid blocks get included in the main chain. + +Clique does not have immediate finality. Implementations using Clique must be aware of forks and chain reorganizations occurring. + +### Minimum number of validators + +To be Byzantine fault tolerant, QBFT and IBFT 2.0 require a minimum of four validators. + +Clique can operate with a single validator but operating with a single validator offers no redundancy if the validator fails. + +:::tip + +Byzantine fault tolerant is the ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +::: + +### Liveness + +Clique is more fault tolerant than QBFT and IBFT 2.0. Clique tolerates up to half of the validators failing. QBFT and IBFT 2.0 networks require greater than or equal to two-thirds of validators to be operating to create blocks. For example, an QBFT and IBFT 2.0 network of: + +- Four to five validators tolerates one unresponsive validator. +- Six to eight validators tolerates two unresponsive validators. + +Networks with three or less validators can produce blocks but do not guarantee finality when operating in adversarial environments. + +:::caution + +We recommend using QBFT or IBFT 2.0 networks with at least four nodes in production environments. + +::: + +### Speed + +Reaching consensus and adding blocks is faster in Clique networks. For Clique, the probability of a fork increases as the number of validators increases. + +For QBFT and IBFT 2.0, the time to add new blocks increases as the number of validators increases. diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/privacy/_category_.json b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/_category_.json new file mode 100644 index 00000000000..e1382c18fd5 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Privacy", + "position": 2 +} diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/privacy/flexible-privacy.md b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/flexible-privacy.md new file mode 100644 index 00000000000..ea40eca8c52 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/flexible-privacy.md @@ -0,0 +1,81 @@ +--- +title: Flexible privacy groups +sidebar_position: 3 +description: Flexible privacy groups +--- + +# Flexible privacy groups + +Flexible [privacy groups](privacy-groups.md) use smart contracts to store and maintain the group membership. You can [add and remove members to and from flexible privacy groups](../../how-to/use-privacy/flexible.md). + +:::tip + +Because group membership for flexible privacy groups is stored in a smart contract, flexible privacy groups are also known as onchain privacy groups. + +::: + +:::danger + +Flexible privacy groups are an early access feature. Don't use in production networks. + +The flexible privacy group interfaces might change between releases. There might not be an upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy group functionality in future versions. + +We don't recommended creating flexible privacy groups in a chain with existing [offchain privacy groups](privacy-groups.md). + +::: + +## Group management contracts + +The privacy group management contract bytecode is hard-coded into Besu and when you create a privacy group, the contract bytecode is part of the genesis state of the privacy group. + +:::caution + +All members of a flexible privacy group must be using the same version of Besu. If using different versions, the private state within the privacy group may become inconsistent. + +::: + +In the default implementation of the group management contract, the signer of the private transaction that creates the privacy group is also the owner of the group. Only the owner can add and remove participants, and upgrade the management contract. + +The owner is identified by the signing key. Transactions to add and remove participants, or upgrade the management contract, must be signed by the same key that signed the group creation transaction. + +## Flexible privacy group IDs + +When creating a flexible privacy group, generate the privacy group ID for the group outside of Besu and pass the ID as a parameter. + +The [web3js-quorum library](../../how-to/use-privacy/flexible.md) generates a unique privacy group ID and passes the ID to Besu when creating a privacy group. + +:::caution + +When generating a privacy group ID, you must ensure the ID is unique across all network participants. If you create a privacy group with an existing privacy group ID, the existing privacy group is overwritten. + +To ensure unique privacy group IDs, we recommend using 256-bit SecureRandom. + +::: + +## Multi-tenancy + +When using [multi-tenancy](multi-tenancy.md) with flexible privacy groups, each user provides a JSON Web Token (JWT) which allows Besu to check that the user has access to functionality and data associated with a privacy group. + +Using multi-tenancy with flexible privacy groups is more complex than with [offchain privacy groups](privacy-groups.md) because users may be added and removed from flexible privacy groups. When a user is added to a privacy group, they get access to all existing data in the privacy group. After being removed from a privacy group, a user retains access to already existing data in the privacy group, up to the block containing the [privacy marker transaction (PMT)](private-transactions/processing.md) that removed them (the removal block). A removed user doesn't have access to data in the privacy group that happens after they were removed. + +In particular, when multi-tenancy is enabled and a user requests access to a privacy group they were once a member of but later removed from, Besu allows the user access to the following functionality and data associated with the privacy group: + +- Private transactions using `priv_getTransaction` and private transaction receipts using [`priv_getTransactionReceipt`](../../../public-networks/reference/api/index.md#priv_gettransactionreceipt) from blocks up to (and including) the removal block. + + :::note + + A removed group member may have access to some private transactions after the removal PMT in the same block. + + ::: + +- Using [`priv_call`](../../../public-networks/reference/api/index.md#priv_call) on blocks up to (and including) the removal block. + +- Private logs using [`priv_getLogs`](../../../public-networks/reference/api/index.md#priv_getlogs) for blocks up to (and including) the removal block. When the `toBlock` is greater than the removal block, `priv_getLogs` still returns logs up to the removal block. + + :::note + + When a user is removed from a privacy group, any log filters they've created are also removed and can't be accessed. A user can only create and access filters for a privacy group they are currently a member of. + + ::: + +All other [`PRIV` API methods](../../../public-networks/reference/api/index.md#priv-methods) fail for the removed group member. diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/privacy/index.md b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/index.md new file mode 100644 index 00000000000..4ffda6e883d --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/index.md @@ -0,0 +1,67 @@ +--- +title: Privacy +sidebar_position: 1 +description: Privacy +--- + +# Privacy + +In Besu, privacy refers to the ability to keep transactions private between the involved participants. Other participants cannot access the transaction content or list of participants. + +:::danger + +For production environments requiring private transactions: + +- We recommend using a network with a consensus mechanism supporting transaction finality. For example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md). +- Tessera must be [highly available and run in a separate instance to Besu]. + +Using private transactions with [pruning] or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. + +::: + +## Private transaction manager + +Besu uses a private transaction manager, [Tessera](https://docs.tessera.consensys.net/), to implement privacy. Each Besu node that sends or receives [private transactions](private-transactions/index.md) requires an associated Tessera node. + +![Tessera Nodes](../../../assets/images/TesseraNodes.png) + +Private transactions pass from the Besu node to the associated Tessera node. The Tessera node encrypts and directly distributes (that is, point-to-point) the private transaction to the Tessera nodes participating in the transaction. + +By default, each participant in a privacy-enabled network uses its own Besu and Tessera node. [Multi-tenancy](multi-tenancy.md) allows more than one participant to use the same Besu and Tessera node. + +:::tip + +Private Transaction Managers are also known as Enclaves. + +::: + +## Privacy-enabled networks + +When enabling privacy in a [private network](../../get-started/system-requirements.md), there's an assumed level of trust among the node operators, since all are members of the private network. + +:::caution + +Inefficient contracts deployed accidentally or deliberately can cause performance issues in privacy-enabled networks because gas isn't required in private transactions. + +::: + +In contrast, gas is required in Ethereum Mainnet and public testnets because they are trustless environments. + +Privacy-enabled networks should have a mechanism to establish trust offchain. Node operators should be informed on: + +- Guidelines for use, responsibilities, and good behavior. +- Smart contract security, so contracts deployed on the network use resources efficiently. +- Consequences for malicious activity. + +Privacy-enabled networks should run development and test environments that closely resemble production, so contracts can be tested, and potential issues can be found before they're deployed in production. + +## Reorg-compatible privacy + +In v1.4, using private transactions in a network using a consensus mechanism where forks occur (that is, PoW algorithms or Clique) is an early access feature. + +Do not use private transactions in production environments using consensus mechanisms where forks occur. + + + +[highly available and run in a separate instance to Besu]: ../../how-to/use-privacy/tessera.md +[pruning]: ../../../public-networks/concepts/data-storage-formats.md#pruning diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/privacy/multi-tenancy.md b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/multi-tenancy.md new file mode 100644 index 00000000000..d04b9606eb8 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/multi-tenancy.md @@ -0,0 +1,33 @@ +--- +title: Multi-tenancy +sidebar_position: 4 +description: Multi-tenancy +--- + +# Multi-tenancy + +By default, each participant in a privacy network uses its own Besu and Tessera node. + +Multi-tenancy allows multiple participants to use the same Besu and Tessera node. Each participant is a _tenant_, and the operator is the _owner_ of the Besu and Tessera node. + +:::info + +The operator is responsible for [configuring multi-tenancy](../../tutorials/privacy/multi-tenancy.md), and has access to all tenant data. + +::: + +![Multi-tenancy](../../../assets/images/Multi-tenancy.png) + +:::tip + +Ensure the multi-tenant Tessera node client API is configured to allow access only by the multi-tenant Besu node. Access to your data is secured through Besu using multi-tenancy mode. + +If not configured to allow access only by the multi-tenant Besu node, other Tessera clients, including other Besu nodes, might be able to access tenant data. + +To secure access, you can [configure TLS between Besu and Tessera](../../how-to/configure/tls/client-and-server.md) with the [`WHITELIST`](https://docs.tessera.consensys.net/en/stable/HowTo/Configure/TLS/#whitelist) trust mode. + +::: + +Multi-tenancy validates that tenants have permission to use the specified HTTP or WebSocket JSON-RPC requests, and the tenant has access to the requested privacy data. Private data is isolated and each tenant uses a JSON Web Token (JWT) for authentication. + +You can [create the JWT either externally or internally](../../../public-networks/how-to/use-besu-api/authenticate.md). diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/privacy/plugin.md b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/plugin.md new file mode 100644 index 00000000000..fbc34fb440f --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/plugin.md @@ -0,0 +1,111 @@ +--- +title: Privacy plugin +description: Privacy plugin +sidebar_position: 5 +--- + +# Privacy plugin + +You can define your own strategy for private transactions by building a plugin that extends Hyperledger Besu functionality. + +The plugin can take many forms, but it must provide Besu with a private transaction when required. + +:::danger + +The privacy plugin is an early access feature and plugin interfaces are subject to change between releases. + +::: + +## Configuration + +Enable the privacy plugin by starting Besu and including the `--Xprivacy-plugin-enabled` command line option. The registered plugin must implement the `PrivacyPluginPayloadProvider` interface. + +## Use the payload provider interface + +The privacy plugin must define the [privacy marker transaction (PMT)] payload. Use the payload to retrieve the contents of the private transaction which could be a link to a location in an enclave, or an encrypted form of the private payload itself. + +Besu doesn't need to know how the private transaction is distributed, it just needs to know what the private transaction for the PMT is. + +### Send transactions + +When submitting a private transaction using [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction), the signed transaction must be sent to `0x000000000000000000000000000000000000007a` to indicate which [privacy precompiled contract](private-transactions/processing.md) is being used. + +The transaction flow is as follows: + +1. The JSON-RPC endpoint passes the private transaction to the private transaction manager (for example Tessera). +2. The private transaction manager sends the private transaction to the privacy plugin. +3. The plugin decides what data to store onchain in the payload, for example the encrypted and serialized private transaction. +4. The plugin returns what needs to be stored in the payload for the PMT. +5. The private transaction handler creates a PMT for the private transaction, and propagates the PMT using devP2P in the same way as a public Ethereum transaction. + +### Mine transactions + +The process of mining transactions happens in reverse to sending transactions. + +1. The Mainnet transaction processor processes the PMT in the same way as any other public transaction. On nodes containing the [privacy precompile contract](../../../public-networks/reference/api/index.md#priv_getprivacyprecompileaddress) specified in the `to` attribute of the PMT, the Mainnet transaction processor passes the PMT to the privacy precompile contract. + + :::note + + Nodes receiving the PMT that do not contain the specified privacy precompile contract will ignore the PMT. + + ::: + +1. The privacy precompile contract queries the plugin for the private transaction using the PMT. +1. The privacy precompile contract passes the private transaction to the private transaction manager. The privacy group ID specifies the private world state to use. +1. The private transaction manager executes the transaction. The private transaction manager can read and write to the private world state, and read from the public world state. + +## Transaction factory + +An additional extension is available to help you define how PMTs are signed. Currently, Besu supports fixed or random key signing for PMTs. + +The extension allows you to use a more dynamic approach, for example different keys for different groups. + +Your plugin needs to register the `PrivateMarkerTransactionFactory` interface which is called before submitting a PMT to the transaction pool. The responsibility then lies with the plugin to sign and serialize the PMT. + +[privacy marker transaction (PMT)]: ../../how-to/use-privacy/access-private-transactions.md + +## Register your plugin + +To enable Besu to use your privacy plugin, you must implement the `PrivacyPluginService` interface and you must call `setPayloadProvider`. + +```java + +@AutoService(BesuPlugin.class) +public class TestPrivacyPlugin implements BesuPlugin { + + private PrivacyPluginService service; + + @Override + public void register(BesuContext context) { + service = context.getService(PrivacyPluginService.class).get(); + } + + @Override + public void start() { + service.setPayloadProvider(new PrivacyPluginPayloadProvider() { + @Override + public Bytes generateMarkerPayload(PrivateTransaction privateTransaction, String privacyUserId) { + // perform logic to serialize the payload of the marker transaction + // in this example we are serialising the private transaction using rlp https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/ + return org.hyperledger.besu.ethereum.privacy.PrivateTransaction.serialize(privateTransaction).encoded(); + } + + @Override + public Optional getPrivateTransactionFromPayload(Transaction transaction) { + // perform logic to deserialize payload from the marker transaction + + final BytesValueRLPInput bytesValueRLPInput = + new BytesValueRLPInput(transaction.getPayload(), false); + + return Optional.of(org.hyperledger.besu.ethereum.privacy.PrivateTransaction.readFrom(bytesValueRLPInput)); + } + }); + } + + @Override + public void stop() { + + } +} + +``` diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/privacy/privacy-groups.md b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/privacy-groups.md new file mode 100644 index 00000000000..d34e661f725 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/privacy-groups.md @@ -0,0 +1,73 @@ +--- +title: Privacy groups +sidebar_position: 2 +description: Privacy groups +--- + +# Privacy groups + +A privacy group is a group of nodes identified by a unique privacy group ID by Tessera. Tessera stores each private transaction with the privacy group ID. + +The Besu nodes maintain the public world state for the blockchain and a private state for each privacy group. The private states contain data that is not shared in the globally replicated world state. + +:::caution + +The privacy group implementations described below are offchain privacy groups and cannot have their group membership updated. + +[Flexible privacy groups are an early access feature](flexible-privacy.md). + +::: + +## Privacy types + +Besu implements two types of privacy: + +- Enterprise Ethereum Alliance (EEA) privacy, where private transactions include `privateFor` as the recipient. +- Besu-extended privacy, where private transactions include `privacyGroupId` as the recipient. + +Both privacy types create privacy groups and store private transactions with their privacy group in Tessera. + +![Privacy Groups](../../../assets/images/PrivacyGroups.png) + +:::note + +For clarity, the Tessera nodes are not shown in the previous diagram. To send private transactions, each Besu node must have an associated Tessera node. + +::: + +### Access between states + +A contract in a privacy group: + +- Can read or write to a contract in the same privacy group. +- Can read from the public state including public contracts. +- Cannot access contracts from a different privacy group. + +A public contract cannot access a private contract. + +### Enterprise Ethereum Alliance privacy + +In the privacy implementation complying with the [EEA Client Specification](https://entethalliance.org/technical-documents/) the group of nodes specified by `privateFrom` and `privateFor` form a privacy group with a unique privacy group ID provided by Tessera. + +The previous diagram illustrates two privacy groups enabling: + +- A, B, and C to send transactions that are private from D. +- A, C, and D to send transactions that are private from B. + +Using EEA-compliant privacy, to send private transactions between A, B, and C, A initializes a contract in a private transaction with B and C specified as the `privateFor` and A specified as the `privateFrom`. Initializing the contract creates a privacy group consisting of A, B, and C. For the ABC private state to remain consistent, A, B, and C must be included on transactions (as either `privateFrom` or `privateFor`) even if they are between only two of the three parties. + +To send private transactions between A, C, and D, C initializes a different contract in a private transaction with A and D specified as the `privateFor` and C specified as the `privateFrom`. Initializing the contract creates a privacy group consisting of A, C, and D. For the ACD private state to remain consistent, A, C, and D must be included on transactions (as either `privateFrom` or `privateFor`) even if they are between only two of the three parties. + +### Besu-extended privacy + +The Besu-extended privacy implementation creates a privacy group using [`priv_createPrivacyGroup`](../../../public-networks/reference/api/index.md#priv_createprivacygroup) with private transactions sent to the privacy group ID. + +Using the same privacy groups as in the previous example. + +Using Besu-extended privacy, to send private transactions between A, B, and C, A creates a privacy group consisting of A, B, and C. The privacy group ID is specified when sending private transactions and A, B, and C are recipients of all private transactions sent to the privacy group. + +To send private transactions between A, C, and D, A creates a privacy group consisting of A, C, and D. The privacy group ID of this group is specified when sending private transactions with A, C, and D as recipients. + +## Multi-tenancy + +When using [multi-tenancy](multi-tenancy.md) with privacy groups, each user provides a JSON Web Token (JWT) which allows Besu to check that the user has access to functionality and data associated with a privacy group. diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/privacy/private-transactions/_category_.json b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/private-transactions/_category_.json new file mode 100644 index 00000000000..465b0be5572 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/private-transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Private transactions", + "position": 1 +} diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/privacy/private-transactions/index.md b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/private-transactions/index.md new file mode 100644 index 00000000000..c149089080d --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/private-transactions/index.md @@ -0,0 +1,98 @@ +--- +description: Private transaction overview +--- + +# Private transactions + +Private transactions have the same parameters as public Ethereum transactions, with the following additions: + +- `privateFrom` - The Tessera public key of the transaction sender. +- One of the following: + - `privateFor` - The Tessera public keys of the transaction recipients. + - `privacyGroupId` - [The privacy group to receive the transaction](../privacy-groups.md). +- `restriction` - Whether the private transaction is `restricted` or `unrestricted`: + + - `restricted` - Only the nodes participating in the transaction receive and store the payload of the private transaction. + - `unrestricted` - All nodes in the network receive the payload of the private transaction, but only the nodes participating in the transaction can read the transaction. + + :::info + + Besu implements `restricted` private transactions only. + + ::: + +The `gas` and `gasPrice` are used by the [privacy marker transaction (PMT)](processing.md), not the private transaction itself. + +:::info + +Because gas isn't required in private transactions, inefficient contracts deployed accidentally or deliberately can cause performance issues in privacy-enabled networks. Ensure your network has a mechanism to [establish trust offchain](../index.md#privacy-enabled-networks). + +::: + +You can [create and send private transactions](../../../how-to/send-transactions/private-transactions.md). + +## Besu and Tessera keys + +Besu and Tessera nodes both have public/private key pairs identifying them. A Besu node sending a private transaction to a Tessera node signs the transaction with the Besu node private key. The `privateFrom` and `privateFor` parameters specified in the RLP-encoded transaction string for [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) are the public keys of the Tessera nodes sending and receiving the transaction. + +:::info + +The mapping of Besu node addresses to Tessera node public keys is offchain. That is, the sender of a private transaction must know the Tessera node public key of the recipient. + +::: + +## Nonces + +A nonce is the number of previous transactions made by the sender. + +[Private transaction processing](processing.md) involves two transactions: the private transaction distributed to involved participants, and the privacy marker transaction (PMT) included on the public blockchain. Each of these transactions has its own nonce. Since the PMT is a public transaction, the PMT nonce is the public nonce for the account. + +### Private transaction nonce + +Besu maintains separate private states for each [privacy group](../privacy-groups.md). The private transaction nonce for an account is specific to the privacy group. That is, the nonce for account A for privacy group ABC is different to the nonce for account A for privacy group AB. + +### Private nonce validation + +Unlike public transactions, private transactions are not submitted to the [transaction pool](../../../../public-networks/concepts/transactions/pool.md). The private transaction is distributed directly to the participants in the transaction, and the PMT is submitted to the transaction pool. + +Unlike [public transaction nonces](../../../../public-networks/concepts/transactions/validation.md), private transaction nonces aren't validated when the private transaction is submitted. If a private transaction has an incorrect nonce, the PMT is still valid and is added to a block. However, in this scenario, the private transaction execution fails when [processing the PMT](processing.md) for the private transaction with the incorrect nonce. + +The following private transaction flow illustrates when nonce validation occurs: + +1. Submit a private transaction with a [nonce value](#private-transaction-nonce). +1. The private transaction is distributed to all participants in the privacy group. +1. The PMT is created and submitted to the transaction pool with a nonce of `0` if using one-time accounts. If using a specific account with [`--privacy-marker-transaction-signing-key-file`](../../../reference/cli/options.md#privacy-marker-transaction-signing-key-file), the public nonce for that account is obtained and used for the PMT. +1. The PMT is mined and included in the block. +1. After the block containing the PMT is imported, and the PMT is processed, the private transaction is retrieved from the private transaction manager and executed. + + If the private transaction was submitted with a correct nonce in step 1, the nonce is validated as correct. If an incorrect nonce was submitted, the private transaction execution fails. + +### Private nonce management + +In Besu, you call [`eth_getTransactionCount`](../../../../public-networks/reference/api/index.md#eth_gettransactioncount) to get a nonce, then use that nonce with [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) to send a private transaction. + +However, when you send multiple transactions in row, if a subsequent call to `getTransactionCount` happens before a previous transaction is processed, you can get the same nonce again. + +You can manage private nonces in multiple ways: + +- Let Besu handle it. You just need to wait long enough between calls to `sendRawTransaction` for the transactions to process. The current window is around 1.5 seconds, depending on block time. + + Public transactions deal with this issue, but the window is shorter, since you can use the transaction pool to take into account pending transactions (by using `eth_getTransactionCount("pending")`). + + For private transactions, the window is longer because private transactions aren't submitted to the transaction pool. You must wait until the private transaction's corresponding PMT is included in a block. + +- Manage the nonce yourself, by keeping track of and providing the nonce at each call. We recommend this if you're [sending many transactions that are independent of each other](../../../how-to/send-transactions/concurrent-private-transactions.md). + + :::note + + You can use [`priv_getTransactionCount`](../../../reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for an account for the specified privacy group or participants. + + ::: + +- Use [Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) for nonce management. We recommend this for enterprise use. + +:::tip + +The [web3js-quorum library includes an example](https://github.com/ConsenSys/web3js-quorum/blob/9a0f9eb1b91a4a0d93801f77782b509ae2e7314c/example/concurrentPrivateTransactions/concurrentPrivateTransactions.js) of nonce management when [sending concurrent private transactions](../../../how-to/send-transactions/concurrent-private-transactions.md). The example calculates the correct nonces for the private transactions and PMTs outside of Besu. + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/concepts/privacy/private-transactions/processing.md b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/private-transactions/processing.md new file mode 100644 index 00000000000..196f2b9e7e0 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/concepts/privacy/private-transactions/processing.md @@ -0,0 +1,72 @@ +--- +title: Private transaction processing +sidebar_position: 1 +description: Private transaction processing +--- + +# Private transaction processing + +Processing [private transactions](index.md) involves the following: + +- **Precompiled contract**: A smart contract compiled from the source language to EVM bytecode and stored by an Ethereum node for later execution. + +- **Privacy marker transaction (PMT)**: A public Ethereum transaction with a payload of the enclave key. The enclave key is a pointer to the private transaction in Tessera. The `to` attribute of the PMT is the [address of the privacy precompiled contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress). + + The PMT is [signed with a random key or the key specified on the command line]. + +Private transaction processing is illustrated and described in the following diagram. + +![Processing Private Transactions](../../../../assets/images/PrivateTransactionProcessing.png) + +1. Submit a private transaction using [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). The signed transaction includes transaction parameters specific to private transactions, including: + + - `privateFor` or `privacyGroupId`, which specifies the list of recipients. + - `privateFrom`, which specifies the sender. + - `restriction`, which specifies the transaction is restricted to the transaction participants. + +1. The JSON-RPC endpoint passes the private transaction to the Private Transaction Handler. + +1. The Private Transaction Handler sends the private transaction to Tessera. + +1. Tessera distributes the private transaction directly (that is, point-to-point) to the Tessera nodes specified in `privateFor` or belonging to the privacy group identified by `privacyGroupId`. All recipient Tessera nodes store the transaction. Tessera associates the stored transaction with the transaction hash and privacy group ID. + +1. Tessera returns the transaction hash to the Private Transaction Handler. + +1. The Private Transaction Handler creates a PMT for the private transaction. The Private Transaction Handler propagates the PMT using devP2P in the same way as any other public Ethereum transaction. + + :::tip + + If you want to sign the PMT outside of Besu, use [`priv_distributeRawTransaction`](../../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). + + ::: + +1. Besu mines the PMT into a block and the PMT is distributed to all Ethereum nodes in the network. + +1. The Mainnet Transaction Processor processes the PMT in the same way as any other public transaction. On nodes containing the [privacy precompile contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress) specified in the `to` attribute of the PMT, the Mainnet Transaction Processor passes the PMT to the privacy precompile contract. + + :::note + + Nodes receiving the PMT that don't contain the privacy precompile contract ignore the PMT. + + ::: + +1. The privacy precompile contract queries Tessera for the private transaction and privacy group ID using the transaction hash. + +1. The privacy precompile contract passes the private transaction to the Private Transaction Processor. The privacy group ID specifies the private world state to use. + +1. The Private Transaction Processor executes the transaction. The Private Transaction Processor can read and write to the private world state, and read from the public world state. + +:::danger Recommendations + +- We recommend using a network with a consensus mechanism supporting transaction finality. For example, [IBFT 2.0](../../../how-to/configure/consensus/ibft.md). +- Tessera must be [highly available and run in a separate instance to Besu](../../../how-to/use-privacy/tessera.md). + +Using private transactions with [pruning] or [fast sync](../../../../public-networks/reference/cli/options.md#sync-mode) is not supported. + +::: + + + +[signed with a random key or the key specified on the command line]: ../../../how-to/use-privacy/sign-pmts.md +[highly available and run in a separate instance to Besu]: ../../../how-to/use-privacy/tessera.md +[pruning]: ../../../../public-networks/concepts/data-storage-formats.md#pruning diff --git a/versioned_docs/version-23.4.0/private-networks/get-started/_category_.json b/versioned_docs/version-23.4.0/private-networks/get-started/_category_.json new file mode 100644 index 00000000000..cb3e9e274e8 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/get-started/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Get started", + "position": 2, + "link": { + "type": "generated-index" + } +} diff --git a/versioned_docs/version-23.4.0/private-networks/get-started/install/_category_.json b/versioned_docs/version-23.4.0/private-networks/get-started/install/_category_.json new file mode 100644 index 00000000000..043580c1474 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/get-started/install/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Install Besu", + "position": 2 +} diff --git a/versioned_docs/version-23.4.0/private-networks/get-started/install/binary-distribution.md b/versioned_docs/version-23.4.0/private-networks/get-started/install/binary-distribution.md new file mode 100644 index 00000000000..afa7a65d6ed --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/get-started/install/binary-distribution.md @@ -0,0 +1,86 @@ +--- +title: Install binary distribution +description: Install or upgrade Hyperledger Besu from binary distribution +sidebar_position: 3 +--- + +# Install binary distribution + +## MacOS with Homebrew + +### Prerequisites + +- [Homebrew](https://brew.sh/) +- Java JDK + +:::caution + +Hyperledger Besu supports: + +- MacOS High Sierra 10.13 or later versions. +- Java 17+. You can install Java using `brew install openjdk`. Alternatively, you can manually install the [Java JDK](https://www.oracle.com/java/technologies/downloads). + +::: + +### Install (or upgrade) using Homebrew + +To install Besu using Homebrew: + +```bash +brew tap hyperledger/besu +brew install hyperledger/besu/besu +``` + +To upgrade an existing Besu installation using Homebrew: + +```bash +brew upgrade hyperledger/besu/besu +``` + +:::note + +If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. + +::: + +:::note + +When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command `brew tap --repair`. + +::: + +To display the Besu version and confirm installation: + +```bash +besu --version +``` + +To display Besu command line help: + +```bash +besu --help +``` + +## Linux / Unix + +### Prerequisites + +- [Java JDK](https://www.oracle.com/java/technologies/downloads/) + +:::note Linux open file limit + +If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the maximum number of open files allowed using `ulimit`. If the open files limit is not high enough, a `Too many open files` RocksDB exception occurs. + +::: + +### Install from packaged binaries + +Download the Besu [packaged binaries](https://github.com/hyperledger/besu/releases). + +Unpack the downloaded files and change into the `besu-` directory. + +Display Besu command line help to confirm installation: + +```bash +bin/besu --help +``` diff --git a/versioned_docs/version-23.4.0/private-networks/get-started/install/index.md b/versioned_docs/version-23.4.0/private-networks/get-started/install/index.md new file mode 100644 index 00000000000..6f718dc97a3 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/get-started/install/index.md @@ -0,0 +1,26 @@ +--- +title: Installation options +description: Options for getting started with Hyperledger Besu +sidebar_position: 1 +--- + +# Installation options + +Get started with the [Developer Quickstart](../../../private-networks/tutorials/quickstart.md). Use the quickstart to rapidly generate local blockchain networks. + +You can also install the following: + +- [Docker image](run-docker-image.md) +- [Binaries](binary-distribution.md) + +## Build from source + +If you want to use the latest development version of Hyperledger Besu or a specific commit, build from source. Otherwise, use the [binary] or [Docker image] for more stable versions. + +View the [Hyperledger Wiki] for instructions to install Hyperledger Besu from source. + + + +[Hyperledger Wiki]: https://wiki.hyperledger.org/display/BESU/Building+from+source +[binary]: binary-distribution.md +[Docker image]: run-docker-image.md diff --git a/versioned_docs/version-23.4.0/private-networks/get-started/install/run-docker-image.md b/versioned_docs/version-23.4.0/private-networks/get-started/install/run-docker-image.md new file mode 100644 index 00000000000..89589d66add --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/get-started/install/run-docker-image.md @@ -0,0 +1,107 @@ +--- +title: Run Besu from Docker image +description: Run Hyperledger Besu using the official docker image +sidebar_position: 2 +--- + +# Run Besu from a Docker image + +Hyperledger Besu provides a Docker image to run a Besu node in a Docker container. + +Use this Docker image to run a single Besu node without installing Besu. + +## Prerequisites + +- [Docker](https://docs.docker.com/install/) + +- MacOS or Linux + + :::caution + + The Docker image does not run on Windows. + + ::: + +## Expose ports + +Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need to expose the ports to use the default ports or the ports specified using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port), [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port), [`--rpc-ws-port`](../../../public-networks/reference/cli/options.md#rpc-ws-port), [`--metrics-port`](../../../public-networks/reference/cli/options.md#metrics-port), [`--graphql-http-port`](../../../public-networks/reference/cli/options.md#graphql-http-port), and [`--metrics-push-port`](../../../public-networks/reference/cli/options.md#metrics-push-port) options. + +To run Besu exposing local ports for access: + +```bash +docker run -p :8545 -p :8546 -p :30303 hyperledger/besu:latest --rpc-http-enabled --rpc-ws-enabled +``` + +:::note + +The examples on this page expose TCP ports only. To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: + +```bash +docker run -p :/udp +``` + +See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). + +::: + +To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: + +```bash +docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled +``` + +## Start Besu + +:::danger + +Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default data path interferes with the operation of Besu and prevents Besu from safely launching. + +To run a node that maintains the node state (key and database), [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) must be set to a location other than `/opt/besu` and a storage volume mounted at that location. + +When running in a Docker container, [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) must be set to `DOCKER` or `AUTO` (default). Don't set [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) to `NONE` or `UPNP`. + +::: + +You can specify [Besu environment variables](../../../public-networks/reference/cli/options.md#specify-options) with the Docker image instead of the command line options. + +```bash +docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest +``` + +:::caution "Unsupported address type exception" + +When running Besu from a Docker image, you might get the following exception: + +```bash +Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. +``` + +This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, preventing outbound communication. IPv6 is disabled by default in Docker. + +[Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound IPv6 traffic and allow connection with IPv6 peers. + +::: + +### Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes with WebSocket enabled: + +```bash +docker run -p 8546:8546 --mount type=bind,source=/,target=/var/lib/besu hyperledger/besu:latest --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-ws-enabled --network=dev --data-path=/var/lib/besu +``` + +## Stop Besu and clean up resources + +When done running nodes, you can shut down the node container without deleting resources or you can delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the container and volume names. + +To stop a container: + +```bash +docker stop +``` + +To delete a container: + +```bash +docker rm +``` diff --git a/versioned_docs/version-23.4.0/private-networks/get-started/start-node.md b/versioned_docs/version-23.4.0/private-networks/get-started/start-node.md new file mode 100644 index 00000000000..60fe10fd401 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/get-started/start-node.md @@ -0,0 +1,104 @@ +--- +title: Start Besu +description: Starting Hyperledger Besu +sidebar_position: 3 +--- + +# Start Besu + +Use the [`besu`](../reference/cli/options.md) command with the required command line options to start a node. + +## Prerequisites + +[Besu installed](install/binary-distribution.md) + +## Local block data + +When connecting to a network other than the network previously connected to, you must either delete the local block data or use the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option to specify a different data directory. + +To delete the local block data, delete the `database` directory in the `besu/build/distribution/besu-` directory. + +## Genesis configuration + +To define a genesis configuration, create a [genesis file](../../public-networks/concepts/genesis-file.md) (for example, `genesis.json`) and specify the file using the [`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) option. + +When you specify [`--network=dev`](../../public-networks/reference/cli/options.md#network), Besu uses the development mode genesis configuration with a fixed low difficulty. A node started with [`--network=dev`](../../public-networks/reference/cli/options.md#network) has an empty bootnodes list by default. + +Predefined genesis configurations for named networks are in the [Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). + +## Confirm node is running + +If you started Besu with the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option, use [cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to confirm the node is running. + +- `eth_chainId` returns the chain ID of the network. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 + ``` + +- `eth_syncing` returns the starting, current, and highest block. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 + ``` + + For example, after connecting to Mainnet, `eth_syncing` will return something similar to: + + ```json + { + "jsonrpc": "2.0", + "id": 1, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x2d0", + "highestBlock": "0x66c0" + } + } + ``` + +## Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes: + +```bash +besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir +``` + +You can also use the following [configuration file](../../public-networks/how-to/configuration-file.md) on the command line to start a node with the same options as above: + +```toml +network="dev" +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +rpc-http-cors-origins=["all"] +host-allowlist=["*"] +rpc-ws-enabled=true +rpc-http-enabled=true +data-path="/tmp/tmpdata-path" +``` + +:::caution + +The following settings are a security risk in production environments: + +- Enabling the HTTP JSON-RPC service ([`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled)) and setting [`--rpc-http-host`](../../public-networks/reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the RPC connection on your node to any remote connection. +- Setting [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) to `"*"` allows JSON-RPC API access from any host. +- Setting [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) to `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. + +::: + +## Run a node on a private network + +To run a node on your private network specifying a genesis file and data directory: + +```bash +besu --genesis-file=/genesis.json --data-path= --rpc-http-enabled --bootnodes= +``` + +Where `` is the path to the directory to save the chain data to. Ensure you configure a peer discovery method, such as [bootnodes](../how-to/configure/bootnodes.md). + +:::note + +You might need to set [`--tx-pool-limit-by-account-percentage`](../../public-networks/reference/cli/options.md#tx-pool-limit-by-account-percentage) to 1. The default value is suitable for Mainnet, but may cause issues on private networks. + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/get-started/system-requirements.md b/versioned_docs/version-23.4.0/private-networks/get-started/system-requirements.md new file mode 100644 index 00000000000..1695ed36a09 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/get-started/system-requirements.md @@ -0,0 +1,50 @@ +--- +title: System requirements +description: System requirements to sync and run Besu +sidebar_position: 1 +--- + +# System requirements + +Private network system requirements depend on many factors, including: + +- Size of the world state for the network. +- Number of transactions submitted to the network. +- [Block gas limit](../../public-networks/reference/genesis-items.md#genesis-block-parameters). +- Number and complexity of [JSON-RPC](../../public-networks/how-to/use-besu-api/json-rpc.md), [PubSub](../../public-networks/how-to/use-besu-api/rpc-pubsub.md), or [GraphQL](../../public-networks/how-to/use-besu-api/graphql.md) queries handled by the node. + +Participation in private networks is typically restricted in some way, so the volume of traffic is much lower than on Mainnet, resulting in lower system requirements. + +## Determining system requirements + +To determine system requirements, check CPU and disk space requirements using [Prometheus](../../public-networks/how-to/monitor/metrics.md). Grafana provides a [sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. + +## Java Virtual Machine size + +Depending on your environment and network setup, the minimum Java Virtual Machine (JVM) memory requirement for private networks is 4 GB. + +JVM memory requirements are highest when syncing, but will reduce after the node is synchronized to the chain head. Monitor your system to determine your actual JVM memory needs. + +## VM requirements + +If you set up your own VM locally using a VM manager such as [VirtualBox](https://www.oracle.com/virtualization/virtualbox/): + +- Ensure you enable Intel Virtualization Technology (VTx) and Virtualization Technology for Directed I/O (VT-d) in the BIOS settings. +- On Windows, you might need to disable Hyper-V in the Windows Feature list. + +We recommend you create a VM with the following attributes: + +- Memory size: Set to 6 GB (recommended) +- Create a virtual hard disk with at least 10 GB (20 GB recommended) +- Virtual hard disk file type: VDI (if you need to share it with other apps, use VHD) +- (Optional) You can create a shared directory to copy block files or genesis files from the host computer to the VM. For details on how to create a shared directory, see "Share Folders" in the [Oracle VirtualBox documentation]. + +## Disk type + +Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). Read-only nodes can use a lower performance setup. + +You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). For higher performance in production settings, we recommend upgrading to [NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). + + + +[Oracle VirtualBox documentation]: https://docs.oracle.com/en/virtualization/virtualbox/6.1/user/ diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/_category_.json b/versioned_docs/version-23.4.0/private-networks/how-to/_category_.json new file mode 100644 index 00000000000..ba43c43036f --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "How to", + "position": 3 +} diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/backup.md b/versioned_docs/version-23.4.0/private-networks/how-to/backup.md new file mode 100644 index 00000000000..4500d87fd0d --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/backup.md @@ -0,0 +1,49 @@ +--- +title: Backup and restore +description: Backing up and restoring Besu +sidebar_position: 7 +--- + +# Backup and restore Besu + +In a decentralized blockchain, data replicates between nodes so it's not lost. But backing up configuration and data ensures a smoother recovery from corrupted data or other failures. + +## Genesis file + +The genesis file for a network must be accessible on every node. We recommend storing the genesis file under source control. + +## Data backups + +If installed locally, the default data location is the Besu installation directory. + +We recommend mounting a [separate volume to store data](../get-started/install/run-docker-image.md). Use the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) command line option to pass the path to Besu. + +The default data location is the Besu installation directory, or `/opt/besu/database` if using the [Besu Docker image](../get-started/install/run-docker-image.md). + +Having some data reduces the time to synchronize a new node. You can perform periodic backups of the data directory and send the data to your preferred backup mechanism. For example, `cron` job and `rsync`, archives to the cloud such as s3, or `tar.gz` archives. + +## Data restores + +To restore data: + +1. If the node is running, stop the node. +1. If required, move the data directory to another location for analysis. +1. Restore the data from your last known good backup to the same directory. +1. Ensure user permissions are valid so you can read from and write to the data directory. +1. Restart the node. + +## Corrupted data + +If log messages signify a corrupt database, the cleanest way to recover is: + +1. Stop the node. +1. Restore the data from a [previous backup](#data-backups). +1. Restart the node. + +## Find peers after restarting + +The process for finding peers after restarting is the same as for [finding peers after upgrading and restarting]. + + + +[finding peers after upgrading and restarting]: ../../public-networks/how-to/upgrade-node.md#find-peers-on-restarting diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/_category_.json b/versioned_docs/version-23.4.0/private-networks/how-to/configure/_category_.json new file mode 100644 index 00000000000..9a879b74368 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Configure", + "position": 1, + "link": { + "type": "generated-index" + } +} diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/block-proposal-permissioning.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/block-proposal-permissioning.md new file mode 100644 index 00000000000..c221095ce7e --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/block-proposal-permissioning.md @@ -0,0 +1,290 @@ +--- +title: Block proposal permissioning +description: Block proposal permissioning +sidebar_position: 7 +--- + +# Block proposal permissioning + +:::info + +Only private networks using the [QBFT consensus protocol] support block proposal permissioning. + +Block proposal permissioning is an early access feature, and functionality and options may be updated between releases. + +::: + +You can configure [block proposal permissioning](../../concepts/pki.md#block-proposal-permissioning) to ensure only authorized validator nodes can propose blocks in the network. + +Use certificates issued by a trusted authority to ensure validators are authorized to propose blocks. + +## Configure block proposal permissioning + +**Prerequisites**: + +- A configured network. For example, [see steps 1 to 5 in the QBFT tutorial](../../tutorials/qbft.md). +- A keystore containing the certificate and key for each network node. +- A truststore containing all the trusted certificates for the network. + +Start Besu and include the following command line options on the required nodes: + +```bash +besu --Xpki-block-creation-enabled=true \ +--Xpki-block-creation-keystore-type="pkcs12" \ +--Xpki-block-creation-keystore-file="keystore" \ +--Xpki-block-creation-keystore-password-file="keystore.password" \ +--Xpki-block-creation-crl-file="crl2.pem" \ +--Xpki-block-creation-keystore-certificate-alias="validator" \ +--Xpki-block-creation-truststore-type="pkcs12" \ +--Xpki-block-creation-truststore-file="truststore" \ +--Xpki-block-creation-truststore-password-file="truststore.password" +``` + +In the command line: + +- Enable block proposal permissioning using [`--Xpki-block-creation-enabled=true`](#xpki-block-creation-enabled). +- Specify the keystore type and keystore file using [`Xpki-block-creation-keystore-type`](#xpki-block-creation-keystore-type) and [`--Xpki-block-creation-keystore-file`](#xpki-block-creation-keystore-file). +- Specify the text file containing the password to unlock the keystore file using [`Xpki-block-creation-keystore-password-file`](#xpki-block-creation-keystore-password-file). +- Specify the optional [certificate revocation list (CRL)] file using [`Xpki-block-creation-crl-file`](#xpki-block-creation-crl-file). +- Specify the alias of the certificate to be included in blocks proposed by this validator using [`Xpki-block-creation-keystore-certificate-alias`](#xpki-block-creation-keystore-certificate-alias). +- Specify the truststore type and truststore file using [`Xpki-block-creation-truststore-type`](#xpki-block-creation-truststore-type) and [`Xpki-block-creation-truststore-file`](#xpki-block-creation-truststore-file). +- Specify the text file containing the password to unlock the truststore file using [`Xpki-block-creation-truststore-password-file`](#xpki-block-creation-truststore-password-file). + +## Command line options + +### `Xpki-block-creation-crl-file` + + + +# Syntax + +```bash +--Xpki-block-creation-crl-file= +``` + +# Example + +```bash +--Xpki-block-creation-crl-file=/home/cert/cert.crl.pem +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_CRL_FILE=/home/cert/cert.crl.pem +``` + + + +Path to the optional certificate revocation list (CRL) file. + +### `Xpki-block-creation-enabled` + + + +# Syntax + +```bash +--Xpki-block-creation-enabled[=] +``` + +# Example + +```bash +--Xpki-block-creation-enabled=true +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_ENABLED=true +``` + + + +Enable PKI integration. The default is `false`. + +### `Xpki-block-creation-keystore-certificate-alias` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-certificate-alias= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-certificate-alias=validatorA +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_CERTIFICATE_ALIAS=validatorA +``` + + + +Alias of the certificate to be included in the blocks proposed by this validator. The default is `validator`. + +### `Xpki-block-creation-keystore-file` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-file= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-file=/home/cert/keystore.jks +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_FILE=/home/cert/keystore.jks +``` + + + +Keystore file containing the key and certificate for PKI block creation. + +### `Xpki-block-creation-keystore-password-file` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-password-file= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_PASSWORD-FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the keystore file. + +### `Xpki-block-creation-keystore-type` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-type= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-type=JKS +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_TYPE=JKS +``` + + + +PKI keystore type. Valid options are `JKS` and `PKCS12`. The default is `JKS`. + +### `Xpki-block-creation-truststore-file` + + + +# Syntax + +```bash +--Xpki-block-creation-truststore-file= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-file=/home/cert/truststore.jks +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_FILE=/home/cert/truststore.jks +``` + + + +Truststore containing the trusted certificates for PKI block creation. + +### `Xpki-block-creation-truststore-password-file` + + + +# Syntax + +```bash +--Xpki-block-creation-truststore-password-file= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the truststore file. + +### `Xpki-block-creation-truststore-type` + + + +# Syntax + +```bash +--Xpki-block-creation-truststore-type= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-type=JKS +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_TYPE=JKS +``` + + + +PKI truststore type. Valid options are `JKS` and `PKCS12`. The default is `JKS`. + +[QBFT consensus protocol]: ./consensus/qbft.md +[certificate revocation list (CRL)]: https://www.securew2.com/blog/certificate-revocation-crl-explained diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/bootnodes.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/bootnodes.md new file mode 100644 index 00000000000..731c1796c8e --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/bootnodes.md @@ -0,0 +1,69 @@ +--- +title: Bootnodes +description: Configuring bootnodes +sidebar_position: 3 +--- + +# Configure bootnodes + +You can use bootnodes to initially discover peers. Bootnodes are regular nodes used to discover other nodes. + +In private networks for development or testing purposes, specify at least one bootnode. + +In production networks, [configure two or more nodes as bootnodes](#configure-bootnodes-in-a-production-network). + +:::tip + +Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, you can use only bootnodes, only static nodes, or both bootnodes and static nodes. + +To find peers, configure one or more bootnodes. To configure a specific set of peer connections, use [static nodes](../../../public-networks/how-to/connect/static-nodes.md). + +::: + +:::note Mainnet and public testnets + +For Mainnet and the Sepolia and Goerli testnets, Hyperledger Besu has an internal list of enode URLs and uses this list automatically when you specify the [`--network`](../../../public-networks/reference/cli/options.md#network) option. + +::: + +## Specify a bootnode + +To start a node, specify a bootnode [enode](../../../public-networks/concepts/node-keys.md) for P2P discovery, using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. + +```bash +besu --genesis-file=privateNetworkGenesis.json --data-path=nodeDataPath --bootnodes=enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb99bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303 +``` + +The default host and port advertised to other peers for P2P discovery is `127.0.0.1:30303`. To specify a different host or port, use the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) and [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) options. + +By default, peer discovery listens on all available network interfaces. If the device Besu is running on must bind to a specific network interface, specify the interface using the [`--p2p-interface`](../../../public-networks/reference/cli/options.md#p2p-interface) option. + +## Configure bootnodes in a production network + +A network must have at least one operating bootnode. To allow for continuity in the event of failure, configure two or more bootnodes in a production network. + +We don't recommend putting bootnodes behind a load balancer because the [enode](../../../public-networks/concepts/node-keys.md#enode-url) relates to the node public key, IP address, and discovery ports. Any changes to a bootnode enode prevents other nodes from being able to establish a connection with the bootnode. This is why we recommend putting more bootnodes on the network itself. + +To ensure a bootnode enode doesn't change when recovering from a complete bootnode failure: + +1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) before starting the bootnode. +1. When creating bootnodes in the cloud (for example, AWS and Azure), attempt to assign a static IP address to them. If your network is: + + - Publicly accessible, assign an elastic IP. + - Internal only, specify a private IP address when you create the instance and record this IP address. + +We recommend storing the bootnode configuration under source control. + +To allow for failure, specify all bootnodes on the command line (even to the bootnodes themselves). + +:::tip + +Having each bootnode list the other bootnodes increases the speed of discovery. Nodes ignore their own enode in the bootnodes list so it isn't required to specify different bootnode lists to the bootnodes themselves. + +::: + +## Add and remove bootnodes + +Adding new bootnodes is a similar process to creating bootnodes. After creating the bootnodes and adding them to the network, update the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) command line option for each node to include the new bootnodes. + +When adding bootnodes, you don't need to restart running nodes. By updating the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option, the next time you restart the nodes (for example, when [upgrading](../../../public-networks/how-to/upgrade-node.md)), the nodes connect to the new bootnodes. diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/_category_.json b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/_category_.json new file mode 100644 index 00000000000..bc0d5770af5 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Consensus", + "position": 1 +} diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/add-validators-without-voting.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/add-validators-without-voting.md new file mode 100644 index 00000000000..8c1305162f6 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/add-validators-without-voting.md @@ -0,0 +1,307 @@ +--- +title: Add and remove validators without voting +description: How to add or remove validators without voting +sidebar_position: 5 +--- + +# Add and remove validators without voting + +[QBFT](qbft.md) or [IBFT 2.0](ibft.md) network conditions might not allow voting to change validators. For example, if a majority of the current validators are no longer participating in the network, a vote to add or remove validators won't be successful. You can bypass voting and specify new validators using a transition in the genesis file. + +:::caution + +- In most cases, add or remove validators [by voting or smart contract for QBFT](qbft.md#add-and-remove-validators); or [by voting for IBFT 2.0](ibft.md#add-and-remove-validators). Use transitions only when voting isn't possible. Using transitions requires coordinating a rolling update of all the nodes in order to pick up the configuration at the correct block height. Using transitions also leaves the validator overrides permanently in your genesis configuration. +- Transitions are a Besu-specific feature. If you run a mixed-client QBFT network, you can't use transitions to change the validators. + +::: + +To add or remove validators without voting: + +1. In the genesis file, add the `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - ` ... ` are strings representing the account addresses of the validators after ``. + + + + # QBFT syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": , + "validators": [ + , + ... + + ] + } + ] + } + }, + ... + } + ``` + + # QBFT example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": 25, + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` + + # IBFT 2.0 syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": , + "validators": [ + , + ... + + ] + } + ] + } + }, + ... + } + ``` + + # IBFT 2.0 example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": 25, + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` + + + +2. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. +3. To verify the changes after the transition block, call [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber) or [`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + +:::caution + +Don't specify a transition block in the past. + +Specifying a transition block in the past can result in unexpected behavior, such as causing the network to fork. + +::: + +## Override smart contract validators + +When using [QBFT contract validator selection](qbft.md#add-and-remove-validators-using-a-smart-contract), if network conditions require it, you can bypass the smart contract and specify new validators in the genesis file. For example, you lose quorum for your current list of contract validators, and you can't perform a transaction to vote more in. + +This requires temporarily [switching to block header validator selection mode](qbft.md#swap-validator-management-methods). + +To bypass the smart contract and specify new validators: + +1. In the genesis file, add a `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - `` is the validator selection mode to switch to. In this case we'll switch to the `blockheader` mode temporarily. + - ` ... ` are strings representing the account addresses of the validators after ``. These validators only need to be sufficient to progress the chain and allow a new contract to be deployed. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": , + "validatorselectionmode": , + "validators": [ + , + ... + + ] + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. +1. Deploy a new contract to the blockchain containing the desired list of validators. +1. In the genesis file, add another `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - `` is the validator selection mode to switch to. In this case we'll switch to `contract` mode. + - `` is the address of the new smart contract. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + “validatorcontractaddress”: “0x0000000000000000000000000000000000007777” + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + }, + { + "block": , + "validatorselectionmode": , + "validatorcontractaddress": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + }, + { + "block": 2755, + "validatorselectionmode": "contract", + "validatorcontractaddress": "0x0000000000000000000000000000000000009999" + } + ] + } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/clique.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/clique.md new file mode 100644 index 00000000000..6bc6c872a03 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/clique.md @@ -0,0 +1,156 @@ +--- +title: Clique +description: Hyperledger Besu Clique Proof-of-Authority (PoA) consensus protocol implementation +sidebar_position: 4 +path: blob/master/config/src/main/resources/ +source: rinkeby.json +--- + +# Configure Clique consensus + +Besu implements the [Clique](https://eips.ethereum.org/EIPS/eip-225) proof of authority (PoA) [consensus protocol](index.md). Private networks can use Clique. + +:::danger + +Clique is not suitable for production environments. Use only in development environments. + +::: + +In Clique networks, approved accounts, known as signers, validate transactions and blocks. Signers take turns to create the next block. Existing signers propose and vote to [add or remove signers](#add-and-remove-signers). + +You can [create a private network using Clique](../../../tutorials/clique.md). + +## Genesis file + +To use Clique in a private network, Besu requires a Clique [genesis file](../../../../public-networks/concepts/genesis-file.md). + +A Clique genesis file defines properties specific to Clique. + +```json title="Example Clique genesis file" +{ + "config": { + "chainId": 1981, + "berlinBlock": 0, + "clique": { + "blockperiodseconds": 15, + "epochlength": 30000 + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "extraData": "0x000000000000000000000000000000000000000000000000000000000000000001a54556254bfa3db2daa7673435ec63649925c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x1fffffffffffff", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "timestamp": "0x5c51a607", + "alloc": {}, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +The properties specific to Clique are: + +- `blockperiodseconds` - The block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `extraData` - [Extra data](#extra-data) including the initial signers. + +### Extra data + +The `extraData` property consists of: + +- 0x prefix. +- 32 bytes of vanity data. +- A list of initial signer addresses (at least one initial signer is required). 20 bytes for each signer. +- 65 bytes for the proposer signature. In the genesis block there is no initial proposer, so the proposer signature is all zeros. + +### One initial signer + +![One Initial Signer](../../../../assets/images/CliqueOneIntialSigner.png) + +### Two initial signers + +![Two Initial Signers](../../../../assets/images/CliqueTwoIntialSigners.png) + +### Post-Merge configuration + +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. + +| Field | Constant value | Comment | +| --- | --- | --- | +| **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | +| **`difficulty`** | `0` | Replaced with `prevrandao` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | + +Additionally, [`extraData`](#extra-data) is limited to 32 bytes of vanity data after The Merge. + +## Connect to a Clique network + +To start a node on a Clique private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. + +## Add and remove signers + +Existing signers propose and vote to add or remove validators using the Clique JSON-RPC API methods. Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). + +The Clique API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `CLIQUE`. + +The methods to add or remove signers are: + +- [`clique_propose`](../../../reference/api/index.md#clique_propose). +- [`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). +- [`clique_discard`](../../../reference/api/index.md#clique_discard). + +To view signer metrics for a specified block range, call [`clique_getSignerMetrics`](../../../reference/api/index.md#clique_getsignermetrics). + +### Add a signer + +To propose adding a signer to a Clique network, call [`clique_propose`](../../../reference/api/index.md#clique_propose), specifying the address of the proposed signer and `true`. A majority of signers must execute the call. + +```bash title="JSON-RPC clique_propose request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` + +When the signer creates the next block, the signer adds a vote to the block for the proposed signer. + +When more than 50% of the existing signers propose adding the signer, with their votes distributed in blocks, the signer can begin signing blocks. + +To return a list of signers and confirm the addition of a proposed signer, call [`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). + +```bash title="JSON-RPC clique_getSigners request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' +``` + +To discard your proposal after confirming the addition of a signer, call [`clique_discard`](../../../reference/api/index.md#clique_discard) specifying the address of the proposed signer. + +```bash title="JSON-RPC clique_discard request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` + +### Remove a signer + +The process for removing a signer from a Clique network is the same as [adding a signer](#add-a-signer), except you specify `false` as the second parameter of [`clique_propose`](../../../reference/api/index.md#clique_propose). + +### Epoch transition + +At each epoch transition, Clique discards all pending votes collected from received blocks. Existing proposals remain in effect and signers re-add their vote the next time they create a block. + +Define the number of blocks between epoch transitions in the [Clique genesis file](#genesis-file). + +## Limitations + +In Clique, blocks created by in-turn validators are published immediately. Out-of-turn validators create blocks that are published after a short delay. In-turn blocks have a higher difficulty than out-of-turn blocks, which allows small forks to resolve to the chain with more in-turn blocks. + +However, when the out-of-turn delay is shorter than the block propagation delay, out-of-turn blocks may be published before in-turn blocks. This may cause large, irresolvable forks in a network. + +:::tip + +We recommend using a more updated consensus protocol such as [IBFT 2.0](ibft.md) or [QBFT](qbft.md). + +::: + + + +\*[vanity data]: Signers can include anything they like as vanity data. diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/ibft.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/ibft.md new file mode 100644 index 00000000000..a9403176e67 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/ibft.md @@ -0,0 +1,501 @@ +--- +title: IBFT 2.0 +description: Hyperledger Besu IBFT 2.0 proof of authority (PoA) consensus protocol implementation +sidebar_position: 3 +--- + +# Configure IBFT 2.0 consensus + +Besu implements the IBFT 2.0 proof of authority (PoA) [consensus protocol](index.md). IBFT 2.0 is supported for existing private networks, but [QBFT](qbft.md) is the recommended enterprise-grade consensus protocol for private networks. + +In IBFT 2.0 networks, approved accounts, known as validators, validate transactions and blocks. Validators take turns to create the next block. Before inserting the block onto the chain, a super-majority (greater than or equal to 2/3) of validators must first sign the block. + +Existing validators propose and vote to [add or remove validators](#add-and-remove-validators). + +You can [create a private network using IBFT](../../../tutorials/ibft/index.md). + +:::danger + +Configure your network to ensure you never lose more than 1/3 of your validators. If more than 1/3 of validators stop participating, new blocks are no longer created, and the network stalls. It may take significant time to recover once nodes are restarted. + +::: + +:::tip + +You can use a plugin to securely store a validator's key using the [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. + +::: + +## Genesis file + +To use IBFT 2.0, Besu requires an IBFT 2.0 [genesis file](../../../../public-networks/concepts/genesis-file.md). The genesis file defines properties specific to IBFT 2.0. + +```json title="Example IBFT 2.0 genesis file" +{ + "config": { + "chainId": 1981, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "blockreward": "5000000000000000", + "miningbeneficiary": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d594c2ab482b506de561668e07f04547232a72897daf808400000000c0", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "alloc": {} +} +``` + +The properties specific to IBFT 2.0 are: + +- `blockperiodseconds` - The minimum block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. +- `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all nodes on the network must use the identical value. +- `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator that proposes the block. If set, then all nodes on the network must use the same beneficiary. +- `extraData` - RLP encoded [extra data](#extra-data). + +:::caution + +We don't recommend changing `epochlength` in a running network. Changing the `epochlength` after genesis can result in illegal blocks. + +::: + +:::caution Invalid block header error + +When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. The imported chain makes new blocks faster than the genesis file allows and Besu rejects them with this error. This error most often occurs when importing chains from older versions of Besu. + +Decrease the `blockperiodseconds` in the new IBFT 2.0 genesis file to a lower value that satisfies the block header validation. + +::: + +If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. + +After you update the new genesis file, if the imported chain has a `blockperiodseconds` value set lower than you prefer, you can adjust it by [configuring the block time on an existing IBFT 2.0 network](#configure-block-time-on-an-existing-network). + +The properties with specific values in the IBFT 2.0 genesis files are: + +- `nonce` - `0x0` +- `difficulty` - `0x1` +- `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul block identification + +To start a node on an IBFT 2.0 private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. + +### Extra data + +The `extraData` property is an RLP encoding of: + +- 32 bytes of vanity data. +- A list of validator addresses. +- Any validator votes. No vote is included in the genesis block. +- The round the block was created on. The round in the genesis block is 0. +- A list of seals of the validators (signed block hashes). No seals are included in the genesis block. + +In the genesis block, the important information in the extra data is the list of validators. All other details have empty values. Formally, `extraData` in the genesis block contains `RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. + +:::info + +RLP encoding is a space-efficient object serialization scheme used in Ethereum. + +::: + +#### Generate extra data + +To generate the `extraData` RLP string for inclusion in the genesis file, use the [`rlp encode`](../../../../public-networks/reference/cli/subcommands.md#rlp) Besu subcommand. + +```bash title="Example" +besu rlp encode --from=toEncode.json +``` + +Where the `toEncode.json` file contains a list of the initial validators, in ascending order. To write the validator address and copy it to the `toEncode.json` file, use the [`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu subcommand. For example: + +```json title="One initial validator in toEncode.json file" +["9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb"] +``` + +Copy the RLP encoded data to the `extraData` property in the genesis file. + +### Block time + +When the protocol receives a new chain head, the block time (`blockperiodseconds`) and round timeout (`requesttimeoutseconds`) timers start. When `blockperiodseconds` expires, the protocol proposes a new block. + +If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with the block time and timeout timers reset. The timeout period for the new round is two times `requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a block. + +Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round then starts, resetting the block time and round timeout timers. When `blockperiodseconds` expires, the protocol proposes the next new block. + +:::danger + +If more than 1/3 of validators stop participating, new blocks can no longer be created and `requesttimeoutseconds` doubles with each round change. The quickest method to resume block production is to restart all validators, which resets `requesttimeoutseconds` to its genesis value. + +::: + +Once `blockperiodseconds` is over, the time from proposing a block to adding the block is small (usually around one second) even in networks with geographically dispersed validators. + +An internal network run by ConsenSys had four geographically dispersed validators in Sweden, Sydney, and two in North Virginia. With a `blockperiodseconds` of 5 and a `requesttimeoutseconds` of 10, the testnet consistently created blocks with a five second block time. + +#### Tune block timeout + +To tune the block timeout for your network deployment: + +1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times `blockperiodseconds`. +1. Reduce `requesttimeoutseconds` until you start to see round changes occurring. +1. Increase `requesttimeoutseconds` to the value where round changes are no longer occurring. + +:::tip + +View [`TRACE` logs](../../../../public-networks/reference/api/index.md#trace-methods) to see round change log messages. + +::: + +Use a [transition](#transitions) to update the `blockperiodseconds` in an existing network. + +import GlobalOptions from '../../../../global/postman.md' + +### Optional configuration options + +Optional configuration options in the genesis file are: + +- `messageQueueLimit` - In large networks with limited resources, increasing the message queue limit might help with message activity surges. The default is 1000. +- `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate message limit might reduce the number of retransmissions. A value of two to three times the number of validators is usually enough. The default is 100. +- `futureMessagesLimit` - The future messages buffer holds messages for a future chain height. For large networks, increasing the future messages limit might be useful. The default is 1000. +- `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering messages in the future messages buffer. The default is 10. + +### Post-Merge configuration + +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. + +| Field | Constant value | Comment | +| --- | --- | --- | +| **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | +| **`difficulty`** | `0` | Replaced with `prevrandao` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | + +Additionally, [`extraData`](#extra-data) is limited to 32 bytes of vanity data after The Merge. + +## Add and remove validators + +Existing validators propose and vote to add or remove validators using the IBFT 2.0 JSON-RPC API methods. Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). + +The IBFT 2.0 API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `IBFT`. + +The methods to add or remove validators are: + +- [`ibft_getPendingVotes`](../../../reference/api/index.md#ibft_getpendingvotes). +- [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). +- [`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote). + +To view validator metrics for a specified block range, use [`ibft_getSignerMetrics`](../../../../public-networks/reference/api/index.md#ibft_getsignermetrics). + +:::note + +If network conditions render it impossible to add and remove validators by voting, you can [add and remove validators without voting](add-validators-without-voting.md). + +::: + +### Add a validator + +To propose adding a validator to an IBFT 2.0 network, call [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the proposed validator and `true`. A majority of validators must execute the call. + +```bash title="JSON-RPC ibft_proposeValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` + +When the validator proposes the next block, the protocol inserts one proposal received from [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote) into the block. If blocks include all proposals, subsequent blocks proposed by the validator will not contain a vote. + +When more than 50% of the existing validators have published a matching proposal, the protocol adds the proposed validator to the validator pool and the validator can begin validating blocks. + +To return a list of validators and confirm the addition of a proposed validator, use [`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber). + +```bash title="JSON-RPC ibft_getValidatorsByBlockNumber request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' +``` + +To discard your proposal after confirming the addition of a validator, call [`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote), specifying the address of the proposed validator. + +```bash title="JSON-RPC ibft_discardValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` + +### Remove a validator + +The process for removing a validator from an IBFT 2.0 network is the same as [adding a validator](#add-a-validator) except you specify `false` as the second parameter of [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). + +### Epoch transition + +At each epoch transition, IBFT 2.0 discards all pending votes collected from received blocks. Existing proposals remain in effect and validators re-add their vote the next time they create a block. + +An epoch transition occurs every `epochLength` blocks. Define `epochlength` in the [IBFT 2.0 genesis file](#genesis-file). + +### Minimum number of validators + +IBFT 2.0 requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the ability for a blockchain network to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +### Maximum number of validators + +As the number of validators increase, the message complexity increases, which can decrease performance. In [network tests](https://wiki.hyperledger.org/display/BESU/Maximum+Validator+count+for+an+IBFT2+Network), IBFT 2.0 handles up to 30 validators with no loss of performance. + +Non-validator nodes don't affect performance and don't count towards the maximum limit. + +## Transitions + +The `transitions` genesis configuration item allows you to specify a future block number at which to change IBFT 2.0 network configuration in an existing network. For example, you can update the [block time](#configure-block-time-on-an-existing-network-deployment), [block reward](#configure-block-rewards-on-an-existing-network-deployment), or [mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). + +:::caution + +Do not specify a transition block in the past. Specifying a transition block in the past could result in unexpected behavior, such as causing the network to fork. + +::: + +### Configure block time on an existing network deployment + +To update an existing network with a new `blockperiodseconds`: + +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockperiodseconds`. + - `` is the updated value for `blockperiodseconds`. + + + + # Syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": , + "blockperiodseconds": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": 1240, + "blockperiodseconds": 4 + } + ] + } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. +1. To verify the changes after the transition block, call [`ibft_getValidatorsByBlockNumber`](../../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + +### Configure block rewards on an existing network deployment + +To update an existing network with a new `blockreward`: + +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockreward`. + - `` is the updated value for `blockreward`. + + + + # Syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "ibft2": [ + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "ibft2": [ + { + "block": 10, + "blockreward": "6000000000000000" + }, + { + "block": 15, + "blockreward": "75000000000000000" + }, + { + "block": 20, + "blockreward": "0" + } + ] + } + }, + ... + } + ``` + + + + :::note + + You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. + + ::: + +1. Restart all nodes in the network using the updated genesis file. + +### Configure the mining beneficiary on an existing network deployment + +To update an existing network with a new mining beneficiary: + +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `miningbeneficiary`. + - `` is the updated 20-byte address for `miningbeneficiary`. Starting at ``, block rewards go to this address. + + + + # Syntax + + ```bash + { + "config": { + "chainId": 999, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 1, + "epochlength": 30000, + "requesttimeoutseconds": 5, + "blockreward": "5000000000000000000", + "miningbeneficiary": "0x0000000000000000000000000000000000000001" + }, + "transitions": { + "ibft2": [ + { + "block": , + "miningbeneficiary": + }, + { + "block": , + "miningbeneficiary": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + "chainId": 999, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 1, + "epochlength": 30000, + "requesttimeoutseconds": 5, + "blockreward": "5000000000000000000", + "miningbeneficiary": "0x0000000000000000000000000000000000000001" + }, + "transitions": { + "ibft2": [ + { + "block": 10000, + "miningbeneficiary": "", + }, + { + "block": 20000, + "miningbeneficiary": "0x0000000000000000000000000000000000000002", + } + ] + } + }, + ... + } + ``` + + + + :::note + + Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the block producer rather than a global override address. + + ::: + +1. Restart all nodes in the network using the updated genesis file. + + + +_[vanity data]: Validators can include anything they like as vanity data. _[RLP]: Recursive Length Prefix + +``` + +``` diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/index.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/index.md new file mode 100644 index 00000000000..87c3ec366bb --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/index.md @@ -0,0 +1,79 @@ +--- +title: Consensus protocols +description: Besu consensus protocols +sidebar_position: 1 +--- + +# Consensus protocols + +Besu supports the following consensus protocols: + +- [QBFT](qbft.md) (proof of authority) - The recommended enterprise-grade consensus protocol for private networks. +- [IBFT 2.0](ibft.md) (proof of authority) - Supported for existing private networks. +- [Clique](clique.md) (proof of authority) - Not recommended for production use. +- [Proof of stake](../../../../public-networks/concepts/proof-of-stake/index.md) - Used on Ethereum Mainnet and public testnets. +- [Ethash](https://ethereum.org/en/developers/docs/consensus-mechanisms/pow/) (proof of work) - Can be used in [small development networks](../../../tutorials/ethash.md). + +See a [comparison of the proof of authority consensus protocols](../../../concepts/poa.md). + +The `config` property in the genesis file specifies the consensus protocol for a chain. + + + +# Ethash + +```json +{ + "config": { + ... + "ethash": { + ... + } + }, + ... +} +``` + +# Clique + +```json +{ + "config": { + ... + "clique": { + ... + } + }, + ... +} +``` + +# IBFT 2.0 + +```json +{ + "config": { + ... + "ibft2": { + ... + } + }, + ... +} +``` + +# QBFT + +```json +{ + "config": { + ... + "qbft": { + ... + } + }, + ... +} +``` + + diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/qbft.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/qbft.md new file mode 100644 index 00000000000..812d3810e5e --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/consensus/qbft.md @@ -0,0 +1,695 @@ +--- +title: QBFT +description: Hyperledger Besu QBFT proof of authority (PoA) consensus protocol implementation +sidebar_position: 2 +--- + +# Configure QBFT consensus + +Hyperledger Besu implements the QBFT proof of authority (PoA) [consensus protocol](index.md). QBFT is the recommended enterprise-grade consensus protocol for private networks. + +In QBFT networks, approved accounts, known as validators, validate transactions and blocks. Validators take turns to create the next block. Before inserting the block onto the chain, a super-majority (greater than or equal to 2/3) of validators must first sign the block. + +Existing validators propose and vote to [add or remove validators](#add-and-remove-validators). + +You can [create a private network using QBFT](../../../tutorials/qbft.md). + +:::caution + +Configure your network to ensure you never lose more than 1/3 your validators. If more than 1/3 of validators stop participating, new blocks are no longer created, and the network stalls. It may take significant time to recover once nodes are restarted. + +::: + +:::tip + +You can use a plugin to securely store a validator's key using the [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. + +::: + +## Genesis file + +To use QBFT, define a [genesis file](../../../../public-networks/concepts/genesis-file.md) that contains the QBFT properties. + +The genesis file differs depending on the [validator management method](#add-and-remove-validators) you intend to use. + +:::note + +You can use a [transitions](#transitions) to change the `blockperiodseconds` or validator management method of the network at a later time. + +::: + + + +# Block header validator selection + +```json +{ + "config": { + "chainid": 1337, + "berlinBlock": 0, + "qbft": { + "epochlength": 30000, + "blockperiodseconds": 5, + "requesttimeoutseconds": 10 + } + }, + "nonce": "0x0", + "timestamp": "0x5b3d92d7", + "extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549464a702e6263b7297a96638cac6ae65e6541f4169943923390ad55e90c237593b3b0e401f3b08a0318594aefdb9a738c9f433e5b6b212a6d62f6370c2f69294c7eeb9a4e00ce683cf93039b212648e01c6c6b78c080c0", + "gasLimit": "0x29b92700", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "64d9be4177f418bcf4e56adad85f33e3a64efe22": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +# Contract validator selection + +```json +{ + "config": { + "chainid": 1337, + "berlinBlock": 0, + "qbft": { + "epochlength": 30000, + "blockperiodseconds": 5, + "requesttimeoutseconds": 10, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + } + }, + "nonce": "0x0", + "timestamp": "0x5b3d92d7", + "extraData": "0xe5a00000000000000000000000000000000000000000000000000000000000000000c0c080c0", + "gasLimit": "0x29b92700", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "64d9be4177f418bcf4e56adad85f33e3a64efe22": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "0x0000000000000000000000000000000000007777": { + "comment": "validator smart contract", + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100a5576000357c0100000000000000000000000000000000000000000000000000000000900480639692ea25116100785780639692ea2514610113578063b4ec9ac114610126578063b7ab4db514610139578063c76f24371461014e57600080fd5b80631c5a9d9c146100aa578063508adcfc146100bf57806351b42b00146100db5780635dc43899146100e3575b600080fd5b6100bd6100b8366004611399565b610161565b005b6100c860035481565b6040519081526020015b60405180910390f35b6100bd6104aa565b6100f66100f1366004611399565b61074e565b6040805193845260208401929092521515908201526060016100d2565b6100bd610121366004611399565b610bbd565b6100bd610134366004611399565b610deb565b6101416110a3565b6040516100d291906113c9565b6100bd61015c366004611399565b611105565b3360009081526001602052604090205460ff1661019c5760405160e560020a62461bcd02815260040161019390611416565b60405180910390fd5b600160a060020a03811661021b5760405160e560020a62461bcd02815260206004820152602860248201527f63616e6e6f742061637469766174652076616c696461746f722077697468206160448201527f64647265737320300000000000000000000000000000000000000000000000006064820152608401610193565b60005b6000548110156102b7576000818154811061023b5761023b611505565b600091825260209091200154600160a060020a03838116911614156102a55760405160e560020a62461bcd02815260206004820152601b60248201527f76616c696461746f7220697320616c72656164792061637469766500000000006044820152606401610193565b806102af816114b8565b91505061021e565b33600090815260016020526040902054610100900460ff16156103345733600090815260016020526040812054815484929162010000900460ff1690811061030157610301611505565b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550610432565b600054610100116103b05760405160e560020a62461bcd02815260206004820152602e60248201527f6e756d626572206f662076616c696461746f72732063616e6e6f74206265206c60448201527f6172676572207468616e203235360000000000000000000000000000000000006064820152608401610193565b3360009081526001602081905260408220805461ff001981166101009081178355845460ff16620100000262ffff001990921691909117179055815490810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563018054600160a060020a038416600160a060020a03199091161790555b600160a060020a0382166000818152600260205260408082208054600160a060020a03191633908117909155915490519192917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f9161049e916001909182521515602082015260400190565b60405180910390a35050565b3360009081526001602052604090205460ff166104dc5760405160e560020a62461bcd02815260040161019390611416565b6000546001106105315760405160e560020a62461bcd02815260206004820181905260248201527f63616e6e6f742064656163746976617465206c6173742076616c696461746f726044820152606401610193565b33600090815260016020526040902054610100900460ff166105be5760405160e560020a62461bcd02815260206004820152602860248201527f73656e64657220646f6573206e6f74206861766520616e20616374697665207660448201527f616c696461746f720000000000000000000000000000000000000000000000006064820152608401610193565b336000908152600160205260408120805461ff0019169081905581546201000090910460ff1691908190839081106105f8576105f8611505565b60009182526020822001548154600160a060020a03909116925081906106209060019061148a565b8154811061063057610630611505565b60009182526020822001548154600160a060020a03909116925082919060ff861690811061066057610660611505565b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055838316825260028152604080832054909316825260019052908120805462ff000019166201000060ff8716021790558054806106c6576106c66114ec565b6000828152602080822060001990840181018054600160a060020a03199081169091559301909355600160a060020a03851680825260028452604080832080549094169093558154835190815293840191909152339290917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f910160405180910390a3505050565b336000908152600160205260408120548190819060ff166107845760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a03851660009081526004602052604090205481101561082357600160a060020a038516600090815260046020526040812080546001929190849081106107d6576107d6611505565b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610811578361080d816114b8565b9450505b8061081b816114b8565b915050610787565b5060026003546108339190611465565b831115610b8657600160a060020a038416600090815260046020526040812061085b9161135f565b600160a060020a03841660009081526001602052604090205460ff1615610ab0576003805490600061088c836114a1565b9091555050600160a060020a038416600090815260016020526040902054610100900460ff1615610a89576000546001106109325760405160e560020a62461bcd02815260206004820152603860248201527f63616e6e6f742072656d6f766520616c6c6f776564206163636f756e7420776960448201527f7468206c617374206163746976652076616c696461746f7200000000000000006064820152608401610193565b600160a060020a03841660009081526001602052604081205481546201000090910460ff169160029181908490811061096d5761096d611505565b6000918252602080832090910154600160a060020a0316835282019290925260400181208054600160a060020a0319169055805481906109af9060019061148a565b815481106109bf576109bf611505565b60009182526020822001548154600160a060020a03909116925082919060ff85169081106109ef576109ef611505565b600091825260208220018054600160a060020a031916600160a060020a039390931692909217909155805480610a2757610a276114ec565b6000828152602080822083016000199081018054600160a060020a0319169055909201909255600160a060020a0392831682526002815260408083205490931682526001905220805460ff909216620100000262ff0000199092169190911790555b600160a060020a0384166000908152600160205260409020805462ffffff19169055610b32565b60038054906000610ac0836114b8565b909155505060408051606081018252600180825260006020808401828152848601838152600160a060020a038b16845293909152939020915182549351915160ff16620100000262ff0000199215156101000261ff00199215159290921661ffff199095169490941717169190911790555b600160a060020a03841660008181526001602090815260409182902054915160ff909216151582527f94154efdb7741591680558a88682943a481f1a468cb81f46fe7f8cead2e40519910160405180910390a25b826002600354610b969190611465565b610ba190600161144d565b6002600354610bb09190611465565b9196909550931192915050565b3360009081526001602052604090205460ff16610bef5760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a038216600090815260046020526040902054811015610d4b57600160a060020a0382166000908152600460205260409020805433919083908110610c3f57610c3f611505565b600091825260209091200154600160a060020a03161415610d3957600160a060020a03821660009081526004602052604090208054610c809060019061148a565b81548110610c9057610c90611505565b6000918252602080832090910154600160a060020a03858116845260049092526040909220805491909216919083908110610ccd57610ccd611505565b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559184168152600490915260409020805480610d1257610d126114ec565b60008281526020902081016000199081018054600160a060020a0319169055019055610d4b565b80610d43816114b8565b915050610bf2565b50600160a060020a0381166000818152600460205260409020546003543392917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba91610d9990600290611465565b610da490600161144d565b600160a060020a0386166000908152600160208181526040928390205483519586529085019390935260ff909216159083015260608201526080015b60405180910390a350565b3360009081526001602052604090205460ff16610e1d5760405160e560020a62461bcd02815260040161019390611416565b600160a060020a038116610e765760405160e560020a62461bcd02815260206004820152601f60248201527f6163636f756e7420746f2062652061646465642063616e6e6f742062652030006044820152606401610193565b600160a060020a03811660009081526001602081905260409091205460ff16151514610f0d5760405160e560020a62461bcd02815260206004820152602a60248201527f6163636f756e7420746f2072656d6f7665206973206e6f74206f6e207468652060448201527f616c6c6f77206c697374000000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a038216600090815260046020526040902054811015610ffb57600160a060020a0382166000908152600460205260409020805433919083908110610f5d57610f5d611505565b600091825260209091200154600160a060020a03161415610fe95760405160e560020a62461bcd02815260206004820152602a60248201527f73656e6465722068617320616c726561647920766f74656420746f2072656d6f60448201527f7665206163636f756e74000000000000000000000000000000000000000000006064820152608401610193565b80610ff3816114b8565b915050610f10565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061107490600290611465565b61107f90600161144d565b60408051928352602083019190915260009082018190526060820152608001610de0565b606060008054806020026020016040519081016040528092919081815260200182805480156110fb57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116110dd575b5050505050905090565b3360009081526001602052604090205460ff166111375760405160e560020a62461bcd02815260040161019390611416565b600160a060020a03811660009081526001602052604090205460ff16156111c95760405160e560020a62461bcd02815260206004820152602b60248201527f6163636f756e7420746f2061646420697320616c7265616479206f6e2074686560448201527f20616c6c6f77206c6973740000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a0382166000908152600460205260409020548110156112b757600160a060020a038216600090815260046020526040902080543391908390811061121957611219611505565b600091825260209091200154600160a060020a031614156112a55760405160e560020a62461bcd02815260206004820152602760248201527f73656e6465722068617320616c726561647920766f74656420746f206164642060448201527f6163636f756e74000000000000000000000000000000000000000000000000006064820152608401610193565b806112af816114b8565b9150506111cc565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061133090600290611465565b61133b90600161144d565b60408051928352602083019190915260019082015260006060820152608001610de0565b508054600082559060005260206000209081019061137d9190611380565b50565b5b808211156113955760008155600101611381565b5090565b6000602082840312156113ab57600080fd5b8135600160a060020a03811681146113c257600080fd5b9392505050565b6020808252825182820181905260009190848201906040850190845b8181101561140a578351600160a060020a0316835292840192918401916001016113e5565b50909695505050505050565b6020808252601f908201527f73656e646572206973206e6f74206f6e2074686520616c6c6f77206c69737400604082015260600190565b60008219821115611460576114606114d3565b500190565b6000826114855760e060020a634e487b7102600052601260045260246000fd5b500490565b60008282101561149c5761149c6114d3565b500390565b6000816114b0576114b06114d3565b506000190190565b60006000198214156114cc576114cc6114d3565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052603160045260246000fd5b60e060020a634e487b7102600052603260045260246000fdfea26469706673582212200c3e9c07521b155532c0de1605aae52f4ae953670f0afb0f30d320580b93213d64736f6c63430008070033", + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000000000000000000000000000000000000002", + "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": "0000000000000000000000009a6d82ef3912d5ab60473124bccd2f2a640769d7", + "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564": "00000000000000000000000065463bf6268e5cc409b6501ec846487b935a1446", + "aedead2c33b41c31b4afd2246c6bf5131c209d4b0ca6c2247778ac7be7443a00": "0000000000000000000000000000000000000000000000000000000000000101", + "33784757d5da236467d27a7c5b0cc5aa9026ca3b79e29106a67a5e93c292a523": "0000000000000000000000000000000000000000000000000000000000010101", + "35aba1eb0bbe741ac01e5b6ce584bc042b1a0b7d115eb8f7dd02a1a1de2fd14d": "000000000000000000000000fe3b557e8fb62b89f4916b721be55ceb828dbd73", + "0d9217f0a1f7c602fd67052d20171ff73b156d1b87ea258cb6a5d94f71298158": "000000000000000000000000627306090abab3a6e1400e9345bc60c78a8bef57", + "0000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000000000000000000000000000000000000000002" + }, + "version": "0x01" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + + + +The QBFT properties are: + +- `blockperiodseconds` - The minimum block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. +- `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all nodes on the network must use the identical value. +- `validatorcontractaddress` - Address of the validator smart contract. Required only if using a contract validator selection. The address must be identical to the address in the `alloc` section. This option can also be used in the [transitions](#transitions) configuration item if swapping [validator management methods](#add-and-remove-validators) in an existing network. +- `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator that proposes the block. If set, then all nodes on the network must use the same beneficiary. +- [`extraData`](#extra-data) - RLP encoded [extra data](#extra-data). + +:::caution + +We don't recommend changing `epochlength` in a running network. Changing the `epochlength` after genesis can result in illegal blocks. + +::: + +:::caution Invalid block header error + +When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. The imported chain makes new blocks faster than the genesis file allows and Besu rejects them with this error. This error most often occurs when importing chains from older versions of Besu. + +Decrease the `blockperiodseconds` in the new QBFT genesis file to a lower value that satisfies the block header validation. + +If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. + +After you update the new genesis file, if the imported chain has a `blockperiodseconds` value set lower than you prefer, you can adjust it by [configuring the block time on an existing QBFT network](#configure-block-time-on-an-existing-network). + +::: + +The properties with specific values in the QBFT genesis files are: + +- `difficulty` - `0x1` +- `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul block identification + +To start a node on a QBFT private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. + +### Extra data + +The `extraData` property is an RLP encoding of: + +- 32 bytes of vanity data. +- If using: + - [Block header validator selection](#add-and-remove-validators-using-block-headers), a list of validator addresses. + - [Contract validator selection](#add-and-remove-validators-using-a-smart-contract), no validators. +- Any validator votes. No vote is included in the genesis block. +- The round the block was created on. The round in the genesis block is 0. +- A list of seals of the validators (signed block hashes). No seals are included in the genesis block. + +When using block header validator selection, the important information in the genesis block extra data is the list of validators. All other details have empty values in the genesis block. + +:::info + +When using contract validator selection to manage validators, the list of validators is configured in the `alloc` property's `storage` section. View the example smart contract for more information on how to generate the `storage` section. + +::: + +Formally, `extraData` in the genesis block contains: + +- If using block header validator selection: `RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. +- If using contract validator selection: `RLP([32 bytes Vanity, 0 Validators, No Vote, Round=Int(0), 0 Seals])`. + +:::info + +RLP encoding is a space-efficient object serialization scheme used in Ethereum. + +::: + +#### Generate extra data + +To generate the `extraData` RLP string for inclusion in the genesis file, use the [`rlp encode`](../../../reference/cli/subcommands.md#rlp) Besu subcommand. + +```bash title="Example" +besu rlp encode --from=toEncode.json --type=QBFT_EXTRA_DATA +``` + +Where the `toEncode.json` file contains a list of the initial validators, in ascending order. To write the validator address and copy it to the `toEncode.json` file, use the [`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu subcommand. For example: + +```json title="Initial validators in toEncode.json file" +[ + "0x4592c8e45706cc08b8f44b11e43cba0cfc5892cb", + "0x06e23768a0f59cf365e18c2e0c89e151bcdedc70", + "0xc5327f96ee02d7bcbc1bf1236b8c15148971e1de", + "0xab5e7f4061c605820d3744227eed91ff8e2c8908" +] +``` + +Copy the RLP encoded data to the `extraData` property in the genesis file. + +```bash title="RLP encoded data" +0xf87aa00000000000000000000000000000000000000000000000000000000000000000f854944592c8e45706cc08b8f44b11e43cba0cfc5892cb9406e23768a0f59cf365e18c2e0c89e151bcdedc7094c5327f96ee02d7bcbc1bf1236b8c15148971e1de94ab5e7f4061c605820d3744227eed91ff8e2c8908c080c0 +``` + +When you start the network, the four nodes previously specified in `toEncode.json` are the validators for the network. + +### Block time + +When the protocol receives a new chain head, the block time (`blockperiodseconds`) timer starts. When `blockperiodseconds` expires, the round timeout (`requesttimeoutseconds`) timer starts and the protocol proposes a new block. + +If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with the block time and timeout timers reset. The timeout period for the new round is two times `requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a block. + +Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round then starts, resetting the block time and round timeout timers. When `blockperiodseconds` expires, the protocol proposes the next new block. + +:::danger + +If more than 1/3 of validators stop participating, new blocks can no longer be created and `requesttimeoutseconds` doubles with each round change. The quickest method to resume block production is to restart all validators, which resets `requesttimeoutseconds` to its genesis value. + +::: + +Once `blockperiodseconds` is over, the time from proposing a block to adding the block is small (usually around one second) even in networks with geographically dispersed validators. + +#### Tune block timeout + +To tune the block timeout for your network deployment: + +1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times `blockperiodseconds`. +1. Reduce `requesttimeoutseconds` until you start to see round changes occurring. +1. Increase `requesttimeoutseconds` to the value where round changes are no longer occurring. + +:::tip + +View [`TRACE` logs](../../../../public-networks/reference/api/index.md#admin_changeloglevel) to see round change log messages. + +::: + +Use a [transition](#transitions) to update the `blockperiodseconds` in an existing network. + +import GlobalOptions from '../../../../global/postman.md' + +### Optional configuration options + +Optional configuration options in the genesis file are: + +- `messageQueueLimit` - In large networks with limited resources, increasing the message queue limit might help with message activity surges. The default is 1000. +- `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate message limit might reduce the number of retransmissions. A value of two to three times the number of validators is usually enough. The default is 100. +- `futureMessagesLimit` - The future messages buffer holds messages for a future chain height. For large networks, increasing the future messages limit might be useful. The default is 1000. +- `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering messages in the future messages buffer. The default is 10. + +### Post-Merge configuration + +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. + +| Field | Constant value | Comment | +| --- | --- | --- | +| **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | +| **`difficulty`** | `0` | Replaced with `prevrandao` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | + +Additionally, [`extraData`](#extra-data) is limited to the 32 bytes of vanity data after The Merge. + +## Add and remove validators + +QBFT provides two methods to manage validators: + +- [Block header validator selection](#add-and-remove-validators-using-block-headers) - Existing validators propose and vote to add or remove validators using the QBFT JSON-RPC API methods. + +- [Contract validator selection](#add-and-remove-validators-using-a-smart-contract) - Use a smart contract to specify the validators used to propose and validate blocks. + +You can use [transitions](#transitions) to swap between block header validator selection and contract validator selection in an existing network. + +For block header validator selection, initial validators are configured in the genesis file's [`extraData`](#extra-data) property, whereas the initial validators when using the contract validator selection method are configured in the genesis file's `storage` section. + +### Add and remove validators using block headers + +Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSockets interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). + +The QBFT API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `QBFT`. + +The methods to add or remove validators are: + +- [`qbft_getPendingVotes`](../../../reference/api/index.md#qbft_getpendingvotes). +- [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). +- [`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote). + +To view validator metrics for a specified block range, use [`qbft_getSignerMetrics`](../../../reference/api/index.md#qbft_getsignermetrics). + +:::note + +If network conditions render it impossible to add and remove validators by voting, you can [add and remove validators without voting](add-validators-without-voting.md). + +::: + +#### Add a validator + +To propose adding a validator, call [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote), specifying the address of the proposed validator and `true`. A majority of validators must execute the call. + +```bash title="JSON-RPC qbft_proposeValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` + +When the validator proposes the next block, the protocol inserts one proposal received from [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote) into the block. If blocks include all proposals, subsequent blocks proposed by the validator will not contain a vote. + +When more than 50% of the existing validators have published a matching proposal, the protocol adds the proposed validator to the validator pool and the validator can begin validating blocks. + +To return a list of validators and confirm the addition of a proposed validator, use [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber). + +```bash title="JSON-RPC qbft_getValidatorsByBlockNumber request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' +``` + +To discard your proposal after confirming the addition of a validator, call [`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote), specifying the address of the proposed validator. + +```bash title="JSON-RPC qbft_discardValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` + +#### Remove a validator + +The process for removing a validator is the same as adding a validator except you specify `false` as the second parameter of [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). + +#### Epoch transition + +At each epoch transition, QBFT discards all pending votes collected from received blocks. Existing proposals remain in effect and validators re-add their vote the next time they create a block. + +An epoch transition occurs every `epochLength` blocks. Define `epochlength` in the QBFT genesis file. + +### Add and remove validators using a smart contract + +Users can create their own smart contracts to add or remove validators based on their organizational requirements. View the [example smart contract](https://github.com/ConsenSys/validator-smart-contracts) for more information on how to create and deploy the smart contract. + +You can pre-deploy the validator smart contract in a new QBFT network by specifying the contract details in the [genesis file](qbft.md#genesis-file). For existing QBFT networks you need to compile and deploy the contract using a transaction, then obtain the contract address from the receipt and use that in a [transition](#swap-validator-management-methods). + +:::info + +You can't use the JSON-RPC methods to add or remove validators when using a smart contract to manage nodes. + +You must interact with the contract functions using transactions. + +::: + +:::note + +If network conditions render it impossible to add and remove validators using a smart contract, you can [override smart contract validators](add-validators-without-voting.md#override-smart-contract-validators). + +::: + +### Minimum number of validators + +QBFT requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the ability for a blockchain network to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +## Transitions + +The `transitions` genesis configuration item allows you to specify a future block number at which to change QBFT network configuration in an existing network. For example, you can update the [block time](#configure-block-time-on-an-existing-network), [block reward](#configure-block-rewards-on-an-existing-network-deployment), [validator management method](#swap-validator-management-methods), or [mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). + +:::caution + +Do not specify a transition block in the past. Specifying a transition block in the past could result in unexpected behavior, such as causing the network to fork. + +::: + +### Configure block time on an existing network + +To update an existing network with a new `blockperiodseconds`: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockperiodseconds`. + - `` is the updated value for `blockperiodseconds`. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": , + "blockperiodseconds": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": 1240, + "blockperiodseconds": 4 + } + ] + } + }, + ... + } + ``` + + + +3. Restart all nodes in the network using the updated genesis file. +4. To verify the changes after the transition block, call [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + +### Configure block rewards on an existing network deployment + +To update an existing network with a new `blockreward`: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockreward`. + - `` is the updated value for `blockreward`. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "qbft": [ + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "qbft": [ + { + "block": 10, + "blockreward": "6000000000000000" + }, + { + "block": 15, + "blockreward": "75000000000000000" + }, + { + "block": 20, + "blockreward": "0" + } + ] + } + }, + ... + } + ``` + + + + :::note + + You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. + + ::: + +3. Restart all nodes in the network using the updated genesis file. + +### Swap validator management methods + +To swap between block header validator selection and contract validator selection methods in an existing network: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change the validator selection method. + - `` is the validator selection mode to switch to. Valid options are `contract` and `blockheader`. + - `` is the smart contract address, if switching to the contract validator selection method. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": , + "validatorselectionmode": , + "validatorcontractaddress": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": 102885, + "validatorselectionmode": "contract", + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + } + ] + } + }, + ... + } + ``` + + + +3. Restart all nodes in the network using the updated genesis file. + +### Configure the mining beneficiary on an existing network deployment + +To update an existing network with a new mining beneficiary: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `miningbeneficiary`. + - `` is the updated 20-byte address for `miningbeneficiary`. Starting at ``, block rewards go to this address. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": , + "miningbeneficiary": + }, + { + "block": , + "miningbeneficiary": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": 10000, + "miningbeneficiary": "0x0000000000000000000000000000000000000002", + }, + { + "block": 20000, + "miningbeneficiary": "", + } + ] + } + }, + ... + } + ``` + + + + :::note + + Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the block producer rather than a global override address. + + ::: + +3. Restart all nodes in the network using the updated genesis file. + + + +_[vanity data]: Validators can include anything they like as vanity data. _[RLP]: Recursive Length Prefix + +[GoQuorum]: https://consensys.net/docs/goquorum/en/stable/ +[View the example smart contract]: https://github.com/ConsenSys/validator-smart-contracts diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/contracts.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/contracts.md new file mode 100644 index 00000000000..b55680ff0ba --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/contracts.md @@ -0,0 +1,37 @@ +--- +title: Pre-deploy a contract +description: Pre-deploying contracts in the genesis file +sidebar_position: 5 +--- + +# Pre-deploy contracts in the genesis file + +To pre-deploy contracts when starting Besu, specify the contract code in the [genesis file](../../../public-networks/concepts/genesis-file.md). + +:::tip Contract code in the genesis file + +```json +{ + ... + "alloc": { + "0x0ffd23af8eebc60b3cfdeed6f814988757237314": { + "balance": "0x100000000000000000000000000000000000000000000000000", + "code": "0x6080604052600436106043576000357c010000000000000000000000000000000000000000000000000000000090048063010fc84214604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b80600081905550807f04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce360405160405180910390a25056fea165627a7a7230582038cb7ea327af8f73feabcfbff64498f1e74831e67f7c75286760d3845c6747c70029", + "storage": { + "7aa07e0c924147697605046b7c2c32645b7bbfb41e0ac5d0a84ac93cbb759798": "0000000000000000000000000000000000000000000000000000000000000001", + "cea2b0602db61f92b76ec4402875cc38eedc9fc425cb1b697fc2265d50fc20fb": "0000000000000000000000000000000000000000000000000000000000000001", + } + } + }, + ... +} +``` + +::: + +The contract code in the genesis file defines the: + +- Address. +- Balance. +- Bytecode. +- Key value pairs for contract storage. diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/curves.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/curves.md new file mode 100644 index 00000000000..c1779056217 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/curves.md @@ -0,0 +1,39 @@ +--- +title: Alternative elliptic curves +description: Using alternative elliptic curves in Besu +sidebar_position: 8 +--- + +# Configure alternative elliptic curves + +:::caution + +Configuring alternative elliptic curves is an early access feature. + +::: + +By default, Besu uses the Ethereum standard `secp256k1` elliptic curve (EC). However, when running nodes in a private network, it is possible to configure an alternative elliptic curve. + +The configuration for what elliptic curve Besu will use is done in the network configuration section of genesis file, using the [`ecCurve`](../../../public-networks/reference/genesis-items.md#Configuration_Items) key: + +```bash +{ + "genesis": { + "config": { + "ecCurve": "secp256k1", + [...] + }, + [...] +} +``` + +:::danger Important + +All nodes in the network **MUST** use the same elliptic curve. Nodes with different EC configuration from the network won't be able to send messages to other nodes or verify transactions and blocks. + +::: + +Besu supports the following elliptic curves: + +- `secp256k1` (Ethereum default) +- `secp256r1` diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/free-gas.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/free-gas.md new file mode 100644 index 00000000000..e41a1ef0c4d --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/free-gas.md @@ -0,0 +1,134 @@ +--- +title: Free gas network +description: Configuring free gas networks +sidebar_position: 2 +--- + +# Configure free gas networks + +Transactions use computational resources so have an associated cost. Gas is the cost unit and the gas price is the price per gas unit. The transaction cost is the gas used \* gas price. + +In public networks, the account submitting the transaction pays the transaction cost, in Ether. The miner (or validator in PoA networks) that includes the transaction in a block receives transaction cost. + +In many private networks, network participants run the validators and do not require gas as an incentive. Networks that don't require gas as an incentive usually configure the gas price to be zero (that is, free gas). Some private networks might allocate Ether and use a non-zero gas price to limit resource use. + +:::tip + +We use the term _free gas network_ to refer to a network with a gas price of zero. A network with a gas price of zero is also known as a _zero gas network_ or _no gas network_. + +::: + +:::note + +Some pre-crafted transactions require the deployment account to have gas available. For example, the transaction that creates the smart contract in [EIP-1820](https://eips.ethereum.org/EIPS/eip-1820). + +::: + +In a free gas network, transactions still use gas but the gas price is zero, meaning the transaction cost is zero. Transaction cost = gas used \* 0 (the gas price). + +## Configure free gas in Besu + +When gas is free, limiting block and contract sizes is less important. In free gas networks, we increase the block size limit and set the contract size limit to the maximum value. + +### 1. Set the block size + +If you want to remove gas from consideration and don't mind blocks potentially taking longer to create, in the genesis file set the block size limit (measured in gas) to the maximum accepted by Truffle (`0x1fffffffffffff`). In the genesis file, specify `gasLimit` following the `config` key. + +```json +{ + "config": { + .... + }, + ... + "gasLimit": "0x1fffffffffffff", + .... +} +``` + +If you are more concerned about blocks arriving on time and don't have expensive individual transactions, set `gasLimit` to a value closer to the amount of gas your validators can process in the configured block time. + +### 2. Set the contract size + +In the `config` section of the genesis file, set the contract size limit to the maximum supported size (in bytes). + +```json +( + "config": { + ... + "contractSizeLimit": 2147483647, + ... + } + ... +} +``` + +### 3. Start Besu with a minimum gas price of zero + +When starting nodes, set the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) to zero. + + + +# Command Line + +```bash +--min-gas-price=0 +``` + +# Configuration File + +```bash +min-gas-price=0 +``` + + + +# Command Line + +:::danger Important + +In a free gas network, ensure the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) is set to zero for every node. Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. You can query a node's gas configuration using [`eth_gasPrice`](../../../public-networks/reference/api/index.md#eth_gasprice). + +::: + +### 4. Enable zero base fee if using London fork or later + +If your network is configured to use the `londonBlock` or a later hard fork, then you must also enable the `zeroBaseFee` configuration. You must set this on all your nodes. Once it is set, future blocks produced by that node will set a `baseFee` of 0. This is required because the London hard fork (EIP-1559) introduced a non-zero `baseFee` into the block which normally means transactions require gas. + +```json +{ + "config": { + "londonBlock": 0, + "zeroBaseFee": true, + ... + }, + ... +} +``` + +## Configure free gas in Truffle + +If using Truffle to develop on your free gas network, you also need to configure free gas in Truffle. + +Like setting block and contract size limits to their maximum values for Besu, set the transaction gas limit in Truffle to the maximum possible. + +:::info + +Besu does not support private key management. To use Besu with Truffle, you must configure a [Truffle wallet](../../../public-networks/how-to/develop/truffle.md). + +::: + +### Update `truffle-config.js` + +Update the `truffle-config.js` file: + +1. Set the gas price to zero. + + ```js + gasPrice: 0; + ``` + +1. Set the gas limit for a transaction (that is, contract creation) to be the block gas limit - 1. + + ```js + gas: "0x1ffffffffffffe"; + ``` diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/tls/_category_.json b/versioned_docs/version-23.4.0/private-networks/how-to/configure/tls/_category_.json new file mode 100644 index 00000000000..5d8b22daabc --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/tls/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "TLS", + "position": 6, + "link": { + "type": "generated-index" + } +} diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/tls/client-and-server.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/tls/client-and-server.md new file mode 100644 index 00000000000..d1a0ca9aa09 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/tls/client-and-server.md @@ -0,0 +1,117 @@ +--- +title: Client and server TLS +sidebar_position: 1 +--- + +# Configure client and server TLS + +Hyperledger Besu supports TLS for client and server communication. For example, you can configure TLS for communication between [EthSigner](https://docs.ethsigner.consensys.net/en/latest/Concepts/TLS/) and Besu, and Besu and [Tessera](https://docs.tessera.consensys.net/HowTo/Configure/TLS/). + +The following diagram displays an example client and server TLS configuration. + +![Besu client and server TLS](../../../../assets/images/Besu_TLS.png) + +Configure TLS communication from the command line. + +## Prerequisites + +- Besu's password-protected PKCS12 keystore +- File containing the keystore password + +## Configure client TLS + +Allow clients (for example a dapp, curl, or EthSigner) to send and receive secure HTTP JSON-RPCs. + +**Client prerequisites**: + +- [Configure the client for TLS] +- Client's PKCS12 keystore information + +### Create the known clients file + +The known clients file allows clients with self-signed certificates or non-public certificates to connect to Besu. + +Create a file (in this example, `knownClients`) that lists one or more trusted clients. Use the format` ` where: + +- `` is the Common Name specified in the client certificate. +- `` is the SHA-256 fingerprint of the client certificate. + +```bash title="Example" +ethsigner 8E:E0:85:9F:FC:2E:2F:21:31:46:0B:82:4C:A6:88:AB:30:34:9A:C6:EA:4F:04:31:ED:0F:69:A7:B5:C2:2F:A7 +curl FC:18:BF:39:45:45:9A:15:46:76:A6:E7:C3:94:64:B8:34:84:A3:8E:B8:EA:67:DC:61:C0:29:E6:38:B8:B7:99 +``` + +You can use [`openssl`](https://www.openssl.org/) or [`keytool`](https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html) to display the SHA256 fingerprint. + +``` +keytool -list -v -keystore -storetype PKCS12 -storepass `. +``` + +### Start Besu + +```bash +besu --rpc-http-enabled --rpc-http-tls-enabled --rpc-http-tls-client-auth-enabled --rpc-http-tls-keystore-file=/Users/me/my_node/keystore.pfx --rpc-http-tls-keystore-password-file=/Users/me/my_node/keystorePassword --rpc-http-tls-known-clients-file=/Users/me/my_node/knownClients --rpc-http-tls-cipher-suite=TLS_AES_256_GCM_SHA384 --rpc-http-tls-protocol=TLSv1.3,TLSv1.2 +``` + +The command line: + +- Enables the HTTP JSON-RPC service using the [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables TLS for the HTTP JSON-RPC service using the [`--rpc-http-tls-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-enabled) option. +- Enables TLS client authentication using the [`--rpc-http-tls-client-auth-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-client-auth-enabled) option. +- Specifies the keystore using the [`--rpc-http-tls-keystore-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-file) option. +- Specifies the file that contains the password to decrypt the keystore using the [`--rpc-http-tls-keystore-password-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-password-file) option. +- [Specifies the clients](#create-the-known-clients-file) allowed to connect to Besu using the [`--rpc-http-tls-known-clients-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-known-clients-file) option. +- specifies the Java cipher suites using the [`--rpc-http-tls-cipher-suite`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-cipher-suite) option. +- specifies the TLS protocol version using the [`--rpc-http-tls-protocol`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-protocol) option. + +:::note + +Set [`--rpc-http-tls-ca-clients-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-ca-clients-enabled) to `true` to allow access to clients with signed and trusted root CAs. + +::: + +## Configure server TLS + +Allow Besu to securely communicate with the server (Tessera). + +**Server prerequisites**: + +- [Configure the server to allow TLS communication] +- Server's certificate information + +### Create the known servers file + +Create a file (in this example, `knownServers`) that lists one or more trusted servers. The file contents use the format `: ` where: + +- `` is the server hostname +- `` is the port used for communication +- `` is the SHA-256 fingerprint of the server's certificate. + +```bash title="Example" +localhost:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC +127.0.0.1:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC +``` + +:::note + +If you are unsure whether requests use the hostname or an IP address, configure both in the file. + +::: + +### Start Besu + +```bash +besu --privacy-tls-enabled --privacy-tls-keystore-file=/Users/me/my_node/keystore.pfx --privacy-tls-keystore-password-file=/Users/me/my_node/keystorePassword --privacy-tls-known-enclave-file=/Users/me/my_node/knownServers +``` + +The command line: + +- Enables TLS with the server using the [`--privacy-tls-enabled`](../../../reference/cli/options.md#privacy-tls-enabled) option. +- Specifies the keystore using the [`--privacy-tls-keystore-file`](../../../reference/cli/options.md#privacy-tls-keystore-file) option. +- Specifies the file that contains the password to decrypt the keystore using the [`--privacy-tls-keystore-password-file`](../../../reference/cli/options.md#privacy-tls-keystore-password-file) option. +- Specifies the trusted servers using the [`--privacy-tls-known-enclave-file`](../../../reference/cli/options.md#privacy-tls-known-enclave-file) option. + + + +[Configure the client for TLS]: https://docs.ethsigner.consensys.net/en/latest/HowTo/Configure-TLS/#server-tls-connection +[Configure the server to allow TLS communication]: https://docs.tessera.consensys.net/HowTo/Configure/TLS/ diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/tls/p2p.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/tls/p2p.md new file mode 100644 index 00000000000..6107444e9e1 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/tls/p2p.md @@ -0,0 +1,259 @@ +--- +title: Peer-to-peer TLS +sidebar_position: 2 +description: Configure P2P TLS communication +--- + +# Configure P2P TLS + +You can configure TLS to secure the P2P communication between nodes by ensuring only authorized nodes can communicate with each other. Use certificates issued by a trusted authority to connect authorized nodes in the network. + +:::caution + +P2P TLS is an early access feature, and functionality and options may be updated between releases. + +::: + +Besu supports PKCS11, PKCS12, and JKS keystore and truststore types for P2P TLS. + +## Configure P2P TLS + +**Prerequisites**: + +- A configured network. For example, [see steps 1 to 5 in the QBFT tutorial](../../../tutorials/qbft.md). +- Each node requires a keystore that contains the node's certificate and key. +- A truststore containing all the trusted certificates for the network. + +Start Besu and include the following command line options on the required nodes: + +```bash +besu --Xp2p-tls-enabled=true \ +--Xp2p-tls-keystore-type="PKCS12" \ +--Xp2p-tls-keystore-file="keystore" \ +--Xp2p-tls-keystore-password-file="keystore.password" \ +--Xp2p-tls-crl-file="crl2.pem" \ +--Xp2p-tls-truststore-type="JKS" \ +--Xp2p-tls-truststore-file="truststore.jks" \ +--Xp2p-tls-truststore-password-file="truststore_password.txt" +``` + +In the command line: + +- Enable TLS for P2P communication using [`--Xp2p-tls-enabled=true`](#xp2p-tls-enabled). +- Specify the keystore type and keystore file using [`--Xp2p-tls-keystore-type`](#xp2p-tls-keystore-type) and [`--Xp2p-tls-keystore-file`](#xp2p-tls-keystore-file). +- Specify the text file containing the password to unlock the keystore file using [`--Xp2p-tls-keystore-password-file`](#xp2p-tls-keystore-password-file). +- Specify the optional [certificate revocation list (CRL)] file using [`--Xp2p-tls-crl-file`](#xp2p-tls-crl-file). +- Specify the truststore type and truststore file using [`--Xp2p-tls-truststore-type`](#xp2p-tls-truststore-type) and [`--Xp2p-tls-truststore-file`](#xp2p-tls-truststore-file). +- Specify the text file containing the password to unlock the truststore file using [`--Xp2p-tls-truststore-password-file`](#xp2p-tls-keystore-password-file). + +## Command line options + +### `Xp2p-tls-crl-file` + + + +# Syntax + +```bash +--Xp2p-tls-crl-file= +``` + +# Example + +```bash +--Xp2p-tls-crl-file=/home/cert/cert.crl.pem +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_CRL_FILE=/home/cert/cert.crl.pem +``` + + + +Path to the optional certificate revocation list (CRL) file. + +### `Xp2p-tls-enabled` + + + +# Syntax + +```bash +--Xp2p-tls-enabled[=] +``` + +# Example + +```bash +--Xp2p-tls-enabled=true +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_ENABLED=true +``` + + + +Enable TLS for P2P communication. The default is `false`. + +### `Xp2p-tls-keystore-file` + + + +# Syntax + +```bash +--Xp2p-tls-keystore-file= +``` + +# Example + +```bash +--Xp2p-tls-keystore-file=/home/cert/keystore.jks +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_KEYSTORE_FILE=/home/cert/keystore.jks +``` + + + +Keystore file containing the key and certificate to allow TLS for P2P communication. + +### `Xp2p-tls-keystore-password-file` + + + +# Syntax + +```bash +--Xp2p-tls-keystore-password-file= +``` + +# Example + +```bash +--Xp2p-tls-keystore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_KEYSTORE_PASSWORD_FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the keystore file. + +### `Xp2p-tls-keystore-type` + + + +# Syntax + +```bash +--Xp2p-tls-keystore-type= +``` + +# Example + +```bash +--Xp2p-tls-keystore-type=JKS +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_KEYSTORE_TYPE=JKS +``` + + + +Keystore type that allows TLS for P2P communication. Valid options are `JKS`, `PKCS11`, and `PKCS12`. The default is `JKS`. + +### `Xp2p-tls-truststore-file` + + + +# Syntax + +```bash +--Xp2p-tls-truststore-file= +``` + +# Example + +```bash +--Xp2p-tls-truststore-file=/home/cert/truststore.jks +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_TRUSTSTORE_FILE=/home/cert/truststore.jks +``` + + + +Truststore containing the trusted certificates that allows TLS for P2P communication. + +### `Xp2p-tls-truststore-password-file` + + + +# Syntax + +```bash +--Xp2p-tls-truststore-password-file= +``` + +# Example + +```bash +--Xp2p-tls-truststore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the truststore file. + +### `Xp2p-tls-truststore-type` + + + +# Syntax + +```bash +--Xp2p-tls-truststore-type= +``` + +# Example + +```bash +--Xp2p-tls-truststore-type=JKS +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_TRUSTSTORE_TYPE=JKS +``` + + + +Truststore type. Valid options are `JKS`, `PKCS11`, and `PKCS12`. The default is `JKS`. + +[certificate revocation list (CRL)]: https://www.securew2.com/blog/certificate-revocation-crl-explained diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/configure/validators.md b/versioned_docs/version-23.4.0/private-networks/how-to/configure/validators.md new file mode 100644 index 00000000000..28a2be29b1a --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/configure/validators.md @@ -0,0 +1,38 @@ +--- +title: Validators +description: Configuring validators in production networks +sidebar_position: 4 +--- + +# Configure validators in a production network + +As when [configuring bootnodes](bootnodes.md): + +1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) before starting the validator. +1. When creating validators in the cloud (for example, AWS or Azure), attempt to assign static IP addresses to them. If your network is: + + - Publicly accessible, assign an elastic IP address. + - Internal only, specify a private IP address when you create the instance and record this IP address. + +We recommend storing validator configuration under source control. + +## Number of validators required + +Ensure you configure enough validators to allow for redundancy. IBFT 2.0 tolerates `f = (n-1)/3` faulty validators, where: + +- `f` is the number of faulty validators +- `n` is the number of validators. + +## Adding and removing validators + +You can [vote validators in or out of the validator pool]. + +## Validators as bootnodes + +Validators can also be bootnodes. Other than the [usual configuration for bootnodes](bootnodes.md), you do not need to specify any extra configuration when a validator is also a bootnode. + +If you remove a validator that is also a bootnode, ensure there are enough remaining bootnodes on the network. + + + +[vote validators in or out of the validator pool]: consensus/ibft.md#add-and-remove-validators diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/deploy/_category_.json b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/_category_.json new file mode 100644 index 00000000000..5befebd2362 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy for production", + "position": 6 +} diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/deploy/ansible.md b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/ansible.md new file mode 100644 index 00000000000..c4c264b5aa7 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/ansible.md @@ -0,0 +1,17 @@ +--- +sidebar_position: 2 +title: Use Ansible +description: Deploying Hyperledger Besu with Ansible role on Galaxy +--- + +# Deploy Besu with Ansible + +To deploy Besu using Ansible, use the [Hyperledger Besu role](https://galaxy.ansible.com/consensys/hyperledger_besu) published on Galaxy. + +For more information, see the "Read Me" button on the [Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). + +:::tip + +We strongly recommend automating network creation. Automating makes updates easier and ensures your configuration is synchronized across the network. + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/deploy/cloud.md b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/cloud.md new file mode 100644 index 00000000000..ab2637ea7cd --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/cloud.md @@ -0,0 +1,14 @@ +--- +title: Deploy to the cloud +sidebar_position: 1 +description: Deploying Besu to the cloud +--- + +# Deploy Besu to the cloud + +When deploying Besu to the cloud: + +- Ensure you have enough spread across Availability Zones (AZs) and Regions, especially for bootnodes and validators. +- If your network is a multi-region network, consider using VPC Peering to reduce latency. +- Where required, use VPNs to connect to your on premise systems, or single private chains. +- If deploying to Kubernetes, please refer to the [tutorial](../../tutorials/kubernetes/index.md). diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/deploy/ethstats.md b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/ethstats.md new file mode 100644 index 00000000000..f8b8da55fa8 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/ethstats.md @@ -0,0 +1,53 @@ +--- +sidebar_position: 4 +title: Use Ethstats network monitor +description: Ethstats network monitor +--- + +# Connect to Ethstats network monitor + +Connect to [Ethstats](https://ethstats.net) to display real time and historical [statistics](#statistics) about the network and nodes. You can connect to the Ethstats dashboard by [connecting to a client and server](#connect-through-a-client-and-server) or by [connecting through the command line](#connect-through-the-command-line). + +## Components + +Ethstats consists of: + +- A [server](https://github.com/goerli/ethstats-server), which consumes node data received from the client. +- A [client](https://github.com/goerli/ethstats-client), which extracts data from the node and sends it to the server. +- A [dashboard](https://github.com/goerli/ethstats-client#available-dashboards), which displays statistics. + +## Statistics + +Statistics displayed by Ethstats include: + +- Nodes in the network. Metrics for nodes include: + - Information about the last received block such as block number, block hash, transaction count, uncle count, block time, and propagation time. + - Connected peers, whether the node is mining, hash rate, latency, and uptime. +- Charts for block time, block difficulty, block gas limit, block uncles, block transactions, block gas used, block propagation histogram, and top miners. +- IP-based geolocation overview. +- Node logs, which display the data sent by a node. +- Block history, which provides the ability to go back in time and playback the block propagation through the nodes. + +## Connect through a client and server + +Refer to the external [Ethstats client](https://github.com/goerli/ethstats-client) and [Ethstats server](https://github.com/goerli/ethstats-server) documentation for installing those components and connecting to a dashboard. + +## Connect through the command line + +You can use command line options to connect a node directly to a [dashboard](https://github.com/goerli/ethstats-client#available-dashboards), without using a client. + +Start a node using the [`--ethstats`](../../../public-networks/reference/cli/options.md#ethstats) option to specify the Ethstats server URL. You can specify a contact email to send to the server using [`--ethstats-contact`](../../../public-networks/reference/cli/options.md#ethstats-contact). + +```bash +besu --ethstats=Dev-Node-1:secret@127.0.0.1:3001 --ethstats-contact=contact@mail.com +``` + +:::note + +A server must be specified by `--ethstats` in order to use `--ethstats-contact`. + +::: + +Open the selected dashboard website. Find your node under the list of nodes to see the statistics for the node and the network. + +![dashboard](../../../assets/images/dashboard.png) diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/deploy/kubernetes.md b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/kubernetes.md new file mode 100644 index 00000000000..5b4013fa803 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/deploy/kubernetes.md @@ -0,0 +1,11 @@ +--- +sidebar_position: 3 +title: Use Kubernetes +description: Deploying Hyperledger Besu with Kubernetes +--- + +# Deploy Besu with Kubernetes + +Use the [reference implementations](https://github.com/ConsenSys/quorum-kubernetes) to install private networks using Kubernetes (K8s). The repository has full support for cloud providers like AWS, Azure, GCP, and IBM, and has production setups that use of identities and cloud-native secret storage services like Azure KeyVault and AWS Secrets Manager. + +Refer to the [tutorial](../../tutorials/kubernetes/index.md) and familiarize yourself with the reference implementations, and customize them to your requirements. diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/index.md b/versioned_docs/version-23.4.0/private-networks/how-to/index.md new file mode 100644 index 00000000000..7fcad052473 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/index.md @@ -0,0 +1,35 @@ +--- +description: private networks how to overview +--- + +# How to + +This section provides instructional content for private network features. + +The following features are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: + +- Configure and manage: + - [Use a configuration file](../../public-networks/how-to/configuration-file.md) + - [Configure high availability](../../public-networks/how-to/configure-ha/index.md) + - [Configure mining](../../public-networks/how-to/use-pow/mining.md) +- [Use the Besu API](../../public-networks/how-to/use-besu-api/index.md): + - [Use JSON-RPC over HTTP, WS, and IPC](../../public-networks/how-to/use-besu-api/json-rpc.md) + - [Use RPC Pub/Sub over WS](../../public-networks/how-to/use-besu-api/rpc-pubsub.md) + - [Use GraphQL over HTTP](../../public-networks/how-to/use-besu-api/graphql.md) + - [Authenticate JSON-RPC requests](../../public-networks/how-to/use-besu-api/authenticate.md) + - [Access logs using JSON-RPC API](../../public-networks/how-to/use-besu-api/access-logs.md) +- Find and connect to peers: + - [Configure static nodes](../../public-networks/how-to/connect/static-nodes.md) + - [Configure ports](../../public-networks/how-to/connect/configure-ports.md) + - [Manage peers](../../public-networks/how-to/connect/manage-peers.md) + - [Specify NAT method](../../public-networks/how-to/connect/specify-nat.md) +- [Configure the Java Virtual Machine](../../public-networks/how-to/configure-jvm/index.md) + - [Pass JVM options](../../public-networks/how-to/configure-jvm/pass-jvm-options.md) + - [Manage JVM memory](../../public-networks/how-to/configure-jvm/manage-memory.md) + - [Use Java Flight Recorder](../../public-networks/how-to/configure-jvm/java-flight-recorder.md) +- Develop dapps: + - [Use Truffle](../../public-networks/how-to/develop/truffle.md) + - [Use client libraries](../../public-networks/how-to/develop/client-libraries.md) +- Troubleshoot: + - [Use EVM tool](../../public-networks/how-to/troubleshoot/evm-tool.md) + - [Trace transactions](../../public-networks/how-to/troubleshoot/trace-transactions.md) diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/monitor/_category_.json b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/_category_.json new file mode 100644 index 00000000000..8e8c27af9a7 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Monitor nodes", + "position": 3 +} diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/monitor/elastic-stack.md b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/elastic-stack.md new file mode 100644 index 00000000000..de0b6b615e7 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/elastic-stack.md @@ -0,0 +1,33 @@ +--- +title: Use Elastic Stack +sidebar_position: 3 +description: Using Elastic Stack (ELK) with Hyperledger Besu +--- + +# Use Elastic Stack + +[Elastic Stack] (ELK) is an open-source log management platform that is available when using the [Developer Quickstart](../../tutorials/quickstart.md). + +The [Filebeat] configuration ingests logs and the [Metricbeat] configuration collects metrics from the nodes at regular defined intervals and outputs them to Redis for storage. Redis provides a highly available mechanism enabling storage by any of the Elastic Beats and pulled by Logstash as required. + +The [pipeline configuration] defines the JSON format used for Besu logs and automatically picks up any new log fields. + +:::note + +The pipeline configuration must match the your log format. If using the default log format, you can use the [grok plugin](https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html) to extract the log fields. + +::: + +To see the Besu Quickstart network logs in Kibana: + +1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting ELK monitoring. +1. Open the [`Kibana logs address`](http://localhost:5601/app/kibana#/discover) listed by the sample networks `list.sh` script. The logs display in Kibana. + + ![Kibana](../../../assets/images/KibanaQuickstart.png) + + + +[Filebeat]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/filebeat/filebeat.yml +[Metricbeat]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/metricbeat/metricbeat.yml +[pipeline configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/logstash/pipeline/20_besu.conf +[Elastic Stack]: https://www.elastic.co/what-is/elk-stack diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/monitor/index.md b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/index.md new file mode 100644 index 00000000000..3f2c9a78708 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/index.md @@ -0,0 +1,18 @@ +--- +description: Monitoring using metrics and logging +--- + +# Monitoring + +Use monitoring to identify node and network issues. In private networks, you can [configure metrics and logging](../../../public-networks/how-to/monitor/index.md) as in public networks. + +You can also use the following monitoring tools in private networks: + +- [Loki](loki.md) +- [Elastic Stack](elastic-stack.md) +- [Quorum Hibernate](quorum-hibernate.md) +- [Splunk](splunk.md) +- [OpenTelemetry](opentelemetry.md) +- [Sirato Explorer](sirato-explorer.md) + +For an overview of monitoring Hyperledger Besu, view [this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/monitor/loki.md b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/loki.md new file mode 100644 index 00000000000..8701c1a9838 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/loki.md @@ -0,0 +1,35 @@ +--- +title: Use Grafana Loki +sidebar_position: 2 +description: Using Grafana Loki log management platform with Hyperledger Besu +--- + +# Grafana Loki + +[Grafana Loki] is an open-source log management platform that is available when using the [Developer Quickstart](../../tutorials/quickstart.md). + +The [Promtail configuration] ingests logs at regular defined intervals and outputs them to [Loki] for storage. + +The `pipeline configuration` in Promtail defines pipeline stages that can collate logs natively or using the JSON format. + +:::note + +If using the pipeline regex stage in `Promtail`, configuration must match your log format. + +::: + +To view the GoQuorum Quickstart network logs in Loki: + +1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting Loki monitoring. +2. Open the [`Grafana Loki address`](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=&from=now-15m&to=now) listed by the sample networks `list.sh` script. + + The logs display in Loki. + + ![Loki logs](../../../assets/images/grafana_loki.png) + + + +[Promtail configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/promtail/promtail.yml +[pipeline configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/promtail/promtail.yml +[Loki]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/loki/loki.yml +[Grafana Loki]: https://grafana.com/oss/loki/ diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/monitor/opentelemetry.md b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/opentelemetry.md new file mode 100644 index 00000000000..4a85ed7ede9 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/opentelemetry.md @@ -0,0 +1,174 @@ +--- +title: Use OpenTelemetry +sidebar_position: 6 +description: Collect Besu information with the OpenTelemetry Collector +--- + +# Use OpenTelemetry + +You can use the OpenTelemetry monitoring and tracing service to gather node metrics and traces. To enable OpenTelemetry to access Hyperledger Besu, use the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) and [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. Use [Splunk](https://splunk.com) to visualize the collected data. A [Besu Sync example](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu-sync) is available. + +:::tip + +Use OpenTelemetry to monitor the sync time of your Besu node and show where time is spent internally and over the JSON-RPC interface. + +[This office hours recording](https://wiki.hyperledger.org/display/BESU/2021-01-19+Office+Hours+Notes) shows examples of monitoring Hyperledger Besu. + +::: + +## Install OpenTelemetry Collector + +Download and install the [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases). + +:::tip + +You can also install exporters that send system metrics to OpenTelemetry to monitor non-Besu-specific items such as disk and CPU usage. The OpenTelemetry Collector can connect to additional applications, and may be deployed in Kubernetes environments as a daemonset. + +::: + +## Setting up and running OpenTelemetry with Besu + +1. Configure OpenTelemetry to accept data from Besu. For example, use the following configuration for your `otel-collector-config.yml` file, and send data to Splunk and Splunk APM: + + ```yml title="otel-collector-config.yml" + receivers: + otlp: + protocols: + grpc: + http: + + exporters: + splunk_hec/traces: + # Splunk HTTP Event Collector token. + token: "11111111-1111-1111-1111-1111111111113" + # URL to a Splunk instance to send data to. + endpoint: "https://:8088/services/collector" + # Optional Splunk source: https://docs.splunk.com/Splexicon:Source + source: "besu:traces" + # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype + sourcetype: "otlp" + # Splunk index, optional name of the Splunk index targeted. + index: "traces" + # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. + max_connections: 20 + # Whether to disable gzip compression over HTTP. Defaults to false. + disable_compression: false + # HTTP timeout when sending data. Defaults to 10s. + timeout: 10s + # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. + # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. + insecure_skip_verify: true + splunk_hec/metrics: + # Splunk HTTP Event Collector token. + token: "11111111-1111-1111-1111-1111111111113" + # URL to a Splunk instance to send data to. + endpoint: "https://:8088/services/collector" + # Optional Splunk source: https://docs.splunk.com/Splexicon:Source + source: "besu:metrics" + # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype + sourcetype: "prometheus" + # Splunk index, optional name of the Splunk index targeted. + index: "metrics" + # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. + max_connections: 20 + # Whether to disable gzip compression over HTTP. Defaults to false. + disable_compression: false + # HTTP timeout when sending data. Defaults to 10s. + timeout: 10s + # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. + # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. + insecure_skip_verify: true + # Traces + sapm: + access_token: "${SPLUNK_ACCESS_TOKEN}" + endpoint: "https://ingest.${SPLUNK_REALM}.signalfx.com/v2/trace" + # Metrics + Events + signalfx: + access_token: "${SPLUNK_ACCESS_TOKEN}" + realm: "${SPLUNK_REALM}" + + processors: + batch: + + extensions: + health_check: + pprof: + zpages: + + service: + extensions: [pprof, zpages, health_check] + pipelines: + traces: + receivers: [otlp] + exporters: [splunk_hec/traces, sapm] + processors: [batch] + metrics: + receivers: [otlp] + exporters: [splunk_hec/metrics, signalfx] + processors: [batch] + ``` + + It is easiest to run the OpenTelemetry collector with Docker with the following command: + + + + # Syntax + + ```bash + docker run -d \ + -v ./otel-collector-config.yml:/etc/otel/config.yaml \ + -e SPLUNK_ACCESS_TOKEN= \ + -e SPLUNK_REALM= \ + -p 4317:4317 \ + otel/opentelemetry-collector-contrib:latest + ``` + + # Example + + ```bash + docker run -d \ + -v ./otel-collector-config.yml:/etc/otel/config.yaml \ + -e SPLUNK_ACCESS_TOKEN=abcdefg654 \ + -e SPLUNK_REALM=us1 \ + -p 4317:4317 \ + otel/opentelemetry-collector-contrib:latest + ``` + + + + You can also refer to this [Docker-compose example](https://github.com/splunk/splunk-connect-for-ethereum/blob/989dc2ccae7d8235bf3ce2a83a18cf0cd1713294/examples/besu-sync/full-sync/docker-compose.yaml). + +2. Start Besu with the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) and [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. For example, run the following command to start a single node: + + + + # Syntax + + ```bash + OTEL_EXPORTER_OTLP_ENDPOINT=https://: besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry + ``` + + # Example + + ```bash + OTEL_EXPORTER_OTLP_ENDPOINT=https://localhost:4317 besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry + ``` + + + + The [OpenTelemetry SDK](https://github.com/open-telemetry/opentelemetry-specification/blob/8f7cdb73618a0b3afa9532b8f8103d719e352781/specification/sdk-environment-variables.md) mandates how to configure the OpenTelemetry gRPC client, so data flows to the collector from Besu. + + You can use the following environment variables: + + | Name | Description | Required | + | --- | --- | --- | + | OTEL_EXPORTER_OTLP_ENDPOINT | OpenTelemetry Collector endpoint, of the form `https://host:port`. The default value is `https://localhost:4317` | Yes | + | OTEL_EXPORTER_OTLP_INSECURE | Whether to allow insecure connections for OpenTelemetry data. False by default. | No | + + + +[Monitoring Besu synchronization to chain with Splunk]: https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu-sync + + + +\*[APM]: Application Performance Monitoring diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/monitor/quorum-hibernate.md b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/quorum-hibernate.md new file mode 100644 index 00000000000..c56c5b65adb --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/quorum-hibernate.md @@ -0,0 +1,18 @@ +--- +title: Use Quorum Hibernate +sidebar_position: 4 +description: Use Quorum Hibernate with Hyperledger Besu +--- + +# Use Quorum Hibernate + +[Quorum Hibernate] is a proxy that monitors a node's API traffic and hibernates the node when inactive. This reduces infrastructure costs by ensuring only nodes receiving API requests or nodes required to establish consensus are running. + +Quorum Hibernate wakes up hibernating nodes: + +- When a new transaction or API request is received. +- To allow it to periodically sync with the network. + + + +[Quorum Hibernate]: https://github.com/ConsenSys/quorum-hibernate diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/monitor/sirato-explorer.md b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/sirato-explorer.md new file mode 100644 index 00000000000..4e5969f2ccd --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/sirato-explorer.md @@ -0,0 +1,123 @@ +--- +title: Use Sirato Explorer +sidebar_position: 7 +description: Use Sirato Explorer on a privacy-enabled Besu network +--- + +# Use Sirato Blockchain Explorer + +[Sirato Blockchain Explorer](https://www.web3labs.com/sirato) supports public and private EVM networks. This page describes how to use the free version of Sirato with its built-in support for [privacy-enabled](../../concepts/privacy/index.md) Besu networks created using the [Developer Quickstart](../../tutorials/quickstart.md). + +Sirato provides an overview of the entire network, including block information, contract metadata, transaction searches, and [more](https://medium.com/web3labs/epirus-ethereum-saas-blockchain-explorer-d5d961717d15). + +:::note + +You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, in order to allow access for Besu [privacy API methods](../../reference/api/index.md#priv-methods). In production networks, you must [secure access](../../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. + +::: + +## Prerequisites + +[Docker and Docker Compose](https://docs.docker.com/compose/install/) installed. + +## Start Sirato + +Clone the [Sirato GitHub repository](https://github.com/web3labs/sirato-free): + +```bash +git clone https://github.com/web3labs/sirato-free +``` + +The repository contains Docker Compose scripts to allow Sirato to start with a Developer Quickstart test network. + +From the Sirato directory, run the following script: + + + +# Command + +```bash +./start_sirato_besu.sh +``` + +# Result + +```bash +************************************* +Sirator Explorer for Besu +************************************* +Starting explorer +-------------------- +[+] Running 5/5 + â ŋ Container docker-compose-mongodb-1 Started 3.3s + â ŋ Container docker-compose-api-1 Started 4.1s + â ŋ Container docker-compose-ingestion-1 Started 4.2s + â ŋ Container docker-compose-web-1 Started 4.4s + â ŋ Container docker-compose-nginx-1 Started 5.0s +---------------------------------- +Services +---------------------------------- +Sirato explorer HTTP endpoint : http://localhost:260012 +Sirato is connected to node : http://rpcnode:8545 +``` + + + +Open `http://localhost/` on your browser. You’ll see the new initialization page while it boots up. This may take 5–10 minutes for the all services to start and the ingestion sync to complete. + +![`Sirato-dashboard`](../../../assets/images/sirato-loading.png) + +## Use Sirato + +The **Dashboard** page provides an aggregated view of network activities. + +![`Epirus-dashboard`](../../../assets/images/sirato-dashboard.png) + +The **Network** page provides an overview of the network status and connected peers. This page is disabled by default, and is only visible if you set `DISPLAY_NETWOR_TAB=enabled` using the following command: + +```bash +NODE_ENDPOINT=http://member1besu:8545 DISPLAY_NETWORK_TAB=enabled docker-compose -f docker-compose.yml -f sirato-extensions/docker-compose-quorum-dev-quickstart.yml up +``` + +![Sirato network](../../../assets/images/sirato-network.png) + +The **Blocks** page shows a real-time view of the finalized blocks. + +![Sirato blocks](../../../assets/images/sirato-blocks.png) + +You can view a given block details by selecting a block hash or number. + +![Sirato block details](../../../assets/images/sirato-block-details.png) + +The **Transactions** page shows a paginated view of new and historical transactions. + +![Sirato transactions](../../../assets/images/sirato-transactions.png) + +## Stop Sirato + +To stop all the services from running, run the following script: + + + +# Command + +```bash +./stop.sh +``` + +# Result + +```bash +************************************* +Sirator Explorer for Besu +************************************* +Stopping explorer +[+] Running 5/5 + â ŋ Container docker-compose-nginx-1 Stopped 0.5s + â ŋ Container docker-compose-ingestion-1 Stopped 4.0s + â ŋ Container docker-compose-web-1 Stopped 10.3s + â ŋ Container docker-compose-api-1 Stopped 2.9s + â ŋ Container docker-compose-mongodb-1 Stopped +``` + + diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/monitor/splunk.md b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/splunk.md new file mode 100644 index 00000000000..de5af2731cc --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/monitor/splunk.md @@ -0,0 +1,190 @@ +--- +title: Use Splunk +sidebar_position: 5 +description: Send Hyperledger Besu logs to Splunk +--- + +# Use Splunk + +[Splunk](https://splunkbase.splunk.com/app/4866/) is a third-party monitoring solution compatible with Besu. A Splunk server can receive Besu logs and enable complex search, visualization, and analysis. + +Splunk can aggregate multiple logs in one place and run complex queries without being connected to the machine running Besu to read the standard output. + +Options for running Splunk and Besu are: + +- [Use Splunk](#use-splunk) + - [Developer Quickstart with Splunk](#developer-quickstart-with-splunk) + - [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose) + - [Requirements](#requirements) + - [Steps](#steps) + - [Use Splunk Enterprise as a Docker container](#use-splunk-enterprise-as-a-docker-container) + - [Prerequisites](#prerequisites) + - [Steps](#steps-1) + - [Run a Splunk Enterprise instance](#run-a-splunk-enterprise-instance) + - [Prerequisites](#prerequisites-1) + - [Steps](#steps-2) + - [Splunk options reference](#splunk-options-reference) + +## Developer Quickstart with Splunk + +To view the Quickstart network logs in Splunk: + +1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting Splunk monitoring. +1. Open the [Splunk UI](http://localhost:8000). + +## Splunk Connect for Ethereum Docker Compose + +To run a development Besu node and connect it to Splunk Enterprise, use the Splunk Connect for Ethereum demonstration Docker Compose environment provided by Splunk. + +### Requirements + +- [Git](https://git-scm.com/) +- [Docker and Docker-compose](https://docs.docker.com/compose/install/) + +:::info + +A Splunk license is not required to use the Splunk Connect for Ethereum demonstration. + +::: + +### Steps + +1. Clone the Splunk Connect for Ethereum repository: + + ```bash + git clone https://github.com/splunk/splunk-connect-for-ethereum.git + cd splunk-connect-for-ethereum + ``` + +1. Start the demonstration environment by following the Splunk Connect for Ethereum repository [README](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu). + + :::note + + Splunk enterprise takes some time to start. + + Run `docker ps` and wait for the `STATUS` of the 3 containers to be `Up [number] seconds (healthy)`. + + ``` + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 127600dd1173 splunkdlt/ethlogger:latest "ethlogger" 53 seconds ago Up 51 seconds (healthy) ethlogger + 88dfcee683c4 splunk/splunk:latest "/sbin/entrypoint.shâ€Ļ" 53 seconds ago Up 52 seconds (healthy) 8065/tcp, 8088-8089/tcp, 8191/tcp, 9887/tcp, 9997/tcp, 0.0.0.0:18000->8000/tcp splunk + 111b0c6d6072 hyperledger/besu:1.4.4 "besu" 53 seconds ago Up 52 seconds (healthy) 8545-8547/tcp, 30303/tcp besu + ``` + + ::: + +## Use Splunk Enterprise as a Docker container + +### Prerequisites + +- [Docker](https://docs.docker.com/compose/install/) +- [Besu 1.4.4](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/CHANGELOG.md#144) or later [installed](../../get-started/install/binary-distribution.md) + +:::info + +A Splunk license is not required to use the trial version of the Splunk Docker image. The image is not suitable for production use and has [restrictions on daily log volume](https://www.splunk.com/). + +::: + +:::note + +If running [Besu as a Docker container](../../get-started/install/run-docker-image.md), consider using [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose) or [Kubernetes](../deploy/kubernetes.md) instead of the Splunk Enterprise trial container. + +::: + +### Steps + +1. Start the Splunk Enterprise container: + + ```bash + docker run \ + -e SPLUNK_START_ARGS=--accept-license \ + -e SPLUNK_HEC_TOKEN=11111111-1111-1111-1111-1111111111113 \ + -e SPLUNK_PASSWORD=changeme \ + --rm \ + -p8080:8000 -p8088:8088 \ + -d \ + --name splunk-demo \ + splunk/splunk:latest + ``` + + Once the service is started, connect on [`http://localhost:8080/`](http://localhost:8080/) and login as the `admin` user with a password of `changeme`. + + :::tip + + To follow the logs of the Splunk container: + + ```bash + docker logs -f splunk-demo + ``` + + ::: + +2. Create the Besu index: + + 1. In the Splunk Web interface, navigate to the [index list in the settings](http://localhost:8080/en-US/manager/search/data/indexes). + 2. [Create an event index] with an Index Name of `besu`. + 3. Leave other fields with the default values. + 4. Save the `besu` index. + +3. Run Besu. To start a Besu node running in development mode, run the following command: + + ```bash + LOGGER=Splunk \ + SPLUNK_URL=https://localhost:8088 \ + SPLUNK_TOKEN=11111111-1111-1111-1111-1111111111113 \ + SPLUNK_SKIPTLSVERIFY=true \ + besu \ + --network=dev \ + --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 \ + --miner-enabled \ + --logging=trace + ``` + + The environment variables specified send the Besu logs to Splunk. Only `LOGGER`, `SPLUNK_URL`, `SPLUNK_TOKEN` and `SPLUNK_SKIPTLSVERIFY` are required in this example. The complete list of options is in the [Splunk options reference table](#splunk-options-reference). + +4. In the Splunk Web interface, navigate to the [search page](http://localhost:8080/en-US/app/search/search). Type `index="besu"` in the search field. Log events sent by Besu are displayed. + + Congratulations! You can now play with the search and other Splunk features to explore your Besu logs. + + ![Splunk search page](../../../assets/images/splunk-ui.png) + +5. Stop Besu with ++ctrl+c++. Stop the Splunk container with `docker stop splunk-demo`. + +## Run a Splunk Enterprise instance + +### Prerequisites + +- [Splunk Enterprise license](https://www.splunk.com/) +- [Besu 1.4.4](https://github.com/hyperledger/besu/blob/master/CHANGELOG.md#144) or later [installed](../../get-started/install/binary-distribution.md) + +### Steps + +1. Follow the steps in the [Splunk Enterprise documentation](https://docs.splunk.com/Documentation/Splunk/8.0.4/Installation) to download, install, and run Splunk Enterprise. + +1. After logging into the Splunk Enterprise Web interface, navigate to the settings to: + + 1. [Create an HTTP Event Collector](https://docs.splunk.com/Documentation/Splunk/8.0.4/Data/UsetheHTTPEventCollector). + 1. [Create an event index] named `besu`. + +1. Run Besu as in step 3 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). Set the `SPLUNK_URL` value to match the HTTP Event Collector address and port. + + You can display logs and use the search engine as in step 4 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). + +## Splunk options reference + +| Name | Description | Required | +| --- | --- | --- | +| LOGGER | Set to `Splunk` to activate sending logs to Splunk. | Yes | +| HOST | Current host. If in a Docker environment, the default value is the docker container ID. Otherwise, the default value is `localhost`. | No | +| SPLUNK_URL | URL of the Splunk HTTP Event Collector. For example, use `https://localhost:8088` | Yes | +| SPLUNK_TOKEN | Authentication token, usually of the form `11111111-1111-1111-1111-111111111111` | Yes | +| SPLUNK_INDEX | [Index](https://docs.splunk.com/Splexicon:Index) to store logs. Defaults to `besu` | No | +| SPLUNK_SOURCE | [Source of the logs](https://docs.splunk.com/Splexicon:Source). Defaults to `besu` | No | +| SPLUNK_SOURCETYPE | [Source type of the logs](https://docs.splunk.com/Splexicon:Sourcetype). Defaults to `besu` | No | +| SPLUNK_BATCH_SIZE_BYTES | Size of a log batch in bytes. Defaults to `65536` | No | +| SPLUNK_BATCH_SIZE_COUNT | Size of a log batch in number of events. Defaults to `1000` | No | +| SPLUNK_BATCH_INTERVAL | Interval at which to send log batches. Defaults to `500` | No | +| SPLUNK_SKIPTLSVERIFY | Whether to check the Splunk instance TLS certificate when sending data. Defaults to `false` | No | + +[Create an event index]: https://docs.splunk.com/Documentation/Splunk/8.0.4/Indexer/Setupmultipleindexes#Create_events_indexes diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/_category_.json b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/_category_.json new file mode 100644 index 00000000000..a663c5c6ed7 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create and send transactions", + "position": 2 +} diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/concurrent-private-transactions.md b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/concurrent-private-transactions.md new file mode 100644 index 00000000000..16d7d4242fe --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/concurrent-private-transactions.md @@ -0,0 +1,35 @@ +--- +title: Send concurrent private transactions +description: Creating and sending concurrent private transactions with Hyperledger Besu +sidebar_position: 2 +--- + +# Send concurrent private transactions + +Private transaction processing involves two transactions, the private transaction and the [privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md). The private transaction and the PMT each have their own [nonce](../../concepts/privacy/private-transactions/index.md#nonces). + +If your private transaction rate requires sending private transactions without waiting for the previous private transaction to be mined, using [`eth_getTransactionCount`](../../../public-networks/reference/api/index.md#eth_gettransactioncount) and [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) may result in [incorrect nonces](../../concepts/privacy/private-transactions/index.md#private-nonce-management). + +In this case, use [`priv_distributeRawTransaction`](private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +:::note + +You can use [`priv_getTransactionCount`](../../reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for an account for the specified privacy group or participants. + +::: + +Send the corresponding PMT using [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), specifying the public PMT nonce. This method allows you to create and send the PMT yourself rather than [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) handling the PMT. + +:::caution + +When using `priv_distributeRawTransaction` to distribute transactions with consecutive nonces for the same account, the corresponding PMTs must use one account with the nonces in the same order as the private transactions. + +This is to ensure that the private transactions are executed in the correct order. + +::: + +:::info + +The [web3js-quorum library](https://github.com/ConsenSys/web3js-quorum/tree/master/example/concurrentPrivateTransactions) includes an example of how to send concurrent private transactions. The example uses [offchain privacy groups](../../concepts/privacy/privacy-groups.md). Use [`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress) to get the precompile address to specify in the `to` field when creating the PMT. + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/index.md b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/index.md new file mode 100644 index 00000000000..61e37b710c9 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/index.md @@ -0,0 +1,14 @@ +--- +title: Create and send transactions +description: private networks send transactions overview +--- + +# Create and send transactions + +In private networks, you can create and [send regular transactions](../../../public-networks/how-to/send-transactions.md) as in public networks. + +You can also: + +- [Send private transactions](private-transactions.md). +- [Send concurrent private transactions](concurrent-private-transactions.md). +- [Include revert reason in transactions](revert-reason.md). diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/private-transactions.md b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/private-transactions.md new file mode 100644 index 00000000000..4552fcda39a --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/private-transactions.md @@ -0,0 +1,140 @@ +--- +title: Create and send private transactions +description: Creating and sending private transactions with Hyperledger Besu +sidebar_position: 1 +--- + +# Create and send private transactions + +Create and send [private transactions](../../concepts/privacy/index.md) using: + +- [web3js-quorum client library](../use-privacy/web3js-quorum.md) or [web3j client library](https://github.com/web3j/web3j) +- [`eea_sendTransaction` with EthSigner](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction) +- [`eea_sendRawTransaction`](#eea_sendrawtransaction) +- [`priv_distributeRawTransaction`](#priv_distributerawtransaction). + +All private transaction participants must be online for a private transaction to be successfully distributed. If any participants are offline when submitting the private transaction, the transaction is not attempted and you must resubmit the transaction. + +The `gas` and `gasPrice` specified when sending a private transaction are used by the [privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md), not the private transaction itself. + +:::note + +Private transactions either deploy contracts or call contract functions. Ether transfer transactions cannot be private. + +::: + +## eea_sendRawTransaction + +[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) distributes the private transaction to the participating nodes, and signs and submits the PMT, as described in [Private transaction processing](../../concepts/privacy/private-transactions/processing.md). + +:::note + +If [sending concurrent transactions](concurrent-private-transactions.md), you must use [`priv_distributeRawTransaction`](#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +::: + +## priv_distributeRawTransaction + +Use [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction) when sending [concurrent private transactions](concurrent-private-transactions.md). + +[`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) distributes the private transaction to the participating nodes but does not sign and submit the PMT. That is, it performs steps 1 to 5 of [private transaction processing](../../concepts/privacy/private-transactions/processing.md). + +If using [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction), use the value returned by [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction), which is the enclave key to the private transaction in [Tessera](https://docs.tessera.consensys.net/), in the `data` field of a call to [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction). Use the value returned by [`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress), which is the address of the [privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md), in the `to` field of the call. + +By using the [public Ethereum transaction](../../how-to/send-transactions/index.md), [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), you are signing and submitting the PMT yourself instead of having it signed by the Besu node, giving you greater control over the PMT. + +:::warning + +If the PMT is not sent after distributing the private transaction, the distributed private transaction is not executed and the private states are not updated. + +::: + +```json title="Distribute private transaction using priv_distributeRawTransaction" +{ + "jsonrpc": "2.0", + "method": "priv_distributeRawTransaction", + "params": [ + "0xf90198808203e8832dc6c08080b8fb608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c003600291ba05393543d483654fd01d9ee818cddfc7527dd6e13e6ef7b45a61e2ca13ffb6b70a0452338873862803ffe04056aea98cd0e3417ff971dcb384e54fce8ca1756a665a09de8260dc3763f8383a6a9ffe96909d36cd3ff4c346e3846a6467c50feaf0119e1a0839f41993789227ec721c9eaf1541683287fa436ef6edd9ec8fd088bad1a0c3c8a72657374726963746564" + ], + "id": 1 +} +``` + +```json title="Enclave key to the private transaction in Tessera returned by priv_distributeRawTransaction" +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" +} +``` + +Send the enclave key in the `data` field, and the [privacy precompile address](../../reference/api/index.md#priv_getprivacyprecompileaddress) in the `to` field of `eth_sendRawTransaction`: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_sendRawTransaction", + "params": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "to": "0x000000000000000000000000000000000000007e", + "data": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b", + "gas": "0x2E1800", + "gasPrice": "0x9184e72a000" + } + ], + "id": 1 +} +``` + +## EEA-compliant or Besu-extended privacy + +To create an [EEA-compliant private transaction], specify `privateFor` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +To create a [Besu-extended private transaction], specify a `privacyGroupId` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +## Unsigned and unencoded private transactions + +The [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) parameter is a signed RLP-encoded private transaction. Shown below are examples of unsigned and unencoded private transactions to create a contract. + +```json title="Unencoded and unsigned EEA-compliant private transaction" +{ + "to": null, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x7600", + "gasPrice": "0x0", + "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "nonce": "0x0", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privateFor": [ + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=", + "6fg8q5rWMBoAT2oIiU3tYJbk4b7oAr7dxaaVY7TeM3U=" + ], + "restriction": "restricted" +} +``` + +```json title="Unencoded and unsigned Besu-extended private transaction" +{ + "to": null, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x7600", + "gasPrice": "0x0", + "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "nonce": "0x0", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privacyGroupId": "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=", + "restriction": "restricted" +} +``` + +:::tip + +The `example` directory in the [web3js-quorum client library](../use-privacy/web3js-quorum.md) contains examples of signing and encoding private transactions. + +::: + + + +[EEA-compliant private transaction]: ../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy +[Besu-extended private transaction]: ../../concepts/privacy/privacy-groups.md#besu-extended-privacy diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/revert-reason.md b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/revert-reason.md new file mode 100644 index 00000000000..5113f6c6255 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/send-transactions/revert-reason.md @@ -0,0 +1,138 @@ +--- +title: Include revert reason +description: Including revert reason in transactions with Hyperledger Besu +sidebar_position: 3 +--- + +# Revert reason + +In smart contracts, the [`revert`](https://docs.soliditylang.org/en/v0.8.12/control-structures.html#revert) operation triggers an exception to flag an error and revert the current call. The EVM passes back to the client an optional string message containing information about the error. + +```sol +pragma solidity ^0.8.4; + +contract VendingMachine { + address owner; + constructor() { + owner = msg.sender; + } + error Unauthorized(); + function buy(uint amount) public payable { + if (amount > msg.value / 2 ether) + revert("Not enough Ether provided."); + // Alternative way to do it: + require( + amount <= msg.value / 2 ether, + "Not enough Ether provided." + ); + // Perform the purchase. + } + function withdraw() public { + if (msg.sender != owner) + revert Unauthorized(); + + payable(msg.sender).transfer(address(this).balance); + } +} +``` + +## Enable revert reason + +Use the [`--revert-reason-enabled`](../../../public-networks/reference/cli/options.md#revert-reason-enabled) command line option to include the revert reason in the transaction receipt, [`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) error, [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) error, and [`trace`](../../../public-networks/reference/trace-types.md#trace) response in Hyperledger Besu. + +:::caution + +Enabling revert reason may use a significant amount of memory. We do not recommend enabling revert reason when connected to public Ethereum networks. + +::: + +## Where the revert reason is included + +With revert reason enabled, the transaction receipt returned by [`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt) includes the revert reason as an ABI-encoded string. + +:::info + +The revert reason is not included in the transactions receipt's root hash. Not including the revert reason in the transactions receipt's root hash means the revert reason is only available to nodes that execute the transaction when importing the block. That is, the revert reason is not available if using fast synchronization ([`--sync-mode=FAST`](../../../public-networks/reference/cli/options.md#sync-mode)). + +::: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": null, + "cumulativeGasUsed": "0x5208", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gasUsed": "0x5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", + "transactionIndex": "0x0", + "revertReason": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" + } +} +``` + +The error returned by [`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) and [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) includes the revert reason as an ABI-encoded string in the `data` field. + +```json title="Exampleof `eth_estimateGas`and`eth_call` error" { "jsonrpc": "2.0", "id": 3, "error": { "code": -32000, "message": "Execution reverted", "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" } } + +```` + +The list items in the [`trace`](../../../public-networks/reference/trace-types.md#trace) response returned by [`trace_replayBlockTransactions`](../../../public-networks/reference/api/index.md#trace_replayblocktransactions), [`trace_block`](../../../public-networks/reference/api/index.md#trace_block), and [`trace_transaction`](../../../public-networks/reference/api/index.md#trace_transaction) include the revert reason as an ABI-encoded string. + +```json title="Example of `trace` response list item" +{ + "jsonrpc": "2.0", + "id": 415, + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffadea", + "input": "0x", + "to": "0x0110000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x220bc13dc4f1ed38dcca927a5be15eca16497d279f4c40d7b8fe9704eadf1464", + "blockNumber": 18, + "error": "Reverted", + "revertReason": "0x7d88c1856cc95352", + "subtraces": 0, + "traceAddress": [], + "transactionHash": "0xc388baa0e55e6b73e850b22dc7e9853700f6b995fd55d95dd6ccd5a13d63c566", + "transactionPosition": 1, + "type": "call" + } + ] +} +```` + +## Revert reason format + +As described in the [Solidity documentation], the revert reason is an ABI-encoded string consisting of: + +```bash +0x08c379a0 // Function selector for Error(string) +0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset +0x000000000000000000000000000000000000000000000000000000000000001a // String length +0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data +``` + +```bash title="Example of revert reason string for 'Not enough Ether provided' " +"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" +``` + +## Dapp support + +Client libraries, such as web3j, do not support extracting the revert reason from the transaction receipt. To extract the revert reason your dapp must interact directly with Besu using a custom JSON -> Object converter. + + + +[Solidity documentation]: https://docs.soliditylang.org/en/v0.8.12/control-structures.html#revert diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/upgrade.md b/versioned_docs/version-23.4.0/private-networks/how-to/upgrade.md new file mode 100644 index 00000000000..d84a03d13dd --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/upgrade.md @@ -0,0 +1,42 @@ +--- +title: Upgrade +description: Upgrading protocol versions +sidebar_position: 8 +--- + +# Network and protocol upgrades + +:::info + +Node upgrades upgrade your Besu client to a later version. In private networks, you can [upgrade your node](../../public-networks/how-to/upgrade-node.md) as in public networks. + +::: + +Network upgrades are the mechanism for upgrading the Ethereum protocol. Protocol upgrades occur during the network upgrades. + +For Ethereum Mainnet and public testnets, the milestone block definitions are included in Besu. Upgrading your Besu client applies the network upgrade. + +For private networks, all network participants must agree on the protocol upgrades and coordinate the network upgrades. The genesis file specifies the milestone block at which to apply the protocol upgrade. + +## Upgrade the protocol + +To upgrade the protocol in a private network: + +1. Review included EIPs for breaking changes. A [meta EIP](https://eips.ethereum.org/meta) for each protocol upgrade lists included EIPs. For example, [Istanbul](https://eips.ethereum.org/EIPS/eip-1679). +1. Network participants agree on the block number at which to upgrade. +1. For each node in the network: + 1. Add the [milestone block number](../../public-networks/reference/genesis-items.md#milestone-blocks) to the genesis file. + 1. Restart the node before reaching milestone block. + +:::caution + +To avoid a forked network, all network participants must update their genesis file to include the agreed on milestone block and restart their node before reaching the milestone block. + +::: + +:::tip + +- For compatibility with future protocol upgrades, don't hardcode any gas price assumptions. +- Implementing upgradeable contracts enables contracts to be upgraded if a protocol upgrade does include breaking changes. + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-permissioning/_category_.json b/versioned_docs/version-23.4.0/private-networks/how-to/use-permissioning/_category_.json new file mode 100644 index 00000000000..cbca3cfba02 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use permissioning", + "position": 5 +} diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-permissioning/local.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-permissioning/local.md new file mode 100644 index 00000000000..0c14692b286 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-permissioning/local.md @@ -0,0 +1,189 @@ +--- +title: Use local permissioning +sidebar_position: 1 +description: Hyperledger Besu local permissioning +--- + +# Use local permissioning + +[Local permissioning](../../concepts/permissioning/index.md#local) supports node and account allowlisting. + +## Node allowlisting + +You can allow access to specified nodes in the [permissions configuration file](#permissions-configuration-file). With node allowlisting enabled, communication is only between nodes in the allowlist. + +:::info + +Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option to enable domain name support. + +If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can connect to a container after being restarted, even if the IP address of the container changes. + +::: + +:::info Nodes allowlist in the permissions configuration file + +`nodes-allowlist=["enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.168.0.9:4567","enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.169.0.9:4568"]` + +::: + +Node allowlisting is at the node level. That is, each node in the network has a [permissions configuration file](#permissions-configuration-file) file in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +Local permissioning doesn't check that the node using the permissions configuration file is listed in the allowlist, it only checks that the remote end of the connection is in the allowlist. Use [onchain permissioning] if you need to check both ends of the connection. + +### Specify bootnodes in the allowlist + +The nodes permissions list must include the [bootnodes](../configure/bootnodes.md) or Hyperledger Besu doesn't start with node permissions enabled. + +If you start Besu with specified bootnodes and have node permissioning enabled: + +```bash +--bootnodes="enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305" +``` + +The `nodes-allowlist` in the [permissions configuration file](#permissions-configuration-file) must contain the specified bootnodes. + +:::tip + +If your node has two different IP addresses for ingress and egress (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. + +::: + +### Enable node allowlisting + +To enable node allowlisting, specify the [`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) option when starting Besu. + +The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +### Update the node allowlist + +To update the nodes allowlist while the node is running, use the following JSON-RPC API methods: + +- [perm_addNodesToAllowlist](../../reference/api/index.md#perm_addnodestoallowlist) +- [perm_removeNodesFromAllowlist](../../reference/api/index.md#perm_removenodesfromallowlist) + +You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly and then update the allowlist using the [`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) method. + +Updates to the permissions configuration file persist across node restarts. + +### View the node allowlist + +To view the nodes allowlist, use the [perm_getNodesAllowlist](../../reference/api/index.md#perm_getnodesallowlist) method. + +:::note + +Each node has a [permissions configuration file](#permissions-configuration-file), which means nodes can have different nodes allowlists. This means nodes might be participating in the network that are not on the allowlist of other nodes in the network. We recommend each node in the network has the same nodes allowlist. + +::: + +```bash Example of different node allowlists + +Node 1 Allowlist = [Node 2, Node 3] + +Node 2 Allowlist = [Node 3, Node 5] + +Node 5 is participating in the same network as Node 1 even though Node 1 does not have Node 5 +on their allowlist. +``` + +## Account allowlisting + +You can specify accounts in the accounts allowlist in the [permissions configuration file](#permissions-configuration-file). A node with account permissioning accepts transactions only from accounts in the accounts allowlist. + +:::info Accounts allowlist in the permissions configuration file + +`accounts-allowlist=["0x0000000000000000000000000000000000000009"]` + +::: + +Account allowlisting is at the node level. That is, each node in the network has a [permissions configuration file](#permissions-configuration-file) in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +:::caution Using account permissioning and privacy + +Account permissioning is incompatible with [random key signing](../use-privacy/sign-pmts.md) for [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md). + +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: + +Transaction validation against the accounts allowlist occurs at the following points: + +- Submitted by JSON-RPC API method [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) +- Received via propagation from another node +- Added to a block by a mining node + +After adding transactions to a block, the transactions are not validated against the allowlist when received by another node. That is, a node can synchronize and add blocks containing transactions from accounts that are not on the accounts allowlist of that node. + +The following diagram illustrates applying local and onchain permissioning rules. + +![Permissioning Flow](../../../assets/images/PermissioningFlow.png) + +```bash title="Example of different account allowlists" + +Node 1 Allowlist = [Account A, Account B] + +Node 2 Allowlist = [Account B, Account C] + +Mining Node Allowlist = [Account A, Account B] + +Account A submits a transaction on Node 1. Node 1 validates and propagates the transaction. The +Mining Node receives the transaction, validates it is from an account in the Mining Node +accounts allowlist, and includes the transaction in the block. Node 2 receives and adds +the block created by the Mining Node. + +Node 2 now has a transaction in the blockchain from Account A, which is not on the accounts +allowlist for Node 2. + +``` + +:::note + +Each node has a [permissions configuration file](#permissions-configuration-file) which means nodes in the network can have different accounts allowlists. This means a transaction can be successfully submitted by Node A from an account in the Node A allowlist but rejected by Node B to which it's propagated if the account is not in the Node B allowlist. We recommend each node in the network has the same accounts allowlist. + +::: + +### Enable account allowlisting + +To enable account allowlisting, specify the [`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled) option when starting Besu. + +The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +### Update the account allowlist + +To update the accounts allowlist when the node is running, use the JSON-RPC API methods: + +- [`perm_addAccountsToAllowlist`](../../reference/api/index.md#perm_addaccountstoallowlist) +- [`perm_removeAccountsFromAllowlist`](../../reference/api/index.md#perm_removeaccountsfromallowlist). + +You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly and use the [`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) method to update the allowlists. + +Updates to the permissions configuration file persist across node restarts. + +### View the account allowlist + +To view the accounts allowlist, use the [`perm_getAccountsAllowlist`](../../reference/api/index.md#perm_getaccountsallowlist) method. + +## Permissions configuration file + +The permissions configuration file contains the nodes and accounts allowlists. If the [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options are not specified, the name of the permissions configuration file must be [`permissions_config.toml`](#permissions-configuration-file) and must be in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +You can specify the accounts and nodes allowlists in the same file or in separate files for accounts and nodes. + +To specify a permissions configuration file (or separate files for accounts and nodes) in any location, use the [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options. + +:::note + +The [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options are not used when running Besu from the [Docker image](../../get-started/install/run-docker-image.md). Use a bind mount to [specify a permissions configuration file with Docker]. + +::: + +```toml title="Sample permissions configuration file" +accounts-allowlist=["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"] + +nodes-allowlist=["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305"] +``` + + + +[specify a permissions configuration file with Docker]: ../../get-started/install/run-docker-image.md +[support domain names]: ../../../public-networks/concepts/node-keys.md#domain-name-support +[onchain permissioning]: ../../concepts/permissioning/onchain.md diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-permissioning/onchain.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-permissioning/onchain.md new file mode 100644 index 00000000000..025312fa311 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-permissioning/onchain.md @@ -0,0 +1,58 @@ +--- +title: Use onchain permissioning +sidebar_position: 2 +description: Use onchain permissioning allowlists +--- + +# Use onchain permissioning + +This page contains some extra info if you're using [onchain permissioning](../../concepts/permissioning/onchain.md). + +:::tip + +If your node has two different IP addresses for ingress and egress (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. + +::: + +:::important + +Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option to enable domain name support. + +If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can connect to a container after being restarted, even if the IP address of the container changes. + +::: + +:::tip + +If you add a running node, the node does not attempt to reconnect to the bootnode and synchronize until peer discovery restarts. To add an allowlisted node as a peer without waiting for peer discovery to restart, use [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer). + +If you add the node to the allowlist before starting the node, using `admin_addPeer` is not required because peer discovery is run on node startup. + +::: + +:::tip + +If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) and search for messages containing `Node permissioning` to identify the issue. + +Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been correctly configured for all nodes with the externally accessible address. + +If you change your network configuration, you may need to update the node allowlist. + +::: + +## Specify the permissioning contract interface version + +Use the [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version) command line option to specify the version of the [permissioning contract interface](../../concepts/permissioning/onchain.md#permissioning-contracts). The default is 1. + +Specify the contract interface version that maps to the version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/) the contract interface implements. + +| | EEA Client Specification | Contract interface | +| :------ | :----------------------- | :----------------- | +| Version | 5 | 1 | +| Version | 6 | 2 | + +The permissioning contracts in the [`ConsenSys/permissioning-smart-contracts`](https://github.com/ConsenSys/permissioning-smart-contracts) repository implement the version 2 contract interface. + +[support domain names]: ../../../public-networks/concepts/node-keys.md#domain-name-support +[projects release page]: https://github.com/ConsenSys/permissioning-smart-contracts/releases/latest +[onchain permissioning tutorial]: ../../tutorials/permissioning/onchain.md diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/_category_.json b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/_category_.json new file mode 100644 index 00000000000..f2a1d4ca864 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use privacy", + "position": 4 +} diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/access-private-transactions.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/access-private-transactions.md new file mode 100644 index 00000000000..b08670cf2ab --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/access-private-transactions.md @@ -0,0 +1,31 @@ +--- +title: Access private and privacy marker transactions +description: Methods for accessing and managing private transactions and privacy groups in Hyperledger Besu +sidebar_position: 6 +--- + +# Access private and privacy marker transactions + +A Hyperledger Besu private transaction creates a [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) and the private transaction itself. + +## Transaction receipts + +With the transaction hash returned when submitting the private transaction, to get the transaction receipt for the: + +- Private transaction, use [`priv_getTransactionReceipt`](../../reference/api/index.md#priv_gettransactionreceipt). +- Privacy marker transaction, use [`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt). + +The transaction receipt includes a `status` indicating if the transaction failed (`0x0`), succeeded (`0x1`), or was invalid (`0x2`). + +:::note Private transaction failure example + +To deploy a private contract, you submit a transaction using [`eea_sendRawTransaction`](../send-transactions/private-transactions.md). If contract deployment fails because of insufficient gas, the privacy marker transaction receipt has a status of success and the private transaction receipt has a status of failure. + +::: + +## Transactions + +With the transaction hash returned when submitting the private transaction, to get the: + +- Private transaction, use [`priv_getPrivateTransaction`](../../reference/api/index.md#priv_getprivatetransaction). +- Privacy marker transaction, use [`eth_getTransactionByHash`](../../../public-networks/reference/api/index.md#eth_gettransactionbyhash). diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/besu-extended.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/besu-extended.md new file mode 100644 index 00000000000..993db42916e --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/besu-extended.md @@ -0,0 +1,38 @@ +--- +title: Use Besu-extended privacy +description: Hyperledger Besu-extended privacy +sidebar_position: 2 +--- + +# Use Besu-extended privacy + +Hyperledger Besu provides an extended implementation of privacy allowing you to [create a privacy group for a set of participants](../../concepts/privacy/privacy-groups.md). You must specify the privacy group ID when sending private transactions. + +To enable the [`PRIV` API methods](../../reference/api/index.md#priv-methods), use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. + +To create the privacy group containing the recipients of a private transaction, use [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup). + +To create an EEA-compliant private transaction, specify `privacyGroupId` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +## Privacy group type + +Privacy groups created using [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) have a `BESU` privacy group type when returned by [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", + "name": "Group B", + "description": "Description of Group B", + "type": "BESU", + "members": [ + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" + ] + } + ] +} +``` diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/eea-compliant.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/eea-compliant.md new file mode 100644 index 00000000000..f3968d131bd --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/eea-compliant.md @@ -0,0 +1,36 @@ +--- +title: Use EEA-compliant privacy +description: Hyperledger Besu JSON-RPC methods to use for EEA-compliant privacy +sidebar_position: 1 +--- + +# Use EEA-compliant privacy + +When using Hyperledger Besu [EEA-compliant privacy](../../concepts/privacy/privacy-groups.md), the group of nodes specified by `privateFrom` and `privateFor` form a privacy group, to which Tessera assigns a unique privacy group ID. + +To enable the [`EEA` API methods](../../reference/api/index.md#eea-methods), use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. + +To create an EEA-compliant private transaction, specify `privateFor` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +## Privacy group type + +Privacy groups created when specifying `privateFrom` and `privateFor` have a `LEGACY` privacy group type when returned by [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "68/Cq0mVjB8FbXDLE1tbDRAvD/srluIok137uFOaClM=", + "name": "legacy", + "description": "Privacy groups to support the creation of groups by privateFor and privateFrom", + "type": "LEGACY", + "members": [ + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=", + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=" + ] + } + ] +} +``` diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/flexible.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/flexible.md new file mode 100644 index 00000000000..6c759a36b47 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/flexible.md @@ -0,0 +1,60 @@ +--- +title: Use flexible privacy groups +description: Use flexible privacy groups +sidebar_position: 5 +--- + +# Use flexible privacy groups + +Use the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) to create and update membership of [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). + +:::tip + +Because group membership for flexible privacy groups is stored in a smart contract, flexible privacy groups are also known as onchain privacy groups. + +::: + +:::info + +[Flexible privacy groups](../../concepts/privacy/flexible-privacy.md) are an early access feature. Don't use in production networks. + +The flexible privacy group interfaces may change between releases. There might not be an upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy group functionality in future versions. + +We don't recommend creating flexible privacy groups in a chain with existing [offchain privacy groups](../../concepts/privacy/privacy-groups.md). + +::: + +## Enable flexible privacy groups + +Use the [`--privacy-flexible-groups-enabled`](../../reference/cli/options.md#privacy-flexible-groups-enabled) command line option to enable [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). When flexible privacy groups are enabled, the [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup), [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup), and [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) methods for [offchain privacy groups](../../concepts/privacy/privacy-groups.md) are disabled. + +## Simple flexible privacy group example + +To create and find a [flexible privacy group](../../concepts/privacy/flexible-privacy.md) using the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum): + +1. Update the `example/keys.js` file to match your network configuration. + +1. Run: + + ```bash + cd example/onchainPrivacy + node simpleExample.js + ``` + + This script creates the flexible privacy group with two members. `findPrivacyGroup` finds and displays the created privacy group. + +:::tip + +The Tessera logs for Tessera 1 and Tessera 2 display `PrivacyGroupNotFound` errors. This is expected behavior because private transactions check offchain and onchain to find the privacy group for a private transaction. + +::: + +## Add and remove members + +To add and remove members from a [flexible privacy group](../../concepts/privacy/flexible-privacy.md), use the `addTo` and `removeFrom` methods in the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) client library. + +:::note + +When adding a member, Besu pushes all existing group transactions to the new member and processes them. If there are a large number of existing transactions, adding the member may take some time. + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/performance-best-practices.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/performance-best-practices.md new file mode 100644 index 00000000000..50f730f606b --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/performance-best-practices.md @@ -0,0 +1,59 @@ +--- +title: Performance best practices +description: Performance best practices +sidebar_position: 10 +--- + +# Performance best practices + +This document collects deployment and usage tips to help you achieve high performance for private transactions. If transaction throughput or latency is not meeting your expectations, please consider the following before raising an issue. + +## General performance + +Private transactions use the same facilities as public ones. General Besu performance tunings apply. Specific approaches are out of scope of this document, except for the following, which strongly impacts performance: + +### Use fast, local, solid state storage + +Running EVM transactions creates a lot of random reads that are executed sequentially. The Besu data folder for high throughput nodes should be located on the fastest possible storage media. + +- Prefer [NVMe](https://cloud.google.com/compute/docs/disks/local-ssd#performance) attached SLC flash or Intel Optane. +- Avoid network attached SSDs or cloud storage with limited input/output operations per second. +- Do not use spinning disks under any circumstances. + +## Private transaction performance + +### Use concurrent submission + +When submitting a private transaction using [web3js-quorum](https://github.com/ConsenSys/web3js-quorum), the submit call will only return once the privacy marker transaction has been included in a block. This limits the throughput to at most one private transaction per block when submitting from a single thread. To increase throughput, use web3js-quorum from multiple concurrent threads or processes. + +### Co-locate Besu and Tessera + +Besu has to talk to its local Tessera node frequently while handling a block. While we do not recommend running them on the same node, minimizing the latency between Besu and Tessera will improve block processing times. Besu and Tessera should not be hosted in geographically distributed locations. + +### Optimize worst-case latency between Tessera nodes + +When distributing a new private transaction between Tessera nodes, the overall throughput is determined by the slowest Tessera nodes. Try to minimize network latency between Tessera nodes and do not mix different machine types when hosting Tessera. + +### Use stateful nonce management + +Management of public and private nonces in web3js-quorum is stateless: before a transaction is sent, web3js-quorum has to query for those nonces. This is increasing latency, the node's load, and is a source of fragility due to nonce collision when multiple senders try to use the same account concurrently. + +For performance and reliability it is advantageous to manage nonces in a stateful manner on the client side instead of querying them for every transaction. If custom code for this is not an option, [Orchestrate](https://consensys.net/codefi/orchestrate/) can be used. + +### Use random senders for privacy marker transactions + +To avoid public nonce management, privacy marker transactions can be sent using a [random account per transaction](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#privacy-marker-transaction-signing-key-file). This option is only available for zero gas networks. + +### Avoid queuing transactions in Tessera + +When Tessera is overloaded with transactions, the performance breaks down catastrophically due to unbounded growth of the request queue. Avoid sending more transactions to Tessera than it can handle. Sudden jumps in submission latency and submission failure rate should be answered with a load reduction on the client side, for example using a back-off scheme. + +Please note that this is not Tessera specific but a general issue in distributed systems. It just happens that if queueing discipline is not maintained, Tessera tends to be the first component to fail. + +### Limit the group size to reduce communication overhead + +Smaller groups need fewer communication for transaction propagation. If reducing the number of Tessera nodes involved in a transaction is an option, it will lead to slightly better tail latencies. Multi-tenancy Tessera can be used to have large groups with a small number of Tessera nodes (possibly only one). + +### Limit group membership changes and make them quick + +Groups are locked (prevented from executing transactions) during membership changes. Try to minimize the number of times the membership changes. When possible, spread load across multiple groups to always have some groups available while others are locked. Consider batching group membership changes if possible. Note however that this does not work with the default management contract, yet. diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/privacy-groups.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/privacy-groups.md new file mode 100644 index 00000000000..727a192f6e2 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/privacy-groups.md @@ -0,0 +1,19 @@ +--- +title: Create and manage privacy groups +description: Create and manage privacy groups with Hyperledger Besu +sidebar_position: 4 +--- + +# Create and manage privacy groups + +Hyperledger Besu-extended privacy provides JSON-RPC API methods for creating and managing privacy groups: + +- [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) +- [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) +- [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). + +:::tip + +You can find and delete [EEA-compliant privacy groups](../../concepts/privacy/privacy-groups.md) using [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) and [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/sign-pmts.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/sign-pmts.md new file mode 100644 index 00000000000..02eb75fea4d --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/sign-pmts.md @@ -0,0 +1,37 @@ +--- +title: Sign privacy marker transactions +description: How to sign a privacy marker transaction with Hyperledger Besu +sidebar_position: 7 +--- + +# Sign privacy marker transactions + +You can sign privacy marker transactions (PMTs) with either a random key or a specified key. To sign privacy marker transactions with a specified private key, use [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) when starting Hyperledger Besu. + +:::note + +The private key file can be the same file used by [`--node-private-key-file`](#node-private-key-file), or a different key file to identify who signed the privacy marker transaction. + +::: + +In networks where you pay gas, you must specify a key and the associated account must contain adequate funds. + +In [free gas networks](../configure/free-gas.md), to provide further anonymity by signing each privacy marker transaction with a different random key, exclude the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option when starting Besu. + +:::caution "Using account permissioning and privacy" + +You can't use [account permissioning] with random key signing. + +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: + +:::note + +Besu signs privacy marker transactions during the [private transaction process](../../concepts/privacy/private-transactions/processing.md). + +::: + + + +[account permissioning]: ../../concepts/permissioning/index.md#account-permissioning diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/tessera.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/tessera.md new file mode 100644 index 00000000000..fa2e10ca5cf --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/tessera.md @@ -0,0 +1,39 @@ +--- +title: Run Tessera with Besu +description: Running ConsenSys Quorum Tessera with Hyperledger Besu +sidebar_position: 3 +--- + +# Run Tessera with Besu + +To enable [privacy functionality](../../concepts/privacy/index.md) in production systems, [Tessera](https://docs.tessera.consensys.net/) must be [highly available](#high-availability) and [run in a separate instance](#separate-instances) to Hyperledger Besu. + +![Besu-Tessera-High-Availability](../../../assets/images/Besu-Tessera-High-Availability.png) + +:::note + +You can also configure Besu for high availability using load balancers. + +::: + +## High availability + +Privacy requires you to [configure Tessera for high availability]. Besu also requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode) to be enabled in Tessera. + +To successfully distribute a private transaction, all private transaction participants must be online. If any participants are offline when submitting the private transaction, the transaction is not attempted and you need to resubmit the transaction. + +If a Tessera node is unavailable when Besu attempts to process a privacy marker transaction, the Besu node stops processing all new blocks until Tessera is available. The Besu node continually attempts to process the privacy marker transaction until Tessera is available again. + +:::caution + +If Tessera becomes available but has lost data, Besu resumes processing blocks and the private states in the Besu nodes might become inconsistent. + +::: + +## Separate instances + +For production systems, we recommend running Besu and Tessera in separate instances. If running Besu and Tessera in the same instance, restrict the amount of memory used by each JVM to ensure each has enough memory. + + + +[configure Tessera for high availability]: https://consensys.net/docs/goquorum//en/stable/configure-and-manage/configure/high-availability/ diff --git a/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/web3js-quorum.md b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/web3js-quorum.md new file mode 100644 index 00000000000..756cf0bbafc --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/how-to/use-privacy/web3js-quorum.md @@ -0,0 +1,84 @@ +--- +title: Use the web3js-quorum library +description: web3js-quorum client library +sidebar_position: 9 +--- + +# Use the web3js-quorum client library + +[web3js-quorum](https://github.com/ConsenSys/web3js-quorum) is an Ethereum JavaScript library extending [web3.js](https://github.com/ethereum/web3.js/) that adds support for Besu-specific JSON-RPC APIs and features. Use the library to create and send RLP-encoded transactions using JSON-RPC. + +!!! important web3js-quorum supports JSON-RPC over HTTP only. + +:::note + +web3js-quorum includes all [quorum.js](https://github.com/ConsenSys/quorum.js) and [web3js-eea](https://github.com/ConsenSys/web3js-eea) features. + +If migrating to web3js-quorum, update your JavaScript code as indicated in the following examples. + +[Read the migration guide for more information about updating your code.](https://consensys.github.io/web3js-quorum/latest/tutorial-Migrate%20from%20web3js-eea.html) + +::: + +## Prerequisites + +- [Node.js (version > 10)](https://nodejs.org/en/download/) +- [The web3 library must be installed in your project](https://github.com/ChainSafe/web3.js#installation) + +## Add web3js-quorum to project + +```bash +npm install web3js-quorum +``` + +## Initialize the web3js-quorum client + +Initialize your client where: + +- `` is the JSON-RPC HTTP endpoint of your Hyperledger Besu node. Specified by the [`--rpc-http-host`](../../../public-networks/reference/cli/options.md#rpc-http-host) and [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) command line options. + + + +# Syntax + +```js +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); +const web3 = new Web3Quorum(new Web3("")); +``` + +# Example + +```js +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); +const web3 = new Web3Quorum(new Web3("http://localhost:8545")); +``` + + + +:::note + +When migrating from web3js-eea to web3js-quorum, use `Web3Quorum`. The constructor doesn't require the chain ID anymore. Chain ID is automatically retrieved from the chain using the specified JSON-RPC HTTP endpoint. + +::: + +## Deploy a contract with `generateAndSendRawTransaction` + +To deploy a private contract, you need the contract binary. You can use [Solidity](https://solidity.readthedocs.io/en/develop/using-the-compiler.html) to get the contract binary. + +```js title="Deploying a contract with 'web3.priv.generateAndSendRawTransaction'" +const contractOptions = { + data: `0x123`, // contract binary + privateFrom: "tesseraNode1PublicKey", + privateFor: ["tesseraNode3PublicKey"], + privateKey: "besuNode1PrivateKey", +}; +return web3.priv.generateAndSendRawTransaction(contractOptions); +``` + +`web3.priv.generateAndSendRawTransaction(contractOptions)` returns the transaction hash. To get the private transaction receipt, use `web3.priv.waitForTransactionReceipt(txHash)`. + +## web3js-quorum methods + +For more information about the web3js-quorum methods, see the [web3js-quorum reference documentation](https://consensys.github.io/web3js-quorum/latest/index.html). diff --git a/versioned_docs/version-23.4.0/private-networks/index.md b/versioned_docs/version-23.4.0/private-networks/index.md new file mode 100644 index 00000000000..18016190851 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/index.md @@ -0,0 +1,26 @@ +--- +title: Private networks +sidebar_position: 1 +id: index +description: Private networks overview +--- + +# Hyperledger Besu for private networks + +You can use Besu to develop enterprise applications requiring secure, high-performance transaction processing in a private network. + +A private network is a network not connected to Ethereum Mainnet or an Ethereum testnet. Private networks typically use a different [chain ID](../public-networks/concepts/network-and-chain-id.md) and proof of authority consensus ([QBFT](how-to/configure/consensus/qbft.md), [IBFT 2.0](how-to/configure/consensus/ibft.md), or [Clique](how-to/configure/consensus/clique.md)). + +You can also [create a local development network](tutorials/ethash.md) using proof of work (Ethash). + +Besu supports enterprise features including [privacy](concepts/privacy/index.md) and [permissioning](concepts/permissioning/index.md). + +Get started with the [Developer Quickstart](tutorials/quickstart.md) to rapidly generate local blockchain networks. + +## Architecture + +The following diagram outlines the high-level architecture of Besu for private networks. + +![Private architecture](../assets/images/private-architecture.jpeg) + +If you have any questions about Besu for private networks, contact us on the [Besu channel on Hyperledger Discord](https://discord.gg/hyperledger). diff --git a/versioned_docs/version-23.4.0/private-networks/reference/_category_.json b/versioned_docs/version-23.4.0/private-networks/reference/_category_.json new file mode 100644 index 00000000000..3ce2f2b757b --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Reference", + "position": 6 +} diff --git a/versioned_docs/version-23.4.0/private-networks/reference/accounts-for-testing.md b/versioned_docs/version-23.4.0/private-networks/reference/accounts-for-testing.md new file mode 100644 index 00000000000..3bca42c1487 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/accounts-for-testing.md @@ -0,0 +1,25 @@ +--- +title: Accounts for testing +sidebar_position: 3 +description: Ethereum accounts used for Hyperledger Besu testing only on private networks +--- + +import TestAccounts from '../../global/test_accounts.md'; + +# Accounts for testing + +You can use existing accounts for testing by including them in the genesis file for a private network. Hyperledger Besu also provides predefined accounts for use in development mode. + +## Development mode + +When you start Besu with the [`--network=dev`](../../public-networks/reference/cli/options.md#network) command line option, Besu uses the `dev.json` genesis file by default. + +The `dev.json` genesis file defines the following accounts used for testing. + + + +## Genesis file + +To use existing test accounts, specify the accounts and balances in a genesis file for your test network. For an example of how to define accounts in the genesis file, see [`dev.json`](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/config/src/main/resources/dev.json). + +To start Besu with the genesis file defining the existing accounts, use the [`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) command line option . diff --git a/versioned_docs/version-23.4.0/private-networks/reference/api/_category_.json b/versioned_docs/version-23.4.0/private-networks/reference/api/_category_.json new file mode 100644 index 00000000000..777d7bb818f --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu API", + "position": 2 +} diff --git a/versioned_docs/version-23.4.0/private-networks/reference/api/index.md b/versioned_docs/version-23.4.0/private-networks/reference/api/index.md new file mode 100644 index 00000000000..8a32571b8be --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/api/index.md @@ -0,0 +1,2155 @@ +--- +description: Hyperledger Besu private network JSON-RPC API methods reference +--- + +# Private network API methods + +:::warning + +- This reference contains API methods that apply to only private networks. For API methods that apply to both private and public networks, see the [public network API reference](../../../public-networks/reference/api/index.md). +- All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If using the [--rpc-http-host](../../../public-networks/reference/cli/options.md#rpc-http-host) or [--rpc-http-port](../../../public-networks/reference/cli/options.md#rpc-http-port) options, update the endpoint. + +::: + +## `CLIQUE` methods + +The `CLIQUE` API methods provide access to the [Clique](../../how-to/configure/consensus/clique.md) consensus engine. + +:::note + +The `CLIQUE` API methods are not enabled by default for JSON-RPC. To enable the `CLIQUE` API methods use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `clique_discard` + +Discards a proposal to [add or remove a signer with the specified address]. + +#### Parameters + +`address`: _string_ - 20-byte address of proposed signer + +#### Returns + +`result`: _boolean_ - indicates if the proposal is discarded + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `clique_getSigners` + +Lists [signers for the specified block]. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _string_ - list of 20-byte addresses of signers + + + +# curl HTTP request + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' http://127.0.0.1:8545 + ``` + +# wscat WS request + + ```bash + {"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1} + ``` + +# JSON result + + ```json + { + "jsonrpc" : "2.0", + "id" : 1, + "result" : [ "0x42eb768f2244c8811c63729a21a3569731535f06", "0x7ffc57839b00206d1ad20c69a1981b489f772031", "0xb279182d99e65703f0076e4812653aab85fca0f0" ] + } + ``` + + + +### `clique_getSignerMetrics` + +Provides the following validator metrics for the specified range: + +- Number of blocks from each validator + +- Block number of the last block proposed by each validator (if any proposed in the specified range) + +- All validators present in the last block + +#### Parameters + +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +If you specify: + +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. + +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. + +#### Returns + +`result`: _array_ of _objects_ - list of validator objects + +:::note + +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + + +### `clique_getSignersAtHash` + +Lists signers for the specified block. + +#### Parameters + +`hash`: _string_ - 32-byte block hash + +#### Returns + +`result`: _array_ of _string_ - list of 20-byte addresses of signers + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42eb768f2244c8811c63729a21a3569731535f06", + "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "0xb279182d99e65703f0076e4812653aab85fca0f0" + ] +} +``` + + + +### `clique_proposals` + +Returns [current proposals](../../how-to/configure/consensus/clique.md#add-and-remove-signers). + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the proposal for each account (if `true`, the proposal is to add a signer; if `false`, the proposal is to remove a signer.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0x42eb768f2244c8811c63729a21a3569731535f07": false, + "0x12eb759f2222d7711c63729a45c3585731521d01": true + } +} +``` + + + +### `clique_propose` + +Proposes to [add or remove a signer with the specified address]. + +#### Parameters + +- `address`: _string_ - 20-byte address + +- `proposal`: _boolean_ - `true` to propose adding signer or `false` to propose removing signer + +#### Returns + +`result`: _boolean_ - `true` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `EEA` methods + +The `EEA` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and [privacy groups](../../concepts/privacy/privacy-groups.md). + +:::note + +The `EEA` API methods are not enabled by default for JSON-RPC. To enable the `EEA` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `eea_sendRawTransaction` + +Distributes the [private transaction](../../how-to/send-transactions/private-transactions.md), generates the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) and submits it to the transaction pool, and returns the transaction hash of the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md). + +The signed transaction passed as an input parameter includes the `privateFrom`, [`privateFor` or `privacyGroupId`](../../how-to/send-transactions/private-transactions.md#eea-compliant-or-besu-extended-privacy), and `restriction` fields. + +The `gas` and `gasPrice` are used by the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) not the private transaction itself. + +To avoid exposing your private key, create signed transactions offline and send the signed transaction data using `eea_sendRawTransaction`. + +:::important + +For production systems requiring private transactions, use a network with a consensus mechanism supporting transaction finality to make sure the private state does not become inconsistent with the chain. For example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md) and [QBFT](../../how-to/configure/consensus/qbft.md) provide the required finality. + +Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md#pruning) or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. + +Besu doesn't implement [`eea_sendTransaction`](../../how-to/send-transactions/private-transactions.md). + +[EthSigner](https://docs.ethsigner.consensys.net/en/latest/) provides transaction signing and implements [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +::: + +#### Parameters + +`transaction`: _string_ - signed RLP-encoded private transaction + +#### Returns + +`result`: _string_ - 32-byte transaction hash of the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) + +:::tip + +If creating a contract, use [priv_getTransactionReceipt](#priv_gettransactionreceipt) to retrieve the contract address after the transaction is finalized. + +::: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} +``` + +# JSON result + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + + + +## `IBFT` 2.0 methods + +The `IBFT` API methods provide access to the [IBFT 2.0](../../how-to/configure/consensus/ibft.md) consensus engine. + +:::note + +The `IBFT` API methods are not enabled by default for JSON-RPC. To enable the `IBFT` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `ibft_discardValidatorVote` + +Discards a proposal to [add or remove a validator] with the specified address. + +#### Parameters + +`address`: _string_ - 20-byte address of proposed validator + +#### Returns + +`result`: _boolean_ - indicates if the proposal is discarded + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `ibft_getPendingVotes` + +Returns [votes](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) cast in the current [epoch](../../how-to/configure/consensus/ibft.md#genesis-file). + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to remove a validator. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, + "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true + } +} +``` + + + +### `ibft_getSignerMetrics` + +Provides the following validator metrics for the specified range: + +- Number of blocks from each validator + +- Block number of the last block proposed by each validator (if any proposed in the specified range) + +- All validators present in the last block of the range + +#### Parameters + +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest` as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +If you specify: + +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. + +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. + +#### Returns + +`result`: _array_ of _objects_ - list of validator objects + +:::note + +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + + +### `ibft_getValidatorsByBlockHash` + +Lists the validators defined in the specified block. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `ibft_getValidatorsByBlockNumber` + +Lists the validators defined in the specified block. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `ibft_proposeValidatorVote` + +Proposes to [add or remove a validator] with the specified address. + +#### Parameters + +- `address`: _string_ - account address + +- `proposal`: _boolean_ - `true` to propose adding validator or `false` to propose removing validator + +#### Returns + +`result`: _boolean_ - `true` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `PERM` (Permissioning) methods + +The `PERM` API methods provide permissioning functionality. Use these methods for [local permissioning](../../how-to/use-permissioning/local.md) only. + +:::important + +The `PERM` API methods are not enabled by default for JSON-RPC. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) CLI options. + +::: + +### `perm_addAccountsToAllowlist` + +Adds accounts (participants) to the [accounts permission list](../../how-to/use-permissioning/local.md#account-permissioning). + +#### Parameters + +`addresses`: _array_ of _strings_ - list of account addresses + +:::note + +The parameters list contains a list which is why the account addresses are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error` (errors include attempting to add accounts already on the allowlist and including invalid account addresses.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_addNodesToAllowlist` + +Adds nodes to the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +To use domain names in enode URLs, ensure you [enable DNS support](../../../public-networks/concepts/node-keys.md#domain-name-support) to avoid receiving a `request contains an invalid node` error. + +:::warning + +Enode URL domain name support is an early access feature. + +::: + +#### Parameters + +`enodes`: _array_ of _strings_ - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) + +:::note + +The parameters list contains a list which is why the enode URLs are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error`; errors include attempting to add nodes already on the allowlist or including invalid enode URLs. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_getAccountsAllowlist` + +Lists accounts (participants) in the [accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - list of accounts (participants) in the accounts allowlist + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x0000000000000000000000000000000000000009", + "0xb9b81ee349c3807e46bc71aa2632203c5b462033" + ] +} +``` + + + +### `perm_getNodesAllowlist` + +Lists nodes in the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) of nodes in the nodes allowlist + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305", + "enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304" + ] +} +``` + + + +### `perm_reloadPermissionsFromFile` + +Reloads the accounts and nodes allowlists from the [permissions configuration file]. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - `Success`, or `error` if the permissions configuration file is not valid + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_removeAccountsFromAllowlist` + +Removes accounts (participants) from the [accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). + +#### Parameters + +`addresses`: _array_ of _strings_ - list of account addresses + +:::note + +The parameters list contains a list which is why the account addresses are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error` (errors include attempting to remove accounts not on the allowlist and including invalid account addresses.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_removeNodesFromAllowlist` + +Removes nodes from the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +#### Parameters + +`enodes`: _array_ of _strings_ - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) + +:::note + +The parameters list contains a list which is why the enode URLs are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error` (errors include attempting to remove nodes not on the allowlist and including invalid enode URLs.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +## `PRIV` methods + +The `PRIV` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and [privacy groups](../../concepts/privacy/privacy-groups.md). + +:::note + +The `PRIV` API methods are not enabled by default for JSON-RPC. To enable the `PRIV` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `priv_call` + +Invokes a private contract function locally and does not change the privacy group state. + +For private contracts, `priv_call` is the same as [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) for public contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `call`: _object_ - [transaction call object](../../../public-networks/reference/api/objects.md#transaction-call-object) + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _data_ - return value of the executed contract + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x0000000000000000000000000000000000000000000000000000000000000001" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```bash +{ + block { + number + call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { + data + status + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17449, + "call": { + "data": "0x", + "status": 1 + } + } + } +} +``` + + + +### `priv_createPrivacyGroup` + +Creates a group of nodes, specified by their [Tessera](https://docs.tessera.consensys.net/) public key. + +#### Parameters + +`options`: _object_ - request options object with the following fields: + +- `addresses`: _array_ of _strings_ - list of nodes specified by [Tessera](https://docs.tessera.consensys.net/) public keys + +- `name`: _string_ - (optional) privacy group name + +- `description`: _string_ - (optional) privacy group description + +#### Returns + +`result`: _string_ - privacy group ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" +} +``` + + + +### `priv_debugGetStateRoot` + +Returns the state root of the specified privacy group at the specified block. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - 32-byte state root + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" +} +``` + + + +### `priv_deletePrivacyGroup` + +Deletes the specified privacy group. + +#### Parameters + +`privacyGroupId`: _string_ - privacy group ID + +#### Returns + +`result`: _string_ - deleted privacy group ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" +} +``` + + + +### `priv_distributeRawTransaction` + +Distributes a signed, RLP encoded [private transaction](../../how-to/send-transactions/private-transactions.md). + +:::tip + +If you want to sign the [privacy marker transaction](../../how-to/use-privacy/sign-pmts.md) outside of Besu, use [`priv_distributeRawTransaction`](../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction). + +::: + +#### Parameters + +`transaction`: _string_ - signed RLP-encoded private transaction + +#### Returns + +`result`: _string_ - 32-byte enclave key (the enclave key is a pointer to the private transaction in [Tessera](https://docs.tessera.consensys.net/).) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" +} +``` + + + +### `priv_findPrivacyGroup` + +Returns a list of privacy groups containing only the listed members. For example, if the listed members are A and B, a privacy group containing A, B, and C is not returned. + +#### Parameters + +`members`: _array_ of _strings_ - members specified by [Tessera](https://docs.tessera.consensys.net/) public keys + +#### Returns + +`result`: _array_ of _objects_ - privacy group objects containing only the specified members; privacy groups are [EEA-compliant](../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy) or [Besu-extended](../../concepts/privacy/privacy-groups.md#besu-extended-privacy) with types: + +- `LEGACY` for EEA-compliant groups. + +- `PANTHEON` for Besu-extended groups. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", + "name": "Group B", + "description": "Description of Group B", + "type": "PANTHEON", + "members": [ + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" + ] + } + ] +} +``` + + + +### `priv_getCode` + +Returns the code of the private smart contract at the specified address. Compiled smart contract code is stored as a hexadecimal value. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `address`: _string_ - 20-byte contract address + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _data_ - code stored at the specified address + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" +} +``` + + + +### `priv_getEeaTransactionCount` + +Returns the private transaction count for the specified account and [group of sender and recipients]. + +!!! important + + If sending more than one transaction to be mined in the same block (that is, you are not + waiting for the transaction receipt), you must calculate the private transaction nonce outside + Besu instead of using `priv_getEeaTransactionCount`. + +#### Parameters + +- `address`: _string_ - account address + +- `sender`: _string_ - base64-encoded Tessera address of the sender + +- `recipients`: _array_ of _strings_ - base64-encoded Tessera addresses of recipients + +#### Returns + +`result`: _string_ - integer representing the number of private transactions sent from the address to the specified group of sender and recipients + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + + + +### `priv_getFilterChanges` + +Polls the specified filter for a private contract and returns an array of changes that have occurred since the last poll. + +Filters for private contracts can only be created by [`priv_newFilter`](#priv_newfilter) so unlike [`eth_getFilterChanges`](../../../public-networks/reference/api/index.md#eth_getfilterchanges), `priv_getFilterChanges` always returns an array of log objects or an empty list. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object), or an empty list if nothing has changed since the last poll + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d0", + "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", + "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + + +### `priv_getFilterLogs` + +Returns an array of [logs](../../../public-networks/concepts/events-and-logs.md) for the specified filter for a private contract. + +For private contracts, `priv_getFilterLogs` is the same as [`eth_getFilterLogs`](../../../public-networks/reference/api/index.md#eth_getfilterlogs) for public contracts except there's no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) for private contracts. + +:::note + +`priv_getFilterLogs` is only used for filters created with [`priv_newFilter`](#priv_newfilter). To specify a filter object and get logs without creating a filter, use [`priv_getLogs`](#priv_getlogs). + +::: + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x493", + "blockHash": "0xd9cb3a852e1e02c95f035a2e32d57f82c10cab61faa3e8f5c010adf979bb4786", + "transactionHash": "0x78866dc51fdf189d8cca74f6a8fe54f172348fbd2163bbe80fa8b106cfc7deb4", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d0", + "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", + "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + + +### `priv_getLogs` + +Returns an array of [logs](../../../public-networks/concepts/events-and-logs.md) matching a specified filter object. + +For private contracts, `priv_getLogs` is the same as [`eth_getLogs`](../../../public-networks/reference/api/index.md#eth_getlogs) for public contracts except there is no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) for private contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterOptions`: _object_ - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x342", + "blockHash": "0xf5954f068fa2f2f7741281e8c753a8e92047e27ab3c4971836d2c89fab86d92b", + "transactionHash": "0xa9ba5cffde9d4ad8997c5c4352d5d49eeea0e9def8a4ea69991b8837c49d4e4f", + "transactionIndex": "0x0", + "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x383", + "blockHash": "0x91b73a47d53e3a88d62ed091a89a4be7557ad91b552e7ff7d86bf78977d5d45d", + "transactionHash": "0xc2a185faf00e87434e55b7f70cc4c38be354c2128b4b96b5f5def0b54a2173ec", + "transactionIndex": "0x0", + "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + + +### `priv_getPrivacyPrecompileAddress` + +Returns the address of the [privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md). The address is derived and based on the value of the [`privacy-flexible-groups-enabled`](../cli/options.md#privacy-flexible-groups-enabled) option. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - address of the privacy precompile + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x000000000000000000000000000000000000007e" +} +``` + + + +### `priv_getPrivateTransaction` + +Returns the private transaction if you are a participant, otherwise, `null`. + +#### Parameters + +`transaction`: _string_ - transaction hash returned by [`eea_sendRawTransaction`](#eea_sendrawtransaction) or [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +#### Returns + +`result`: _object_ - [private transaction object](objects.md#private-transaction-object), or `null` if not a participant in the private transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x2dc6c0", + "gasPrice": "0x0", + "hash": "0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498", + "input": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610221806100606000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f2451461005c5780636057361d1461008757806367e404ce146100b4575b600080fd5b34801561006857600080fd5b5061007161010b565b6040518082815260200191505060405180910390f35b34801561009357600080fd5b506100b260048036038101908080359060200190929190505050610115565b005b3480156100c057600080fd5b506100c96101cb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600254905090565b7fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f53382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18060028190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050905600a165627a7a723058208efaf938851fb2d235f8bf9a9685f149129a30fe0f4b20a6c1885dc02f639eba0029", + "nonce": "0x0", + "to": null, + "value": "0x0", + "v": "0xfe8", + "r": "0x654a6a9663ca70bb13e27cca14b3777cc92da184e19a151cdeef2ccbbd5c6405", + "s": "0x5dd4667b020c8a5af7ae28d4c3126f8dcb1187f49dcf0de9d7a39b1651892eef", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privateFor": ["g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="], + "restriction": "restricted" + } +} +``` + + + +### `priv_getTransactionCount` + +Returns the private transaction count for specified account and privacy group. + +:::important + +If sending more than one transaction to be mined in the same block (that is, you are not waiting for the transaction receipt), you must calculate the private transaction nonce outside Besu instead of using `priv_getTransactionCount`. + +::: + +#### Parameters + +- `address`: _string_ - account address + +- `privacyGroupId`: _string_ - privacy group ID + +#### Returns + +`result`: _string_ - integer representing the number of private transactions sent from the address to the specified privacy group + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + + + +### `priv_getTransactionReceipt` + +Returns information about the private transaction after mining the transaction. Receipts for pending transactions are not available. + +#### Parameters + +`transaction`: _string_ - 32-byte hash of a transaction + +#### Returns + +`result`: _object_ - [private Transaction receipt object](objects.md#private-transaction-receipt-object), or `null` if no receipt found + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": "0x493b76031593402e24e16faa81f677b58e2d53f3", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "logs": [], + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0x36219e92b5f53d4150aa9ef7d2d793118cced523de6724100da5b534e3ceb4b8", + "transactionIndex": "0x0", + "output": "0x6080604052600436106049576000357c010000000000000000000000000000000000000000000 + 0000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b3480156059 + 57600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b + 50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b8060008190555050560 + 0a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "commitmentHash": "0x79b9e6b0856db398ad7dc208f15b1d38c0c0b0c5f99e4a443a2c5a85510e96a5", + "status": "0x1", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privacyGroupId": "cD636RZlcqVSpoxT/ExbkWQfBO7kPAZO0QlWHErNSL8=", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } +} +``` + + + +### `priv_newFilter` + +Creates a [log filter](../../../public-networks/concepts/events-and-logs.md) for a private contract. To poll for logs associated with the created filter, use [`priv_getFilterChanges`](#priv_getfilterchanges). To get all logs associated with the filter, use [`priv_getFilterLogs`](#priv_getfilterlogs). + +For private contracts, `priv_newFilter` is the same as [`eth_newFilter`](../../../public-networks/reference/api/index.md#eth_newfilter) for public contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterOptions`: _object_ - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) + +:::note + +`fromBlock` and `toBlock` in the filter options object default to `latest`. + +::: + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4a35b92809d73f4f53a2355d62125442" +} +``` + + + +### `priv_uninstallFilter` + +Uninstalls a filter for a private contract with the specified ID. When a filter is no longer required, call this method. + +Filters time out when not requested by [`priv_getFilterChanges`](#priv_getfilterchanges) or [`priv_getFilterLogs`](#priv_getfilterlogs) for 10 minutes. + +For private contracts, `priv_uninstallFilter` is the same as [`eth_uninstallFilter`](../../../public-networks/reference/api/index.md#eth_uninstallfilter) for public contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy group ID](../../concepts/privacy/privacy-groups.md) + +- `filterId`: _string_ - filter ID + +#### Returns + +`result`: _boolean_ - indicates if the filter is successfully uninstalled + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `QBFT` methods + +The `QBFT` API methods provide access to the [QBFT](../../how-to/configure/consensus/qbft.md) consensus engine. + +:::note + +The `QBFT` API methods are not enabled by default for JSON-RPC. To enable the `QBFT` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `qbft_discardValidatorVote` + +Discards a proposal to [add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with the specified address. + +#### Parameters + +`address`: _string_ - 20-byte address of proposed validator + +#### Returns + +`result`: _boolean_ - indicates if the proposal is discarded + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `qbft_getPendingVotes` + +Returns [votes](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) cast in the current [epoch](../../how-to/configure/consensus/qbft.md#genesis-file). + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to remove a validator. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, + "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true + } +} +``` + + + +### `qbft_getSignerMetrics` + +Provides the following validator metrics for the specified range: + +- Number of blocks from each validator + +- Block number of the last block proposed by each validator (if any proposed in the specified range) + +- All validators present in the last block of the range + +#### Parameters + +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest` as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +If you specify: + +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. + +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. + +#### Returns + +`result`: _array_ of _objects_ - list of validator objects + +:::note + +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + + +### `qbft_getValidatorsByBlockHash` + +Lists the validators defined in the specified block. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `qbft_getValidatorsByBlockNumber` + +Lists the validators defined in the specified block. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `qbft_proposeValidatorVote` + +Proposes to [add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with the specified address. + +#### Parameters + +- `address`: _string_ - account address + +- `proposal`: _boolean_ - `true` to propose adding validator or `false` to propose removing validator + +#### Returns + +`result`: _boolean_ - `true` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + + + +[add or remove a signer with the specified address]: ../../how-to/configure/consensus/clique.md#add-and-remove-signers +[signers for the specified block]: ../../how-to/configure/consensus/clique.md#adding-and-removing-signers +[add or remove a validator]: ../../how-to/configure/consensus/ibft.md#add-and-remove-validators +[permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file +[group of sender and recipients]: ../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy + +\*[EEA]: Enterprise Ethereum Alliance diff --git a/versioned_docs/version-23.4.0/private-networks/reference/api/objects.md b/versioned_docs/version-23.4.0/private-networks/reference/api/objects.md new file mode 100644 index 00000000000..b5446d65d32 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/api/objects.md @@ -0,0 +1,57 @@ +--- +title: Private network API objects +sidebar_position: 2 +description: Hyperledger Besu private network API objects reference +--- + +# Private network API objects + +The following objects are parameters for or returned by Besu private network API methods. + +:::warning + +This reference contains API objects that apply to only private networks. For API objects that apply to both private and public networks, see the [public network API objects reference](../../../public-networks/reference/api/objects.md). + +::: + +## Private transaction object + +Returned by [`priv_getPrivateTransaction`](index.md#priv_getprivatetransaction). + +| Key | Type | Value | +| --- | :-: | --- | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | Gas price, in Wei, provided by the sender. | +| `input` | Data | The data to create or invoke a contract. | +| `nonce` | Quantity | Number of transactions made by the sender to the privacy group before this one. | +| `to` | Data, 20 bytes | `null` if a contract creation transaction, otherwise, the contract address. | +| `value` | Quantity | `null` because private transactions cannot transfer Ether. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | +| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | +| `privateFor` | Array of Data, 32 bytes each | [Tessera](https://docs.tessera.consensys.net/) public keys of recipients. Not returned if using `privacyGroupId` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | +| `privacyGroupId` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) privacy group ID of recipients. Not returned if using `privateFor` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | +| `restriction` | String | Must be [`restricted`](../../../private-networks/concepts/privacy/private-transactions/index.md). | + +## Private transaction receipt object + +Returned by [`priv_getTransactionReceipt`](index.md#priv_gettransactionreceipt). + +| Key | Type | Value | +| --- | :-: | --- | +| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | +| `blockNumber` | Quantity | Block number of block containing this transaction. | +| `contractAddress` | Data, 20 bytes | Contract address created if a contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | +| `from` | Data, 20 bytes | Address of the sender. | +| `logs` | Array | Array of [log objects](../../../public-networks/reference/api/objects.md#log-object) generated by this private transaction. | +| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | +| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | +| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | +| `output` | Data | RLP-encoded return value of a contract call if a value returns, otherwise, `null`. | +| `commitmentHash` | Data, 32 bytes | Hash of the privacy marker transaction. | +| `status` | Quantity | Either `0x1` (success) or `0x0` (failure). | +| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | +| `privateFor` or `privacyGroupId` | Array or Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public keys or privacy group ID of the recipients. | +| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | diff --git a/versioned_docs/version-23.4.0/private-networks/reference/cli/_category_.json b/versioned_docs/version-23.4.0/private-networks/reference/cli/_category_.json new file mode 100644 index 00000000000..bec3b04721b --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/cli/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu CLI", + "position": 1 +} diff --git a/versioned_docs/version-23.4.0/private-networks/reference/cli/options.md b/versioned_docs/version-23.4.0/private-networks/reference/cli/options.md new file mode 100644 index 00000000000..de8570c2023 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/cli/options.md @@ -0,0 +1,707 @@ +--- +title: Private network options +sidebar_position: 1 +description: Hyperledger Besu private networks CLI reference +--- + +# Private network command line options + +This reference describes the syntax of the Hyperledger Besu private network command line interface (CLI) options. + +:::danger + +This reference contains options that apply to only private networks. For options that apply to both private and public networks, see the [public network options reference](../../../public-networks/reference/cli/options.md). + +::: + +## Specify options + +You can specify Besu options: + +- On the command line. + + ```bash + besu [OPTIONS] [SUBCOMMAND] + ``` + +- As an environment variable. For each command line option, the equivalent environment variable is: + + - Uppercase. + - `_` replaces `-`. + - Has a `BESU_` prefix. + + For example, set `--miner-coinbase` using the `BESU_MINER_COINBASE` environment variable. + +- In a [configuration file](../../../public-networks/how-to/configuration-file.md). + +If you specify an option in more than one place, the order of priority is command line, environment variable, configuration file. + +If using Bash or Z shell, you can view option suggestions by entering `--` and pressing the Tab key twice. + +```bash +besu --Tab+Tab +``` + +:::caution + +Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em hyphens. + +::: + +## Options + +### `permissions-accounts-config-file` + + + +# Syntax + +```bash +--permissions-accounts-config-file= +``` + +# Example + +```bash +--permissions-accounts-config-file=/home/me/me_configFiles/myPermissionsFile +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile +``` + +# Configuration file + +```bash +permissions-accounts-config-file="/home/me/me_configFiles/myPermissionsFile" +``` + + + +The [accounts permissions configuration file]. The default is the `permissions_config.toml` file in the [data directory](../../../public-networks/reference/cli/options.md#data-path). + +:::tip + +`--permissions-accounts-config-file` and [`--permissions-nodes-config-file`](#permissions-nodes-config-file) can use the same file. + +::: + +### `permissions-accounts-config-file-enabled` + + + +# Syntax + +```bash +--permissions-accounts-config-file-enabled[=] +``` + +# Example + +```bash +--permissions-accounts-config-file-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE_ENABLED=true +``` + +# Configuration file + +```bash +permissions-accounts-config-file-enabled=true +``` + + + +Enables or disables file-based account level permissions. The default is `false`. + +### `permissions-accounts-contract-address` + + + +# Syntax + +```bash +--permissions-accounts-contract-address= +``` + +# Example + +```bash +--permissions-accounts-contract-address=xyz +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ADDRESS=xyz +``` + +# Configuration file + +```bash +permissions-accounts-contract-address="xyz" +``` + + + +The contract address for [onchain account permissioning](../../concepts/permissioning/onchain.md). + +### `permissions-accounts-contract-enabled` + + + +# Syntax + +```bash +--permissions-accounts-contract-enabled[=] +``` + +# Example + +```bash +--permissions-accounts-contract-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ENABLED=true +``` + +# Configuration file + +```bash +permissions-accounts-contract-enabled=true +``` + + + +Enables or disables contract-based [onchain account permissioning](../../concepts/permissioning/onchain.md). The default is `false`. + +### `permissions-nodes-config-file` + + + +# Syntax + +```bash +--permissions-nodes-config-file= +``` + +# Example + +```bash +--permissions-nodes-config-file=/home/me/me_configFiles/myPermissionsFile +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile +``` + +# Configuration file + +```bash +permissions-nodes-config-file="/home/me/me_configFiles/myPermissionsFile" +``` + + + +The [nodes permissions configuration file]. The default is the `permissions_config.toml` file in the [data directory](../../../public-networks/reference/cli/options.md#data-path). + +:::tip + +`--permissions-nodes-config-file` and [`--permissions-accounts-config-file`](#permissions-accounts-config-file) can use the same file. + +::: + +### `permissions-nodes-config-file-enabled` + + + +# Syntax + +```bash +--permissions-nodes-config-file-enabled[=] +``` + +# Example + +```bash +--permissions-nodes-config-file-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONFIG_FILE_ENABLED=true +``` + +# Configuration file + +```bash +permissions-nodes-config-file-enabled=true +``` + + + +Enables or disables file-based node level permissions. The default is `false`. + +### `permissions-nodes-contract-address` + + + +# Syntax + +```bash +--permissions-nodes-contract-address= +``` + +# Example + +```bash +--permissions-nodes-contract-address=xyz +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_ADDRESS=xyz +``` + +# Configuration file + +```bash +permissions-nodes-contract-address="xyz" +``` + + + +The contract address for [onchain node permissioning](../../concepts/permissioning/onchain.md). + +### `permissions-nodes-contract-enabled` + + + +# Syntax + +```bash +--permissions-nodes-contract-enabled[=] +``` + +# Example + +```bash +--permissions-nodes-contract-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_ENABLED=true +``` + +# Configuration file + +```bash +permissions-nodes-contract-enabled=true +``` + + + +Enables or disables contract-based [onchain node permissioning](../../concepts/permissioning/onchain.md). The default is `false`. + +### `permissions-nodes-contract-version` + + + +# Syntax + +```bash +--permissions-nodes-contract-version= +``` + +# Example + +```bash +--permissions-nodes-contract-version=2 +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_VERSION=2 +``` + +# Configuration file + +```bash +permissions-nodes-contract-version=2 +``` + + + +Version of the EEA [node permissioning interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version). The default is 1. + +### `privacy-enabled` + + + +# Syntax + +```bash +--privacy-enabled[=] +``` + +# Example + +```bash +--privacy-enabled=false +``` + +# Environment variable + +```bash +BESU_PRIVACY_ENABLED=false +``` + +# Configuration file + +```bash +privacy-enabled=false +``` + + + +Enables or disables [private transactions](../../concepts/privacy/index.md). The default is `false`. + +:::important + +Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md) or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) is not supported. + +::: + +### `privacy-marker-transaction-signing-key-file` + + + +# Syntax + +```bash +--privacy-marker-transaction-signing-key-file= +``` + +# Example + +```bash +--privacy-marker-transaction-signing-key-file=/home/me/me_node/myPrivateKey +``` + +# Environment variable + +```bash +BESU_PRIVACY_MARKER_TRANSACTION_SIGNING_KEY_FILE=/home/me/me_node/myPrivateKey +``` + +# Configuration file + +```bash +privacy-marker-transaction-signing-key-file="/home/me/me_node/myPrivateKey" +``` + + + +`` is the name of the private key file used to [sign privacy marker transactions](../../how-to/use-privacy/sign-pmts.md). + +:::note + +This can be the same file used by [`--node-private-key-file`](../../../public-networks/reference/cli/options.md#node-private-key-file), or a different key file to identify who signed the privacy marker transaction. + +::: + +You must specify this option if you're using: + +- a privacy network where you pay gas. Also, the associated account must contain adequate funds. +- [account permissioning] and privacy. You must include the corresponding public key in the accounts allowlist. + +If you do not specify this option (for example, in a free gas network), Besu signs each transaction with a different randomly generated key. + +### `privacy-multi-tenancy-enabled` + + + +# Syntax + +```bash +--privacy-multi-tenancy-enabled[=] +``` + +# Example + +```bash +--privacy-multi-tenancy-enabled=false +``` + +# Environment variable + +```bash +BESU_PRIVACY_MULTI_TENANCY_ENABLED=false +``` + +# Configuration file + +```bash +privacy-multi-tenancy-enabled=false +``` + + + +Enables or disables [multi-tenancy](../../concepts/privacy/multi-tenancy.md) for private transactions. The default is `false`. + +### `privacy-flexible-groups-enabled` + + + +# Syntax + +```bash +--privacy-flexible-groups-enabled[=] +``` + +# Example + +```bash +--privacy-flexible-groups-enabled=true +``` + +# Environment variable + +```bash +BESU_PRIVACY_FLEXIBLE_GROUPS_ENABLED=true +``` + +# Configuration file + +```bash +privacy-flexible-groups-enabled=true +``` + + + +Enables or disables [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). The default is `false`. + +Deprecated syntax for this option is `--privacy-onchain-groups-enabled`. + +### `privacy-public-key-file` + + + +# Syntax + +```bash +--privacy-public-key-file= +``` + +# Example + +```bash +--privacy-public-key-file=Tessera/nodeKey.pub +``` + +# Environment variable + +```bash +BESU_PRIVACY_PUBLIC_KEY_FILE=Tessera/nodeKey.pub +``` + +# Configuration file + +```bash +privacy-public-key-file="Tessera/nodeKey.pub" +``` + + + +The [public key of the Tessera node](https://docs.tessera.consensys.net/). + +:::important + +You cannot specify `privacy-public-key-file` when [`--privacy-multi-tenancy-enabled`](#privacy-multi-tenancy-enabled) is `true` + +::: + +### `privacy-tls-enabled` + + + +# Syntax + +```bash +--privacy-tls-enabled[=] +``` + +# Example + +```bash +--privacy-tls-enabled=false +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_ENABLED=false +``` + +# Configuration file + +```bash +privacy-tls-enabled=false +``` + + + +Enables or disables [TLS on communication with the private transaction manager]. The default is false. + +### `privacy-tls-keystore-file` + + + +# Syntax + +```bash +--privacy-tls-keystore-file= +``` + +# Example + +```bash +--privacy--keystore-file=/home/me/me_node/key +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_KEYSTORE_FILE=/home/me/me_node/key +``` + +# Configuration file + +```bash +privacy-tls-keystore-file="/home/me/me_node/key" +``` + + + +The keystore file (in PKCS #12 format) containing the private key and the certificate presented during authentication. + +You must specify `privacy-tls-keystore-file` if [`--privacy-tls-enabled`](#privacy-tls-enabled) is `true`. + +### `privacy-tls-keystore-password-file` + + + +# Syntax + +```bash +--privacy-tls-keystore-password-file= +``` + +# Example + +```bash +--privacy-tls-keystore-password-file=/home/me/me_node/password +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password +``` + +# Configuration file + +```bash +privacy-tls-keystore-password-file="/home/me/me_node/password" +``` + + + +The path to the file containing the password to decrypt the keystore. + +### `privacy-tls-known-enclave-file` + + + +# Syntax + +```bash +--privacy-tls-known-enclave-file= +``` + +# Example + +```bash +--privacy-tls-known-enclave-file=/home/me/me_node/knownEnclave +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_KNOWN_ENCLAVE_FILE=/home/me/me_node/knownEnclave +``` + +# Configuration file + +```bash +privacy-tls-known-enclave-file="/home/me/me_node/knownEnclave" +``` + + + +The path to the file containing the hostnames, ports, and SHA256 certificate fingerprints of the [authorized privacy enclave](../../how-to/configure/tls/client-and-server.md#create-the-known-servers-file). + +### `privacy-url` + + + +# Syntax + +```bash +--privacy-url= +``` + +# Example + +```bash +--privacy-url=http://127.0.0.1:8888 +``` + +# Environment variable + +```bash +BESU_PRIVACY_URL=http://127.0.0.1:8888 +``` + +# Configuration file + +```bash +privacy-url="http://127.0.0.1:8888" +``` + + + +The URL on which the [Tessera node](../../tutorials/privacy/index.md#3-create-tessera-configuration-files) is running. + + + +[accounts permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file +[nodes permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file +[account permissioning]: ../../concepts/permissioning/index.md#account-permissioning +[TLS on communication with the private transaction manager]: ../../concepts/privacy/index.md#private-transaction-manager diff --git a/versioned_docs/version-23.4.0/private-networks/reference/cli/subcommands.md b/versioned_docs/version-23.4.0/private-networks/reference/cli/subcommands.md new file mode 100644 index 00000000000..d31b0a106b2 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/cli/subcommands.md @@ -0,0 +1,141 @@ +--- +title: Private network subcommands +sidebar_position: 2 +description: Hyperledger Besu command line interface subcommands +--- + +# Private network subcommands + +This reference describes the syntax of the Hyperledger Besu private network command line interface (CLI) subcommands. + +:::danger + +This reference contains subcommands that apply to only private networks. For subcommands that apply to both private and public networks, see the [public network subcommands reference](../../../public-networks/reference/cli/subcommands.md). + +::: + +To start a Besu node using subcommands, run: + +```bash +besu [OPTIONS] [SUBCOMMAND] [SUBCOMMAND OPTIONS] +``` + +If using Bash or Z shell, you can view subcommand suggestions by pressing the Tab key twice. + +```bash +besu Tab+Tab +``` + +## `operator` + +Provides operator actions. + +### `generate-blockchain-config` + + + +# Syntax + +```bash +besu operator generate-blockchain-config --config-file= --to= [--genesis-file-name=] [--private-key-file-name=] [--public-key-file-name=] +``` + +# Example + +```bash +besu operator generate-blockchain-config --config-file=config.json --to=myNetworkFiles +``` + + + +Generates an [IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) or [QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 or QBFT genesis file, except for the `extraData` string. The second is the `blockchain` property defining the number of key pairs to generate. + +## `rlp` + +Provides RLP related actions. + +### `encode` + + + +# Syntax + +```bash +besu rlp encode [--from=] [--to=] [--type=] +``` + +# File example + + ```bash + besu rlp encode --from=ibft_extra_data.json --to=extra_data_for_ibft_genesis.txt --type=IBFT_EXTRA_DATA + ``` + +# Standard input/output example + +```bash +cat extra_data.json | besu rlp encode > rlp.txt +``` + + + +Encodes the RLP hexadecimal string for use in an [IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) or [QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. The default type is `IBFT_EXTRA_DATA`. + +Supported types are: + +- `IBFT_EXTRA_DATA` - The IBFT 2.0 genesis file includes the `IBFT_EXTRA_DATA` type in the [`extraData`](../../how-to/configure/consensus/ibft.md#extra-data) property. + +- `QBFT_EXTRA_DATA` - The QBFT genesis file includes the `QBFT_EXTRA_DATA` type in the [`extraData`](../../how-to/configure/consensus/qbft.md#extra-data) property. + +## IBFT 2.0 extra data + +To generate the RLP encoded `extraData` string, specify a JSON input that is an array of validator addresses in ascending order. + +:::tip JSON Schema for IBFT_EXTRA_DATA + +Use the following JSON Schema to validate that your JSON data is well formed. To validate your JSON content, use an online validation tool, such as [JSON Schema Validator](https://www.jsonschemavalidator.net/). + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://org.hyperledger.besu/cli_rlp_ibft_extra_data.json", + "type": "array", + "definitions": {}, + "title": "IBFT extra data", + "description": "JSON format used as input to generate an IBFT extra data RLP string", + "items": { + "$id": "#/address", + "type": "string", + "title": "Validator address", + "description": "The validator node address", + "default": "", + "examples": [ + "be068f726a13c8d46c44be6ce9d275600e1735a4", + "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" + ], + "pattern": "^([0-9a-f]{40})$" + } +} +``` + +Example IBFT_EXTRA_DATA encoding + + + +# JSON input + +```json +[ + "be068f726a13c8d46c44be6ce9d275600e1735a4", + "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" +] +``` + +# RLP output + +``` +0xf853a00000000000000000000000000000000000000000000000000000000000000000ea94be068f726a13c8d46c44be6ce9d275600e1735a4945ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193808400000000c0 +``` + + diff --git a/versioned_docs/version-23.4.0/private-networks/reference/index.md b/versioned_docs/version-23.4.0/private-networks/reference/index.md new file mode 100644 index 00000000000..1bea1051aa9 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/index.md @@ -0,0 +1,21 @@ +--- +description: private networks reference overview +--- + +# Reference + +This section provides reference material for private network features. + +The following features and resources are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: + +- Besu command line: + - [Standard options](../../public-networks/reference/cli/options.md) + - [Standard subcommands](../../public-networks/reference/cli/subcommands.md) +- Besu API: + - [Standard Besu API methods](../../public-networks/reference/api/index.md) + - [Standard Besu API objects](../../public-networks/reference/api/objects.md) +- [Genesis file items](../../public-networks/reference/genesis-items.md) +- [EVM tool options](../../public-networks/reference/evm-tool.md) +- [Transaction trace types](../../public-networks/reference/trace-types.md) +- [Projects using Besu](../../public-networks/reference/projects-using-besu.md) +- [Security disclosure policy](../../public-networks/reference/disclosure.md) diff --git a/versioned_docs/version-23.4.0/private-networks/reference/plugin-api-interfaces.md b/versioned_docs/version-23.4.0/private-networks/reference/plugin-api-interfaces.md new file mode 100644 index 00000000000..c8f66d4aa1e --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/reference/plugin-api-interfaces.md @@ -0,0 +1,59 @@ +--- +title: Plugin API interfaces +sidebar_position: 4 +description: Plugin interfaces +--- + +# Plugin API interfaces + +API interfaces in Hyperledger Besu allow users to [build plugins](../concepts/plugins.md) to extend Besu functionality. + +For more information about the available interfaces, see the [Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). + +:::note Javadoc issue + +The plugin API documentation is currently not being updated. We're working on a fix, but in the meantime, some links are temporarily pointing to wiki.hyperledger.org. + +::: + +## Core plugin classes + +The following table lists the interfaces providing core plugin classes. + +| Interface | Description | +| --- | --- | +| [**BesuContext**](https://wiki.hyperledger.org/display/BESU/BesuContext) | Allows plugins to access Besu services. | +| [**BesuPlugin**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/BesuPlugin.html) | Used to manage the plugin lifecycle. | + +## Plugin services + +The following table lists interfaces providing services you can retrieve. + +| Interface | Description | +| --- | --- | +| [**BesuEvents**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuEvents.html) | Allows plugins to attach to events during Besu operation. | +| [**BesuConfiguration**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuConfiguration.html) | Provides file system locations of Besu's storage. | +| [**IbftQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/IbftQueryService.html) | Allows query of the IBFT 2.0 aspects of the blockchain. | +| [**MetricCategoryRegistry**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/metrics/MetricCategoryRegistry.html) | Adds a new metrics category to the CLI. | +| [**MetricsSystem**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/MetricsSystem.html) | Register metrics with the Prometheus endpoint. | +| [**PoaQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/PoaQueryService.html) | Query the current state of Clique and IBFT 2.0 consensus protocols. | +| [**PicoCLIOptions**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/PicoCLIOptions.html) | Adds CLI commands to the Besu command line. | +| [**SecurityModuleService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/SecurityModuleService.html) | Allows plugins to register a security module. | +| [**StorageService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/StorageService.html) | Allows plugins to register as a storage engine. For example, to connect to a hardware security module (HSM). | +| [**PermissioningService**](https://wiki.hyperledger.org/display/BESU/PermissioningService) | Allows for fine grain control of node connection and node messaging permissioning. | +| [**PrivacyPluginService**](https://wiki.hyperledger.org/display/BESU/PrivacyPluginService) | Provides a way to define how [privacy marker transactions] are created, and what private genesis to use. | +| [**RpcEndpointService**](https://wiki.hyperledger.org/display/BESU/RpcEndpointService) | Register custom RPC endpoints. | + +To use the interfaces in your plugin, ensure the [Gradle build file](https://github.com/ConsenSys/PluginsAPIDemo/blob/957628b3c6f533f3c3f405e2a17e369cd1f02c31/build.gradle) contains the `https://hyperledger.jfrog.io/hyperledger/besu-maven` repository and the `plugin-api` dependency. + +:::warning Known issue + +As indicated in [issue #406](https://github.com/hyperledger/besu-docs/issues/406), plugins may need to access the parsed command line during registration, but the command line is not yet initialized at this stage. + +It's in our roadmap to improve lifecycle steps and provide additional visibility for some data. A workaround is to create a supplier during the `register` step and store it in memory. + +The `start` step can be ignored and your plugin module will be instantiated when the command line interface is parsed and available. + +::: + +[privacy marker transactions]: ../concepts/privacy/private-transactions/processing.md diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/_category_.json b/versioned_docs/version-23.4.0/private-networks/tutorials/_category_.json new file mode 100644 index 00000000000..8b9b59e8439 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Tutorials", + "position": 5, + "link": { + "type": "generated-index" + } +} diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/azure.md b/versioned_docs/version-23.4.0/private-networks/tutorials/azure.md new file mode 100644 index 00000000000..14d0d60bef7 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/azure.md @@ -0,0 +1,96 @@ +--- +title: Deploy using Microsoft Azure +sidebar_position: 10 +description: Hyperledger Besu private network example on Azure +--- + +# Deploy private network example on Azure + +The [Quorum Dev Quickstart on Azure Marketplace] enables deploying a private IBFT 2.0 network, which includes: + +- A bootnode. +- An RPC node. +- Three regular nodes. +- A block explorer. +- Prometheus and Grafana with the Besu dashboard installed. + +These are deployed on a single Azure VM in minutes. + +Once deployed, you can develop and test applications and connect to the Visual Studio Code (VSCode) plugin using the RPC endpoint `http:///jsonrpc`. + +## Overview + +The following is a high-level overview of the deployed network. + +![Image landing](../../assets/images/sampleNetworks-poa.png) + +## Deploy + +To deploy the private network example on Azure: + +1. Create a Resource Group in the [Azure Portal](https://portal.azure.com). + +1. Go to the [Quorum Dev Quickstart on Azure Marketplace]. + +1. Click **Get It Now** and **Continue**. The Quickstart landing page is displayed. + + ![Image landing](../../assets/images/mp_0_landing.png) + +1. Click **Create**. The **Basics** page is displayed. + + ![Image basics](../../assets/images/mp_1_basics.png) + +1. Enter: + + - Details of the Resource Group you created earlier. + - Basic user credentials to start a VM. + - Prefix for your new VM and any other resources created. + - Region to which you wish to deploy the VM. + +1. Click **Next: Size** and select the size of the VM you want to use. + +1. To start the deployment, click **Review + create** at the bottom left of the page. + + The deployment typically takes 3--5 minutes. The progress of your deployment is displayed. + + When the deployment is complete, the resources created are displayed. + +1. Click **Go to Resource**. Everything created in the deployment is displayed. + +1. Click on the VM name. The VM details such as the IP and DNS name are displayed. Use the IP and DNS name displayed to connect to the VM, either in browser or via RPC calls. + +## Block explorer + +To display the block explorer, open a new tab and enter either the IP of the VM or the DNS name. + +![Image be](../../assets/images/mp_8_block_explorer.png) + +## Metrics + +The deployment includes Prometheus metrics and Grafana with a custom Besu Dashboard installed. To display the dashboard: + +1. Open a new tab and enter the IP or DNS name appended with `/grafana`. For example: `http:///grafana`. + +1. Click on home and select the Besu dashboard. + + ![Grafana screenshot](../../assets/images/mp_9_grafana.png) + +The dashboard provides a visual way to monitor your network and nodes as the chain progresses. Alerting can also be configured. + +## Connect to VM RPC endpoint + +You can connect dapps or develop directly from the IDE by using VSCode and connecting to the VM RPC endpoint. The endpoint is the DNS name appended with `/jsonrpc`: `http:///jsonrpc`. + +## SSH + +You can SSH into the VM to see how everything is set up and working. Use the credentials from step 5 of [deployment](#deploy) and your preferred client: + +```bash +ssh username@ +``` + +To list all containers running, run `docker ps`. Find the complete setup in `/home//besu-quickstart`. + +![Image ssh](../../assets/images/mp_10_ssh.png) + +[Quorum Dev Quickstart on Azure Marketplace]: https://azuremarketplace.microsoft.com/en-us/marketplace/apps/consensys.quorum-dev-quickstart diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/clique.md b/versioned_docs/version-23.4.0/private-networks/tutorials/clique.md new file mode 100644 index 00000000000..0b8a6345a7d --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/clique.md @@ -0,0 +1,270 @@ +--- +title: Create a Clique network +sidebar_position: 4 +description: Hyperledger Besu private network using the Clique (proof of authority) consensus protocol +--- + +# Create a private network using Clique + +A private network provides a configurable network for testing. This private network uses the [Clique (proof of authority) consensus protocol]. + +:::danger + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +::: + +## Prerequisites + +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using Clique. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. When the node starts, Besu saves the [node key](../../public-networks/concepts/node-keys.md) in this directory. + +Create directories for your private network, each of the three nodes, and a data directory for each node: + +```bash +Clique-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 + ├── data +``` + +### 2. Get the address for Node-1 + +In Clique networks, you must include the address of at least one initial signer in the genesis file. For this Clique network, we'll use Node-1 as the initial signer. This requires obtaining the address for Node-1. + +To get the address for Node-1, in the `Node-1` directory, use the [`public-key export-address`](../../public-networks/reference/cli/subcommands.md#export-address) subcommand to write the node address to the specified file (`node1Address` in this example). + + + +# MacOS + +```bash +besu --data-path=data public-key export-address --to=data/node1Address +``` + +# Windows + +```bash +besu --data-path=data public-key export-address --to=data\node1Address +``` + + + +### 3. Create the genesis file + +The genesis file defines the genesis block of the blockchain (that is, the start of the blockchain). The [Clique genesis file](../how-to/configure/consensus/clique.md#genesis-file) includes the address of Node-1 as the initial signer in the `extraData` field. + +All nodes in a network must use the same genesis file. + +Copy the following genesis definition to a file called `cliqueGenesis.json` and save it in the `Clique-Network` directory: + +```json +{ + "config": { + "chainId": 1337, + "berlinBlock": 0, + "clique": { + "blockperiodseconds": 15, + "epochlength": 30000 + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0xa00000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "timestamp": "0x5c51a607", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +In `extraData`, replace `` with the [address for Node-1](#2-get-the-address-for-node-1), excluding the 0x prefix. + +```json +{ + ... +"extraData":"0x0000000000000000000000000000000000000000000000000000000000000000b9b81ee349c3807e46bc71aa2632203c5b4620340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + ... +} +``` + +:::warning + +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 4. Start the first node as the bootnode + +Start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line enables: + +- The JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option +- The ETH, NET, and CLIQUE APIs using the [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option +- All-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option +- All-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../assets/images/EnodeStartup.png) + +### 5. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + + +The command line specifies: + +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- The data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). + +### 6. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- The bootnode as for [Node-2](#5-start-node-2). +- Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). + +### 7. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 +``` + +The result confirms Node-1 has two peers (Node-2 and Node-3): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x2" +} +``` + +## Next steps + +Look at the logs displayed to confirm Node-1 is producing blocks and Node-2 and Node-3 are importing blocks. + +Use the [Clique API to add] Node-2 or Node-3 as a signer. + +:::note + +To add Node-2 or Node-3 as a signer you need the [node address as when specifying Node-1](#2-get-the-address-for-node-1) as the initial signer. + +::: + +Import accounts to MetaMask and send transactions, as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::info + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the Clique network in the future, start from [4. Start First Node as Bootnode](#4-start-the-first-node-as-the-bootnode). + +::: + + + +[Clique (proof of authority) consensus protocol]: ../how-to/configure/consensus/clique.md +[Clique API to add]: ../how-to/configure/consensus/clique.md#add-and-remove-signers diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/_category_.json b/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/_category_.json new file mode 100644 index 00000000000..3ba8177fcc1 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy a smart contract", + "position": 8 +} diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/index.md b/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/index.md new file mode 100644 index 00000000000..862fdc7e17b --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/index.md @@ -0,0 +1,273 @@ +--- +title: Deploy a smart contract +sidebar_position: 1 +description: deploying smart contracts +--- + +# Deploy smart contracts to an Ethereum chain + +This tutorial shows you how to deploy smart contracts as transactions to a network. + +## Prerequisites + +This tutorial requires a local blockchain network. You can use the [Developer Quickstart](../quickstart.md) to rapidly generate one. If deploying a private contract, enable privacy on the network (public contracts can also be deployed on privacy-enabled networks). + +## Use `eth_sendSignedTransaction` + +To deploy a smart contract using [`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sendsignedtransaction), use an account's private key to sign and serialize the transaction, and send the API request. + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. + +Using the [`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) smart contract as an example, create a new file called `compile.js` with the following content: + +```js title="compile.js" +const fs = require("fs").promises; +const solc = require("solc"); + +async function main() { + // Load the contract source code + const sourceCode = await fs.readFile("SimpleStorage.sol", "utf8"); + // Compile the source code and retrieve the ABI and bytecode + const { abi, bytecode } = compile(sourceCode, "SimpleStorage"); + // Store the ABI and bytecode into a JSON file + const artifact = JSON.stringify({ abi, bytecode }, null, 2); + await fs.writeFile("SimpleStorage.json", artifact); +} + +function compile(sourceCode, contractName) { + // Create the Solidity Compiler Standard Input and Output JSON + const input = { + language: "Solidity", + sources: { main: { content: sourceCode } }, + settings: { outputSelection: { "*": { "*": ["abi", "evm.bytecode"] } } }, + }; + // Parse the compiler output to retrieve the ABI and bytecode + const output = solc.compile(JSON.stringify(input)); + const artifact = JSON.parse(output).contracts.main[contractName]; + return { + abi: artifact.abi, + bytecode: artifact.evm.bytecode.object, + }; +} + +main().then(() => process.exit(0)); +``` + +Run `compile.js` to get the smart contract's output JSON: + +```bash +node compile.js +``` + +Run `solc` to get the contract's bytecode and ABI: + +```bash +solc SimpleStorage.sol --bin --abi +``` + +Once you have the bytecode and ABI, you can rename the output files to make them easier to use; this tutorial refers to them as `SimpleStorage.bin` and `SimpleStorage.abi`. + +Create a new file named `public_tx.js` to send the transaction (or run the following commands in a JavaScript console). The Developer Quickstart provides an [example of a public transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js). + +```js titl="public_tx.js" +const web3 = new Web3(host); +// use an existing account, or make an account +const privateKey = + "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63"; +const account = web3.eth.accounts.privateKeyToAccount(privateKey); + +// read in the contracts +const contractJsonPath = path.resolve(__dirname, "SimpleStorage.json"); +const contractJson = JSON.parse(fs.readFileSync(contractJsonPath)); +const contractAbi = contractJson.abi; +const contractBinPath = path.resolve(__dirname, "SimpleStorage.bin"); +const contractBin = fs.readFileSync(contractBinPath); +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +// get txnCount for the nonce value +const txnCount = await web3.eth.getTransactionCount(account.address); + +const rawTxOptions = { + nonce: web3.utils.numberToHex(txnCount), + from: account.address, + to: null, //public tx + value: "0x00", + data: "0x" + contractBin + contractInit, // contract binary appended with initialization value + gasPrice: "0x0", //ETH per unit of gas + gasLimit: "0x24A22", //max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const tx = new Tx(rawTxOptions); +console.log("Signing transaction..."); +tx.sign(privateKey); +console.log("Sending transaction..."); +var serializedTx = tx.serialize(); +const pTx = await web3.eth.sendSignedTransaction( + "0x" + serializedTx.toString("hex").toString("hex"), +); +console.log("tx transactionHash: " + pTx.transactionHash); +console.log("tx contractAddress: " + pTx.contractAddress); +``` + +`rawTxOptions` contains the following fields: + +- `nonce` - the number of transactions sent from an address. +- `from` - address of the sending account. For example `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`. +- `to` - address of the receiver. To deploy a contract, set to `null`. +- `gas` - amount of gas provided by the sender for the transaction. +- `gasPrice` - price for each unit of gas the sender is willing to pay. +- `data` - binary of the contract (in this example there's also a constructor initialization value, so we append that to the binary value). +- `value` - amount of Ether/Wei transferred from the sender to the recipient. + +Run the `public_tx.js` to send the transaction: + +```bash +node public_tx.js +``` + +This example code creates the transaction `tx`, signs it with the private key of the account, serializes it, then calls `eth_sendSignedTransaction` to deploy the contract. + +## Use `eth_sendTransaction` + +You can use [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) as an alternative to `eth_sendSignedTransaction`. However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account management separate for stronger security. Configure [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) with your Besu node to make the `eth_sendTransaction` API call. + +An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC node is paired with EthSigner. Refer to the [EthSigner documentation](https://docs.ethsigner.consensys.net/) for configuration details. + +Pass the following parameters to the [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods/#eth_sendtransaction) call to EthSigner; EthSigner then converts the request to an [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) call that Besu uses: + +- `to` - address of the receiver. To deploy a contract, set to `null`. +- `from` - address of the sender account. For example `0x9b790656b9ec0db1936ed84b3bea605873558198`. +- `gas` - amount of gas provided by the sender for the transaction +- `gasPrice` - price for each unit of gas the sender is willing to pay +- `data` - one of the following: + - For contract deployments (this use case) - compiled code of the contract + - For contract interactions - hash of the invoked method signature and encoded parameters (see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html)) + - For simple ether transfers - empty + +```json title="'eth_sendTransaction' parameters" +params: { + "to": null, + "from": "0x9b790656b9ec0db1936ed84b3bea605873558198", + "gas": "0x76c0", + "gasPrice": "0x9184e72a000", + "data": "0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033" +} +``` + +Make the request using `eth_sendTransaction`: + +```bash title="'eth_sendTransaction' curl HTTP request" +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0x9b790656b9ec0db1936ed84b3bea605873558198", "to":null, "gas":"0x7600","gasPrice":"0x9184e72a000", "data":"0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"}], "id":1}' +``` + +## Use `eea_sendRawTransaction` for private contracts with web3js-quorum + +To deploy a private contract to another node or [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. + +The Developer Quickstart provides an [example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. + +Use [`web3.priv.generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) by running the following commands in a JavaScript console, or by including them in a `private_tx.js` file and running `node private_tx.js`: + +```js title="'private_tx.js' using 'web3.priv.generateAndSendRawTransaction'" +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); + +const bytecode = + "608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +const chainId = 1337; +const web3 = new Web3(clientUrl); +const web3quorum = new Web3Quorum(web3, chainId); + +const txOptions = { + data: "0x" + bytecode + contractConstructorInit, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], +}; +console.log("Creating contract..."); +const txHash = await web3quorum.priv.generateAndSendRawTransaction(txOptions); +console.log("Getting contractAddress from txHash: ", txHash); + +const privateTxReceipt = await web3quorum.priv.waitForTransactionReceipt( + txHash, +); +console.log("Private Transaction Receipt: ", privateTxReceipt); +return privateTxReceipt; +``` + +`txOptions` contains the following field: + +- `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append that to the bytecode). + +The deployment process includes creating the client as in the previous examples, but rather than deploying the contract with `to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the contract's address. + +:::note + +This example doesn't use a privacy group and makes a simple node-to-node transaction. To use a privacy group: + +- Create the privacy group using the public keys of the nodes in the group. +- Specify the `privacyGroupId` instead of the `privateFor` option in the txOptions above and then send the transaction. + +The Developer Quickstart provides an [example of a private transaction with a privacy group](https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/besu/smart_contracts/privacy/scripts/private_tx_privacy_group.js). + +::: + +## Use `eea_sendRawTransaction` for private contracts with web3js-eea + +:::warning + +This web3js-eea library will be deprecated on December 31, 2021. Please use the [web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library instead and refer to the previous section. + +::: + +To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. + +The Developer Quickstart provides an [example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. + +Use `eea_sendRawTransaction` by running the following commands in a JavaScript console, or by including them in a `private_tx.js` file and running `node private_tx.js`: + +```js title="'private_tx.js' using 'eea_sendRawTransaction'" +const Web3 = require("web3"); +const EEAClient = require("web3-eea"); + +const bytecode = + "608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +const web3 = new Web3(clientUrl); +const web3eea = new EEAClient(web3, 1337); +const txOptions = { + data: "0x" + bytecode + contractConstructorInit, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], +}; +console.log("Creating contract..."); +const txHash = await web3eea.eea.sendRawTransaction(txOptions); +console.log("Getting contractAddress from txHash: ", txHash); + +const privateTxReceipt = await web3.priv.getTransactionReceipt( + txHash, + fromPublicKey, +); +// console.log("Private Transaction Receipt: ", privateTxReceipt); +return privateTxReceipt; +``` + +`txOptions` contains the following field: + +- `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append that to the bytecode). + +The deployment process includes creating the client as in the previous examples, but rather than deploying the contract with `to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the contract's address. diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/interact.md b/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/interact.md new file mode 100644 index 00000000000..b5ff8ebfd18 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/interact.md @@ -0,0 +1,192 @@ +--- +title: Interact with a deployed contract +sidebar_position: 2 +description: calling smart contracts functions +--- + +# Interact with deployed smart contracts + +You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate local blockchain networks. + +This tutorial shows you how to interact with smart contracts that have been deployed to a network. + +## Prerequisites + +- A network with a deployed smart contract as in the [deploying smart contracts tutorial](index.md) + +## Interact with public contracts + +This tutorial uses the [`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) contract: + +```js +pragma solidity ^0.7.0; + +contract SimpleStorage { + uint public storedData; + + constructor(uint initVal) public { + storedData = initVal; + } + + function set(uint x) public { + storedData = x; + } + + function get() view public returns (uint retVal) { + return storedData; + } +} +``` + +Once the contract is deployed, you can perform a read operation using the `get` function call and a write operation using the `set` function call. This tutorial uses the [web3js](https://www.npmjs.com/package/web3) library to interact with the contract. A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js) of these calls can be found in the [Developer Quickstart]. + +### 1. Perform a read operation + +To perform a read operation, you need the address that the contract was deployed to and the contract's ABI. The contract's ABI can be obtained from compiling the contract; see the [deploying smart contracts tutorial](index.md) for an example. + +Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new instance of the smart contract, then make the `get` function call from the contract's list of methods, which will return the value stored: + +```js +async function getValueAtAddress( + host, + deployedContractAbi, + deployedContractAddress, +) { + const web3 = new Web3(host); + const contractInstance = new web3.eth.Contract( + deployedContractAbi, + deployedContractAddress, + ); + const res = await contractInstance.methods.get().call(); + console.log("Obtained value at deployed contract is: " + res); + return res; +} +``` + +### 2. Perform a write operation + +To perform a write operation, send a transaction to update the stored value. As with the [`get` call](#1-perform-a-read-operation), you need to use the address that the contract was deployed to and the contract's ABI. The account address must correspond to an actual account with some ETH in it to perform the transaction. Because Besu doesn't manage accounts, this address is the address you use in [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) (or equivalent) to manage your accounts. + +Make the `set` call passing in your account address, `value` as the updated value of the contract, and the amount of gas you are willing to spend for the transaction: + +```js +// You need to use the accountAddress details provided to Besu to send/interact with contracts +async function setValueAtAddress( + host, + accountAddress, + value, + deployedContractAbi, + deployedContractAddress, +) { + const web3 = new Web3(host); + const contractInstance = new web3.eth.Contract( + deployedContractAbi, + deployedContractAddress, + ); + const res = await contractInstance.methods + .set(value) + .send({ from: accountAddress, gasPrice: "0xFF", gasLimit: "0x24A22" }); + return res; +} +``` + +### 3. Verify an updated value + +To verify that a value has been updated, perform a `get` call after a `set` update call. + +## Interact with private contracts + +This private contracts example uses the same `SimpleStorage.sol` contract as in the [public contracts example](#interact-with-public-contracts), but it uses the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) method to interact with the contract. Both read and write operations are performed using the `generateAndSendRawTransaction` API call. A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js) can be found in the [Developer Quickstart]. + +### 1. Perform a read operation + +As in the public contracts example, to perform a read operation, you need the address that the contract was deployed to and the contract's ABI. You also need your private and public keys and the recipient's public key. + +Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new instance of the smart contract, extract the signature of function's ABI for the `get` method, and then use this value as the `data` parameter for the `generateAndSendRawTransaction` transaction. + +The keys remain the same for the sender and recipient, and the `to` field is the contract's address. Once you make the request, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the value stored: + +```js +async function getValueAtAddress( + clientUrl, + address, + contractAbi, + fromPrivateKey, + fromPublicKey, + toPublicKey, +) { + const Web3 = require("web3"); + const Web3Quorum = require("web3js-quorum"); + const web3 = new Web3Quorum(new Web3("http://localhost:22000")); + // eslint-disable-next-line no-underscore-dangle + const functionAbi = contract._jsonInterface.find((e) => { + return e.name === "get"; + }); + const functionParams = { + to: address, + data: functionAbi.signature, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], + }; + const transactionHash = await web3quorum.priv.generateAndSendRawTransaction( + functionParams, + ); + // console.log(`Transaction hash: ${transactionHash}`); + const result = await web3quorum.priv.waitForTransactionReceipt( + transactionHash, + ); + console.log( + "" + nodeName + " value from deployed contract is: " + result.output, + ); + return result; +} +``` + +### 2. Perform a write operation + +Performing a write operation is almost the same process as the read operation, except that you encode the new value to the `set` function's ABI, and then append these arguments to the `set` function's ABI and use this as the `data` field: + +```js +async function setValueAtAddress( + clientUrl, + address, + value, + contractAbi, + fromPrivateKey, + fromPublicKey, + toPublicKey, +) { + const Web3 = require("web3"); + const Web3Quorum = require("web3js-quorum"); + const web3 = new Web3Quorum(new Web3("http://localhost:22000")); + // eslint-disable-next-line no-underscore-dangle + const functionAbi = contract._jsonInterface.find((e) => { + return e.name === "set"; + }); + const functionArgs = web3quorum.eth.abi + .encodeParameters(functionAbi.inputs, [value]) + .slice(2); + const functionParams = { + to: address, + data: functionAbi.signature + functionArgs, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], + }; + const transactionHash = await web3quorum.priv.generateAndSendRawTransaction( + functionParams, + ); + console.log(`Transaction hash: ${transactionHash}`); + const result = await web3quorum.priv.waitForTransactionReceipt( + transactionHash, + ); + return result; +} +``` + +### 3. Verify an updated value + +To verify that a value has been updated, perform a `get` call after a `set` update call. + +[Developer Quickstart]: ../quickstart.md diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/transfer-funds.md b/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/transfer-funds.md new file mode 100644 index 00000000000..ee5c2dbb56d --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/contracts/transfer-funds.md @@ -0,0 +1,126 @@ +--- +title: Transfer account funds +sidebar_position: 1 +description: funds transfer transactions +--- + +# Transfer funds between accounts in a transaction + +You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate local blockchain networks. + +This tutorial shows you how to transfer funds (ETH) between accounts in a transaction. + +## Prerequisites + +- A [private network](../quickstart.md) + +## Use `eth_sendSignedTransaction` + +The simplest way to transfer funds between externally-owned accounts is using [`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendsignedtransaction). This example uses `eth_sendSignedTransaction` and one of the [test accounts](../../reference/accounts-for-testing.md) to transfer funds to a newly created account. + +:::danger Do not use the test accounts on Ethereum Mainnet or any production network + +The private key is publicly displayed, which means the account is not secure. + +::: + +Before making the transaction, check the balances of both accounts to verify the funds transfer after the transaction. + +```js +const web3 = new Web3(host); +// Pre-seeded account with 90000 ETH +const privateKeyA = + "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; +const accountA = web3.eth.accounts.privateKeyToAccount(privateKeyA); +var accountABalance = web3.utils.fromWei( + await web3.eth.getBalance(accountA.address), +); +console.log("Account A has balance of: " + accountABalance); + +// Create a new account to transfer ETH to +var accountB = web3.eth.accounts.create(); +var accountBBalance = web3.utils.fromWei( + await web3.eth.getBalance(accountB.address), +); +console.log("Account B has balance of: " + accountBBalance); +``` + +Use the test account address (Account A) for the `from` parameter, the recipient account address (Account B) for the `to` parameter, and the amount of ETH to transfer between accounts for the `value` parameter. Sign the transaction with Account A's private key and send it using `eth_sendSignedTransaction`. + +```js +// Send some ETH from A to B +const rawTxOptions = { + nonce: web3.utils.numberToHex( + await web3.eth.getTransactionCount(accountA.address), + ), + from: accountA.address, + to: accountB.address, + value: "0x100", // Amount of ETH to transfer + gasPrice: "0x0", // ETH per unit of gas + gasLimit: "0x24A22", // Max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const tx = new Tx(rawTxOptions); +console.log("Signing transaction..."); +tx.sign(Buffer.from(accountA.privateKey.substring(2), "hex")); +console.log("Sending transaction..."); +var serializedTx = tx.serialize(); +const pTx = await web3.eth.sendSignedTransaction( + "0x" + serializedTx.toString("hex").toString("hex"), +); +console.log("tx transactionHash: " + pTx.transactionHash); +``` + +Once it completes, you can see the updated balances. + +```js +// After the transaction, there should be some ETH transferred +var accountABalance = await getAccountBalance(host, accountA); +console.log("Account A has an updated balance of: " + accountABalance); +var accountBBalance = await getAccountBalance(host, accountB); +console.log("Account B has an updatedbalance of: " + accountBBalance); +} +``` + +A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/eth_tx.js) can be found in the Developer Quickstart. + +## Use `eth_sendTransaction` + +An alternative to using `eth_sendSignedTransaction` is [`eth_sendTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendtransaction). However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account management separate for stronger security. Instead, Besu uses [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) to make the `eth_sendTransaction` API call. + +An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC node is paired with EthSigner. Refer to the [EthSigner documentation](https://docs.ethsigner.consensys.net/en/stable/) configuration details. + +Use `eth_sendTransaction` similarly to [using `eth_sendSignedTransaction`](#use-eth_sendsignedtransaction) (without the signing step which is done by EthSigner): + +```js +const web3 = new Web3(host); +// Pre-seeded account with 90000 ETH +const privateKeyA = "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; +const accountA = web3.eth.accounts.privateKeyToAccount(privateKeyA); +var accountABalance = web3.utils.fromWei(await web3.eth.getBalance(accountA.address)); +console.log("Account A has balance of: " + accountABalance); + +// Create a new account to transfer ETH to +var accountB = web3.eth.accounts.create(); +var accountBBalance = web3.utils.fromWei(await web3.eth.getBalance(accountB.address)); +console.log("Account B has balance of: " + accountBBalance); + +// Send some ETH from A to B +const txOptions = { + from: accountA.address, + to: accountB.address, + value: "0x100", // Amount of ETH to transfer + gasPrice: "0x0", // ETH per unit of gas + gasLimit: "0x24A22" // Max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const pTx = await web3.eth.sendTransaction(txOptions); +console.log("tx transactionHash: " + pTx.transactionHash); + +// After the transaction, there should be some ETH transferred +var accountABalance = await getAccountBalance(host, accountA); +console.log("Account A has an updated balance of: " + accountABalance); +var accountBBalance = await getAccountBalance(host, accountB); +console.log("Account B has an updatedbalance of: " + accountBBalance); +} +``` diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/ethash.md b/versioned_docs/version-23.4.0/private-networks/tutorials/ethash.md new file mode 100644 index 00000000000..d675ba9b356 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/ethash.md @@ -0,0 +1,223 @@ +--- +title: Create an Ethash network +sidebar_position: 5 +description: Hyperledger Besu private network using Ethash (proof of work) Consensus Protocol tutorial +--- + +# Create a private network using Ethash + +A private network provides a configurable network for testing. By configuring a low difficulty and enabling mining, this allows for fast block creation. + +You can test multi-block and multi-user scenarios on a private network before moving to one of the public testnets. + +:::danger + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +::: + +## Prerequisites + +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using Ethash. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. When the node starts, Besu saves the [node key](../../public-networks/concepts/node-keys.md) in this directory. + +Create directories for your private network, each of the three nodes, and a data directory for each node: + +```bash +Private-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 + ├── data +``` + +### 2. Create a genesis file + +The genesis file defines the genesis block of the blockchain (that is, the start of the blockchain). The genesis file includes entries for configuring the blockchain, such as the mining difficulty and initial accounts and balances. + +All nodes in a network must use the same genesis file. The [network ID](../../public-networks/concepts/network-and-chain-id.md) defaults to the `chainID` in the genesis file. The `fixeddifficulty` enables fast block mining. + +Copy the following genesis definition to a file called `privateNetworkGenesis.json` and save it in the `Private-Network` directory: + +```json +{ + "config": { + "berlinBlock": 0, + "ethash": { + "fixeddifficulty": 1000 + }, + "chainID": 1337 + }, + "nonce": "0x42", + "gasLimit": "0x1000000", + "difficulty": "0x10000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +:::warning + +Don't use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Start the first node as a bootnode + +Start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line enables: + +- Mining and specifies the account to pay mining rewards to using the [`--miner-enabled`](../../public-networks/reference/cli/options.md#miner-enabled) and [`--miner-coinbase`](../../public-networks/reference/cli/options.md#miner-coinbase) options. +- JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- All-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. +- All-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. + +:::info + +The miner coinbase account is one of the accounts defined in the genesis file. + +::: + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../assets/images/EnodeStartup.png) + +### 4. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30304 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30304 +``` + + + +The command line specifies: + +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- A data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A genesis file as for Node-1. + +### 5. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30305 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30305 +``` + + + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery. +- A data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A bootnode and genesis file as for Node-2. + +### 6. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 +``` + +The result confirms Node-1 (the node running the JSON-RPC service) has two peers (Node-2 and Node-3): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x2" +} +``` + +## Next steps + +Import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::info + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: + +Send transactions using `eth_sendRawTransaction` to [send ether or, deploy or invoke contracts](../how-to/send-transactions/index.md). + +Use the [JSON-RPC API](../../public-networks/how-to/use-besu-api/json-rpc.md). + +Start a node with the [`--rpc-ws-enabled`](../../public-networks/reference/cli/options.md#rpc-ws-enabled) option and use the [RPC Pub/Sub API](../../public-networks/how-to/use-besu-api/rpc-pubsub.md). + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the private network in the future, start from [3. Start the first node as a bootnode](#3-start-the-first-node-as-a-bootnode). + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/ibft/_category_.json b/versioned_docs/version-23.4.0/private-networks/tutorials/ibft/_category_.json new file mode 100644 index 00000000000..c90421ed03c --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/ibft/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create an IBFT 2.0 network", + "position": 3 +} diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/ibft/index.md b/versioned_docs/version-23.4.0/private-networks/tutorials/ibft/index.md new file mode 100644 index 00000000000..f7106f73d4b --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/ibft/index.md @@ -0,0 +1,374 @@ +--- +description: Hyperledger Besu private network using the IBFT 2.0 (Proof of Authority) consensus protocol +--- + +# Create a private network using IBFT 2.0 + +A private network provides a configurable network for testing. This private network uses the [IBFT 2.0 (proof of authority) consensus protocol](../../how-to/configure/consensus/ibft.md). + +:::danger + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires 4 validators to be Byzantine fault tolerant. + +::: + +## Prerequisites + +- [Hyperledger Besu](../../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using IBFT 2.0 with four nodes. The four nodes are all validators. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. + +Create directories for your private network, each of the four nodes, and a data directory for each node: + +```bash +IBFT-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +├── Node-3 +│   ├── data +└── Node-4 + ├── data +``` + +### 2. Create a configuration file + +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `IBFT-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the configuration file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +:::warning + +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `IBFT-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```bash +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │   ├── key + │   └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │   ├── key + │   └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │   ├── key + │   └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the IBFT-Network directory + +Copy the `genesis.json` file to the `IBFT-Network` directory. + +### 5. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```bash +IBFT-Network/ +├── genesis.json +├── Node-1 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-2 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-3 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-4 +│ ├── data +│ │    ├── key +│ │    ├── key.pub +``` + +### 6. Start the first node as the bootnode + +In the `Node-1` directory, start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line: + +- Specifies the data directory for Node-1 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- Enables the JSON-RPC API using the [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables the ETH, NET, and IBFT APIs using the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) option. +- Enables all-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist) option. +- Enables all-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) + +### 7. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + + +The command line specifies: + +- The data directory for Node-2 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 8. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + + +The command line specifies: + +- The data directory for Node-3 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 9. Start Node-4 + +Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + + ```bash + besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 + ``` + +# Windows + + ```bash + besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 + ``` + + + +The command line specifies: + +- The data directory for Node-4 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 10. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`ibft_getvalidatorsbyblocknumber`](../../reference/api/index.md#ibft_getvalidatorsbyblocknumber) method and confirm the network has four validators: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' localhost:8545 +``` + +The result displays the four validators: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x1e326b6da177ede2d3eb6d7247bd9f6901d40234", + "0x4aaac297fefe4466ebcb0b23ab90c5f466b11556", + "0xa267ead2e91e1673e0943b925176b51d9cd4f6d2", + "0xe3e680bc0ff485d1d415a384721f19e0db65fea7" + ] +} +``` + +Look at the logs to confirm Besu is producing blocks: + +```bash +2020-12-21 07:22:17.883+10:00 | EthScheduler-Workers-0 | INFO | PersistBlockTask | Imported #1 / 0 tx / 0 om / 0 (0.0%) gas / (0xde088192f27ca376eea969cb7a4a1de445bd923fde0444194c88e630f7705584) in 0.010s. Peers: 4 +2020-12-21 07:22:19.057+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=2, Round=0}, hash=0x2ca2652fa79ae2b3b6aadcfb13d5d362ffd6207c3b5ae47971e04eb9d05deaa9 +2020-12-21 07:22:21.044+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=3, Round=0}, hash=0x5d9a06cd17127712cfae7d1c25f705f302e146f4b64a73de3c814e1b5a3f9a16 +2020-12-21 07:22:23.049+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=4, Round=0}, hash=0x843981375f4cb2bb0f33a09b647ac27da5df2c539d940d8344c907eede57829c +2020-12-21 07:22:25.060+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=5, Round=0}, hash=0x82b2069961d9185f7857cad1123de72d715729e122441335db486ea436834d6e +``` + +:::info + +If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), the network will not start producing blocks. + +The logs for each node should indicate the public key was loaded from the `data/key` directory: + +```bash +2020-12-21 07:16:18.360+10:00 | main | INFO | KeyPairUtil | Loaded public key 0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc from /IBFT-Network/Node-1/data/key +``` + +If the keys were not copied to the correct directory, Besu creates a key when starting up: + +```bash +2020-12-21 07:33:11.458+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /IBFT-Network/Node-1/data/key +``` + +If a new key was created, the validator key specified in the configuration does not match the created key and the node cannot participate in creating blocks. + +::: + +## Next steps + +Use the [IBFT API](../../reference/api/index.md#ibft-20-methods) to remove or add validators. + +:::note + +To add or remove nodes as validators you need the node address. The directory [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the name. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires four validators to be Byzantine fault tolerant. + +::: + +Import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](../quickstart.md#create-a-transaction-using-metamask). + +:::info + +Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). + +::: + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the IBFT 2.0 network in the future, start from [6. Start First Node as Bootnode](#6-start-the-first-node-as-the-bootnode). + +::: + + + +[IBFT 2.0 (proof of authority)consensus protocol]: ../../how-to/configure/consensus/ibft.md + + + +\*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/ibft/validators.md b/versioned_docs/version-23.4.0/private-networks/tutorials/ibft/validators.md new file mode 100644 index 00000000000..445d39e3e29 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/ibft/validators.md @@ -0,0 +1,123 @@ +--- +title: Add and removing IBFT 2.0 validators +sidebar_position: 1 +description: Adding and removing IBFT 2.0 validators +--- + +# Add and remove IBFT 2.0 validators + +This example walks through [adding and removing an IBFT 2.0 validator](../../how-to/configure/consensus/ibft.md#add-and-remove-validators). + +## Prerequisites + +- [IBFT 2.0 network as configured in the IBFT 2.0 tutorial](index.md) + +## Add a validator + +### 1. Create directories + +Create a working directory and a data directory for the new node that needs to be added: + +```bash +mkdir -p Node-5/data +``` + +### 2. Start the node + +Change into the working directory for the new Node-5 and start the node, specifying the [Node-1 enode URL](index.md#6-start-the-first-node-as-the-bootnode) as the bootnode: + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30307 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8549 +``` + +The command line specifies: + +- The data directory for Node-5 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](index.md#6-start-the-first-node-as-the-bootnode). + +### 3. Copy the address of the node + +Copy the address of the node. You can find the address in the logs when starting the new node: + +```bash +2021-05-28 09:49:00.881+10:00 | main | INFO | DefaultP2PNetwork | Node address 0x90626e6a67445aabf1c0615410d108d4733aa90b +``` + +Or use the [`public-key export-address`](../../../public-networks/reference/cli/subcommands.md#export-address) subcommand: + + + +# Subcommand + +```bash +besu --data-path=IBFT-Network/Node-5/data public-key export-address +``` + +# Output + +```bash +0x90626e6a67445aabf1c0615410d108d4733aa90b +``` + + + +### 4. Propose adding the new validator + +Propose adding the new validator from more than half the number of current validators, using [`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the proposed validator and `true`: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0x90626e6a67445aabf1c0615410d108d4733aa90b", true], "id":1}' http://127.0.0.1:8545 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +Repeat the proposal process for this candidate node from at least two of the other nodes. + +### 5. Verify the addition of the new validator + +Verify that the new validator is now in the list of validators using [`ibft_getValidatorsByBlockNumber`](../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber): + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` + +# JSON result + +```json +[ + "0x189d23d201b03ae1cf9113672df29a5d672aefa3", + "0x2aabbc1bb9bacef60a09764d1a1f4f04a47885c1", + "0x44b07d2c28b8ed8f02b45bd84ac7d9051b3349e6", + "0x4c1ccd426833b9782729a212c857f2f03b7b4c0d", + "0x90626e6a67445aabf1c0615410d108d4733aa90b" +] +``` + + + +The list of validators contains 5 addresses now. + +## Remove a validator + +The process for removing a validator is similar to [adding a validator](#add-a-validator) starting from step 2, except you specify `false` as the second parameter of [`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote). diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/_category_.json b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/_category_.json new file mode 100644 index 00000000000..5a498fa215c --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy using Kubernetes", + "position": 9 +} diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/charts.md b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/charts.md new file mode 100644 index 00000000000..ff552ab5cf3 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/charts.md @@ -0,0 +1,502 @@ +--- +title: Deploying Charts +sidebar_position: 3 +description: Deploying Besu Helm Charts for a Kubernetes cluster +--- + +# Deploy charts + +You can deploy Besu Helm charts for a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) + +## Provision with Helm charts + +Helm is a method of packaging a collection of objects into a chart which can then be deployed to the cluster. After you have cloned the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change the directory to `helm` for the rest of this tutorial. + +```bash +cd helm +``` + +Each helm chart has the following key-map values which you will need to set depending on your needs. The `cluster.provider` is used as a key for the various cloud features enabled. Please specify only one cloud provider, not both. At present, the charts have full support for cloud native services in both AWS and Azure. Please note that if you use GCP, IBM etc please set `cluster.provider: local` and set `cluster.cloudNativeServices: false`. + +Please update the `aws` or `azure` map as shown below if you deploy to either cloud provider. + +```bash +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) + reclaimPolicy: Delete # set to either Retain or Delete; note that PVCs and PVs will still exist after a 'helm delete'. Setting to Retain will keep volumes even if PVCs/PVs are deleted in kubernetes. Setting to Delete will remove volumes from EC2 EBS when PVC is deleted + +quorumFlags: + privacy: false + removeKeysOnDelete: false + +aws: + # the aws cli commands uses the name 'quorum-node-secrets-sa' so only change this if you altered the name + serviceAccountName: quorum-node-secrets-sa + # the region you are deploying to + region: ap-southeast-2 + +azure: + # the script/bootstrap.sh uses the name 'quorum-pod-identity' so only change this if you altered the name + identityName: quorum-pod-identity + # the clientId of the user assigned managed identity created in the template + identityClientId: azure-clientId + keyvaultName: azure-keyvault + # the tenant ID of the key vault + tenantId: azure-tenantId + # the subscription ID to use - this needs to be set explictly when using multi tenancy + subscriptionId: azure-subscriptionId +``` + +Setting the `cluster.cloudNativeServices: true`: + +- Stores keys in Azure Key Vault or AWS Secrets Manager. +- Uses Azure Managed Identities or AWS Identity and Access Management for pod identity access. + +:::note + +You can customize any of the charts in this repository to suit your requirements, and make pull requests to extend functionality. + +::: + +### 1. Check that you can connect to the cluster with `kubectl` + +Verify kubectl is connected to cluster using: (use the latest version) + +```bash +kubectl version +``` + +The result looks similar to: + +```bash +Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.1", GitCommit:"86ec240af8cbd1b60bcc4c03c20da9b98005b92e", GitTreeState:"clean", BuildDate:"2021-12-16T11:41:01Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"} +Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"} +``` + +### 2. Create the namespace + +This tutorial isolates groups of resources (for example, StatefulSets and Services) within a single cluster. + +:::note + +The rest of this tutorial uses `besu` as the namespace, but you're free to pick any name when deploying, as long as it's consistent across the [infrastructure scripts](cluster.md) and charts. + +::: + +Run the following in a terminal window: + +```bash +kubectl create namespace besu +``` + +### 3. Deploy the monitoring chart + +This chart deploys Prometheus and Grafana to monitor the metrics of the cluster, nodes and state of the network. + +Update the admin `username` and `password` in the [monitoring values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/monitoring.yml). Configure alerts to the receiver of your choice (for example, email or Slack), then deploy the chart using: + +```bash +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm repo update +helm install monitoring prometheus-community/kube-prometheus-stack --version 34.10.0 --namespace=besu --values ./values/monitoring.yml --wait +kubectl --namespace besu apply -f ./values/monitoring/ +``` + +Metrics are collected via a [ServiceMonitor](https://github.com/prometheus-operator/prometheus-operator/blob/7c77626e5e270a2530e187b185d45eeed8a773bf/Documentation/user-guides/getting-started.md) that scrapes each Besu pod, using given [`annotations`](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) which specify the port and path to use. For example: + +```bash + template: + metadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: 9545 + prometheus.io/path: "/metrics" +``` + +:::warning + +For production use cases, configure Grafana with one of the supported [native auth mechanisms](https://grafana.com/docs/grafana/latest/auth/). + +::: + +![k8s-metrics](../../../assets/images/kubernetes-grafana.png) + +Optionally you can also deploy the [Elastic Stack](https://www.elastic.co/elastic-stack/) to view logs (and metrics). + +```bash +helm repo add elastic https://helm.elastic.co +helm repo update +# if on cloud +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace quorum --values ./values/elasticsearch.yml +# if local - set the replicas to 1 +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace quorum --values ./values/elasticsearch.yml --set replicas=1 --set minimumMasterNodes: 1 +helm install kibana --version 7.17.1 elastic/kibana --namespace quorum --values ./values/kibana.yml +helm install filebeat --version 7.17.1 elastic/filebeat --namespace quorum --values ./values/filebeat.yml +``` + +If you install `filebeat`, please create a `filebeat-*` index pattern in `kibana`. All the logs from the nodes are sent to the `filebeat` index. If you use The Elastic stack for logs and metrics, please deploy `metricbeat` in a similar manner to `filebeat` and create an index pattern in Kibana. + +![k8s-elastic](../../../assets/images/kubernetes-elastic.png) + +To connect to Kibana or Grafana, we also need to deploy an ingress so you can access your monitoring endpoints publicly. We use Nginx as our ingress here, and you are free to configure any ingress per your requirements. + +```bash +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +helm install quorum-monitoring-ingress ingress-nginx/ingress-nginx \ + --namespace quorum \ + --set controller.ingressClassResource.name="monitoring-nginx" \ + --set controller.ingressClassResource.controllerValue="k8s.io/monitoring-ingress-nginx" \ + --set controller.replicaCount=1 \ + --set controller.nodeSelector."kubernetes\.io/os"=linux \ + --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.service.externalTrafficPolicy=Local + +kubectl apply -f ../ingress/ingress-rules-monitoring.yml +``` + +Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard or on the command line `kubectl -n quorum get services quorum-monitoring-ingress-ingress-nginx-controller`. + +:::note + +We refer to the ingress here as `external-nginx` because it deals with monitoring endpoints specifically. We also deploy a second ingress called `network-ingress` which is for the blockchain nodes only in [step 8](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) + +::: + +![`k8s-ingress-external`](../../../assets/images/kubernetes-ingress-ip.png) + +You can view the Besu dashboard by going to: + +```bash +http:///d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s +``` + +You can view the Kibana dashboard (if deployed) by going to: + +```bash +http:///kibana +``` + +### 4. Deploy the genesis chart + +The genesis chart creates the genesis file and keys for the validators. + +:::warning + +It's important to keep the release names of the initial validator pool as per this tutorial, that is `validator-n`, where `n` is the node number. Any validators created after the initial pool can be named to anything you like. + +::: + +The override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) looks like below: + +```bash +--- +quorumFlags: + removeGenesisOnDelete: true + +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false + +aws: + # the aws cli commands uses the name 'quorum-node-secrets-sa' so only change this if you altered the name + serviceAccountName: quorum-node-secrets-sa + # the region you are deploying to + region: ap-southeast-2 + +azure: + # the script/bootstrap.sh uses the name 'quorum-pod-identity' so only change this if you altered the name + identityName: quorum-pod-identity + # the clientId of the user assigned managed identity created in the template + identityClientId: azure-clientId + keyvaultName: azure-keyvault + # the tenant ID of the key vault + tenantId: azure-tenantId + # the subscription ID to use - this needs to be set explictly when using multi tenancy + subscriptionId: azure-subscriptionId + +# the raw Genesis config +# rawGenesisConfig.blockchain.nodes set the number of validators/signers +rawGenesisConfig: + genesis: + config: + chainId: 1337 + algorithm: + consensus: qbft # choose from: ibft | qbft | raft | clique + blockperiodseconds: 10 + epochlength: 30000 + requesttimeoutseconds: 20 + gasLimit: '0x47b760' + difficulty: '0x1' + coinbase: '0x0000000000000000000000000000000000000000' + blockchain: + nodes: + generate: true + count: 4 + accountPassword: 'password' +``` + +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeGenesisOnDelete: true` tells the chart to delete the genesis file when the chart is deleted. If you may wish to retain the genesis on deletion, please set that value to `false`. + +The last config item is `rawGenesisConfig` which has details of the chain you are creating, please edit any of the parameters in there to match your requirements. To set the number of initial validators set the `rawGenesisConfig.blockchain.nodes` to the number that you'd like. We recommend using the Byzantine formula of `N=3F+1` when setting the number of validators. + +One more thing to note is that when `cluster.cloudNativeServices: true` is set, the genesis job will not add the [Quickstart](../quickstart.md) test accounts into the genesis file. + +When you are ready deploy the chart with : + +```bash +cd helm +helm install genesis ./charts/besu-genesis --namespace besu --create-namespace --values ./values/genesis-besu.yml +``` + +Once completed, view the genesis and enodes (the list of static nodes) configuration maps that every Besu node uses, and the validator and bootnode node keys as secrets. + +![k8s-genesis-configmaps](../../../assets/images/kubernetes-genesis-configmaps.png) + +![k8s-genesis-secrets](../../../assets/images/kuberenetes-genesis-secrets.png) + +### 5. Deploy the bootnodes + +This is an optional but recommended step. In a production setup we recommend the use of two ore more bootnodes for best practices. Each Besu node has a map that tells the StatefulSet what to deploy and how to clean up. The default `values.yml` for the StatefulSet define the following flags which are present in all the override values files. + +```bash +--- +quorumFlags: + privacy: false + removeKeysOnDelete: true + isBootnode: true # set this to true if this node is a bootnode + usesBootnodes: true # set this to true if the network you are connecting to use a bootnode/s that are deployed in the cluster + +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false + reclaimPolicy: Delete # set to either Retain or Delete; note that PVCs and PVs will still exist after a 'helm delete'. Setting to Retain will keep volumes even if PVCs/PVs are deleted in kubernetes. Setting to Delete will remove volumes from EC2 EBS when PVC is deleted + +aws: + # the aws cli commands uses the name 'quorum-node-secrets-sa' so only change this if you altered the name + serviceAccountName: quorum-node-secrets-sa + # the region you are deploying to + region: ap-southeast-2 + +azure: + # the script/bootstrap.sh uses the name 'quorum-pod-identity' so only change this if you altered the name + identityName: quorum-pod-identity + # the clientId of the user assigned managed identity created in the template + identityClientId: azure-clientId + keyvaultName: azure-keyvault + # the tenant ID of the key vault + tenantId: azure-tenantId + # the subscription ID to use - this needs to be set explictly when using multi tenancy + subscriptionId: azure-subscriptionId + +node: + besu: + metrics: + serviceMonitorEnabled: true + resources: + cpuLimit: 1 + cpuRequest: 0.1 + memLimit: "2G" + memRequest: "1G" +``` + +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. If you may wish to retain the keys on deletion, please set that value to `false`. + +For the bootnodes only, set the `quorumFlags.isBootnode: true`. When using bootnodes you have to also set `quorumFlags.usesBootnodes: true` to indicate that all nodes on the network will use these bootnodes. + +:::note + +If you use bootnodes, you must set `quorumFlags.usesBootnodes: true` in the override values.yaml for every other node type, that is validators.yaml, txnode.yaml and reader.yaml + +::: + +```bash +helm install bootnode-1 ./charts/besu-node --namespace besu --values ./values/bootnode.yml +helm install bootnode-2 ./charts/besu-node --namespace besu --values ./values/bootnode.yml +``` + +Once complete, you see two StatefulSets, and the two bootnodes discover themselves and peer. Because there are no validators present yet, there are no blocks created, as seen in the following logs. + +![k8s-bootnode-logs](../../../assets/images/kubernetes-bootnode-logs.png) + +### 6. Deploy the validators + +The validators peer with the bootnodes and themselves, and when a majority of the validators have peered, blocks are proposed and created on the chain. + +These are the next set of nodes that we will deploy. The charts use four validators (default) to replicate best practices for a network. The override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/validator.yml) for the StatefulSet looks like below: + +```bash +--- +quorumFlags: + privacy: false + removeKeysOnDelete: false + isBootnode: false # set this to true if this node is a bootnode + usesBootnodes: true # set this to true if the network you are connecting to use a bootnode/s that are deployed in the cluster +``` + +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. If you may wish to retain the keys on deletion, please set that value to `false`. + +:::warning + +Please note that if you delete a majority of the validators, the network will halt. Additionally, if the validator keys are deleted you may not be able to recover as you need a majority of the validators up to vote to add new validators into the pool + +::: + +When using bootnodes (if deployed in the previous step) you have to also set `quorumFlags.usesBootnodes: true` to indicate that all nodes on the network will use these bootnodes. + +For the initial validator pool we set all the node flags to `false` and then deploy. + +```bash +helm install validator-1 ./charts/besu-node --namespace besu --values ./values/validator.yml +helm install validator-2 ./charts/besu-node --namespace besu --values ./values/validator.yml +helm install validator-3 ./charts/besu-node --namespace besu --values ./values/validator.yml +helm install validator-4 ./charts/besu-node --namespace besu --values ./values/validator.yml +``` + +:::warning + +It's important to keep the release names of the validators the same as it is tied to the keys that the genesis chart creates. So we use `validator-1`, `validator-2`, etc. in the following command. + +::: + +Once completed, you may need to give the validators a few minutes to peer and for round changes, depending on when the first validator was spun up, before the logs display blocks being created. + +![k8s-validator-logs](../../../assets/images/kubernetes-validator-logs.png) + +### 7. Add/Remove additional validators to the validator pool + +To add (or remove) more validators to the initial validator pool, you need to deploy a node such as an RPC node (step 8) and then [vote](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) that node in. The vote API call must be made on a majority of the existing pool and the new node will then become a validator. + +Please refer to the [Ingress Section](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) for details on making the API calls from your local machine or equivalent. + +### 8. Deploy RPC or Transaction nodes + +An RPC node is simply a node that can be used to make public transactions or perform read heavy operations such as when connected to a chain explorer like [BlockScout](https://github.com/blockscout/blockscout). + +The RPC override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/reader.yml) for the StatefulSet looks identical to that of the validators above, and will create it's own node keys before the node starts. + +To deploy an RPC node: + +```bash +helm install rpc-1 ./charts/besu-node --namespace besu --values ./values/reader.yml +``` + +A Transaction or Member node in turn is one which has an accompanying Private Transaction Manager, such as Tessera; which allow you to make private transactions between nodes. + +The Transaction override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) for the StatefulSet looks identical to that of the validators above and only has `quorumFlags.privacy: true` to indicate that it is deploying a pair of GoQuorum and Tessera nodes. + +To deploy a Transaction or Member node: + +```bash +helm install member-1 ./charts/besu-node --namespace besu --values ./values/txnode.yml +``` + +Logs for `member-1` resemble the following for Tessera: + +![`k8s-tx-tessera-logs`](../../../assets/images/kubernetes-tx-tessera-logs.png) + +Logs for Besu resemble the following: + +![`k8s-tx-Besu-logs`](../../../assets/images/kubernetes-tx-Besu-logs.png) + +:::note + +In these examples we use `member-1` and `rpc-1` as release names for the deployments. You can pick any release name that you'd like to use in place of those as per your requirements. + +::: + +### 9. Connect to the node from your local machine via an ingress + +In order to view the Grafana dashboards or connect to the nodes to make transactions from your local machine you can deploy an ingress controller with rules. We use the `ingress-nginx` ingress controller which can be deployed as follows: + +```bash +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +helm install quorum-network-ingress ingress-nginx/ingress-nginx \ + --namespace quorum \ + --set controller.ingressClassResource.name="network-nginx" \ + --set controller.ingressClassResource.controllerValue="k8s.io/network-ingress-nginx" \ + --set controller.replicaCount=1 \ + --set controller.nodeSelector."kubernetes\.io/os"=linux \ + --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.service.externalTrafficPolicy=Local +``` + +Use [pre-defined rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) to test functionality, and alter to suit your requirements (for example, restrict access for API calls to trusted CIDR blocks). + +Edit the [rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) file so that the service names match your release name. In the example, we deployed a transaction node with the release name `member-1` so the corresponding service is called `besu-node-member-1`. Once you have settings that match your deployments, deploy the rules as follows: + +```bash +kubectl apply -f ../ingress/ingress-rules-besu.yml +``` + +Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard or on the command line `kubectl -n quorum get services quorum-network-ingress-ingress-nginx-controller`. + +![`k8s-ingress`](../../../assets/images/kubernetes-ingress-ip.png) + +The following is an example RPC call, which confirms that the node running the JSON-RPC service is syncing: + + + +# curl HTTP request + +```bash +curl -v -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http:///rpc +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4e9" +} +``` + + + +### 10. Blockchain explorer + +You can deploy [BlockScout](https://github.com/blockscout/blockscout) to aid with monitoring the blockchain. To do this, update the [BlockScout values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/blockscout-besu.yml) and set the `database` and `secret_key_base` values. + +:::important + +Changes to the database requires changes to both the `database` and the `blockscout` dictionaries. + +::: + +Once completed, deploy the chart using: + +```bash +helm dependency update ./charts/blockscout +helm install blockscout ./charts/blockscout --namespace quorum --values ./values/blockscout-goquorum.yaml +``` + +You can optionally deploy the [Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight blockchain explorer. The Quorum Explorer is not recommended for use in production and is intended for demonstration or Development purposes only. The Explorer can give an overview over the whole network, such as querying each node on the network for node or block information, voting (add/remove) validators from the network, demonstrating a SimpleStorage smart contract with privacy enabled, and sending transactions between wallets as you would do in MetaMask. Please see the [Explorer](quorum-explorer.md) page for details on how to use the application. + +:::warning + +The accounts listed in the file below are for test purposes only and should not be used on a production network. + +::: + +To deploy the application, update the [Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) with details of your nodes and endpoints and then deploy. + +```bash +helm install quorum-explorer ./charts/explorer --namespace besu --values ./values/explorer-besu.yaml +``` + +You will also need deploy the ingress (if not already done in [Monitoring](#3-deploy-the-monitoring-chart) to access the endpoint on `http:///explorer` + +![`k8s-explorer`](../../../assets/images/kubernetes-explorer.png) diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/cluster.md b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/cluster.md new file mode 100644 index 00000000000..fa0d46eb958 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/cluster.md @@ -0,0 +1,228 @@ +--- +title: Create a cluster +sidebar_position: 2 +description: Create a cluster for deployment +--- + +# Create a cluster + +You can create a [local](#local-clusters) or [cloud](#cloud-clusters) cluster to deploy a Besu network using Kubernetes. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) +- Install [AWS CLI](https://aws.amazon.com/cli/) and [`eksctl`](https://eksctl.io/) for AWS EKS clusters +- Install [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) for Azure AKS clusters +- Install the cloud-specific CLI + +## Local Clusters + +Use one of several options to create a local cluster. Select one listed below, or another that you're comfortable with. + +### Minikube + +[Minikube](https://minikube.sigs.k8s.io/docs/start/) is one of the most popular options to spin up a local Kubernetes cluster for development. You can [install a version](https://minikube.sigs.k8s.io/docs/start/) based on your architecture. + +:::note + +We recommend at least 2 CPUs and 16GB of RAM. + +::: + +To start the cluster, run the following command: + +```bash +minikube start --cpus 2 --memory 16384 --cni auto +``` + +### kind + +[kind (Kubernetes in Docker)](https://kind.sigs.k8s.io) is a lightweight tool for running local Kubernetes clusters. The [installation](https://kind.sigs.k8s.io/docs/user/quick-start#installation) is similar to [Minikube](#minikube). + +To start the cluster, run the following command: + +```bash +kind create cluster +``` + +### Rancher + +[Rancher](https://github.com/rancher-sandbox/rancher-desktop/) is a lightweight open source desktop application for Mac, Windows, and Linux. It provides Kubernetes and container management, and allows you to choose the version of Kubernetes to run. + +It can build, push, pull, and run container images. Built container images can be run without needing a registry. + +:::note + +The official Docker-CLI is not supported but rather uses [nerdctl](https://github.com/containerd/nerdctl) which is a Docker-CLI compatible tool for containerd, and is automatically installed with Rancher Desktop. + +::: + +:::note + +For Windows, you must [install Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install) to install Rancher Desktop. + +Refer to the [official Rancher Desktop documentation](https://docs.rancherdesktop.io/) for system requirements and installation instructions. + +::: + +## Cloud clusters + +### AWS EKS + +[AWS Elastic Kubernetes Service (AWS EKS)](https://aws.amazon.com/eks/) is one of the most popular platforms to deploy Hyperledger Besu. + +To create a cluster in AWS, you must install the [AWS CLI](https://aws.amazon.com/cli/) and [`eksctl`](https://eksctl.io/). + +The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) comprises the base infrastructure used to build the cluster and other resources in AWS. We also use some native services with the cluster for performance and best practices, these include: + +- [Pod identities](https://github.com/aws/amazon-eks-pod-identity-webhook). +- [Secrets Store CSI drivers](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html). +- Dynamic storage classes backed by AWS EBS. The [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) are fixed sizes and can be updated as you grow via helm updates, and won't need to re-provision the underlying storage class. +- [CNI](https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html) networking mode for EKS. By default, EKS clusters use `kubenet` to create a virtual network and subnet. Nodes get an IP address from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods receive an IP address "hidden" behind the node IP. + + :::note + + This approach reduces the number of IP addresses that you must reserve in your network space for pods, but constrains what can connect to the nodes from outside the cluster (for example, on-premise nodes or those on another cloud provider). + + ::: + +AWS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed directly. The IP addresses must be unique across your network space, and must be planned in advance. Each node has a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses per node are then reserved up front for that node. This approach requires more planning, and can lead to IP address exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. + +:::warning + +EKS clusters must not use 169.254.0.0/16, 172.30.0.0/16, 172.31.0.0/16, or 192.0.2.0/24 for the Kubernetes service address range. + +::: + +To provision the cluster: + +1. Update [cluster.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/aws/templates/cluster.yml) + +2. Deploy the template: + + ```bash + eksctl create cluster -f ./templates/cluster.yml + ``` + +3. Your `.kube/config` should be connected to the cluster automatically, but if not, run the commands below and replace `AWS_REGION` and `CLUSTER_NAME` with details that are specific to your deployment. + + ```bash + aws sts get-caller-identity + aws eks --region AWS_REGION update-kubeconfig --name CLUSTER_NAME + ``` + +4. After the deployment completes, provision the EBS drivers for the volumes. While it is possible to use the in-tree `aws-ebs` driver that's natively supported by Kubernetes, it is no longer being updated and does not support newer EBS features such as the [cheaper and better gp3 volumes](https://stackoverflow.com/questions/68359043/whats-the-difference-between-ebs-csi-aws-com-vs-kubernetes-io-aws-ebs-for-provi). The `cluster.yml` file (from the steps above) that is included in this folder automatically deploys the cluster with the EBS IAM policies, but you need to install the EBS CSI drivers. This can be done through the AWS Management Console for simplicity, or via a CLI command as below. Replace `CLUSTER_NAME`, `AWS_REGION` and `AWS_ACCOUNT` with details that are specific to your deployment. + + ```bash + eksctl create iamserviceaccount --name ebs-csi-controller-sa --namespace kube-system --cluster CLUSTER_NAME --region AWS_REGION --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --approve --role-only --role-name AmazonEKS_EBS_CSI_DriverRole + + eksctl create addon --name aws-ebs-csi-driver --cluster CLUSTER_NAME --region AWS_REGION --service-account-role-arn arn:aws:iam::AWS_ACCOUNT:role/AmazonEKS_EBS_CSI_DriverRole --force + ``` + +5. Once the deployment is completed, provision the Secrets Manager IAM and CSI driver. Use `besu` (or equivalent) for `NAMESPACE` and replace `CLUSTER_NAME`, `AWS_REGION` and `AWS_ACCOUNT` with details that are specific to your deployment. + + ```bash + helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts + helm install --namespace kube-system --create-namespace csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver + kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml + + POLICY_ARN=$(aws --region AWS_REGION --query Policy.Arn --output text iam create-policy --policy-name quorum-node-secrets-mgr-policy --policy-document '{ + "Version": "2012-10-17", + "Statement": [ { + "Effect": "Allow", + "Action": ["secretsmanager:CreateSecret","secretsmanager:UpdateSecret","secretsmanager:DescribeSecret","secretsmanager:GetSecretValue","secretsmanager:PutSecretValue","secretsmanager:ReplicateSecretToRegions","secretsmanager:TagResource"], + "Resource": ["arn:aws:secretsmanager:AWS_REGION:AWS_ACCOUNT:secret:besu-node-*"] + } ] + }') + + # If you have deployed the above policy before, you can acquire its ARN: + POLICY_ARN=$(aws iam list-policies --scope Local \ + --query 'Policies[?PolicyName==`quorum-node-secrets-mgr-policy`].Arn' \ + --output text) + + eksctl create iamserviceaccount --name quorum-node-secrets-sa --namespace NAMESPACE --region=AWS_REGION --cluster CLUSTER_NAME --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts + ``` + + :::warning + + The above command creates a service account called `quorum-node-secrets-sa` and is preconfigured in the helm charts override `values.yml` files, for ease of use. + + ::: + +6. Optionally, deploy the [kubernetes dashboard](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws/templates/k8s-dashboard). + +7. You can now use your cluster and you can deploy [Helm charts](charts.md) to it. + +### Azure Kubernetes Service + +[Azure Kubernetes Service (AKS)](https://azure.microsoft.com/en-us/services/kubernetes-service/) is another popular cloud platform that you can use to deploy Besu. To create a cluster in Azure, you must install the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) and have admin rights on your Azure subscription to enable some preview features on AKS. + +The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) comprises the base infrastructure used to build the cluster and other resources in Azure. We also make use Azure native services and features after the cluster is created. These include: + +- [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity). +- [Secrets Store CSI drivers](https://docs.microsoft.com/en-us/azure/key-vault/general/key-vault-integrate-kubernetes). +- Dynamic storage classes backed by Azure Files. The [volume claims](https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv) are fixed sizes and can be updated as you grow via helm updates, and won't need to re-provision the underlying storage class. +- [CNI](https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni) networking mode for AKS. By default, AKS clusters use `kubenet`, to create a virtual network and subnet. Nodes get an IP address from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods receive an IP address "hidden" behind the node IP. + + :::note + + This approach reduces the number of IP addresses you must reserve in your network space for pods to use, but constrains what can connect to the nodes from outside the cluster (for example, on-premise nodes or other cloud providers). + + ::: + +AKS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed directly. These IP addresses must be unique across your network space, and must be planned in advance. Each node has a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses per node are then reserved up front for that node. This approach requires more planning, and can leads to IP address exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. + +:::warning + +Please do not create more than one AKS cluster in the same subnet. AKS clusters may not use `169.254.0.0/16`, `172.30.0.0/16`, `172.31.0.0/16`, or `192.0.2.0/24` for the Kubernetes service address range. + +::: + +To provision the cluster: + +1. Enable the preview features that allow you to use AKS with CNI, and a managed identity to authenticate and run cluster operations with other services. We also enable [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity) which use the managed identity. This is in preview, so you must enable this feature by registering the `EnablePodIdentityPreview` feature: + + ```bash + az feature register --name EnablePodIdentityPreview --namespace Microsoft.ContainerService + ``` + + This takes a little while and you can check on progress by running: + + ```bash + az feature list --namespace Microsoft.ContainerService -o table + ``` + + Install or update your local Azure CLI with preview features: + + ```bash + az extension add --name aks-preview + az extension update --name aks-preview + ``` + +1. Create a resource group if you don't already have one: + + ```bash + az group create --name BesuGroup --location "East US" + ``` + +1. Deploy the template: + + 1. Navigate to the [Azure portal](https://portal.azure.com), select **+ Create a resource** in the upper left corner. + 1. Search for `Template deployment (deploy using custom templates)` and select **Create**. + 1. Select **Build your own template in the editor**. + 1. Remove the contents (JSON) in the editor and paste in the contents of [`azuredeploy.json`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/arm/azuredeploy.json) + 1. Select **Save**. + 1. Input provisioning parameters in the displayed user interface. + +1. Provision the drivers: + + 1. Run the [bootstrap](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/scripts/bootstrap.sh) script. + 1. Use `besu` for `AKS_NAMESPACE`, and update `AKS_RESOURCE_GROUP`, `AKS_CLUSTER_NAME`, and `AKS_MANAGED_IDENTITY` in the commands below to match your settings and deployed resources from step 3. + + ```bash + ./scripts/bootstrap.sh "AKS_RESOURCE_GROUP" "AKS_CLUSTER_NAME" "AKS_MANAGED_IDENTITY" "AKS_NAMESPACE" + ``` + +1. You can now use your cluster and you can deploy [Helm charts](charts.md) to it. diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/index.md b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/index.md new file mode 100644 index 00000000000..370a7b6d7cb --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/index.md @@ -0,0 +1,136 @@ +--- +title: Deploy a Hyperledger Besu private network with Kubernetes +description: Deploying Hyperledger Besu with Kubernetes +--- + +# Deploy Besu using Kubernetes + +Use the [reference implementations](https://github.com/ConsenSys/besu-kubernetes) to install private networks using Kubernetes (K8s). Reference implementations are available using: + +- [Helm](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm). +- [Helmfile](https://github.com/roboll/helmfile). +- [`kubectl`](https://github.com/ConsenSys/besu-kubernetes/tree/master/playground/kubectl). + +Familiarize yourself with the reference implementations and customize them for your requirements. + +## Quorum-Kubernetes + +[Quorum-Kubernetes](https://github.com/ConsenSys/quorum-Kubernetes) is a repository containing Kubernetes manifests and Helm charts that you can customize and deploy on a local cluster or in the cloud. + +:::important + +We recommend starting with the [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) directory and working through the example setups before moving to the [`Helm charts`](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm/) directory. + +::: + +The `helm` directory contains charts for the various components, and each chart has a `cluster` map with features that you can toggle. + +```bash +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) +``` + +Setting `cluster.cloudNativeServices: true` stores keys in AWS Secrets Manager or Azure Key Vault instead of Kubernetes Secrets, and will also make use of AWS IAM or Azure Managed Identities for the pods. + +### Cloud support + +The repository's `helm` charts support on-premise and cloud providers such as AWS, Azure, GCP, IBM etc. You can configure the provider in the [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) file of the respective charts by setting `cluster.provider` to `local`, `aws`, or `azure`. If you use GCP, IBM etc., please set `cluster.provider: local` and `cluster.cloudNativeServices: false`. + +The repository also contains [Azure ARM templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) and [AWS `eksctl` templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) to deploy the required base infrastructure. + +## Limitations + +When using multi-clusters, Kubernetes load balancers disallow TCP and UDP traffic on the same port, which inhibits discovery working natively for each pod. Use the following solutions to mitigate this limitation: + +- Disallow discovery and use static nodes to allow only TCP traffic. This isn't an issue for load balancers or exposing nodes publicly. +- If you need to use discovery, use something such as [CNI](#cni) which is supported by all major cloud providers, and the cloud templates already have CNI implemented. + +### CNI + +With the traditional `kubenet` networking mode, nodes get an IP from the virtual network subnet. Each node in turn uses NAT to configure the pods so that they reach other pods on the virtual network. This limits where they can reach but also more specifically what can reach them. For example, an external VM which must have custom routes does not scale well. + +![without-CNI](../../../assets/images/kubernetes-1.jpeg) + +CNI, on the other hand, allows every pod to get a unique IP directly from the virtual subnet which removes this restriction. Therefore, it has a limit on the maximum number of pods that can be spun up, so you must plan ahead to avoid IP exhaustion. + +![with-CNI](../../../assets/images/kubernetes-2.jpeg) + +## Multi-cluster + +You must enable [CNI](#cni) to use multi-cluster, or to connect external nodes to an existing Kubernetes cluster. To connect multiple clusters, they must each have different CIDR blocks to ensure no conflicts, and the first step is to peer the VPCs or VNets together and update the route tables. From that point on you can use static nodes and pods to communicate across the cluster. + +The same setup also works to connect external nodes and business applications from other infrastructure, either in the cloud or on premise. + +![multi-cluster](../../../assets/images/kubernetes-3.png) + +## Concepts + +### Namespaces + +In Kubernetes, [namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) provide a mechanism for isolating groups of resources within a single cluster. Both namespaces and resources (for example, Stateful Sets or Services) within a namespace must be unique, but resources across namespaces don't need to be. + +:::note + +Namespace-based scoping is not applicable for cluster-wide objects (for example, Storage Class or Persistent Volumes). + +::: + +### Nodes + +Consider using Stateful Sets instead of Deployments for Besu. The term 'client node' refers to bootnode, validator and member/RPC nodes. For Besu nodes, we only use CLI arguments to keep things consistent. + +### Role-based access controls + +We encourage using role-based access controls (RBACs) for access to the private key of each node, that is, only a specific pod or statefulset is allowed to access a specific secret. + +If you need to specify a Kube configuration file for each pod, use the `KUBE_CONFIG_PATH` variable. + +### Storage + +We use separate data volumes to store the blockchain data. This is similar to using separate volumes to store data when using docker containers natively or docker-compose. This is done for a few reasons: + +- Containers are mortal and we do not want to store data on them. +- Kubernetes host nodes can fail and we want the chain data to persist. + +Ensure that you provide enough data storage capacity for all nodes on the cluster. Select the appropriate type of [Storage Class](https://kubernetes.io/docs/concepts/storage/storage-classes/) based on your cloud provider. In the templates, the size of the [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) is set to 20Gb by default; you can change this depending on your needs. If you have a different storage account than the one in the charts, you may edit those [Storage Classes](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/charts/besu-node/templates/node-storage.yaml). + +When using Persistent Volume Claims, set the `allowVolumeExpansion` to `true`. This helps keep costs low and enables growing the volume over time rather than creating new volumes and copying data across. + +### Monitoring + +We recommend deploying metrics to get an overview of the network, nodes, and volumes. You can also create alerts. + +Besu publishes metrics to Prometheus, and you can configure metrics using the kubernetes scraper configuration. We also have custom Grafana dashboards to monitor the blockchain. + +:::note + +Refer to `values/monitoring.yml` to configure the alerts per your requirements (for example slack or email). + +::: + +```bash +cd helm +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm repo update +helm install monitoring prometheus-community/kube-prometheus-stack --version 34.10.0 --namespace=besu --create-namespace --values ./values/monitoring.yml --wait +kubectl --namespace besu apply -f ./values/monitoring/ +``` + +You can configure Besu to suit your environment. For example, use the Elastic charts to log to a file that you can parse using Logstash into an ELK cluster. + +```bash +cd helm +helm repo add elastic https://helm.elastic.co +helm repo update +# if on cloud +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace besu --create-namespace --values ./values/elasticsearch.yml +# if local - set the replicas to 1 +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace besu --create-namespace --values ./values/elasticsearch.yml --set replicas=1 --set minimumMasterNodes: 1 +helm install kibana --version 7.17.1 elastic/kibana --namespace besu --values ./values/kibana.yml +helm install filebeat --version 7.17.1 elastic/filebeat --namespace besu --values ./values/filebeat.yml +``` + +### Ingress Controllers + +If you require the ingress controllers for the RPC calls or the monitoring dashboards, we have provided example [rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) that are pre-configured for common use cases. Use these as a reference and develop solutions to match your network topology and requirements. diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/maintenance.md b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/maintenance.md new file mode 100644 index 00000000000..1330931e243 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/maintenance.md @@ -0,0 +1,62 @@ +--- +title: Maintenance +sidebar_position: 5 +description: Maintenance for Besu on a Kubernetes cluster +--- + +# Maintenance + +You can perform maintenance for Besu on a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) with a [network](charts.md) +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) + +## Update a persistent volume claim size + +Over time, as the chain grows, so will the amount of space used by the persistent volume claim (PVC). As of Kubernetes v1.11, [certain types of Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/#allow-volume-expansion) allow volume resizing. Production charts for Azure use Azure Files, and on AWS use EBS Block Store which allow for volume expansion. + +To update the volume size, you must update the override values file. For example, to increase the size on the transaction nodes volumes, add the following snippet to the [`txnode values.yml`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) file, with the new size limit (the following example uses 50Gi). + +```bash +storage: + sizeLimit: "50Gi" + pvcSizeLimit: "50Gi" +``` + +Once complete, update the node via helm: + +```bash +helm upgrade tx-1 ./charts/besu-node --namespace besu --values ./values/txnode.yml +``` + +## Update Besu versions + +:::important + +When updating Besu nodes across a cluster, perform the updates as a rolling update and not all at once, especially for the validator pool. If all the validators are taken offline, the chain halts, and you must wait for round changes to expire before blocks are created again. + +::: + +Updates for Besu can be done via Helm in exactly the same manner as other applications. Alternatively, this can be done via `kubectl`. This example updates a node called `besu-validator-3`: + +1. Set the update policy to use rolling updates (if not done already): + + ```bash + kubectl patch statefulset besu-validator-3 --namespace besu -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}' + ``` + +2. Update the Besu version via Helm: + + ```bash + helm upgrade bootnode-1 ./charts/besu-node --namespace besu --values ./values/bootnode.yml --set image.besu.tag=21.10.0 + ``` + + Or via `kubectl`: + + ```bash + kubectl patch statefulset besu-validator-3 --namespace besu --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"hyperledger/besu:21.10.0"}]' + ``` diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/nat-manager.md b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/nat-manager.md new file mode 100644 index 00000000000..51463314ac6 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/nat-manager.md @@ -0,0 +1,219 @@ +--- +title: Configure Kubernetes mode in NAT manager +sidebar_position: 9 +description: Tutorial to configure Kubernetes mode for Hyperledger Besu Nat Manager +--- + +# Configure Kubernetes mode in NAT Manager + +Use [`--nat-method=AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) or [`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) CLI options to let the Besu node automatically configure its IP address and ports. + +Use mode [`--nat-method=NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) to be able to set your Besu ports and IP address manually. + +Default mode is [`AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) but Besu will fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode if automatic configuration fails. + +:::info The following log shows fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode after an automatic detection failure. + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: + +## Automatic configuration + +Follow 3 steps to configure Besu for automatic IP address and ports detection on Kubernetes: + +1. [Create a load balancer](#1-create-a-load-balancer) +1. [Check if the load balancer is properly deployed](#2-check-if-the-load-balancer-is-properly-deployed) +1. [Deploy Besu](#3-deploy-besu) + +### 1. Create a load balancer + +Deploy a `LoadBalancer` service for Besu to recover IP address and ports. + +Here is an example that you can customize with your own ports and routing rules. + +```yaml +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + name: besu +spec: + ports: + - name: "json-rpc" + port: 8545 + targetPort: 8545 + - name: "rlpx" + port: 30303 + targetPort: 30303 + selector: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + type: LoadBalancer +``` + +This service example lists the rules for the different ports used by Besu (`json-rpc` and` rlpx`). The default value is used for `discovery`. + +### 2. Check if the load balancer is properly deployed + +Verify the load balancer readiness before launching Besu. + +Run `kubectl describe services besu` to check the service status. + +The command should display the following information: + +```bash +Name: besu +Namespace: default +Labels: app.kubernetes.io/name=besu + app.kubernetes.io/release=1.0.0 +Annotations: kubectl.kubernetes.io/last-applied-configuration: + {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"besu","app.kubernetes.io/release":"1.... +Selector: app.kubernetes.io/name=besu,app.kubernetes.io/release=1.0.0 +Type: LoadBalancer +IP: -------- +LoadBalancer Ingress: ****** +``` + +The load balancer must have an IP address displayed in place of `******` on the `LoadBalancer Ingress` line to be ready. + +Run the `kubectl describe services besu` command again until the load balancer IP address appears in the output. + +### 3. Deploy Besu + +When steps 1 and 2 are completed, deploy Besu using the following YAML example: + +```yaml +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: besu-config + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: 1.0.0 +data: + BESU_LOGGING: "INFO" + BESU_NETWORK: "dev" + BESU_P2P_ENABLED: "true" + BESU_RPC_HTTP_ENABLED: "true" + BESU_RPC_HTTP_APIS: "eth,net,web3,debug,admin" + KUBE_CONFIG_PATH: "/opt/besu/shared/kube-config" +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: besu + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" +spec: + replicas: 1 + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + spec: + containers: + - name: besu + image: "hyperledger/besu:latest" + imagePullPolicy: Always + ports: + - containerPort: 8545 + - containerPort: 30303 + envFrom: + - configMapRef: + name: besu-config + restartPolicy: Always +status: {} +``` + +## Automatic detection errors + +:::danger + +Automatic detection error messages do not prevent you to use Besu. + +Try the fix indicated for each error or use [`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) CLI option and [set IP address and port manually](../../../public-networks/how-to/connect/configure-ports.md). + +::: + +Possible errors messages for Kubernetes automatic detection failure: + +- [`Service not found`](#service-not-found-error-message) +- [`Forbidden`](#forbidden-error-message) +- [`Ingress not found`](#ingress-not-found-error-message) + +### `Service not found` error message + +- **Error message:** `Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used` +- **Cause:** load balancer did start correctly or has the incorrect name. +- **Fix:** check and modify load balancer YAML configuration and restart service. + +:::info Example error log + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: + +### `Forbidden` error message + +- **Error message:** `Nat manager failed to configure itself automatically due to the following reason Forbidden. NONE mode will be used` +- **Cause:** Besu don't have permission to list the services via the Kubernetes API to retrieve IP address and ports from the load balancer. +- **Fix:** Give it the required permissions using [Role-based access control](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). + + If you can't manage permissions, define the IP address and ports manually with [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode + +:::info Example error log + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Forbidden. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: + +:::tip + +For development environment, the permission issue can be fixed by running `kubectl create clusterrolebinding myapp-view-binding --clusterrole=admin --serviceaccount=default:default` + +This command should only be used on development environment and not in production environment. + +In production environment, require a finer management of permissions using Kubernetes [Role-based access control](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). + +::: + +### `Ingress not found` error message + +- **Error message:** `Nat manager failed to configure itself automatically due to the following reason Ingress not found. NONE mode will be used` +- **Cause:** Load balancer did not finish to recover an IP address. +- **Fix:** [Check that the load balancer is properly deployed](#2-check-if-the-load-balancer-is-properly-deployed) before launching Besu. + +:::info Example error log + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Ingress not found. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/playground.md b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/playground.md new file mode 100644 index 00000000000..778c08d4bc3 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/playground.md @@ -0,0 +1,26 @@ +--- +title: Local playground +sidebar_position: 1 +description: Deploying a Hyperledger Besu private network locally with Kubernetes +--- + +# Deploy in a local environment + +The [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) was created to provide an opportunity to deploy [quorum-kubernetes](https://github.com/ConsenSys/quorum-kubernetes/) in a local environment before attempting in a live environment (such as in the cloud or on-premise). Local deployment can be done with any local Kubernetes tool. Minikube and Rancher Desktop have been tested to work, but any complete Kubernetes solution with support for `kubectl` should suffice. + +## Steps + +1. Navigate to the playground [`README`](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground). +1. Ensure that your system meets the requirements specified. +1. Choose your Ethereum client (Hyperledger Besu or GoQuorum): `quorum-besu` or `quorum-go`. +1. Choose your consensus algorithm. The playground supports Clique, Ethash (PoW), and IBFT2 for Besu, and IBFT for GoQuorum. +1. Follow the instructions from the `README` for the chosen client and consensus algorithm folder. + +## Important notes + +Consider the following when deploying and developing with the playground: + +- The playground is created specifically for developers and operators to become familiar with the deployment of Besu in a Kubernetes environment in preparation for going into a cloud or on-premise environment. Thus, it should **not** be deployed into a production environment. +- The playground is not a complete reflection of the `helm` charts as it does not use `Helm`, but rather static or non-templated code that is deployed through `kubectl apply -f`. This means that without `Helm` there's a significant amount of repeated code. This is fine for development but not ideal for a production environment. +- The playground uses static/hard-coded keys. Automatic key generation is only supported in `helm` charts. +- As the playground is for local development, no cloud integration or lifecycle support is offered. diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/production.md b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/production.md new file mode 100644 index 00000000000..7dd556e649f --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/production.md @@ -0,0 +1,87 @@ +--- +title: Production +sidebar_position: 6 +description: Deploying Besu Helm Charts for production on a Kubernetes cluster +--- + +# Deploy for production + +You can deploy Besu for production on a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- [Helm3](https://helm.sh/docs/intro/install/) + +## Overview + +To get things production-ready, we'll use the same charts, and set a few of the values in the `cluster` map as in the [Deploy](#deploy-the-network) section. + +:::warning + +The following tutorial ONLY supports AWS and Azure currently. Other cloud providers will be added in time. + +::: + +:::warning + +We recommend using AWS RDS or Azure PostgreSQL in High Availability mode for any Tessera nodes that you use. The templates don't include that functionality. They can be provisioned with CloudFormation or Azure Resource Manager, respectively. Once created, please specify the connection details to the `values.yml`. + +::: + +## Deploy + +### Check that you can connect to the cluster with `kubectl` + +Once you have a [cluster running](cluster.md), verify `kubectl` is connected to cluster with: + +```bash +kubectl version +Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.1", GitCommit:"86ec240af8cbd1b60bcc4c03c20da9b98005b92e", GitTreeState:"clean", BuildDate:"2021-12-16T11:41:01Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"} +Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"} +``` + +### Deploy the network + +For the rest of this tutorial we use Helm charts. After you have cloned the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change the directory to `helm` for the rest of this tutorial. + +```bash +cd helm +``` + +Each helm chart has the following keys that must be set. + +Specify either `aws` or `azure` for the `cluster.provider`. Additionally, set `cloudNativeServices: true` and `reclaimPolicy: Retain` so that it looks like the following for AWS: + +```bash +cluster: + provider: aws # choose from: aws | azure + cloudNativeServices: true # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) + reclaimPolicy: Retain # set to either Retain or Delete; note that PVCs and PVs will still exist after a 'helm delete'. Setting to Retain will keep volumes even if PVCs/PVs are deleted in kubernetes. Setting to Delete will remove volumes from EC2 EBS when PVC is deleted +``` + +Follow the steps outlined in the [deploy charts](charts.md) tutorial to deploy the network. + +## Best practices + +The most important thing is to plan your network out on paper first and then test it in a Dev cluster to make sure connectivity works with your applications and you get the required throughput in transactions per second (TPS). We also recommend you test the entire process, from provisioning infrastructure to updating nodes on a Dev cluster, prior to launching your production network. + +By default, the cloud Kubernetes clusters take care of availability and do multi-zones within a region. The scheduler also ensures that deployments are spread out across zones. Where possible, we recommend you use multiple bootnodes and static nodes to speed up peering. + +You can connect to APIs and services outside the cluster normally, but connecting into your network (such as adding an on-premise node to the network) might require more configuration. Please check the [limitations](index.md#limitations) and use CNI where possible. To connect an external node to your cluster, the easiest way is to use a VPN as seen in the following [multi-cluster](#multi-cluster-support) setup. + +Finally, we recommend setting up monitoring and alerting from the beginning, so you can get early warnings of issues rather than after failure. We have a monitoring chart which uses Grafana and you can use it with Alertmanager to create alerts or alternatively alert via Cloudwatch or Azure Monitoring. + +## Multi-cluster support + +When CNI is used, multi-cluster support is simple, but you have to cater for cross-cluster DNS names. Ideally, you want to create two separate VPCs (or VNets) and make sure they have different base CIDR blocks so that IP addresses don't conflict. Once done, peer the VPCs together and update the subnet route table, so they are effectively a giant single network. + +![multi-cluster](../../../assets/images/kubernetes-3.png) + +When you [spin up clusters](cluster.md), use [CNI](index.md#limitations) and CIDR blocks to match the subnet's CIDR settings. Then deploy the genesis chart on one cluster and copy across the genesis file and static nodes config maps. Depending on your DNS settings, they might be fine as is, or they might need to be actual IP addresses. That is, you can provision cluster B only after cluster A has Besu nodes up and running. + +Deploy the network on cluster A, and then on cluster B. Besu nodes on cluster A should work as expected, and Besu nodes on cluster B should use the list of peers provided to communicate with the nodes on cluster A. + +Keeping the list of peers on the clusters live and up to date can be challenging, so we recommend using the cloud service provider's DNS service such as Route 53 or Azure DNS and adapting the charts to create entries for each node when it comes up. diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/quorum-explorer.md b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/quorum-explorer.md new file mode 100644 index 00000000000..9b31f61bd80 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/kubernetes/quorum-explorer.md @@ -0,0 +1,67 @@ +--- +title: Using the Quorum Explorer +sidebar_position: 4 +description: Using the Quorum Explorer on a Kubernetes cluster +--- + +# Use the Quorum Explorer + +You can use the Quorum Explorer on a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- [Helm3](https://helm.sh/docs/intro/install/) +- [Existing network](charts.md) + +## Deploy the Quorum Explorer helm chart + +[Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight blockchain explorer. The Quorum Explorer is **not** recommended for use in production and is intended for demonstration or development purposes only. + +The explorer can provide an overview over the whole network, such as block information, voting or removing validators from the network, and demonstrates using the `SimpleStorage` smart contract with privacy enabled, and sending transactions between wallets in one interface. + +To use the explorer, update the [Quorum-Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) with your node details and endpoints, and then [deploy](charts.md). + +## Nodes + +The **Nodes** page provides an overview of the nodes on the network. Select the node you would like to interact with from the drop-down on the top right, and you'll get details of the node, block height, peers, queued transactions etc. + +![`k8s-explorer`](../../../assets/images/kubernetes-explorer.png) + +## Validators + +The **Validators** page simulates a production environment or consortium where each node individually runs API calls to vote to add a validator or remove an existing validator. + +When using the buttons to remove, discard pending validators, or proposing a validator, the app sends an API request to the selected node in the drop-down only. To add or remove a validator you need to select a majority of the existing validator pool individually, and perform the vote API call by clicking the button. Each node can call a discard on the voting process during or after the validator has been added. + +The vote calls made from non-validator nodes have no effect on overall consensus. + +![`k8s-explorer-validators`](../../../assets/images/kubernetes-explorer-validators.png) + +## Explorer + +The **Explorer** page gives you the latest blocks from the chain and the latest transactions as they occur on the network. In addition, you can search by block number or transaction hash using the respective search bar. + +![`k8s-explorer-explorer`](../../../assets/images/kubernetes-explorer-explorer.png) + +## Contracts + +Use the **Contracts** page to compile and deploy a smart contract. Currently, the only contract available for deployment through the app is the `SimpleStorage` contract. However, in time, we plan to add more contracts to that view. + +In this example, we deploy from `member-1` and select `member-1` and `member-3` in the **Private For** multi-select. Then click on `Compile` and `Deploy` + +![`k8s-explorer-contracts-1`](../../../assets/images/kubernetes-explorer-contracts-1.png) + +Once deployed, you can interact with the contract. As this is a new transaction, select `member-1` and `member-3` in **Interact** multi-select, and then click on the appropriate method call to `get` or `set` the value at the deployed contract address. + +![`k8s-explorer-contracts-set`](../../../assets/images/kubernetes-explorer-contracts-set.png) + +To test the private transaction functionality, select `member-2` from the drop-down on the top right, you'll notice that you are unable to interact with the contract because `member-2` was not part of the transaction. Only `members-1` and `member-3` responds correctly. + +## Wallet + +The **Wallet** page gives you the functionality to send simple ETH transactions between accounts by providing the account's private key, the recipient's address, and transfer amount in Wei. + +![`k8s-explorer-wallet`](../../../assets/images/kubernetes-explorer-wallet.png) diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/_category_.json b/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/_category_.json new file mode 100644 index 00000000000..da14c12d4b3 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create a permissioned network", + "position": 7 +} diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/index.md b/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/index.md new file mode 100644 index 00000000000..c7f0decc643 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/index.md @@ -0,0 +1,495 @@ +--- +title: Create a permissioned network +sidebar_position: 1 +description: Hyperledger Besu create a permissioned network +--- + +# Create a permissioned network + +The following steps set up a permissioned network with local node and account permissions. The network uses the [IBFT 2.0 proof of authority consensus protocol]. + +:::danger + +A permissioned Ethereum network as described here is not protected against all attack vectors. We recommend applying defense in depth to protect your infrastructure. + +::: + +## Prerequisites + +- [Hyperledger Besu](../../get-started/install/binary-distribution.md) +- [curl (or similar Web service client)](https://curl.haxx.se/download.html) + +## Steps + +### 1. Create folders + +Each node requires a data directory for the blockchain data. + +Create directories for your permissioned network and each of the three nodes, and a data directory for each node: + +```bash +Permissioned-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 +│   ├── data +└── Node-4 + ├── data +``` + +### 2. Create the configuration file + +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `Permissioned-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::danger Security warning + +Don't use the accounts in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `Permissioned-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```bash +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │   ├── key + │   └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │   ├── key + │   └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │   ├── key + │   └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the Permissioned-Network directory + +Copy the `genesis.json` file to the `Permisssioned-Network` directory. + +### 5. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```bash +Permissioned-Network/ +├── genesis.json +├── Node-1 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-2 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-3 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-4 +│ ├── data +│ │    ├── key +│ │    ├── key.pub +``` + +### 6. Create the permissions configuration file + +The [permissions configuration file](../../how-to/use-permissioning/local.md#permissions-configuration-file) defines the nodes and accounts allowlists. + +Copy the following permissions configuration to a file called `permissions_config.toml` and save a copy in the `Node-1/data`, `Node-2/data`, `Node-3/data`, and `Node-4/data` directories: + +```toml title="permissions_config.toml" +accounts-allowlist=["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "0x627306090abaB3A6e1400e9345bC60c78a8BEf57"] + +nodes-allowlist=[] +``` + +The permissions configuration file includes the first two accounts from the genesis file. + +Use the [`perm_addNodesToAllowlist`](../../reference/api/index.md#perm_addnodestoallowlist) JSON-RPC API method to add permissioned nodes after starting the nodes. + +### 7. Start Node-1 + +Use the following command: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" +``` + + + +The command line allows you to enable: + +- Nodes and accounts permissions using [`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) and [`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled). +- The JSON-RPC API using [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled). +- The `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). +- All-host access to the HTTP JSON-RPC API using [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). +- All-domain access to the node through the HTTP JSON-RPC API using [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to specify Node-1 as a peer and update the permissions configuration file in the following steps. + +![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) + +### 8. Start Node-2 + +Start another terminal, change to the `Node-2` directory, and start Node-2: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 +``` + + + +The command line specifies: + +- A different port to Node-1 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- A data directory for Node-2 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). +- Other options as for [Node-1](#7-start-node-1). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. + +### 9. Start Node-3 + +Start another terminal, change to the `Node-3` directory, and start Node-3: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 +``` + + + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- A data directory for Node-3 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). +- Other options as for [Node-1](#7-start-node-1). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. + +### 10. Start Node-4 + +Start another terminal, change to the `Node-4` directory, and start Node-4: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 +``` + + + +The command line specifies: + +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- A data directory for Node-4 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). +- Other options as for [Node-1](#7-start-node-1). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. + +### 11. Add enode URLs for nodes to permissions configuration file + +Start another terminal and use the [`perm_addNodesToAllowlist`](../../reference/api/index.md#perm_addnodestoallowlist) JSON-RPC API method to add the nodes to the permissions configuration file for each node. + +Replace ``, ``, ``, and `` with the enode URL displayed when starting each node. + + + +# Node-1 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8545 +``` + +# Node-2 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8546 +``` + +# Node-3 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8548 +``` + + + +:::tip + +The curl call is the same for each node except for the JSON-RPC endpoint. + +::: + +### 12. Add nodes as peers + +Use the [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer) JSON-RPC API method to add Node-1 as a peer for Node-2, Node-3, and Node-4. + +Replace `` with the enode URL displayed when starting Node-1. + + + +# Node-2 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8546 +``` + +# Node-3 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` + + + +:::tip + +The curl call is the same for each node except for the JSON-RPC endpoint. + +::: + +Replace `` with the enode URL displayed when starting Node-2. + + + +# Node-3 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` + + + +Replace `` with the enode URL displayed when starting Node-3. + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` + +### 13. Confirm permissioned network is working + +#### Check peer count + +Use curl to call the JSON-RPC API [`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 +``` + +The result confirms Node-1 (the node running the JSON-RPC service) has three peers (Node-2, Node-3 and Node-4): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x3" +} +``` + +#### Send a transaction from an account in the allowlist + +Import the first account from the genesis file into MetaMask and send transactions, as described in [Quickstart tutorial]: + +:::info Account 1 + +- Address: `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73` +- Private key : `0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63` +- Initial balance : `0xad78ebc5ac6200000` (200000000000000000000 in decimal) + +::: + +:::info + +Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). + +::: + +### Try sending a transaction from an account not in the accounts allowlist + +Import the third account from the genesis file into MetaMask and try to send a transaction, as described in [Quickstart tutorial]: + +:::info Account 3 + +- Address: `0xf17f52151EbEF6C7334FAD080c5704D77216b732` +- Private key: `0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f` +- Initial balance: `0x90000000000000000000000` (2785365088392105618523029504 in decimal) + +::: + +### Start a node not on the nodes allowlist + +In your `Permissioned-Network` directory, create a `Node-5` directory and `data` directory inside it. + +Change to the `Node-5` directory and start Node-5 specifying the Node-1 enode URL as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --bootnodes="" --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 +``` + +# Windows + +```bash +besu --data-path=data --bootnodes="" --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 +``` + + + +Start another terminal and use curl to call the JSON-RPC API [`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8549 +``` + +The result confirms Node-5 has no peers even though it specifies Node-1 as a bootnode: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x0" +} +``` + +## Stop nodes + +When finished using the permissioned network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the permissioned network in the future, start from [step 7](#7-start-node-1). + +::: + + + +[IBFT 2.0 proof of authority consensus protocol]: ../../how-to/configure/consensus/ibft.md +[Private network example tutorial]: ../quickstart.md#create-a-transaction-using-metamask diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/onchain.md b/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/onchain.md new file mode 100644 index 00000000000..64cf1cfb7db --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/onchain.md @@ -0,0 +1,338 @@ +--- +title: Get started with onchain permissioning +sidebar_position: 1 +description: Setting up and using Hyperledger Besu onchain permissioning +--- + +# Get started with onchain permissioning + +The following steps describe bootstrapping a permissioned network using a Hyperledger Besu node. + +This tutorial configures permissioning on a [IBFT 2.0 proof of authority (PoA)] network. + +## Prerequisites + +- [Node.js](https://nodejs.org/en/) v10.16.0 or later +- [Yarn](https://yarnpkg.com/en/) v1.15 or later +- Browser with [MetaMask installed](https://metamask.io/) + +## Steps + +### 1. Create folders + +Each node requires a data directory for the blockchain data. + +Create directories for your permissioned network and each of the three nodes, and a data directory for each node: + +```bash +Permissioned-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 +│   ├── data +└── Node-4 + ├── data +``` + +### 2. Create the configuration file + +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `Permissioned-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::critical Security warning + +Don't use the accounts in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `Permissioned-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```bash +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │   ├── key + │   └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │   ├── key + │   └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │   ├── key + │   └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the Permissioned-Network directory + +Copy the `genesis.json` file to the `Permisssioned-Network` directory. + +### 5. Add the Ingress contracts to the genesis file + +:::tip + +If the network is using only account or node permissioning, add only the relevant Ingress contract to the genesis file. + +::: + +Add the Ingress contracts to the genesis file for your network by copying them from [`genesis.json`](https://github.com/ConsenSys/permissioning-smart-contracts/blob/e6c2d4d5a728c11cdb8e97a07ddda3c0bfb57b5d/genesis.json) in the [`permissioning-smart-contracts` repository](https://github.com/ConsenSys/permissioning-smart-contracts) to the `alloc` section of the contract: + +```json +"0x0000000000000000000000000000000000008888": { + "comment": "Account Ingress smart contract", + "balance": "0", + "code": , + "storage": { + + } +} + +"0x0000000000000000000000000000000000009999": { + "comment": "Node Ingress smart contract", + "balance": "0", + "code": , + "storage": { + + } +} +``` + +:::info + +To support the permissioning contracts, ensure your genesis file includes at least the `constantinopleFixBlock` milestone. + +The permissioning contract has multiple interfaces, and each interface maps to a specific version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). Ensure that you specify the [permissioning contract interface](../../how-to/use-permissioning/onchain.md) being used when starting Besu. + +::: + +### 6. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```bash +Permissioned-Network/ +├── genesis.json +├── Node-1 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-2 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-3 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-4 +│ ├── data +│ │    ├── key +│ │    ├── key.pub +``` + +### 7. Start Node-1 + +:::info + +The specified node must be producing blocks, that is, be a miner (PoW networks) or validator (PoA networks). + +To allow MetaMask to connect, the node must have JSON-RPC HTTP enabled, and have `--rpc-http-cors-origins` set to allow MetaMask. + +If your network is not a [free gas network](../../how-to/configure/free-gas.md), the account used to interact with the permissioning contracts must have a balance. + +::: + +Start the first node with command line options to enable onchain permissioning and the location of the **data** folder and genesis file: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" +``` + +On the command line: + +- Enable onchain accounts permissioning using [`--permissions-accounts-contract-enabled`](../../reference/cli/options.md#permissions-accounts-contract-enabled). +- Set the address of the Account Ingress contract in the genesis file using [`--permissions-accounts-contract-address`](../../reference/cli/options.md#permissions-accounts-contract-address). +- Enable onchain nodes permissioning using [`--permissions-nodes-contract-enabled`](../../reference/cli/options.md#permissions-nodes-contract-enabled). +- Set the address of the Node Ingress contract in the genesis file using [`--permissions-nodes-contract-address`](../../reference/cli/options.md#permissions-nodes-contract-address). +- Set the version of the [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) using [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version). +- Enable the JSON-RPC API using [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled). +- Enable the `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). +- Allow all-host access to the HTTP JSON-RPC API using [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). +- Allow all-domain access to the node through the HTTP JSON-RPC API using [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to use when starting Node-2, Node-3, and Node-4. + +### 8. Start Node-2 + +Use the following command to start Node-2: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --p2p-port=30304 --rpc-http-port=8546 +``` + +The command line specifies: + +- A different port to Node-1 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- The enode URL of Node-1 using [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes). +- Other options as for [Node-1](#7-start-node-1). + +### 9. Start Node-3 + +Use the following command to start Node-3: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --p2p-port=30305 --rpc-http-port=8547 +``` + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- The enode URL of Node-1 using [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes). +- Other options as for [Node-1](#7-start-node-1). + +### 10. Start Node-4 + +Use the following command to start Node-4: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --p2p-port=30306 --rpc-http-port=8548 +``` + +The command line specifies: + +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- The enode URL of Node-1 using [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes). +- Other options as for [Node-1](#7-start-node-1). + +:::tip + +If your nodes are having trouble connecting as peers, update the `--bootnodes` option for each node to include all four enode URLs. + +::: + +### 11. Clone the contracts and install dependencies + +Clone the `permissioning-smart-contracts` repository: + +```bash +git clone https://github.com/ConsenSys/permissioning-smart-contracts.git +``` + +Change into the `permissioning-smart-contracts` directory. + +### 12. Set the environment variables + +Create the following environment variables and set to the specified values: + +- `BESU_NODE_PERM_ACCOUNT` - Account to deploy the permissioning contracts and become the first admin account. +- `BESU_NODE_PERM_KEY` - Private key of the account to deploy the permissioning contracts. +- `ACCOUNT_INGRESS_CONTRACT_ADDRESS` - Address of the Account Ingress contract in the genesis file. +- `NODE_INGRESS_CONTRACT_ADDRESS` - Address of the Node Ingress contract in the genesis file. +- `BESU_NODE_PERM_ENDPOINT` - Required only if your node is not using the default JSON-RPC host and port (`http://127.0.0.1:8545`). Set to JSON-RPC host and port. When bootstrapping the network, Besu uses the specified node to deploy the contracts and is the first node in the network. +- `CHAIN_ID` - The chain ID from the genesis file. +- `INITIAL_ALLOWLISTED_NODES`(optional) - The enode URLs of permitted nodes. Specify multiple nodes (Node-1, Node-2, Node-3) as a comma-separated list. + +:::tip + +A simple way to set multiple environment variables is to create a file called `.env` with the required settings: + +```env +NODE_INGRESS_CONTRACT_ADDRESS=0x0000000000000000000000000000000000009999 +ACCOUNT_INGRESS_CONTRACT_ADDRESS=0x0000000000000000000000000000000000008888 +BESU_NODE_PERM_ACCOUNT=627306090abaB3A6e1400e9345bC60c78a8BEf57 +BESU_NODE_PERM_KEY=c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 +BESU_NODE_PERM_ENDPOINT=http://127.0.0.1:8545 +CHAIN_ID=1337 +INITIAL_ALLOWLISTED_NODES=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` + +If using a `.env` file, save the file to the `permissioning-smart-contracts` directory. + +::: + +### 13. Deploy the contracts + +In the `permissioning-smart-contracts` directory, while your network is running, deploy the Admin and Rules contracts: + +```bash +yarn truffle migrate --reset --network besu +``` + +This also updates the Ingress contract with the name and version of the Admin and Rules contracts. The migration logs the addresses of the Admin and Rules contracts. + +:::important + +The account that deploys the contracts is automatically an admin account. + +::: + + + +[Node-1, Node-2, Node-3, and Node-4 to the allowlist]: ../../how-to/use-permissioning/onchain.md#update-nodes-allowlist +[IBFT 2.0 proof of authority (PoA)]: ../../how-to/configure/consensus/ibft.md diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/upgrade-contracts.md b/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/upgrade-contracts.md new file mode 100644 index 00000000000..d36fb7d4edd --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/permissioning/upgrade-contracts.md @@ -0,0 +1,153 @@ +--- +title: Upgrade permissioning contracts +sidebar_position: 2 +description: Upgrade the permissioning contracts for onchain permissioning +--- + +# Upgrade permissioning contracts + +The following tutorial describes the steps to upgrade the onchain permissioning contracts to the latest version. + +## Prerequisites + + + +- [Node.js](https://nodejs.org/en/) v10.16.0 or later + +- [Yarn](https://yarnpkg.com/en/) v1.15 or later +- Browser with [MetaMask installed](https://metamask.io/). + +## Steps + +### 1. Get the latest contracts and install dependencies + +:::note + +Pull the latest changes if you already have a cloned repository using the `git pull` command inside the `permissioning-smart-contracts` directory. + +::: + +1. Clone the `permissioning-smart-contracts` repository: + + ```bash + git clone https://github.com/ConsenSys/permissioning-smart-contracts.git + ``` + +### 3. Update environment variables + +If using a `.env` file to configure environment variables, then the file must be in the `permissioning-smart-contracts` directory. + +:::tip + +You can use environment variables to retain existing contracts if required. For example: + +- `RETAIN_ADMIN_CONTRACT=true` to retain the current admin list +- `RETAIN_NODE_RULES_CONTRACT=true` to retain the current Node rules contract +- `RETAIN_ACCOUNT_RULES_CONTRACT=true` to retain the current Account rules contract + +::: + +1. Legacy: If they exist, rename the following environment variables: + + - `PANTHEON_NODE_PERM_ACCOUNT` to `BESU_NODE_PERM_ACCOUNT` + - `PANTHEON_NODE_PERM_KEY` to `BESU_NODE_PERM_KEY` + - `PANTHEON_NODE_PERM_ENDPOINT` to `BESU_NODE_PERM_ENDPOINT` + +2. If updating from v1 to v2, you need to re-deploy the `NodeIngress` contract. In order to do this, first delete the `NODE_INGRESS_CONTRACT_ADDRESS` environment variable. + + :::important + + This step is only required if upgrading from v1 of the node permissioning contract to v2 (because the interface changed, a new `NodeIngress` contract must be deployed). + + ::: + +### 4. Optional: Export current allowlists + +:::note + +This step enables you to export the current allowlists to assist in updating. + +::: + +1. Export the current allowlists by setting the following environment variables: + + ```bash + RETAIN_ADMIN_CONTRACT=true + RETAIN_NODE_RULES_CONTRACT=true + RETAIN_ACCOUNT_RULES_CONTRACT=true + ``` + +2. Log the current allowlists to console: + + ```bash + truffle migrate --reset + ``` + + The migration scripts will log the existing allowlists to the console, but no contracts will be deployed. + +3. Set initial values for updated deployment using the values logged in the previous step: + + ```bash + INITIAL_ADMIN_ACCOUNTS= + INITIAL_ALLOWLISTED_ACCOUNTS= + INITIAL_ALLOWLISTED_NODES= + ``` + +4. Update environment variables for contracts that are to be deployed. For example: + + ```bash + RETAIN_ADMIN_CONTRACT=true + RETAIN_NODE_RULES_CONTRACT=false + RETAIN_ACCOUNT_RULES_CONTRACT=false + ``` + +### 5. Deploy the contracts + +1. In the `permissioning-smart-contracts` directory, deploy the contracts: + + ```bash + truffle migrate --reset + ``` + + :::important + + - If updating from v1 to v2, the new `NodeIngress` contract address must be specified when restarting the Besu nodes. Copy this address from the migration output. For example: + + ```bash + > Deployed NodeIngress contract to address = 0x12B1f953395080A13AeED0dC4d0bb14e787A91cF + ``` + + - If upgrading from v2 (using separate storage contracts) copy the `Storage` contract addresses displayed in the output. For example: + + ``` + > Deployed NodeStorage contract to address = 0x4F3e35A3Be3C1b77Ade39969D175C743ad3484Ee + ... + > Deployed AccountStorage contract to address = 0x2362187023D738034B516438Af187356b31E8Fb8 + ``` + + ::: + +1. Set the storage contract address environment variables to ensure that the storage contracts are not re-deployed. For example: + + ```bash + NODE_STORAGE_CONTRACT_ADDRESS=0xE0bF6021e023a197DBb3fABE64efA880E13D3f4b + ACCOUNT_STORAGE_CONTRACT_ADDRESS=0x7153CCD1a20Bbb2f6dc89c1024de368326EC6b4F + ``` + +1. Deploy the updated contracts: + + ```bash + truffle migrate --reset + ``` + +### 6. Restart Besu nodes + +Restart the Besu nodes with the updated [`NodeIngress`](#5-deploy-the-contracts) contract address and [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) version 2. + +```besu +cmd besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x4E72770760c011647D4873f60A3CF6cDeA896CD8" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" +``` + + + +[nodes to the allowlist]: ../../how-to/use-permissioning/onchain.md#update-nodes-allowlist diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/_category_.json b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/_category_.json new file mode 100644 index 00000000000..c6e33f3bea4 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create a privacy enabled network", + "position": 6 +} diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/index.md b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/index.md new file mode 100644 index 00000000000..19581ee85ae --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/index.md @@ -0,0 +1,431 @@ +--- +title: Create a privacy enabled network using the Quickstart +sidebar_position: 1 +description: Configure Hyperledger Besu privacy +--- + +# Create a privacy-enabled network + +Configuring a network that supports private transactions requires starting a [Tessera] node for each Hyperledger Besu node. Besu command line options associate the Besu node with the Tessera node. + +This tutorial assumes you have completed setting up an IBFT 2.0 network to the point where you have [created the genesis file and copied the private keys](../ibft/index.md#5-copy-the-node-private-keys-to-the-node-directories). If not, complete steps 1 to 5 of the [Create an IBFT 2.0](../ibft/index.md) tutorial before continuing. + +:::important + +To support privacy, ensure your genesis file includes at least the `byzantium` milestone. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires 4 validators to be Byzantine fault tolerant. + +::: + +In this tutorial we start Tessera nodes for the four Besu nodes and associate each Besu node with a Tessera node. + +## Prerequisites + +- [Install Tessera](https://docs.tessera.consensys.net/category/install). + +## 1. Create Tessera directories + +Inside each `Node-*` directory, create a `Tessera` directory: + +```bash +IBFT-Network/ +├── Node-1 +│   ├── data +│ ├── Tessera +├── Node-2 +│   ├── data +│ ├── Tessera +├── Node-3 +│   ├── data +│ ├── Tessera +└── Node-4 + ├── data + ├── Tessera +``` + +## 2. Generate Tessera keys + +This example creates an unlocked private key, meaning you do not need a password to decrypt the private key file. + +In each `Tessera` directory, generate a public/private key pair for the Tessera node: + +```bash +tessera -keygen -filename nodeKey +``` + +At the prompt, press **Enter** to create an unlocked key. + +Tessera generates the public/private key pair and saves the keys in the `nodeKey.pub` and `nodeKey.key` files. + +## 3. Create Tessera configuration files + +In the `Tessera` directory for each node, create a file called `tessera.conf`, with the following configuration: + +:::important + +In production environments, only specify [`tls`](https://docs.tessera.consensys.net/HowTo/Configure/TLS/) as `OFF` if another transport security mechanism, such as WireGuard, is in place. + +::: + + + +# Node-1 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9101", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9102", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9103", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +# Node-2 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9201", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9202", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9203", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +# Node-3 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9301", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9302", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9303", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +# Node-4 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9401", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9402", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9403", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + + + +In the configuration file, specify: + +- Different port numbers for the various servers in the [`serverConfigs`](https://docs.tessera.consensys.net/HowTo/Configure/TesseraAPI/) section. +- The address of the Tessera nodes to discover, in the [`peer`](https://docs.tessera.consensys.net/HowTo/Configure/Peer-discovery/#specify-peers) section. +- The location of the public/private key pair. + +## 4. Start the Tessera nodes + +In each `Tessera` directory, start Tessera specifying the [configuration file](#3-create-tessera-configuration-files) created in the previous step: + +```bash +tessera -configfile tessera.conf +``` + +:::info + +After starting the first Tessera node and before starting the other nodes, the log message `failed to connect to node` displays. This is normal behavior. Until you start the other peer nodes, your node is not connected and displays this warning. You can continue to start the other nodes. + +::: + +## 5. Start Besu Node-1 + +In the `Node-1` directory, start Besu Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies privacy options: + +- [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy +- [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the Q2T server address of the Tessera node (`Q2T` in `tessera.conf`) +- [`--privacy-public-key-file`](../../reference/cli/options.md#privacy-public-key-file) specifies the file containing Tessera node public key (created in [3. Generate Tessera Keys](#2-generate-tessera-keys)) +- [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) includes `EEA` and `PRIV` in the list of JSON-RPC APIs to enable privacy JSON-RPC API methods. +- [`--min-gas-price`](../../../public-networks/reference/cli/options.md#min-gas-price) is 0 for a [free gas network](../../how-to/configure/free-gas.md). + +:::note + +Use the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option to sign [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md) using a supplied key. The command line option is mandatory in privacy-enabled paid gas networks. + +::: + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) + +## 6. Start Besu Node-2 + +In the `Node-2` directory, start Besu Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + +:::note + +When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), [expose ports](../../get-started/install/run-docker-image.md#expose-ports). + +::: + +## 7. Start Besu Node-3 + +In the `Node-3` directory, start Besu Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + +## 8. Start Besu Node-4 + +In the `Node-4` directory, start Besu Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + + + +[Tessera]: https://docs.tessera.consensys.net/ diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/multi-tenancy.md b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/multi-tenancy.md new file mode 100644 index 00000000000..895487a360c --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/multi-tenancy.md @@ -0,0 +1,185 @@ +--- +title: Create a multi-tenant network +sidebar_position: 2 +description: Configure multi-tenancy +--- + +# Configure a multi-tenant node + +You can configure Besu and associated Tessera node in a privacy-enabled network to host [multiple tenants](../../concepts/privacy/multi-tenancy.md). + +In this tutorial we'll add tenants to the `Node-1` Besu and Tessera node in a [privacy-enabled network](index.md). + +```bash +IBFT-Network/ +├── Node-1 +│   ├── data +│ ├── Tessera +├── Node-2 +│   ├── data +│ ├── Tessera +├── Node-3 +│   ├── data +│ ├── Tessera +└── Node-4 + ├── data + ├── Tessera +``` + +:::info + +This tutorial uses [JWT public key authentication] to create the tenant's JWT, but you can also use [username and password authentication]. + +::: + +## Prerequisites + +- A [Privacy-enabled network](index.md). + +## 1. Generate a private and public key pair + +In the `Node-1` directory, [generate the private and public key pair]. The key pair, which must be in `.pem` format, belongs to the operator who uses the key pair to authenticate the [tenant JWTs](#6-generate-the-tenant-jwts). + +:::info + +This step is not required when using [username and password authentication] to create the required JWTs. + +::: + +## 2. Generate Tessera keys + +In the `Node-1/Tessera` directory, [generate a public/private key pair for each tenant](index.md#2-generate-tessera-keys). + +:::note + +The instructions creates an unlocked private key, meaning you do not need a password to decrypt the private key file. + +::: + +Name the key pair `nodeKey2` and `nodeKey3`. + +## 3. Update the Tessera configuration file + +In the `Node-1/Tessera` directory, update the `tessera.conf` file by adding the new key pairs: + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9101", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9102", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9103", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + }, + { + "privateKeyPath": "nodeKey2.key", + "publicKeyPath": "nodeKey2.pub" + }, + { + "privateKeyPath": "nodeKey3.key", + "publicKeyPath": "nodeKey3.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +:::info + +Besu requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode). Add the line `"mode": "orion",` to the Tessera configuration file. + +::: + +## 4. Start Tessera + +[Start the Tessera nodes](index.md#4-start-the-tessera-nodes) and specify the configuration file. + +## 5. Start Besu Node-1 + +In the `Node-1` directory, start Besu Node-1: + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-authentication-enabled --rpc-http-authentication-jwt-public-key-file=publicKey.pem --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-multi-tenancy-enabled --min-gas-price=0 +``` + +The command line specifies privacy options: + +- [`--rpc-http-authentication-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-enabled) enables authentication for JSON-RPC APIs. +- [`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) specifies the Operator's [public key file](#1-generate-a-private-and-public-key-pair). Used to authenticate the [tenant JWTs](#6-generate-the-tenant-jwts). +- [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy. +- [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the [Quorum to Tessera (Q2T)] server address of the Tessera node (`Q2T` in `tessera.conf`). +- [`--privacy-multi-tenancy-enabled`](../../reference/cli/options.md#privacy-multi-tenancy-enabled) enables multi-tenancy. + +:::note + +[`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) is only required when using [JWT public key authentication]. If using [username and password authentication], use [`--rpc-http-authentication-credentials-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-credentials-file) instead. + +::: + +[Start the remaining Besu nodes](index.md#6-start-besu-node-2). + +## 6. Generate the tenant JWTs + +[Generate the JWT](../../../public-networks/how-to/use-besu-api/authenticate.md#2-create-the-jwt) for each tenant and specify the [tenant's Tessera public key](#2-generate-tessera-keys) in the `privacyPublicKey` field. + +Ensure you apply the appropriate [JSON-RPC API permissions](../../../public-networks/how-to/use-besu-api/authenticate.md#json-rpc-permissions) to the token. For example, ensure you enable the `PRIV` and `EEA` APIs for privacy. + +:::note + +This step is not required when using [username and password authentication] to create the required JWTs. + +::: + +[Use the authentication token to make requests]. + + + +[JWT public key authentication]: ../../../public-networks/how-to/use-besu-api/authenticate.md#jwt-public-key-authentication +[username and password authentication]: ../../../public-networks/how-to/use-besu-api/authenticate.md#username-and-password-authentication +[generate the private and public key pair]: ../../../public-networks/how-to/use-besu-api/authenticate.md#1-generate-a-private-and-public-key-pair +[Use the authentication token to make requests]: ../../../public-networks/how-to/use-besu-api/authenticate.md#using-an-authentication-token-to-make-requests +[Quorum to Tessera (Q2T)]: https://docs.tessera.consensys.net/Reference/TesseraAPI + + + +\*[JWT]: JSON Web Token diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/quickstart.md b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/quickstart.md new file mode 100644 index 00000000000..d5ec7acf840 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/quickstart.md @@ -0,0 +1,158 @@ +--- +description: Hyperledger Besu privacy-enabled private network tutorial +--- + +# Create a privacy-enabled network using the Quorum Developer Quickstart + +You can create a privacy-enabled network using the [Quorum Developer Quickstart](../quickstart.md). It runs a private Hyperledger Besu network that uses [Tessera](https://docs.tessera.consensys.net/en/stable/) as its private transaction manager. + +You can use the [Block Explorer](../quickstart.md#block-explorer), make [JSON-RPC requests](../quickstart.md#run-json-rpc-requests), and [create transactions using MetaMask](../quickstart.md#create-a-transaction-using-metamask). This tutorial describes how to make private transactions between nodes, and perform read and write operations on private contracts. + +:::important + +This tutorial runs a private network suitable for education or demonstration purposes and is not intended for running production networks. + +::: + +## Prerequisites + +To run this tutorial, you must have the following installed: + +- [Docker and Docker-compose](https://docs.docker.com/compose/install/) + + :::important + + If using [MacOS](https://docs.docker.com/docker-for-mac/) or [Windows](https://docs.docker.com/docker-for-windows/), enable Docker to use up to 6GB of memory on the _Advanced_ tab in _Preferences_. + + ::: + +- [Nodejs](https://nodejs.org/en/download/) +- [Git command line](https://git-scm.com/) +- [Curl command line](https://curl.haxx.se/download.html). + +## Create Docker-compose file + +## Usage + +To create the docker-compose file and artifacts, run: + +```bash +npx quorum-dev-quickstart +``` + +Follow the prompts displayed to run Hyperledger Besu, private transactions, and [logging with ELK](../../how-to/monitor/elastic-stack.md). Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/). + +## Start the network + +:::caution + +If running in Windows, please run commands from the GitBash shell + +::: + +In the installation directory, start the network: + +```bash +./run.sh +``` + +The script pulls the Docker images starts the network. Pulling the images takes a few minutes the first time. The network details display. + +```bash +************************************* +Quorum Dev Quickstart +************************************* +Setting up the index patterns in kibana ................. +---------------------------------- +List endpoints and services +---------------------------------- +JSON-RPC HTTP service endpoint : http://localhost:8545 +JSON-RPC WebSocket service endpoint : ws://localhost:8546 +Web block explorer address : http://localhost:25000/ +Prometheus address : http://localhost:9090/graph +Grafana address : http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All +Collated logs using Kibana endpoint : http://localhost:5601/app/kibana#/discover + +For more information on the endpoints and services, refer to README.md in the installation directory. +**************************************************************** +``` + +## Deploy the private contract and interact with the nodes + +To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls, the example creates three Besu nodes, with each node having a corresponding Tessera node for privacy. You can access the Besu member nodes for API calls on the following ports: + +```bash +Member1Besu RPC: http://localhost:20000 +Member1Tessera: http://localhost:9081 + +Member2Besu RPC: http://localhost:20002 +Member2Tessera: http://localhost:9082 + +Member3Besu RPC: http://localhost:20004 +Member3Tessera: http://localhost:9083 +``` + +Navigate to the `smart_contracts` directory and deploy the private transaction: + +```bash +cd smart_contracts +npm install +node scripts/private_tx.js +``` + +The script deploys the contract and sends an arbitrary value (47) from `Member1` to `Member3`. Once done, it queries all three members (Tessera) to check the value at an address. Only `Member1` & `Member3` has this information as they were involved in the transaction, `Member2` responds with a `0x` to indicate it is unaware of the transaction. + +```bash +node scripts/private_tx.js +Creating contract... +Getting contractAddress from txHash: 0xc1b57f6a7773fe887afb141a09a573d19cb0fdbb15e0f2b9ed0dfead6f5b5dbf +Waiting for transaction to be mined ... +Address of transaction: 0x8220ca987f7bb7f99815d0ef64e1d8a072a2c167 +Use the smart contracts 'get' function to read the contract's constructor initialized value .. +Waiting for transaction to be mined ... +Member1 value from deployed contract is: 0x000000000000000000000000000000000000000000000000000000000000002f +Use the smart contracts 'set' function to update that value to 123 .. - from member1 to member3 +Transaction hash: 0x387c6627fe87e235b0f2bbbe1b2003a11b54afc737dca8da4990d3de3197ac5f +Waiting for transaction to be mined ... +Verify the private transaction is private by reading the value from all three members .. +Waiting for transaction to be mined ... +Member1 value from deployed contract is: 0x000000000000000000000000000000000000000000000000000000000000007b +Waiting for transaction to be mined ... +Member2 value from deployed contract is: 0x +Waiting for transaction to be mined ... +Member3 value from deployed contract is: 0x000000000000000000000000000000000000000000000000000000000000007b +``` + +The general contract deployment flow is: + +1. Deploy a contract, which returns a transaction hash. + +1. Obtain the privacy transaction receipt from the transaction hash. + +1. Use the contract address in the privacy transaction receipt to [interact with the contract](../contracts/interact.md) from that point on. + +## Further examples + +View the [web3js-quorum client library example](web3js-quorum.md) and view the [sample code examples](https://github.com/ConsenSys/web3js-quorum/tree/master/example). + +You can also test the erc20 token example by executing `erc20.js` which deploys a `HumanStandardToken` contract and transfers 1 token to Node2. + +This can be verified from the `data` field of the `logs` which is `1`. + +## Stop the network + +Do one of the following to stop the network: + +- Stop the network: + + ```bash + ./stop.sh + ``` + +- Stop the network and remove the containers and volumes: + + ```bash + ./remove.sh + ``` diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/web3js-quorum.md b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/web3js-quorum.md new file mode 100644 index 00000000000..1495f8225d2 --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/privacy/web3js-quorum.md @@ -0,0 +1,118 @@ +--- +title: Use the web3js-quorum multi-node example +sidebar_position: 3 +description: web3js-quorum client library multi-node example +--- + +# Use the multi-node example in the web3js-quorum client library + +To use the examples provided in the web3js-quorum library with [your privacy network](index.md): + +:::note + +This example uses 3 of the 4 nodes configured in the [privacy tutorial](index.md). + +::: + +1. Clone the **ConsenSys/web3js-quorum** repository: + + ```bash + git clone https://github.com/ConsenSys/web3js-quorum + ``` + +2. In the `web3js-quorum` directory: + + ```bash + npm install + ``` + +3. In the `example` directory, update the `keys.js` file to include: + + - chain ID + - Tessera node public keys + - Hyperledger Besu node RPC URLs + - [Hyperledger Besu node private keys](../../../public-networks/concepts/node-keys.md#node-private-key). + +4. In the `example/multiNodeExample` directory, deploy the contract: + + ```bash + node deployContract.js + ``` + + A private transaction receipt returns. + + ```text + Transaction Hash 0x23b57ddc3ecf9c9a548e4401a411420ffc0002fd259a86d5656add7c6108beeb + Waiting for transaction to be mined ... + Private Transaction Receipt + { contractAddress: '0xfee84481da8f4b9a998dfacb38091b3145bb01ab', + from: '0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb', + to: null, + output: + '0x6080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f245811461005b5780636057361d1461008257806367e404ce146100ae575b600080fd5b34801561006757600080fd5b506100706100ec565b60408051918252519081900360200190f35b34801561008e57600080fd5b506100ac600480360360208110156100a557600080fd5b50356100f2565b005b3480156100ba57600080fd5b506100c3610151565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60025490565b604080513381526020810183905281517fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f5929181900390910190a16002556001805473ffffffffffffffffffffffffffffffffffffffff191633179055565b60015473ffffffffffffffffffffffffffffffffffffffff169056fea165627a7a72305820c7f729cb24e05c221f5aa913700793994656f233fe2ce3b9fd9a505ea17e8d8a0029', + logs: [] } + ``` + + :::note + + If you receive a `Method not enabled` error, ensure you enabled the appropriate APIs using the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) + + ::: + +5. Copy the contract address from the private transaction receipt and set the `CONTRACT_ADDRESS` environment variable: + + ```bash + export CONTRACT_ADDRESS= + ``` + + !!! example + + ```bash + export CONTRACT_ADDRESS=0xfee84481da8f4b9a998dfacb38091b3145bb01ab + ``` + +6. Store a value in the contract from Node 1: + + ```bash + node storeValueFromNode1.js + ``` + + Node 1 stores the value of 1000 (3e8 in hex) and is visible to Node 1 and Node 2. + + ```bash + Transaction Hash: 0xd9d71cc6f64675e1a48183ded8f08930af317eb883ebae4c4eec66ae68618d85 + Waiting for transaction to be mined ... + Event Emited: 0x0000000000000000000000009811ebc35d7b06b3fa8dc5809a1f9c52751e1deb00000000000000000000000000000000000000000000000000000000000003e8 + Waiting for transaction to be mined ... + Get Value from http://localhost:8545: 0x00000000000000000000000000000000000000000000000000000000000003e8 + Waiting for transaction to be mined ... + Get Value from http://localhost:8546: 0x00000000000000000000000000000000000000000000000000000000000003e8 + Waiting for transaction to be mined ... + Get Value from http://localhost:8547: 0x + ``` + +7. Store a value in the contract from Node 2: + + ```bash + node storeValueFromNode2.js + ``` + + Node 2 stores the value of 42 (2a in hex) and is visible to Node 1 and Node 2. + + ```text + Transaction Hash: 0xa025433aec47a71b0230f12f43708812fd38ff7b7c1dc89a715f71dcbd5fbdbf + Waiting for transaction to be mined ... + Event Emited: 0x000000000000000000000000372a70ace72b02cc7f1757183f98c620254f9c8d000000000000000000000000000000000000000000000000000000000000002a + Waiting for transaction to be mined ... + Get Value from http://localhost:8545: 0x000000000000000000000000000000000000000000000000000000000000002a + Waiting for transaction to be mined ... + Get Value from http://localhost:8546: 0x000000000000000000000000000000000000000000000000000000000000002a + Waiting for transaction to be mined ... + Get Value from http://localhost:8547: 0x + ``` + + :::note + + As expected, log messages indicate that Node 3 Tessera cannot find payloads because Node 3 does not have access to the private transactions between Node 1 and Node 2. + + ::: diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/qbft.md b/versioned_docs/version-23.4.0/private-networks/tutorials/qbft.md new file mode 100644 index 00000000000..d03a032cada --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/qbft.md @@ -0,0 +1,375 @@ +--- +title: Create a QBFT network +sidebar_position: 2 +description: Hyperledger Besu private network using the QBFT (proof of authority) consensus protocol +--- + +# Create a private network using QBFT + +A private network provides a configurable network for testing. This private network uses the [QBFT (proof of authority) consensus protocol](../how-to/configure/consensus/qbft.md). + +The QBFT network in this tutorial implements the [block header validator selection method] to manage validators. For a tutorial on how to implement the [contract validator selection method], follow the steps in the [example smart contract repository]. + +:::important + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +This tutorial configures a private network using QBFT for educational purposes only. QBFT requires 4 validators to be Byzantine fault tolerant. + +::: + +## Prerequisites + +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using QBFT with four nodes. The four nodes are all validators. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. + +Create directories for your private network, each of the four nodes, and a data directory for each node: + +```bash +QBFT-Network/ +├── Node-1 +│ ├── data +├── Node-2 +│ ├── data +├── Node-3 +│ ├── data +└── Node-4 + ├── data +``` + +### 2. Create a configuration file + +The configuration file defines the [QBFT genesis file](../how-to/configure/consensus/qbft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the QBFT genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `qbftConfigFile.json` and save it in the `QBFT-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +:::warning + +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `QBFT-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=qbftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```text +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │ ├── key + │ └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │ ├── key + │ └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │ ├── key + │ └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the QBFT-Network directory + +Copy the `genesis.json` file to the `QBFT-Network` directory. + +### 5. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```text +QBFT-Network/ +├── genesis.json +├── Node-1 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +├── Node-2 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +├── Node-3 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +├── Node-4 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +``` + +### 6. Start the first node as the bootnode + +In the `Node-1` directory, start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line: + +- Specifies the data directory for Node-1 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- Enables the JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables the ETH, NET, and QBFT APIs using the [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option. +- Enables all-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. +- Enables all-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../assets/images/EnodeStartup.png) + +### 7. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + + +The command line specifies: + +- The data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 8. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + + +The command line specifies: + +- The data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 9. Start Node-4 + +Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 +``` + + + +The command line specifies: + +- The data directory for Node-4 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 10. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`qbft_getvalidatorsbyblocknumber`](../reference/api/index.md#qbft_getvalidatorsbyblocknumber) method and confirm the network has four validators: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' localhost:8545 +``` + +The result displays the four validators: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x73ced0bd3def2e2d9859e3bd0882683a2e6835fb", + "0x7a175f3542ceb60bf80fb536b3f42e7a30c0a6d7", + "0x7f6efa6e34f8c9b591a9ad4763e21b3fca31bcd6", + "0xc64140f1c9d5bb82e54976e568ad39958c3e94be" + ] +} +``` + +Look at the logs to confirm Besu is producing blocks: + +```bash +2021-05-26 08:47:00.221+10:00 | EthScheduler-Workers-0 | INFO | PersistBlockTask | Imported #1 / 0 tx / 0 om / 0 (0.0%) gas / (0x4ee4456536e2793523df87288fae76518089eec91c3f7e05e220f1f4d3f6f95b) in 0.016s. Peers: 4 +2021-05-26 08:47:02.071+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #2 / 0 tx / 0 pending / 0 (0.0%) gas / (0x6fc47ada7146d75f6a46911d8d4038795b0c99970bbd4ce0c6d6aa60955f66fe) +2021-05-26 08:47:04.051+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #3 / 0 tx / 0 pending / 0 (0.0%) gas / (0x3cb663880a65103266b11a8d8631beca5c482d515ac287125aa077b2e31b80b0) +2021-05-26 08:47:06.058+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Produced #4 / 0 tx / 0 pending / 0 (0.0%) gas / (0xc2927915ac0c94bab5fc9acea6608455f1c857d69e97191dc2c39e4ac411817b) +2021-05-26 08:47:08.058+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #5 / 0 tx / 0 pending / 0 (0.0%) gas / (0xba63471d62c936733add9b884f5213c3842af9f52460268e39e0666ab82f02a5) +``` + +:::important + +If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), the network will not start producing blocks. + +The logs for each node should indicate the public key was loaded from the `data/key` directory: + +```bash +2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Loaded public key 0x931d32f1aec4e45b150ee38f3c74157a750fc53f523e63fe2b07bf3fce43a3de64587fc9aaf3736444f2e3eef0eea90be3b67d18be7b5b2b7cb2fcd670416a7e from /QBFT-Network/Node-1/data/key +``` + +If the keys were not copied to the correct directory, Besu creates a key when starting up: + +```bash +2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /QBFT-Network/Node-1/data/key +``` + +If a new key was created, the validator key specified in the configuration does not match the created key and the node cannot participate in creating blocks. + +::: + +## Next steps + +Use the [QBFT API](../reference/api/index.md#qbft-methods) to remove or add validators, or import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::note + +To add or remove nodes as validators you need the node address. The directory [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the name. + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: + +You can switch from the [block header validator selection method] configured here, to the [contract validator selection method] by updating the genesis file and [configuring a transition]. + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the QBFT network in the future, start from [step 6](#6-start-the-first-node-as-the-bootnode). + +::: + + + +[block header validator selection method]: ../how-to/configure/consensus/qbft.md#add-and-remove-validators-using-block-headers +[contract validator selection method]: ../how-to/configure/consensus/qbft.md#add-and-remove-validators-using-a-smart-contract +[example smart contract repository]: https://github.com/ConsenSys/validator-smart-contracts +[configuring a transition]: ../how-to/configure/consensus/qbft.md#transitions + + + +\*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. diff --git a/versioned_docs/version-23.4.0/private-networks/tutorials/quickstart.md b/versioned_docs/version-23.4.0/private-networks/tutorials/quickstart.md new file mode 100644 index 00000000000..ad04c892f7b --- /dev/null +++ b/versioned_docs/version-23.4.0/private-networks/tutorials/quickstart.md @@ -0,0 +1,592 @@ +--- +title: Quorum Developer Quickstart +sidebar_position: 1 +description: Rapidly generate local blockchain networks. +--- + +import TestAccounts from '../../global/test_accounts.md'; + +import Postman from '../../global/postman.md'; + +# Developer Quickstart + +The Quorum Developer Quickstart uses the Hyperledger Besu Docker image to run a private [IBFT 2.0](../how-to/configure/consensus/ibft.md) network of Besu nodes managed by Docker Compose. + +:::danger + +This tutorial runs a private network suitable for education or demonstration purposes and is not intended for running production networks. + +::: + +## Prerequisites + +- One of the following operating systems: + - Linux on x86_64 architecture + - macOS on an Intel processor (M1 processor not supported yet) + - Windows 64-bit edition, with: + - Windows Subsystem for Linux 2 + - Docker desktop configured to use the WSL2-based engine +- [Docker and Docker Compose](https://docs.docker.com/compose/install/) +- [Node.js](https://nodejs.org/en/download/) version 12 or higher +- [Truffle](https://www.trufflesuite.com/truffle) +- [cURL command line](https://curl.haxx.se/download.html) +- [MetaMask](https://metamask.io/) + +:::info + +Allow Docker up to 4G of memory or 6G if running the privacy examples. Refer to the **Resources** section in [Docker for Mac](https://docs.docker.com/docker-for-mac/) and [Docker Desktop](https://docs.docker.com/docker-for-windows/) for details. + +::: + +## Generate the tutorial blockchain configuration files + +To create the tutorial `docker-compose` files and artifacts, run: + +```bash +npx quorum-dev-quickstart +``` + +Follow the prompts displayed to run Hyperledger Besu and [logging with ELK](../how-to/monitor/elastic-stack.md). Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) and [private transactions](../concepts/privacy/index.md). + +:::note + +If you enter `y` for private transactions, you get three Besu nodes with corresponding Tessera nodes for privacy. You can follow the [privacy walk-through](privacy/index.md), which details how to send private transactions and interact with deployed private contracts. + +::: + +## Start the network + +To start the network, go to the installation directory (`quorum-test-network` if you used the default value) and run: + +```bash +./run.sh +``` + +The script builds the Docker images, and runs the Docker containers. + +Four Besu IBFT 2.0 validator nodes and a non-validator node are created to simulate a base network. + +When execution is successfully finished, the process lists the available services: + +```log title="Services list" +************************************* +Quorum Dev Quickstart +************************************* +---------------------------------- +List endpoints and services +---------------------------------- +JSON-RPC HTTP service endpoint : http://localhost:8545 +JSON-RPC WebSocket service endpoint : ws://localhost:8546 +Web block explorer address : http://localhost:25000/ +Prometheus address : http://localhost:9090/graph +Grafana address : http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All +Kibana logs address : http://localhost:5601/app/kibana#/discover +Collated logs using Grafana Loki : http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search= + +For more information on the endpoints and services, refer to README.md in the installation directory. +**************************************************************** +``` + +- Use the **JSON-RPC HTTP service endpoint** to access the RPC node service from your dapp or from cryptocurrency wallets such as MetaMask. +- Use the **JSON-RPC WebSocket service endpoint** to access the Web socket node service from your dapp. +- Use the **Web block explorer address** to display the [block explorer Web application](http://localhost:25000). +- Use the **Prometheus address** to access the [Prometheus dashboard](http://localhost:9090/graph). [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). +- Use the **Grafana address** to access the [Grafana dashboard](http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All). [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). +- Use the **Kibana logs address** to access the [logs in Kibana](http://localhost:5601/app/kibana#/discover). [Read more about log management](../how-to/monitor/elastic-stack.md). +- Use the **Grafana Loki logs address** to access the [logs in Grafana](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=). [Read more about log management](../how-to/monitor/loki.md). + +To display the list of endpoints again, run: + +```bash +./list.sh +``` + +## Use a block explorer + +You can [use Sirato Blockchain Explorer](../how-to/monitor/sirato-explorer.md) to analyze block information, contract metadata, transaction searches, and more. Sirato has built-in support for privacy-enabled Besu networks. + +:::note + +You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, in order to allow access for Besu [privacy API methods](../reference/api/index.md#priv-methods). In production networks, you must [secure access](../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. + +::: + +Clone the [Sirato GitHub repository](https://github.com/web3labs/sirato-free): + +```bash +git clone https://github.com/web3labs/sirato-free +``` + +From the Sirato directory, run the following command: + +```bash +cd docker-compose +NODE_ENDPOINT=member1besu PORT=26000 docker-compose -f docker-compose.yml -f sirato-extensions/docker-compose-quorum-dev-quickstart.yml up +``` + +Open `http://localhost/` on your browser. You’ll see the new initialization page while it boots up. This may take 5–10 minutes for the all services to start and the ingestion sync to complete. + +To stop all the services from running, run the following script from the `docker-compose` directory: + +```bash +docker-compose down -v +``` + +## Monitor nodes with Prometheus and Grafana + +The sample network also includes Prometheus and Grafana monitoring tools to let you visualize node health and usage. You can directly access these tools from your browser at the addresses displayed in the endpoint list. + +- [Prometheus dashboard](http://localhost:9090/graph) +- [Grafana dashboard](http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All) +- [Grafana Loki logs dashboard](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=quorum&var-search=) + +For more details on how to configure and use these tools for your own nodes, see the [performance monitoring documentation](../../public-networks/how-to/monitor/metrics.md), [Prometheus documentation](https://prometheus.io/docs/introduction/overview/) and [Grafana documentation](https://grafana.com/docs/). + +![Grafana dashboard screenshot](../../assets/images/grafana.png) + +and collated logs via Grafana Loki + +![Grafana Loki dashboard screenshot](../../assets/images/grafana_loki.png) + +## Run JSON-RPC requests + +You can run JSON-RPC requests on: + +- HTTP with `http://localhost:8545`. +- WebSockets with `ws://localhost:8546`. + +### Run with `cURL` + +This tutorial uses [cURL](https://curl.haxx.se/download.html) to send JSON-RPC requests over HTTP. + +### Run with Postman + +You can also run all the requests with the Besu Postman collection. + + + +### Request the node version + +Run the following command from the host shell: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://localhost:8545 +``` + +The result displays the client version of the running node: + + + +# Result example + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "besu/v21.1.2/linux-x86_64/oracle_openjdk-java-11" +} +``` + +# Result explanation + +- `"jsonrpc" : "2.0"` indicates that the JSON-RPC 2.0 spec format is used. +- `"id" : 1` is the request identifier used to match the request and the response. This tutorial always uses 1. +- `"result"` contains the running Besu information: + - `v21.1.2` is the running Besu version number. This may be different when you run this tutorial. + - `linux-x86_64` is the architecture used to build this version. + - `oracle_openjdk-java-11` is the JVM type and version used to build this version. This may be different when you run this tutorial. + + + +Successfully calling this method shows that you can connect to the nodes using JSON-RPC over HTTP. + +From here, you can walk through more interesting requests demonstrated in the rest of this section, or skip ahead to [Create a transaction using MetaMask](#create-a-transaction-using-metamask). + +### Count the peers + +Peers are the other nodes connected to the node receiving the JSON-RPC request. + +Poll the peer count using [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount): + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' http://localhost:8545 +``` + +The result indicates that there are four peers (the validators): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4" +} +``` + +### Request the most recent block number + +Call [`eth_blockNumber`](../../public-networks/reference/api/index.md#eth_blockNumber) to retrieve the number of the most recently synchronized block: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http://localhost:8545 +``` + +The result indicates the highest block number synchronized on this node. + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x2a" +} +``` + +Here the hexadecimal value `0x2a` translates to decimal as `42`, the number of blocks received by the node so far, about two minutes after the new network started. + +## Create a transaction using MetaMask + +You can use [MetaMask](https://metamask.io/) to send a transaction on your private network. + +1. Open MetaMask and connect it to your private network RPC endpoint by selecting `Localhost 8545` in the network list. +1. Choose one of the following test accounts and [import it into MetaMask by copying the corresponding private key](https://metamask.zendesk.com/hc/en-us/articles/360015489331-How-to-import-an-Account). + + + +:::note + +Besu doesn't incorporate [account management](../../public-networks/how-to/send-transactions.md). To create your own account, you have to use a third-party tool, such as MetaMask. + +::: + +1. After importing an existing test account, [create another test account from scratch] to use as the recipient for a test Ether transaction. + +1. In MetaMask, select the new test account and [copy its address](https://metamask.zendesk.com/hc/en-us/articles/360015289512-How-to-copy-your-MetaMask-Account-Public-Address). + +1. In the [Block Explorer](http://localhost:25000), search for the new test account by selecting the :mag: and pasting the test account address into the search box. + + The new test account displays with a zero balance. + +1. [Send test Ether](https://metamask.zendesk.com/hc/en-us/articles/360015488931-How-to-send-ETH-and-ERC-20-tokens-from-your-MetaMask-Wallet) from the first test account (containing test Ether) to the new test account (which has a zero balance). + + :::tip + + You can use a zero gas price here as this private test network is a [free gas network](../how-to/configure/free-gas.md), but the maximum amount of gas that can be used (the gas limit) for a value transaction must be at least 21000. + + ::: + +1. Refresh the Block Explorer page in your browser displaying the target test account. + + The updated balance reflects the transaction completed using MetaMask. + +## Smart contract and dapp usage + +You can use a demo dapp called Pet Shop, provided by [Truffle](https://www.trufflesuite.com/tutorial). + +The dapp runs a local website using Docker, and uses smart contracts deployed on the network. + +The directory created by `quorum-dev-quickstart` includes a `dapps` directory with a `pet-shop` subdirectory, which contains the source code for the dapp, including the smart contracts, website, and configurations to run this tutorial. + +With the blockchain running and MetaMask connected to `Localhost 8545` via the browser, run the following command to start the Pet Shop dapp: + +```bash +cd dapps/pet-shop +./run_dapp.sh +``` + +The script: + +1. Installs the dapp Node dependencies (you may see some warnings here, but it will not prevent the dapp from running). +1. Compiles the contracts. +1. Deploys the contracts to the blockchain. +1. Runs tests. +1. Builds and runs a Docker image to serve the dapp website. + +```text './run_dapp.sh' example output +Compiling your contracts... +=========================== +> Compiling ./contracts/Adoption.sol +> Compiling ./contracts/Migrations.sol +> Artifacts written to /Users/demo/quorum-test-network/dapps/pet-shop/pet-shop-box/build/contracts +> Compiled successfully using: + - solc: 0.5.16+commit.9c3226ce.Emscripten.clang + +Starting migrations... +====================== +> Network name: 'quickstartWallet' +> Network id: 1337 +> Block gas limit: 16234336 (0xf7b760) + +1_initial_migration.js +====================== + + Deploying 'Migrations' + ---------------------- + > transaction hash: 0xdd27f5bc5b0c4a42bb4f4d9ba00b4d33742de10ba8f03484cbf095ee824ba11a + > Blocks: 0 Seconds: 0 + > contract address: 0xFB88dE099e13c3ED21F80a7a1E49f8CAEcF10df6 + > block number: 2747 + > block timestamp: 1618000437 + > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 + > balance: 89999.97435026 + > gas used: 221555 (0x36173) + > gas price: 20 gwei + > value sent: 0 ETH + > total cost: 0.0044311 ETH + + + > Saving migration to chain. + > Saving artifacts + ------------------------------------- + > Total cost: 0.0044311 ETH + +2_deploy_contracts.js +===================== + + Deploying 'Adoption' + -------------------- + > transaction hash: 0xd6f5b11807a0727a92b6063c95b9101769d310592b0d3cf35d6df233d05d50e6 + > Blocks: 0 Seconds: 0 + > contract address: 0xf204a4Ef082f5c04bB89F7D5E6568B796096735a + > block number: 2749 + > block timestamp: 1618000441 + > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 + > balance: 89999.968712 + > gas used: 239915 (0x3a92b) + > gas price: 20 gwei + > value sent: 0 ETH + > total cost: 0.0047983 ETH + + + > Saving migration to chain. + > Saving artifacts + ------------------------------------- + > Total cost: 0.0047983 ETH + +Summary +======= +> Total deployments: 2 +> Final cost: 0.0092294 ETH + + +Using network 'quickstartWallet'. + +Compiling your contracts... +=========================== +> Compiling ./test/TestAdoption.sol + +TestAdoption +✓ testUserCanAdoptPet (2071ms) +✓ testGetAdopterAddressByPetId (6070ms) +✓ testGetAdopterAddressByPetIdInArray (6077ms) + +3 passing (37s) +``` + +After these tests are successful, the script builds a container for the Pet Shop dapp and deploys it, binding it to port 3001 on your system. + +```text +Sending build context to Docker daemon 489.4MB +Step 1/5 : FROM node:12.14.1-stretch-slim +---> 2f7e25ad14ea +Step 2/5 : EXPOSE 3001 +---> Using cache +---> 2ef0665a040a +Step 3/5 : WORKDIR /app +---> Using cache +---> e8e97cedb575 +Step 4/5 : COPY . /app +---> f70e4265e598 +Step 5/5 : CMD npm run dev +---> Running in 3c6e8bdb3f3b +Removing intermediate container 3c6e8bdb3f3b +---> ce2588e47ab0 +Successfully built ce2588e47ab0 +Successfully tagged quorum-dev-quickstart_pet_shop:latest +b1615ab765656bc027f63fc60019dba1ca572305766c820f41eaf113b7e14cf8 +``` + +In the browser where you have MetaMask enabled and one of the test accounts loaded, open a new tab and navigate to [the Pet Shop dapp](http://localhost:3001) where you can adopt lovely pets (sorry, not for real, it's a demo). + +When you select **Adopt**, a MetaMask window pops up and requests your permission to continue with the transaction. + +After the transaction is complete and successful, the status of the pet you adopted shows **Success**. + +![Dapp UI](../../assets/images/dapp-ui.png) + +You can also search for the transaction and view its details in the [Block Explorer](http://localhost:25000/). + +![Dapp UI](../../assets/images/dapp-explorer-tx.png) + +The MetMask UI also keeps a record of the transaction. + +![Dapp UI](../../assets/images/dapp-metamask-tx.png) + +### Deploy your own dapp + +You can deploy your own dapp to the Quorum Developer Quickstart, by configuring your dapp to point to the Quickstart network. + +If you're using [Truffle](https://trufflesuite.com/truffle/), update the `networks` object in the [Truffle configuration file](https://trufflesuite.com/docs/truffle/reference/configuration#networks) to specify which networks to connect to for deployments and testing. The Quickstart RPC service endpoint is `http://localhost:8545`. + +For example, the following is the Truffle configuration file for the Pet Shop dapp used in the Quickstart Besu network: + +```js +const PrivateKeyProvider = require("@truffle/hdwallet-provider"); + +// insert the private key of the account used in MetaMask, e.g. Account 1 (Miner Coinbase Account) +const privateKey = + "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; + +module.exports = { + networks: { + development: { + host: "127.0.0.1", + port: 7545, + network_id: "*", // Match any network id + }, + develop: { + port: 8545, + }, + quickstartWallet: { + provider: () => + new PrivateKeyProvider(privateKey, "http://localhost:8545"), + network_id: "*", + }, + }, +}; +``` + +Deploy the dapp using: + +```bash +truffle migrate --network quickstartWallet +``` + +## Stop and restart the private network without removing containers + +To shut down the private network without deleting the containers: + +```bash +./stop.sh +``` + +This command stops the containers related to the services specified in the `docker-compose.yml` file. + +To restart the private network: + +```bash +./resume.sh +``` + +## Stop the private network and remove containers + +To shut down the private network and delete all containers and images created from running the sample network and the Pet Shop dapp: + +```bash +./remove.sh +``` + +## Add a new node to the network + +New nodes joining an existing network require the following: + +- The same genesis file used by all other nodes on the running network. +- A list of nodes to connect to; this is done by specifying [bootnodes], or by providing a list of [static nodes]. +- A node key pair and optionally an account. If the running network is using permissions, then you need to add the new node's enode details to the [permissions file] used by existing nodes, or update the onchain permissioning contract. + +The following steps describe the process to add a new node to the Developer Quickstart. + +### 1. Create the node key files + +Create a node key pair and account for a new node by running the following script: + +```bash +cd ./extra +npm install +node generate_node_keys.js --password "Password" +``` + +:::note + +The `--password` parameter is optional. + +::: + +### 2. Create new node directory + +Navigate to the directory where the configuration files for the network were created. + +:::note + +The directory was specified in an earlier step when running `npx quorum-dev-quickstart`. The default location is `./quorum-test-network`. + +::: + +In the `config/nodes` directory, create a subdirectory for the new node (for example, `newnode`), and move the `nodekey`, `nodekey.pub`, `address` and `accountkey` files from the previous step into this directory. + +### 3. Update docker-compose + +Add an entry for the new node into the docker-compose file: + +```yaml +newnode: + <<: *besu-def + container_name: newnode + volumes: + - public-keys:/opt/besu/public-keys/ + - ./config/besu/:/config + - ./config/nodes/newnode:/opt/besu/keys + - ./logs/besu:/tmp/besu + depends_on: + - validator1 + networks: + quorum-dev-quickstart: + ipv4_address: 172.16.239.41 +``` + +!!! important + + Select an IP address and port map not being used for the other containers. + Mount the newly created folder `./config/nodes/newnode` to the `/opt/besu/keys` directory of the new node, as seen + in this example. + +### 4. Update Prometheus configuration + +Update `prometheus.yml` in the `./config/prometheus/` directory to configure metrics to display in Grafana. + +Insert the following under `scrape_configs` section in the file. Change `job_name` and `targets` appropriately if you've updated them. + +```yaml +- job_name: newnode + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: [newnode:9545] +``` + +### 5. Update files with the enode address + +Add the new node's enode address to the [static nodes] file and [permissions file]. The enode uses the format `enode://pubkey@ip_address:30303`. If the `nodekey.pub` is `4540ea...9c1d78` and the IP address is `172.16.239.41`, then the enode address is `"enode://4540ea...9c1d78@172.16.239.41:30303"`, which must be added to both files. + +Alternatively, call the [`perm_addNodesToAllowlist`](../../public-networks/reference/api/index.md#perm_addnodestoallowlist) API method on existing nodes to add the new node without restarting. + +:::note + +Calling the API method by itself only persists for as long as the nodes remain online and is lost on the next restart. + +On a live network, the new node must be added to the [permissions file] so that subsequent restarts of the nodes are aware of the change. + +::: + +### 6. Start the network + +Once complete, start the network up with `./run.sh`. When using the smart contract you can either make changes via a [dapp](https://github.com/ConsenSys/permissioning-smart-contracts) or via [RPC API calls](../../public-networks/reference/api/index.md#perm_addnodestoallowlist). + + + +[bootnodes]: ../how-to/configure/bootnodes.md +[permissions file]: ../how-to/use-permissioning/local.md +[static nodes]: ../../public-networks/how-to/connect/static-nodes.md +[allow list]: ../how-to/use-permissioning/local.md#node-allowlisting +[Import one of the existing accounts above into MetaMask]: https://metamask.zendesk.com/hc/en-us/articles/360015489331-Importing-an-Account-New-UI- +[create another test account from scratch]: https://metamask.zendesk.com/hc/en-us/articles/360015289452-Creating-Additional-MetaMask-Wallets-New-UI- diff --git a/docs/private-networks/.meta.yml b/versioned_docs/version-23.4.0/public-networks/.meta.yml similarity index 88% rename from docs/private-networks/.meta.yml rename to versioned_docs/version-23.4.0/public-networks/.meta.yml index b15f1b1bec1..47f9110472f 100644 --- a/docs/private-networks/.meta.yml +++ b/versioned_docs/version-23.4.0/public-networks/.meta.yml @@ -3,4 +3,4 @@ # see https://squidfunk.github.io/mkdocs-material/reference/#built-in-meta-plugin tags: - - private networks + - public networks diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/_category_.json b/versioned_docs/version-23.4.0/public-networks/concepts/_category_.json new file mode 100644 index 00000000000..d373a29254a --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Concepts", + "position": 4 +} diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/data-storage-formats.md b/versioned_docs/version-23.4.0/public-networks/concepts/data-storage-formats.md new file mode 100644 index 00000000000..daf6c6fea84 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/data-storage-formats.md @@ -0,0 +1,83 @@ +--- +title: Data storage formats +sidebar_position: 3 +description: Data storage formats +--- + +# Data storage formats + +Besu offers two formats for storing the world state, [Forest of Tries](#forest-of-tries) and [Bonsai Tries](#bonsai-tries). + +## Forest of Tries + +Forest of Tries, also called forest mode, is the default storage format. + +In forest mode, each node in the trie is saved in a key-value store by hash. For each block, the world state is updated with new nodes, leaf nodes, and a new state root. Old leaf nodes remain in the underlying data store. Data is accessed and stored by hash, which increases the size of the database and increases the resources and time needed to access account data. + +![forest_of_tries](../../assets/images/forest_of_tries.png) + +### Pruning + +Pruning reduces the storage required by removing state trie nodes unreachable from [recent blocks](../../public-networks/reference/cli/options.md#pruning-blocks-retained). + +Pruning is disabled by default, and can be enabled with the [`--pruning-enabled`](../../public-networks/reference/cli/options.md#pruning-enabled) command line option. + +:::info + +Using pruning with [private transactions](../../private-networks/concepts/privacy/private-transactions)\ +isn't supported. + +::: + +Pruning might increase block import times, but it doesn't affect the ability of nodes to stay in sync. + +:::caution + +Pruning is being deprecated for [Bonsai Tries](#bonsai-tries) and is currently not being updated. + +::: + +## Bonsai Tries + +Bonsai Tries is a data storage layout policy designed to reduce storage requirements and increase read performance. + +Bonsai stores leaf values in a trie log, separate from the branches of the trie. Bonsai stores nodes by the location of the node instead of the hash of the node. Bonsai can access the leaf from the underlying storage directly using the account key. This greatly reduces the disk space needed for storage and allows for less resource-demanding and faster read performance. Bonsai inherently prunes orphaned nodes and old branches. + +To run a node with Bonsai Tries data storage format, use the command line option [`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). + +![Bonsai_tries](../../assets/images/Bonsai_tries.png) + +## Forest of Tries vs. Bonsai Tries + +### Storage requirements + +Forest mode uses significantly more memory than Bonsai. With an [archive node](../get-started/connect/sync-node.md#run-an-archive-node), forest mode uses an estimated 12 TB of storage, while Bonsai uses an estimated 1100 GB of storage. With a [full node](../get-started/connect/sync-node.md#run-a-full-node), forest mode uses an estimated 750 GB of storage, while Bonsai uses an estimated 650 GB of storage. + +### Accessing data + +Forest mode must go through all the branches by hash to read a leaf value. Bonsai can access the leaf from the underlying storage directly using the account key. Bonsai will generally read faster than forest mode, particularly if the blocks are more recent. + +However, Bonsai becomes increasingly more resource-intensive the further in history you try to read data. To prevent this, you can limit how far Bonsai looks back while reconstructing data. The default limit Bonsai looks back is 512. To change the parameter, use the [`--bonsai-maximum-back-layers-to-load`](../reference/cli/options.md#bonsai-maximum-back-layers-to-load) option. + +:::note + +Using `--bonsai-maximum-back-layers-to-load` doesn't affect the size of the database being stored, only how far back to load. This means there is no "safe minimum" value to use with this option. + +::: + +### Syncing nodes + +The following table shows the ways you can [sync a full node](../get-started/connect/sync-node.md#run-a-full-node) with the different data storage formats using [fast](../get-started/connect/sync-node.md#fast-synchronization) and [snap](../get-started/connect/sync-node.md#snap-synchronization) sync. + +| Data storage format | Sync mode | Storage estimate | Can other nodes sync to your node? | +| --- | --- | --- | --- | +| Bonsai | Fast | 650 GB | No | +| Bonsai | Snap | 650 GB | To be implemented | +| Forest | Fast | 750 GB | Yes | +| Forest | Snap | 750 GB | No | + +:::tip + +We recommend using snap sync with Bonsai for the fastest sync and lowest storage requirements. + +::: diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/events-and-logs.md b/versioned_docs/version-23.4.0/public-networks/concepts/events-and-logs.md new file mode 100644 index 00000000000..07f46288e7b --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/events-and-logs.md @@ -0,0 +1,185 @@ +--- +title: Events and logs +sidebar_position: 6 +description: Hyperledger Besu events and logs +tags: + - private networks +--- + +# Events and logs + +Transaction mining causes smart contracts to emit events and write logs to the blockchain. + +The smart contract address is the link to the logs and the blockchain includes the logs, but contracts cannot access logs. Log storage is cheaper than contract storage (that is, it costs less gas) so storing and accessing the required data in logs reduces the cost. For example, use logs to display all transfers made using a specific contract, but not the current state of the contract. + +A Dapp front end can either access logs using the [JSON-RPC API filter methods](../how-to/use-besu-api/access-logs.md) or subscribe to logs using the [RPC Pub/Sub API](../how-to/use-besu-api/rpc-pubsub.md#logs). + +Use [`admin_generateLogBloomCache`](../reference/api/index.md#admin_generatelogbloomcache) to improve log retrieval performance. + +## Topics + +Log entries contain up to four topics. The first topic is the [event signature hash](#event-signature-hash) and up to three topics are the indexed [event parameters](#event-parameters). + +```json title="A log entry for an event with one indexed parameter" +{ + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x84", + "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", + "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] +} +``` + +## Event parameters + +Up to three event parameters can have the `indexed` attribute. Logs store these indexed parameters as `topics`. Indexed parameters are searchable and filterable. + +Topics are 32 bytes. If an indexed argument is an array (including `string` and `byte` datatypes), the log stores the keccak-256 hash of the parameter as a topic. + +Log `data` includes non-indexed parameters but is difficult to search or filter. + +A Solidity contract storing one indexed and one non-indexed parameter and has an event emitting the value of each parameter: + +```solidity +pragma solidity ^0.5.1; +contract Storage { + uint256 public valueIndexed; + uint256 public valueNotIndexed; + + event Event1(uint256 indexed valueIndexed, uint256 valueNotIndexed); + + function setValue(uint256 _valueIndexed, uint256 _valueNotIndexed) public { + valueIndexed = _valueIndexed; + valueNotIndexed = _valueNotIndexed; + emit Event1(_valueIndexed, _valueNotIndexed); + } +} +``` + +A log entry created by invoking the contract in the previous example with `valueIndexed` set to 5 and `valueNotIndexed` set to 7: + +```json +{ + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d6", + "blockHash": "0x7d0ac7c12ac9f622d346d444c7e0fa4dda8d4ed90de80d6a28814613a4884a67", + "transactionHash": "0xe994022ada94371ace00c4e1e20663a01437846ced02f18b3f3afec827002781", + "transactionIndex": "0x0", + "address": "0x43d1f9096674b5722d359b6402381816d5b22f28", + "data": "0x0000000000000000000000000000000000000000000000000000000000000007", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] +} +``` + +## Event signature hash + +The first topic in a log entry is always the event signature hash. The event signature hash is a keccak-256 hash of the event name and input argument types, with argument names ignored. For example, the event `Hello(uint256 worldId)` has the signature hash `keccak('Hello(uint256)')`. The signature identifies to which event log topics belong. + +A Solidity contract with two different events: + +```solidity +pragma solidity ^0.5.1; +contract Storage { + uint256 public valueA; + uint256 public valueB; + + event Event1(uint256 indexed valueA); + event Event2(uint256 indexed valueB); + + function setValue(uint256 _valueA) public { + valueA = _valueA; + emit Event1(_valueA); + } + + function setValueAgain(uint256 _valueB) public { + valueB = _valueB; + emit Event2(_valueB); + } +} +``` + +The event signature hash for event 1 is `keccak('Event1(uint256)')` and the event signature hash for event 2 is `keccak('Event2(uint256)')`. The hashes are: + +- `04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3` for event 1 +- `06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e` for event 2. + +:::tip + +You can use a library keccak (sha3) hash function, such as provided in [Web3.js](https://web3js.readthedocs.io/en/v1.2.11/web3-utils.html?highlight=sha3#sha3), or an online tool, such as https://emn178.github.io/online-tools/keccak_256.html, to generate event signature hashes. + +::: + +Log entries from invoking the Solidity contract in the previous example: + +```json +[ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x84", + "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", + "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x87", + "blockHash": "0x6643a1e58ad857f727552e4572b837a85b3ca64c4799d085170c707e4dad5255", + "transactionHash": "0xa95295fcea7df3b9e47ab95d2dadeb868145719ed9cc0e6c757c8a174e1fcb11", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } +] +``` + +## Topic filters + +[Filter options objects](../reference/api/objects.md#filter-options-object) have a `topics` key to filter logs by topics. + +Topics are order-dependent. A transaction with a log containing topics `[A, B]` matches with the following topic filters: + +- `[]` - Match any topic +- `[A]` - Match A in first position +- `[[null], [B]]` - Match any topic in first position AND B in second position +- `[[A],[B]]` - Match A in first position AND B in second position +- `[[A, C], [B, D]]` - Match (A OR C) in first position AND (B OR D) in second position. + +The following filter option object returns log entries for the [Event Parameters example contract](#event-parameters) with `valueIndexed` set to 5 or 9: + +```json +{ + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x43d1f9096674b5722d359b6402381816d5b22f28", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + [ + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000009" + ] + ] +} +``` diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/genesis-file.md b/versioned_docs/version-23.4.0/public-networks/concepts/genesis-file.md new file mode 100644 index 00000000000..c64eaadb4da --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/genesis-file.md @@ -0,0 +1,49 @@ +--- +title: Genesis file +sidebar_position: 7 +description: Configuring a network using the genesis file +tags: + - private networks +--- + +# Genesis file + +The genesis file defines the first block in the chain, and the first block defines which chain you want to join. + +For Ethereum Mainnet and public testnets (for example, Goerli) the genesis configuration definition is in Besu and used when specifying a public network using the [`--network`](../reference/cli/options.md#network) command line option. + +For private networks, [create a JSON genesis file](https://consensys.net/blog/quorum/hyperledger-besu-how-to-create-an-ethereum-genesis-file/), then specify the genesis file using the [`--genesis-file`](../reference/cli/options.md#genesis-file) command line option. + +The genesis file specifies the [network-wide settings](../reference/genesis-items.md), such as those for a [free gas network](../../private-networks/how-to/configure/free-gas.md), so all nodes in a network must use the same genesis file. + +:::note + +You can specify node-level settings on the command line or in the [node configuration file](../how-to/configuration-file.md). + +::: + +```json title="Example IBFT 2.0 genesis file" +{ + "config": { + "chainId": 2018, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000c0", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb": { + "balance": "0xad78ebc5ac6200000" + } + } +} +``` diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/network-and-chain-id.md b/versioned_docs/version-23.4.0/public-networks/concepts/network-and-chain-id.md new file mode 100644 index 00000000000..d8405c54cd3 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/network-and-chain-id.md @@ -0,0 +1,75 @@ +--- +title: Network ID and chain ID +sidebar_position: 5 +description: Besu network ID and chain ID implementation +tags: + - private networks +--- + +# Network ID and chain ID + +Ethereum networks have two identifiers, a network ID and a chain ID. Although they often have the same value, they have different uses. + +Peer-to-peer communication between nodes uses the _network ID_, while the transaction signature process uses the _chain ID_. + +:::note + +[EIP-155](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md) introduced using the chain ID as part of the transaction signing process to protect against transaction replay attacks. + +::: + +For most networks, including Mainnet and the public testnets, the network ID and the chain ID are the same, with the network ID defaulting to the chain ID, as specified in the genesis file. + +```json title="Chain ID in the genesis file" +{ + "config": { + "ethash": { + }, + "chainID": 1981 + }, + ... +} +``` + +Besu sets the chain ID (and by default the network ID) automatically, using either the [`--genesis-file`](../reference/cli/options.md#genesis-file) option or when specifying a network using the [`--network`](../reference/cli/options.md#network) option. The following table lists the available networks and their chain and network IDs. + +| Network | Chain | Chain ID | Network ID | Type | +| --------- | ----- | -------- | ---------- | ----------- | +| `mainnet` | ETH | 1 | 1 | Production | +| `goerli` | ETH | 5 | 5 | Test | +| `sepolia` | ETH | 11155111 | 11155111 | Test | +| `dev` | ETH | 2018 | 2018 | Development | +| `classic` | ETC | 61 | 1 | Production | +| `mordor` | ETC | 63 | 7 | Test | +| `kotti` | ETC | 6 | 6 | Test | +| `astor` | ETC | 212 | 212 | Test | + +:::info + +The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: + +## Specify a different network ID + +Usually the network ID is the same as the chain ID, but if you want to separate specific nodes from the rest of the network so they can't connect or synchronize with other nodes, you can override the default network ID for those nodes using the [`--network-id`](../reference/cli/options.md#network-id) option. + +## Start a new chain with a new chain ID + +If you update the chain ID (or network ID) of existing nodes, they can no longer peer with other nodes in the network. Nodes need to have a matching [genesis file](genesis-file.md), including the chain ID, in order to peer. In this case, you're effectively running two chains that can't communicate with each other. + +To change a chain ID and start a new chain: + +1. Stop all your nodes using ctrl+c in each terminal window. +2. Update the [genesis file](genesis-file.md) with the new chain ID. +3. Make sure all nodes have the same genesis file. +4. Delete the old data directory or point to a new location for each node. +5. [Restart the nodes](../../private-networks/tutorials/ibft/index.md#6-start-the-first-node-as-the-bootnode). + +:::danger Warning + +Starting a new chain is starting from block zero. + +This means when you start a new chain with a new chain ID, you lose all previous data. + +::: diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/node-keys.md b/versioned_docs/version-23.4.0/public-networks/concepts/node-keys.md new file mode 100644 index 00000000000..1c006f6fdc3 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/node-keys.md @@ -0,0 +1,103 @@ +--- +title: Node keys +sidebar_position: 8 +description: Private and public key, and node address used to identify nodes +tags: + - private networks +--- + +# Node keys and node address + +Each node has a private and public key pair, and a node address. Hyperledger Besu uses the private and public key pair to sign and verify transactions, and the node address as an identifier for the node. + +## Node private key + +When starting Hyperledger Besu, if the [`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option is not specified and a `key` file does not exist in the data directory for the node, Besu generates a node private key and writes it to the `key` file. + +If a `key` file does exist in the data directory when starting Besu, the node starts using the private key in the `key` file. + +:::info + +The private key is not encrypted. + +::: + +## Node public key + +The node public key displays in the log after starting Besu. Also referred to as the node ID, the node public key forms part of the enode URL of a node. + +You can export the node public key, either to standard output or to a specified file, using the [`public-key export`](../reference/cli/subcommands.md#public-key) subcommand. + +## Node address + +Besu generates the node address by creating a hash of the node public key and using the last 20 bytes of the hash as the node address. It is also displayed in the logs after starting Besu. + +You can export the node address, either to standard output or to a specified file, using the [`public-key export-address`](../reference/cli/subcommands.md#public-key) subcommand. + +## Specify a custom node private key file + +Use the [`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option to specify a custom `key` file in any location. + +If the `key` file exists, the node starts with the private key in the `key` file. If the `key` file does not exist, Besu generates a node private key and writes it to the `key` file. + +For example, the following command either reads the node private key from `privatekeyfile` or writes a generated private key to `privatekeyfile`. + +```bash +besu --node-private-key-file="/Users/username/privatekeyfile" +``` + +## Enode URL + +The enode URL identifies a node. For example, the [`--bootnodes`](../reference/cli/options.md#bootnodes) option and the [`perm_addNodesToAllowlist`](../reference/api/index.md#perm_addnodestoallowlist) method specify nodes by enode URL. + +The enode URL format is `enode://@[?discport=]` where: + +- `` is the node public key, excluding the initial 0x. +- `` is the host and TCP port the bootnode is listening on for P2P discovery. Specify the host and TCP port using the [`--p2p-host`](../reference/cli/options.md#p2p-host) and [`--p2p-port`](../reference/cli/options.md#p2p-port) options. The default host is `127.0.0.1` and the default port is `30303`. + + :::note + + Standard Ethereum enode URLs allow hostnames as IP addresses only, however Besu provides [domain name support](#domain-name-support) in private permissioned networks. + + ::: + +- If the TCP listening and UDP discovery ports differ, the UDP port is specified as query parameter `discport`. + +:::info + +If the node public key is `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, the host is `10.3.58.6`, the TCP listening port is `30303`, and the UDP discovery port is `30301`, then the enode URL is `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@10.3.58.6:30303?discport=30301` + +If the [`--p2p-host`](../reference/cli/options.md#p2p-host) or [`--p2p-port`](../reference/cli/options.md#p2p-port) options are not specified and the node public key is `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, then the enode URL is `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303` + +::: + +The enode URL displays when starting a Besu node. Use the [`net_enode`](../reference/api/index.md#net_enode) JSON-RPC API method to get the enode URL of the node. + +The enode advertised to other nodes during discovery is the external IP address and port, as defined by [`--nat-method`](../how-to/connect/specify-nat.md). + +### Domain name support + +:::caution + +Enode URL domain name support is an early access feature that you can use in private [permissioned networks](../../private-networks/concepts/permissioning/index.md) only. + +::: + +To use domain names in enode URLs: + +- Configure DNS reverse lookup. +- Enable DNS support using the early access option `--Xdns-enabled`. + +```bash title="Example enode URL using a domain name" +enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@mydomain.dev.example.net:30301 +``` + +:::tip + +If deploying Besu using Kubernetes in private permissioned networks, use the `--Xdns-enabled` and `--Xdns-update-enabled` options to ensure that Besu can connect to a container after restarting even if the IP address of the container changes. + +Use the [`--Xhelp`](../reference/cli/options.md#xhelp) command line option to view early access options and their descriptions. + +::: + +If nodes are not connecting as expected, set the [log level to TRACE](../reference/api/index.md#admin_changeloglevel) to help troubleshoot the issue. diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/proof-of-stake/_category_.json b/versioned_docs/version-23.4.0/public-networks/concepts/proof-of-stake/_category_.json new file mode 100644 index 00000000000..47b2323cd5d --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/proof-of-stake/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Proof of stake consensus", + "position": 2 +} diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/proof-of-stake/attestations.md b/versioned_docs/version-23.4.0/public-networks/concepts/proof-of-stake/attestations.md new file mode 100644 index 00000000000..6746ac81042 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/proof-of-stake/attestations.md @@ -0,0 +1,74 @@ +--- +title: Attestations +sidebar_position: 1 +description: Proof of stake attestations +--- + +# Attestations + +Ethereum's move to [proof of stake consensus](./index.md) has brought many changes to the way the network operates. An important aspect of proof of stake is the need for validators to provide attestations in a timely and accurate manner. However, missed attestations have become a common occurrence among validators, leading to a loss of rewards and earnings. This page explores the context behind missing attestations. + +## What are attestations? + +Every epoch (6.4 minutes), a validator proposes an attestation to the network. The attestation is for a specific slot (every 12 seconds) in the epoch. The attestation votes in favor of the validator's view of the chain, in particular, the most recent justified block and the first block in the current epoch (known as _source_ and _target_ checkpoints). This information is collected for all participating validators, enabling the network to reach consensus about the state of the blockchain. + +Honest nodes have 1/3 \* `SECONDS_PER_SLOT` (4 seconds) from the start of the slot to either receive the block or decide there was no block produced and attest to an “empty” or “skip” slot. Once this time has elapsed, attesters should broadcast their attestation reflecting their local view of the chain. + +See the [official specification](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) for more information about attestations. + +## Attestation rewards + +Around 85% of validators' rewards come from making attestations. Although committee and slot assignments for attesting are randomized, every active validator will be selected to make exactly one attestation each epoch. + +Attestations receive rewards only if they're included in Beacon Chain blocks. An attestation contains three votes. Each vote is eligible for a reward, subject to the following conditions: + +- Getting attestations included with the correct source checkpoint within 5 slots +- Getting attestations included with the correct target checkpoint within 32 slots +- Getting attestations included with the correct head within 1 slot immediately + +Each of these duties carries a reward rate, a portion of the entire "weight denominator," or the sum of weighted rewards for each attestation. The remaining weights relate to participating in sync committees and proposing blocks (excluding any tips/MEV, the bulk of block rewards). The following table (from [Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/)) breaks down these weights for cumulative rewards: + +| Name | Percentage | Value | +| ---------------------- | ---------- | ------------ | +| `TIMELY_SOURCE_WEIGHT` | 21.9% | `uint64(14)` | +| `TIMELY_TARGET_WEIGHT` | 40.6% | `uint64(26)` | +| `TIMELY_HEAD_WEIGHT` | 21.9% | `uint64(14)` | +| `SYNC_REWARD_WEIGHT` | 3.1% | `uint64(2)` | +| `PROPOSER_WEIGHT` | 12.5% | `uint64(8)` | +| `WEIGHT_DENOMINATOR` | 100% | `uint64(64)` | + +## Incorrect attestations + +If you have attestations with incorrect head votes, your node might be experiencing slow block imports. However, block producers can also be slow to publish blocks, resulting in a majority of validators getting the head vote wrong. A <100% head vote doesn't necessarily imply a problem with your node. + +In case of a slowdown, identify whether the issue is with the beacon node or the execution client. Block timing logs can be helpful in determining this. + +If you're using [Teku](https://docs.teku.consensys.net/) as a consensus layer client, identify late blocks (the block didn't get to Teku in time) with the following kind of log: + +```bash +Late Block Import *** Block: c2b911533a8f8d5e699d1a334e0576d2b9aa4caa726bde8b827548b579b47c68 (4765916) proposer 6230 arrival 3475ms, pre-state_retrieved +5ms, processed +185ms, execution_payload_result_received +1436ms, begin_importing +0ms, transaction_prepared +0ms, transaction_committed +0ms, completed +21ms +``` + +The time of arrival indicates how much time elapsed after the start of the slot before your node received the block. In this example, the block arrived after 3475ms, which is slower than optimal, but still enough time for Teku to create an attestation 4 seconds into the slot. + +Typically, delayed arrivals occur when the block producer is slow in generating the block. It's also possible that the block was published on time but took longer to propagate to your node through peer-to-peer gossip. If delayed arrivals are a recurring issue, it might be a problem with your node, such as an incorrect system clock, network issues, or a reduction in the number of peers. + +## Conclusion + +Attestations are complicated. Rewards can be impacted by: + +- The contents of a block (how long it takes to compute). +- The hardware processing that block (execution speed). +- How long it takes for the block to arrive to Besu from the consensus layer. +- The arrival time of the block from other consensus layer peers. Besu and your consensus layer client have no control over how late into a slot they receive blocks. +- General network latency. +- The status of either Besu or the consensus layer client. + +[Monitoring](../../how-to/monitor/index.md) your validator carefully for uptime, execution speed, and a valid consensus layer connection will help you explore attestation performance for your node. + +## References + +- [Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/) +- [Understanding Attestation Misses](https://www.symphonious.net/2022/09/25/understanding-attestation-misses/) +- [Block production in Ethereum after the Merge](https://notes.ethereum.org/DaWh-02HQ4qftum1xdphkg?view#Broadcast-attestation) +- [Ethereum Consensus Specs](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/proof-of-stake/index.md b/versioned_docs/version-23.4.0/public-networks/concepts/proof-of-stake/index.md new file mode 100644 index 00000000000..31ac1189fa3 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/proof-of-stake/index.md @@ -0,0 +1,41 @@ +--- +description: Ethereum proof of stake consensus +--- + +# Proof of stake consensus + +[The Merge](../the-merge.md) transitioned Ethereum Mainnet to [proof of stake (PoS)](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/) consensus. + +In Ethereum's PoS, you must run a [full node](../the-merge.md#execution-and-consensus-clients) and [stake 32 ETH](https://ethereum.org/en/staking/) to become a validator. + +:::caution + +Withdrawing staked ETH isn't yet supported and will be included in a separate upgrade following The Merge. + +::: + +:::note + +You must run a beacon node and an execution client to operate a full node on Mainnet. To become a validator, you must also run a validator client (either [in the same process as the beacon node](https://docs.teku.consensys.net/en/stable/HowTo/Get-Started/Run-Teku/#start-the-clients-in-a-single-process) or [separately](https://docs.teku.consensys.net/en/stable/HowTo/Get-Started/Run-Teku/#run-the-clients-separately)). + +::: + +PoS is preferred over proof of work and proof of authority as a consensus mechanism because it is more secure, requires less energy, and lowers the barrier to entry. + +The PoS mechanism randomly chooses validators to propose or validate blocks on the [Beacon Chain](https://ethereum.org/en/upgrades/beacon-chain/) in defined time frames. + +Proposers are responsible for proposing new consensus blocks, and non-proposing validators are responsible for validating (attesting to) proposed blocks. Validators are rewarded for proposing and attesting to consensus blocks eventually included in the Beacon Chain, and penalized for malicious behavior. [Attestations](./attestations.md) make up the bulk of validator rewards (~85%). Validators also receive [transaction fees](https://docs.teku.consensys.net/en/latest/HowTo/Prepare-for-The-Merge/#configure-the-fee-recipient) for included blocks. + +Each consensus block contains an execution payload, which contains a list of transactions and other data required to execute and validate the payload. + +When a node validates a consensus block, its [consensus client](../the-merge.md#consensus-clients) processes the block and sends the execution payload to the [execution client](../the-merge.md#execution-clients), which: + +1. Assembles a block on the execution layer. +2. Verifies pre-conditions. +3. Executes transactions. +4. Verifies post-conditions. +5. Sends the validity result back to the consensus client. + +If the block is valid, the execution client includes it in the execution chain and stores the new state in execution state storage. + +If a consensus block receives attestations backed by enough staked ETH, the block is included in the Beacon Chain. diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/the-merge.md b/versioned_docs/version-23.4.0/public-networks/concepts/the-merge.md new file mode 100644 index 00000000000..3f26993ad63 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/the-merge.md @@ -0,0 +1,63 @@ +--- +title: The Merge +sidebar_position: 1 +description: What is the Merge? +--- + +# The Merge + +:::info + +The Merge was executed on **September 15, 2022**. + +::: + +[The Merge](https://ethereum.org/en/upgrades/merge/) was an Ethereum upgrade that merged the [Beacon Chain] into Ethereum Mainnet, turning Mainnet into a combination of an [execution layer and consensus layer](#execution-and-consensus-clients). The Merge transitioned Mainnet from proof of work to [proof of stake consensus](proof-of-stake/index.md). + +You can run Besu as an execution client with: + +- [Any consensus client on Mainnet](../get-started/connect/mainnet.md). +- [Any consensus client on a testnet](../get-started/connect/testnet.md). +- [Teku on Mainnet](../tutorials/besu-teku-mainnet.md). +- [Teku on a testnet](../tutorials/besu-teku-testnet.md). + +## Execution and consensus clients + +After The Merge, a full Ethereum Mainnet node is a combination of an execution client (previously called an [Ethereum 1.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client) and a consensus client (previously called an [Ethereum 2.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client). + +Execution and consensus clients communicate with each other using the [Engine API](../how-to/use-engine-api.md). + +![Ethereum Merge node](../../assets/images/Execution-Consensus-Clients.png) + +### Execution clients + +Execution clients, such as Besu, manage the execution layer, including executing transactions and updating the world state. Execution clients serve [JSON-RPC API](../reference/engine-api/index.md) requests and communicate with each other in a peer-to-peer network. + +### Consensus clients + +Consensus clients, such as [Teku], contain beacon node and validator client implementations. The beacon node is the primary link to the [Beacon Chain] (consensus layer). The validator client performs [validator duties](proof-of-stake/index.md) on the consensus layer. Consensus clients serve [REST API](https://docs.teku.consensys.net/en/stable/Reference/Rest_API/Rest/) requests and communicate with each other in a peer-to-peer network. + +## What happened during The Merge + +Before The Merge, the execution and consensus clients' configurations were updated to listen for a certain total terminal difficulty (TTD) to be reached. + +:::info + +The TTD is a specific value for the total difficulty, which is the sum of the proof-of-work mining difficulty for all blocks up to some point in the blockchain. + +::: + +The consensus layer enabled the Merge configuration (Bellatrix) before reaching the TTD. Once the execution layer blocks reached the TTD, the Beacon Chain merged into Ethereum Mainnet, and Ethereum transitioned to a proof of stake network. + +:::tip + +After The Merge, a Mainnet node operator must run both an execution client and a beacon node at the same time. To become a validator, you must also run a validator client (either [in the same process as the beacon node](https://docs.teku.consensys.net/en/stable/HowTo/Get-Started/Run-Teku/#start-the-clients-in-a-single-process) or [separately](https://docs.teku.consensys.net/en/stable/HowTo/Get-Started/Run-Teku/#run-the-clients-separately). + +::: + +After The Merge, validators earn rewards for performing [validator duties](proof-of-stake/index.md), and [fee recipients](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax#validators-proposer-default-fee-recipient) also earn rewards for the inclusion of execution layer transactions. + + + +[Beacon Chain]: https://ethereum.org/en/upgrades/beacon-chain/ +[Teku]: https://docs.teku.consensys.net/en/stable/ diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/transactions/_category_.json b/versioned_docs/version-23.4.0/public-networks/concepts/transactions/_category_.json new file mode 100644 index 00000000000..e82ef121922 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Transactions", + "position": 4 +} diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/transactions/pool.md b/versioned_docs/version-23.4.0/public-networks/concepts/transactions/pool.md new file mode 100644 index 00000000000..4fb5f9182b1 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/transactions/pool.md @@ -0,0 +1,47 @@ +--- +title: Transaction pool +sidebar_position: 2 +description: Transaction pool overview +tags: + - private networks +--- + +# Transaction pool + +All nodes maintain a transaction pool to store pending transactions before processing. + +Options and methods for configuring and monitoring the transaction pool include: + +- [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions) JSON-RPC API method to list transactions in the transaction pool. +- [`--tx-pool-max-size`](../../reference/cli/options.md#tx-pool-max-size) command line option to specify the maximum number of transactions in the transaction pool. +- [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) command line option to specify the price bump percentage to replace an existing transaction. +- [`--tx-pool-retention-hours`](../../reference/cli/options.md#tx-pool-retention-hours) command line option to specify the maximum number of hours to keep pending transactions in the transaction pool. +- [`newPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#pending-transactions) and [`droppedPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#dropped-transactions) RPC subscriptions to notify of transactions added to and dropped from the transaction pool. + +:::tip + +When submitting [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md#nonce-validation), the [privacy marker transaction](../../../private-networks/concepts/privacy/private-transactions/processing.md) is submitted to the transaction pool, not the private transaction itself. + +::: + +## Dropping transactions when the transaction pool is full + +When the transaction pool is full, it accepts and retains local transactions in preference to remote transactions. If the transaction pool is full of local transactions, Besu drops the oldest local transactions first. That is, a full transaction pool continues to accept new local transactions by first dropping remote transactions and then by dropping the oldest local transactions. + +## Replacing transactions with the same sender and nonce + +You can replace a pending transaction with a transaction that has the same sender and nonce but a higher gas price. + +If sending a [legacy transaction](types.md#frontier-transactions), the old transaction is replaced if the new transaction has a gas price higher than the existing gas price by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). + +If sending an [`EIP1559` transaction](types.md#eip1559-transactions), the old transaction is replaced if one of the following is true: + +- The new transaction's effective gas price is higher than the existing gas price by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) AND the new effective priority fee is greater than or equal to the existing priority fee. + +- The new transaction's effective gas price is the equal to the existing gas price AND the new effective priority fee is higher than the existing priority fee by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). + +The default value for [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) is 10%. + +## Size of the transaction pool + +Decreasing the maximum size of the transaction pool reduces memory use. If the network is busy and there is a backlog of transactions, increasing the size of the transaction pool reduces the risk of removing transactions from the transaction pool. diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/transactions/types.md b/versioned_docs/version-23.4.0/public-networks/concepts/transactions/types.md new file mode 100644 index 00000000000..4e4d792f04d --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/transactions/types.md @@ -0,0 +1,40 @@ +--- +title: Transaction types +sidebar_position: 1 +description: Description of the different transaction types +tags: + - private networks +--- + +# Transaction types + +You can interact with the Hyperledger Besu JSON-RPC API using different transaction types (specified by the `transactionType` parameter). + +The following API objects use a unique format for each `transactionType`: + +- [Pending transaction object](../../reference/api/objects.md#pending-transaction-object) +- [Transaction object](../../reference/api/objects.md#transaction-object) +- [Transaction call object](../../reference/api/objects.md#transaction-call-object) +- [Transaction receipt object](../../reference/api/objects.md#transaction-receipt-object) + +## `FRONTIER` transactions + +Transactions with type `FRONTIER` are _legacy transactions_ that use the transaction format existing before typed transactions were introduced in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). They contain the parameters `chainId`, `nonce`, `gasPrice`, `gasLimit`, `to`, `value`, `data`, `v`, `r`, and `s`. Legacy transactions don't use [access lists](#access_list-transactions) or incorporate [EIP-1559 fee market changes](#eip1559-transactions). + +## `ACCESS_LIST` transactions + +Transactions with type `ACCESS_LIST` are transactions introduced in [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930). They contain, along with the [legacy parameters](#frontier-transactions), an `accessList` parameter, which specifies an array of addresses and storage keys that the transaction plans to access (an _access list_). `ACCESS_LIST` transactions must specify an access list, and they don't incorporate [EIP-1559 fee market changes](#eip1559-transactions). + +Use the [`eth_createAccessList`](../../reference/api/index.md#eth_createaccesslist) API to simulate a transaction which returns the addresses and storage keys that may be used to send the real transaction, and the approximate gas cost. + +## `EIP1559` transactions + +Transactions with type `EIP1559` are transactions introduced in [EIP-1559](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md). EIP-1559 addresses the network congestion and overpricing of transaction fees caused by the historical fee market, in which users send transactions specifying a gas price bid using the `gasPrice` parameter, and miners choose transactions with the highest bids. + +`EIP1559` transactions don't specify `gasPrice`, and instead use an in-protocol, dynamically changing _base fee_ per gas. At each block, the base fee per gas is adjusted to address network congestion as measured by a gas target. + +`EIP1559` transactions contain, along with the [`accessList`](#access_list-transactions) parameter and [legacy parameters](#frontier-transactions) except for `gasPrice`, a `maxPriorityFeePerGas` parameter, which specifies the maximum fee the sender is willing to pay per gas above the base fee (the maximum _priority fee_ per gas), and a `maxFeePerGas` parameter, which specifies the maximum total fee (base fee + priority fee) the sender is willing to pay per gas. + +An `EIP1559` transaction always pays the base fee of the block it's included in, and it pays a priority fee as priced by `maxPriorityFeePerGas` or, if the base fee per gas + `maxPriorityFeePerGas` exceeds `maxFeePerGas`, it pays a priority fee as priced by `maxFeePerGas` minus the base fee per gas. The base fee is burned, and the priority fee is paid to the miner that included the transaction. A transaction's priority fee per gas incentivizes miners to include the transaction over other transactions with lower priority fees per gas. + +`EIP1559` transactions must specify both `maxPriorityFeePerGas` and `maxFeePerGas`. They must not specify `gasPrice`. diff --git a/versioned_docs/version-23.4.0/public-networks/concepts/transactions/validation.md b/versioned_docs/version-23.4.0/public-networks/concepts/transactions/validation.md new file mode 100644 index 00000000000..0a53eeeb240 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/concepts/transactions/validation.md @@ -0,0 +1,29 @@ +--- +title: Transaction validation +sidebar_position: 3 +description: What transaction validation and when +tags: + - private networks +--- + +# Transaction validation + +For transactions submitted and added to a block, Besu validates the transactions, as illustrated in the following diagram. + +![Transaction Validation](../../../assets/images/transaction-validation.png) + +Besu repeats the set of transaction pool validations after propagating the transaction. Besu repeats the same set of validations when importing the block that includes the transaction, except the nonce must be exactly right when importing the block. + +:::tip + +Private transactions are not added to the transaction pool. The privacy marker transaction is submitted to the transaction pool but the private transaction itself is directly distributed to the transaction participants. + +::: + +When adding the transaction to a block, Besu performs an additional validation to check that the transaction gas limit is less than the remaining block gas limit. After creating a block, the node imports the block and then repeats the transaction pool validations. + +:::info + +The transaction is only added if the entire transaction gas limit is less than the remaining gas for the block. The total gas used by the transaction is not relevant to this validation. That is, if the total gas used by the transaction is less than the remaining block gas, but the transaction gas limit is more than the remaining block gas, the transaction is not added. + +::: diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/_category_.json b/versioned_docs/version-23.4.0/public-networks/get-started/_category_.json new file mode 100644 index 00000000000..b79c4b214b5 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Get started", + "position": 2 +} diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/connect/_category_.json b/versioned_docs/version-23.4.0/public-networks/get-started/connect/_category_.json new file mode 100644 index 00000000000..f326ba7b151 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/connect/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Connect to a network", + "position": 4 +} diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/connect/index.md b/versioned_docs/version-23.4.0/public-networks/get-started/connect/index.md new file mode 100644 index 00000000000..abf914826c9 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/connect/index.md @@ -0,0 +1,9 @@ +--- +title: Connect to a network overview +hide: + - feedback +--- + +# Connect to a network + +This section provides information on connecting Besu to a public Ethereum network. diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/connect/mainnet.md b/versioned_docs/version-23.4.0/public-networks/get-started/connect/mainnet.md new file mode 100644 index 00000000000..b0d51acebaf --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/connect/mainnet.md @@ -0,0 +1,142 @@ +--- +title: Connect to Mainnet +sidebar_position: 2 +description: How to connect to Mainnet +--- + +# Connect to Mainnet + +:::info + +[The Merge](../../concepts/the-merge.md) was executed on **September 15, 2022**. Ethereum is now a [proof of stake](../../concepts/proof-of-stake/index.md) network, and a full Ethereum node requires both [an execution client and a consensus client](../../concepts/the-merge.md#execution-and-consensus-clients). + +::: + +Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus client on Ethereum Mainnet. + +If you're using [Teku] as a consensus client, you can follow the [Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md). + +## Prerequisites + +- [Besu installed](../install/binary-distribution.md). +- A consensus client installed. For example, [Teku](https://docs.teku.consensys.net/en/latest/). + +## Steps + +### 1. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and the consensus client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../../how-to/use-engine-api.md). + +### 2. Generate validator keys + +If you're running the consensus client as a beacon node only, skip to the [next step](#3-start-besu). + +If you're also running the consensus client as a validator client, have a funded Ethereum address ready (32 ETH and gas fees for each validator). + +Generate validator keys for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: + +### 3. Start Besu + +Run the following command or specify the options in a [configuration file](../../how-to/configuration-file.md): + +```bash +besu \ + --sync-mode=X_SNAP \ + --data-storage-format=BONSAI \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist=,127.0.0.1,localhost \ + --engine-host-allowlist=,127.0.0.1,localhost \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. +- The IP address of your Besu node using the [`--host-allowlist`](../../reference/cli/options.md#host-allowlist) and [`--engine-host-allowlist`](../../reference/cli/options.md#engine-host-allowlist) options. + +Also, in the command: + +- [`--sync-mode`](../../reference/cli/options.md#sync-mode) specifies using [snap sync](sync-node.md#snap-synchronization). +- [`--data-storage-format`](../../reference/cli/options.md#data-storage-format) specifies using [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). +- [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC service. +- [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC service. +- [`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--engine-rpc-enabled`](../../reference/cli/options.md#engine-rpc-enabled) enables the [Engine API](../../reference/engine-api/index.md). + +You can modify the option values and add other [command line options](../../reference/cli/options.md) as needed. + +### 4. Start the consensus client + +Refer to your consensus client documentation to configure and start the consensus client. + +:::info + +If you're running a validator client, make sure you set a fee recipient address. + +::: + +If you're using Teku, follow the [Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md#5-start-teku). + +### 5. Wait for the clients to sync + +After starting Besu and the consensus client, your node starts syncing and connecting to peers. + + + +# Besu logs + +```bash +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running the consensus client as a beacon node only, you're all set. If you're also running the consensus client as a validator client, ensure your clients are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. + +### 6. Stake ETH + +Stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +You can check your validator status by searching your Ethereum address on the [Beacon Chain explorer](https://beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + + + +[Teku]: https://docs.teku.consensys.net/en/stable/ diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/connect/sync-node.md b/versioned_docs/version-23.4.0/public-networks/get-started/connect/sync-node.md new file mode 100644 index 00000000000..0af9d6c710e --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/connect/sync-node.md @@ -0,0 +1,161 @@ +--- +title: Sync Besu +sidebar_position: 1 +description: Full and archive node types +--- + +# Sync Besu + +Besu supports two node types, commonly referred to as [full nodes](#run-a-full-node) and [archive nodes](#run-an-archive-node). + +Full nodes have the current state of the blockchain. They can't serve the network with all data requests (for example, the balance of an account at an old block). Full nodes can guarantee the latest state for the blockchain (and some older states, but not all). You can check current balances, sign and send transactions, and look at current dapp data. + +Archive nodes also store the intermediary state of every account and contract for every block since the genesis block. Archive nodes can do everything full nodes do, and they can access historical state data. Archive nodes require more disk space than full nodes. + +Besu must connect with other peers to sync with the network. If your node is having trouble peering, try [troubleshooting peering](../../how-to/troubleshoot/peering.md). + +## Sync times + +To sync with a public network, Besu runs two processes in parallel: the world state sync and the blockchain download. + +The following table shows the average world state sync time for each sync mode on Mainnet. All times are hardware dependent; this table is based on running AWS instances m6gd.2xlarge. Each sync mode also has its own world state database size. + +| Sync mode | Time to sync world state | Disk usage | +| ---------- | ------------------------ | ------------- | +| Snap | ~6 hours | Average disk | +| Checkpoint | ~5 hours | Smallest disk | +| Fast | ~1.5 days | Average disk | +| Full | ~weeks | Largest disk | + +:::note + +- As of late 2022, an average Mainnet snap sync consumes around 750 GB using Bonsai Tries. Read more about [storage requirements](../../concepts/data-storage-formats.md#storage-requirements) across data storage formats and sync modes. + +- Testnets take significantly less time and space to sync. + +::: + +While the world state syncs, Besu downloads and imports the blockchain in the background. The blockchain download time depends on CPU, the network, Besu's peers, and disk speed. It generally takes longer than the world state sync. + +Besu must catch up to the current chain head and sync the world state to participate on Mainnet. + +## Storage + +You can store the world state using [Forest of Tries](../../concepts/data-storage-formats.md#forest-of-tries) or [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). We recommend using Bonsai Tries for the lowest storage requirements. + +## Run a full node + +You can run a full node using [snap synchronization (snap sync)](#snap-synchronization), [checkpoint synchronization (checkpoint sync)](#checkpoint-synchronization), or [fast synchronization (fast sync)](#fast-synchronization). + +### Snap synchronization + +:::tip + +We recommend using snap sync over fast sync because snap sync can be faster by several days. + +We recommend using snap sync with the [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries) data storage format for the fastest sync and lowest storage requirements. + +::: + +Enable snap sync using [`--sync-mode=X_SNAP`](../../reference/cli/options.md#sync-mode). You need Besu version 22.4.0 or later to use snap sync. + +Instead of downloading the [state trie](../../concepts/data-storage-formats.md) node by node, snap sync downloads as many leaves of the trie as possible, and reconstructs the trie locally. + +You can't switch from fast sync to snap sync. If your node is blocked in the middle of a fast sync, you can start over using snap sync instead by stopping the node, deleting the data directory, and starting over using `--sync-mode=X_SNAP`. + +You can restart Besu during a snap sync in case of hardware or software problems. The sync resumes from the last valid world state and continues to download blocks starting from the last downloaded block. + +See [how to read the Besu metrics charts](../../how-to/monitor/understand-metrics.md) when using snap sync. + +### Checkpoint synchronization + +:::caution + +Checkpoint sync is an early access feature. + +::: + +Enable checkpoint sync using [`--sync-mode=X_CHECKPOINT`](../../reference/cli/options.md#sync-mode). You need Besu version 22.4.3 or later to use checkpoint sync. + +Checkpoint sync behaves like [snap sync](#snap-synchronization), but instead of syncing from the genesis block, it syncs from a specific checkpoint block configured in the [Besu genesis file](../../concepts/genesis-file.md). + +Ethereum Mainnet and the Goerli testnet configurations already define default checkpoints, so you don't have to add this yourself. + +For other networks, you can configure a checkpoint in the genesis file by specifying the block hash, number, and total difficulty as in the following example. + +```json title="Checkpoint configuration example" +"checkpoint": { + "hash": "0x844d581cb00058d19f0584fb582fa2de208876ee56bbae27446a679baf4633f4", + "number": 14700000, + "totalDifficulty": "0xA2539264C62BF98CFC6" +} +``` + +:::note + +If using [Clique](../../../private-networks/how-to/configure/consensus/clique.md) consensus, the checkpoint must be the beginning of an epoch. + +::: + +If you enable checkpoint sync without a checkpoint configuration in the genesis file, Besu snap syncs from the genesis block. + +You can restart Besu during a checkpoint sync in case of hardware or software problems. The sync resumes from the last valid world state and continues to download blocks starting from the last downloaded block. + +### Fast synchronization + +:::caution + +It might become impossible to sync Ethereum Mainnet using fast sync in the future. If you sync for the first time or ever need to re-sync, update Besu to a version that supports newer sync methods. + +::: + +Enable fast sync using [`--sync-mode=FAST`](../../reference/cli/options.md#sync-mode). + +Fast sync downloads the block headers and transaction receipts, and verifies the chain of block headers from the genesis block. + +When starting fast sync, Besu first downloads the world state for a recent block verified by its peers (referred to as a pivot block), and then begins fast sync from the genesis block. + +Fast sync is the default for named networks specified using the [`--network`](../../reference/cli/options.md#network) option, except for the `dev` development network. It's also the default if connecting to Ethereum Mainnet by not specifying the [`--network`](../../reference/cli/options.md#network) or [`--genesis-file`](../../reference/cli/options.md#genesis-file) options. + +Using fast sync with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. + +You can observe the `besu_synchronizer_fast_sync_*` and `besu_synchronizer_world_state_*` [metrics](../../how-to/monitor/metrics.md#metrics-list) to monitor fast sync. + +:::note + +When fast syncing, block numbers increase until close to the head block, then the process pauses while the world state download completes. This may take a significant amount of time depending on world state size, during which the current head block doesn't increase. For example, Mainnet may take several days or more to fast sync. Fast sync time may increase because Besu picks new pivot blocks, or because peers prune the world state before it completes downloading. + +::: + +:::caution RocksDB error on AWS + +When running Besu on some cloud providers, a known [RocksDB](https://github.com/facebook/rocksdb/issues/6435) issue causes fast sync to fail occasionally. The following error is displayed repeatedly: + +``` +EthScheduler-Services-1 (importBlock) | ERROR | PipelineChainDownloader | Chain download failed. Restarting after short delay. +java.util.concurrent.CompletionException: org.hyperledger.besu.plugin.services.exception.StorageException: org.rocksdb.RocksDBException: block checksum mismatch: +``` + +The failure has been seen on AWS and Digital Ocean. On AWS, A full restart of the VM is required to restart the fast sync. Fast sync isn't [currently supported on Digital Ocean](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/CHANGELOG.md#143). + +::: + +:::caution Pending state nodes stays constant + +When fast syncing, the pending state nodes count is the number of nodes yet to be downloaded, and it should change constantly. Pending state nodes trend to 0 during fast sync and then goes to 0. + +If the number stays constant, this could mean your node isn't syncing against any peers. + +In the following example, the pivot block is 0 and the pending state nodes value is constant. This means the node isn't syncing against any peers. The fact that state nodes have been downloaded means at some stage it was syncing. + +![Fast synchronization](../../../assets/images/fastsync.png) + +The easiest solution in this scenario is to restart fast sync to obtain a new pivot block. + +::: + +## Run an archive node + +To run an archive node, enable full synchronization (full sync) using [`--sync-mode=FULL`](../../reference/cli/options.md#sync-mode). + +Full sync starts from the genesis block and reprocesses all transactions. diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/connect/testnet.md b/versioned_docs/version-23.4.0/public-networks/get-started/connect/testnet.md new file mode 100644 index 00000000000..522e4fc53f1 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/connect/testnet.md @@ -0,0 +1,153 @@ +--- +title: Connect to a testnet +sidebar_position: 3 +Description: How to connect to a testnet +--- + +# Connect to a testnet + +Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus client on the [Goerli](https://github.com/eth-clients/goerli) and [Sepolia](https://github.com/eth-clients/sepolia) testnets. + +If you're using [Teku](https://docs.teku.consensys.net/en/latest/) as a consensus client, you can follow the [Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md). + +:::note + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. You can connect your consensus client using the beacon node only, without any validator duties. + +::: + +## Prerequisites + +- [Besu installed](../install/binary-distribution.md). +- A consensus client installed. For example, [Teku](https://docs.teku.consensys.net/en/latest/). + +## Steps + +### 1. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and the consensus client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../../how-to/use-engine-api.md). + +### 2. Generate validator keys + +If you're running the consensus client as a beacon node only, skip to the [next step](#3-start-besu). + +If you're also running the consensus client as a validator client, create a test Ethereum address (you can do this in [MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and [Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). + +:::note + +If you can't get ETH using the faucet, you can ask for help on the [EthStaker Discord](https://discord.io/ethstaker). + +::: + +Generate validator keys for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or [request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: + +### 3. Start Besu + +Run the following command or specify the options in a [configuration file](../../how-to/configuration-file.md): + + + +# Goerli + +```bash +besu \ + --network=goerli \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +# Sepolia + +```bash +besu \ + --network=sepolia \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. + +You can modify the option values and add other [command line options](../../reference/cli/options.md) as needed. + +### 4. Start the consensus client + +Refer to your consensus client documentation to configure and start the consensus client. + +:::info + +If you're running a validator client, make sure you set a fee recipient address. + +::: + +If you're using Teku, follow the [Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md#5-start-teku). + +### 5. Wait for the clients to sync + +After starting Besu and the consensus client, your node starts syncing and connecting to peers. + + + +# Besu logs + +```bash +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running the consensus client as a beacon node only, you're all set. If you're also running the consensus client as a validator client, ensure your clients are fully synced before submitting your staking deposit in the next step. This can take several days. + +### 6. Stake ETH + +Stake your testnet ETH for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). + +You can check your validator status by searching your Ethereum address on the [Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/install/_category_.json b/versioned_docs/version-23.4.0/public-networks/get-started/install/_category_.json new file mode 100644 index 00000000000..043580c1474 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/install/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Install Besu", + "position": 2 +} diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/install/binary-distribution.md b/versioned_docs/version-23.4.0/public-networks/get-started/install/binary-distribution.md new file mode 100644 index 00000000000..03f626a9bd2 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/install/binary-distribution.md @@ -0,0 +1,86 @@ +--- +title: Install binary distribution +sidebar_position: 2 +description: Install or upgrade Hyperledger Besu from binary distribution +--- + +# Install binary distribution + +## MacOS with Homebrew + +### Prerequisites + +- [Homebrew](https://brew.sh/) +- Java JDK + +:::caution + +Hyperledger Besu supports: + +- MacOS High Sierra 10.13 or later versions. +- Java 17+. You can install Java using `brew install openjdk`. Alternatively, you can manually install the [Java JDK](https://www.oracle.com/java/technologies/downloads). + +::: + +### Install (or upgrade) using Homebrew + +To install Besu using Homebrew: + +```bash +brew tap hyperledger/besu +brew install hyperledger/besu/besu +``` + +To upgrade an existing Besu installation using Homebrew: + +```bash +brew upgrade hyperledger/besu/besu +``` + +:::note + +If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. + +::: + +:::note + +When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command `brew tap --repair`. + +::: + +To display the Besu version and confirm installation: + +```bash +besu --version +``` + +To display Besu command line help: + +```bash +besu --help +``` + +## Linux / Unix + +### Prerequisites + +- [Java JDK](https://www.oracle.com/java/technologies/downloads/) + +:::note Linux open file limit + +If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the maximum number of open files allowed using `ulimit`. If the open files limit is not high enough, a `Too many open files` RocksDB exception occurs. + +::: + +### Install from packaged binaries + +Download the Besu [packaged binaries](https://github.com/hyperledger/besu/releases). + +Unpack the downloaded files and change into the `besu-` directory. + +Display Besu command line help to confirm installation: + +```bash +bin/besu --help +``` diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/install/index.md b/versioned_docs/version-23.4.0/public-networks/get-started/install/index.md new file mode 100644 index 00000000000..257b00fa721 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/install/index.md @@ -0,0 +1,21 @@ +--- +title: Installation options +description: Options for getting started with Hyperledger Besu +--- + +# Installation options + +- [Docker image](run-docker-image.md) +- [Binaries](binary-distribution.md) + +## Build from source + +If you want to use the latest development version of Hyperledger Besu or a specific commit, build from source. Otherwise, use the [binary] or [Docker image] for more stable versions. + +View the [Hyperledger Wiki] for instructions to install Hyperledger Besu from source. + + + +[Hyperledger Wiki]: https://wiki.hyperledger.org/display/BESU/Building+from+source +[binary]: binary-distribution.md +[Docker image]: run-docker-image.md diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/install/run-docker-image.md b/versioned_docs/version-23.4.0/public-networks/get-started/install/run-docker-image.md new file mode 100644 index 00000000000..7c475bfae5d --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/install/run-docker-image.md @@ -0,0 +1,141 @@ +--- +title: Run Besu from Docker image +sidebar_position: 1 +description: Run Hyperledger Besu using the official docker image +--- + +# Run Besu from a Docker image + +Hyperledger Besu provides a Docker image to run a Besu node in a Docker container. + +Use this Docker image to run a single Besu node without installing Besu. + +## Prerequisites + +- [Docker](https://docs.docker.com/install/) + +- MacOS or Linux + + :::info + + The Docker image doesn't run on Windows. + + ::: + +## Default node for Mainnet + +To run a Besu node in a container connected to the Ethereum Mainnet: + +```bash +docker run hyperledger/besu:latest +``` + +:::note + +https://hub.docker.com/r/hyperledger/besu/tags lists the available tags for the image. + +If you previously pulled `latest`, Docker runs the cached version. + +To ensure your image is up to date, pull the `latest` version again using `docker pull hyperledger/besu:latest`. + +::: + +## Expose ports + +Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need to expose the ports to use the default ports or the ports specified using [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), [`--p2p-port`](../../reference/cli/options.md#p2p-port), [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), [`--metrics-port`](../../reference/cli/options.md#metrics-port), [`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port), and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. + +To run Besu exposing local ports for access: + +```bash +docker run -p :8545 -p :8546 -p :30303 hyperledger/besu:latest --rpc-http-enabled --rpc-ws-enabled +``` + +:::note + +The examples on this page expose TCP ports only. To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: + +```bash +docker run -p :/udp +``` + +See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). + +::: + +To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: + +```bash +docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled +``` + +## Start Besu + +:::danger + +Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default data path interferes with the operation of Besu and prevents Besu from safely launching. + +To run a node that maintains the node state (key and database), [`--data-path`](../../reference/cli/options.md#data-path) must be set to a location other than `/opt/besu` and a storage volume mounted at that location. + +When running in a Docker container, [`--nat-method`](../../how-to/connect/specify-nat.md) must be set to `DOCKER` or `AUTO` (default). Don't set [`--nat-method`](../../how-to/connect/specify-nat.md) to `NONE` or `UPNP`. + +::: + +You can specify [Besu environment variables](../../reference/cli/options.md#specify-options) with the Docker image instead of the command line options. + +```bash title="Example" +docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest +``` + +:::caution Unsupported address type exception + +When running Besu from a Docker image, you might get the following exception: + +```bash +Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. +``` + +This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, preventing outbound communication. IPv6 is disabled by default in Docker. + +[Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound IPv6 traffic and allow connection with IPv6 peers. + +::: + +### Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes with WebSocket enabled: + +```bash +docker run -p 8546:8546 --mount type=bind,source=/,target=/var/lib/besu hyperledger/besu:latest --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-ws-enabled --network=dev --data-path=/var/lib/besu +``` + +### Run a node on Goerli testnet + +To run a node on Goerli: + +```bash +docker run -p 30303:30303 --mount type=bind,source=/,target=/var/lib/besu hyperledger/besu:latest --network=goerli --data-path=/var/lib/besu +``` + +### Run a node on Ethereum Mainnet + +To run a node on Ethereum Mainnet with the HTTP JSON-RPC service enabled: + +```bash +docker run -p 8545:8545 --mount type=bind,source=/,target=/var/lib/besu -p 30303:30303 hyperledger/besu:latest --rpc-http-enabled --data-path=/var/lib/besu +``` + +## Stop Besu and clean up resources + +When done running nodes, you can shut down the node container without deleting resources or you can delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the container and volume names. + +To stop a container: + +```bash +docker stop +``` + +To delete a container: + +```bash +docker rm +``` diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/migrate-to-besu.md b/versioned_docs/version-23.4.0/public-networks/get-started/migrate-to-besu.md new file mode 100644 index 00000000000..8195654fc21 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/migrate-to-besu.md @@ -0,0 +1,13 @@ +--- +description: Migrate to Besu guide +--- + +# Migrate to Besu + +Migrate from a different Ethereum [execution client](../concepts/the-merge.md#execution-clients) to Besu to contribute to [client diversity](https://clientdiversity.org/). + +To migrate from a different client, [configure Besu as an execution client](connect/mainnet.md#2-start-besu) and connect your [consensus client](../concepts/the-merge.md#consensus-clients) to Besu instead of your original execution client. + +To minimize downtime while [Besu syncs](connect/sync-node.md) and avoid downtime penalties, you can sync Besu with a new consensus layer instance. Once Besu has fully synced you can connect it to your existing consensus client. + +Find guides to switch from specific clients on the [client diversity website](https://clientdiversity.org/#switch). diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/start-node.md b/versioned_docs/version-23.4.0/public-networks/get-started/start-node.md new file mode 100644 index 00000000000..7516ff37da8 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/start-node.md @@ -0,0 +1,149 @@ +--- +title: Start Besu +sidebar_position: 3 +description: Starting Hyperledger Besu +--- + +# Start Besu + +Nodes can connect to Ethereum Mainnet and public testnets. + +Use the [`besu`](../reference/cli/options.md) command with the required command line options to start a node. + +## Prerequisites + +[Besu installed](install/binary-distribution.md) + +## Local block data + +When connecting to a network other than the network previously connected to, you must either delete the local block data or use the [`--data-path`](../reference/cli/options.md#data-path) option to specify a different data directory. + +To delete the local block data, delete the `database` directory in the `besu/build/distribution/besu-` directory. + +## Genesis configuration + +Besu specifies the genesis configuration, and sets the network ID and bootnodes when connecting to [Goerli](#run-a-node-on-goerli-testnet), [Sepolia](#run-a-node-on-sepolia-testnet), and [Mainnet](#run-a-node-on-ethereum-mainnet). + +:::info + +The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: + +When you specify [`--network=dev`](../reference/cli/options.md#network), Besu uses the development mode genesis configuration with a fixed low difficulty. A node started with [`--network=dev`](../reference/cli/options.md#network) has an empty bootnodes list by default. + +The genesis files defining the genesis configurations are in the [Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). + +To define a genesis configuration, create a genesis file (for example, `genesis.json`) and specify the file using the [`--genesis-file`](../reference/cli/options.md#genesis-file) option. + +## Syncing and storage + +By default, Besu syncs to the current state of the blockchain using [fast sync](connect/sync-node.md#fast-synchronization) in: + +- Networks specified using [`--network`](../reference/cli/options.md#network) except for the `dev` development network. +- Ethereum Mainnet. + +We recommend using [snap sync](connect/sync-node.md#snap-synchronization) for a faster sync, by starting Besu with [`--sync-mode=X_SNAP`](../reference/cli/options.md#sync-mode). + +By default, Besu stores data in the [Forest of Tries](../concepts/data-storage-formats.md#forest-of-tries) format. We recommend using [Bonsai Tries](../concepts/data-storage-formats.md#bonsai-tries) for lower storage requirements, by starting Besu with [`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). + +## Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes: + +```bash +besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir +``` + +You can also use the following [configuration file](../how-to/configuration-file.md) on the command line to start a node with the same options as above: + +```toml +network="dev" +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +rpc-http-cors-origins=["all"] +host-allowlist=["*"] +rpc-ws-enabled=true +rpc-http-enabled=true +data-path="/tmp/tmpdata-path" +``` + +:::danger Warning + +The following settings are a security risk in production environments: + +- Enabling the HTTP JSON-RPC service ([`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled)) and setting [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the RPC connection on your node to any remote connection. +- Setting [`--host-allowlist`](../reference/cli/options.md#host-allowlist) to `"*"` allows JSON-RPC API access from any host. +- Setting [`--rpc-http-cors-origins`](../reference/cli/options.md#rpc-http-cors-origins) to `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. + +::: + +## Run a node on Goerli testnet + +To run a node on [Goerli](https://github.com/goerli/testnet) specifying a data directory: + +```bash +besu --network=goerli --data-path=/ +``` + +Where `` and `` are the path and directory to save the Goerli chain data to. + +See the [guide on connecting to a testnet](connect/testnet.md) for more information. + +## Run a node on Sepolia testnet + +To run a node on [Sepolia](https://github.com/goerli/sepolia) specifying a data directory: + +```bash +besu --network=sepolia --data-path=/ +``` + +Where `` and `` are the path and directory to save the Sepolia chain data to. + +See the [guide on connecting to a testnet](connect/testnet.md) for more information. + +## Run a node on Ethereum Mainnet + +To run a node on the Ethereum Mainnet: + +```bash +besu +``` + +To run a node on Mainnet with the HTTP JSON-RPC service enabled and available for localhost only: + +```bash +besu --rpc-http-enabled +``` + +See the [guide on connecting to Mainnet](connect/mainnet.md) for more information. + +## Confirm node is running + +If you started Besu with the [`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) option, use [cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to confirm the node is running. + +- `eth_chainId` returns the chain ID of the network. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 + ``` + +- `eth_syncing` returns the starting, current, and highest block. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 + ``` + + For example, after connecting to Mainnet, `eth_syncing` will return something similar to: + + ```json + { + "jsonrpc": "2.0", + "id": 1, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x2d0", + "highestBlock": "0x66c0" + } + } + ``` diff --git a/versioned_docs/version-23.4.0/public-networks/get-started/system-requirements.md b/versioned_docs/version-23.4.0/public-networks/get-started/system-requirements.md new file mode 100644 index 00000000000..32123e25f26 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/get-started/system-requirements.md @@ -0,0 +1,45 @@ +--- +title: System requirements +sidebar_position: 1 +description: System requirements to sync and run Besu +--- + +# System requirements + +Determine public network system requirements by checking CPU and disk space requirements using [Prometheus](../how-to/monitor/metrics.md). Grafana provides a [sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. + +:::tip + +CPU requirements are highest when syncing to the network and typically reduce after the node is synchronized to the chain head. + +::: + +## Java Virtual Machine size + +For Mainnet and testnets, the minimum [Java Virtual Machine (JVM) memory requirement is 8 GB](../how-to/configure-jvm/manage-memory.md). + +JVM memory requirements are highest when syncing, but will reduce after the node is synchronized to the chain head. Monitor your system to determine your actual JVM memory needs. + +## Disk space + +[Fast synchronization](../reference/cli/options.md#sync-mode) with [pruning](../concepts/data-storage-formats.md) enabled requires approximately 750 GB of disk space. [Full synchronization](../reference/cli/options.md#sync-mode) requires approximately 3 TB. + +## Disk type + +Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). Read-only nodes can use a lower performance setup. + +You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). For higher performance in production settings, we recommend upgrading to [NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). + +## AWS requirements + +We are running 22.4.2 Mainnet nodes using `m6gd.2xlarge` boxes. + +We synchronized the 22.4.2 Mainnet nodes using `m6gd.2xlarge` boxes. + +Using a larger box while synchronizing speeds up the sync process by giving it more resources. When the sync is completed, the box size can be reduced. + +:::caution + +If you are using a more recent release than 22.4.2, resource requirements may have increased. + +::: diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/_category_.json b/versioned_docs/version-23.4.0/public-networks/how-to/_category_.json new file mode 100644 index 00000000000..ba43c43036f --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "How to", + "position": 3 +} diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/configuration-file.md b/versioned_docs/version-23.4.0/public-networks/how-to/configuration-file.md new file mode 100644 index 00000000000..21c9f35d146 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/configuration-file.md @@ -0,0 +1,65 @@ +--- +title: Use a configuration file +sidebar_position: 3 +description: Using the Hyperledger Besu configuration file +tags: + - private networks +--- + +# Use the Hyperledger Besu configuration file + +To specify command line options in a file, use a TOML configuration file. + +Save the configuration file and reuse it across node startups. To specify the configuration file, use the [`--config-file`](../reference/cli/options.md#config-file) option. + +To override an option specified in the configuration file, either specify the same option on the command line or as an [environment variable](../reference/cli/options.md#specify-options). For options specified in more than one place, the order of precedence is command line, environment variable, configuration file. + +:::note + +The configuration file is used for node-level settings. You can specify network-wide settings in the [genesis file](../concepts/genesis-file.md). + +::: + +## TOML specification + +The configuration file must be a valid TOML file composed of key/value pairs. Each key is the same as the corresponding command line option name without the leading dashes (`--`). + +Values must conform to TOML specifications for string, numbers, arrays, and booleans. Specific differences between the command line and the TOML file format are: + +- Comma-separated lists on the command line are string arrays in the TOML file. +- Enclose file paths, hexadecimal numbers, URLs, and <host:port> values in quotes. + +:::tip + +The [command line reference](../reference/cli/options.md) includes configuration file examples for each option. + +::: + +```toml title="Sample TOML configuration file" +# Valid TOML config file +data-path="~/besudata" # Path + +# Network +bootnodes=["enode://001@123:4567", "enode://002@123:4567", "enode://003@123:4567"] + +p2p-host="1.2.3.4" +p2p-port=1234 +max-peers=42 + +rpc-http-host="5.6.7.8" +rpc-http-port=5678 + +rpc-ws-host="9.10.11.12" +rpc-ws-port=9101 + +# Chain +genesis-file="~/genesis.json" # Path to the custom genesis file + +# Mining +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +``` + +```bash title="Starting Besu with a configuration file" +besu --config-file=/home/me/me_node/config.toml +``` diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/configure-ha/_category_.json b/versioned_docs/version-23.4.0/public-networks/how-to/configure-ha/_category_.json new file mode 100644 index 00000000000..450cbdb623f --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/configure-ha/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure high availability", + "position": 7 +} diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/configure-ha/index.md b/versioned_docs/version-23.4.0/public-networks/how-to/configure-ha/index.md new file mode 100644 index 00000000000..ed5d54b257c --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/configure-ha/index.md @@ -0,0 +1,106 @@ +--- +description: Hyperledger Besu high availability +tags: + - private networks +--- + +# High availability of JSON-RPC and RPC Pub/Sub APIs + +To enable high availability to the [RPC Pub/Sub API over WebSocket](../use-besu-api/rpc-pubsub.md) or the [JSON-RPC API](../use-besu-api/json-rpc.md), run and synchronize more than one Hyperledger Besu node to the network. Use a load balancer to distribute requests across nodes in the cluster that are ready to receive requests. + +![Load Balancer](../../../assets/images/LoadBalancer.png) + +:::tip + +We don't recommend putting [bootnodes](../../../private-networks/how-to/configure/bootnodes.md) behind a load balancer. + +::: + +:::info + +We recommend using load balancers over WebSockets because WebSockets are persistent connections associated with specific nodes. If you use load balancers configured in sticky mode over HTTP instead, the connection sticks to the associated node even when the node is congested and there is a lower load node available. If you use load balancers not configured in sticky mode over HTTP, the connections may switch from node to node, so some JSON-RPC requests may not provide expected results (for example, [`admin` methods](../../reference/api/index.md#admin-methods), [`net_enode`](../../reference/api/index.md#net_enode), [`net_peerCount`](../../reference/api/index.md#net_peercount), and [`eth_syncing`](../../reference/api/index.md#eth_syncing)). + +::: + +## Determine when a node is ready + +Use the [readiness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) to determine when a node is ready. + +:::note + +The minimum number of peers and number of blocks from the best known block for determining if a node considered ready is deployment specific. + +::: + +## Transaction nonces + +Besu obtains the nonce for the next transaction using [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). The nonce depends on the transactions in the [transaction pool](../../concepts/transactions/pool.md). If sending [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) and [`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction) requests for a specific account to more than one node, the [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) results might be incorrect. + +:::note + +If using [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md), retrieve the nonce using [`priv_getTransactionCount`](../../../private-networks/reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../../private-networks/reference/api/index.md#priv_geteeatransactioncount) and send the private transactions using [`eea_sendRawTransaction`](../../../private-networks/reference/api/index.md#eea_sendrawtransaction). + +::: + +To get correct nonces when distributing requests across a cluster, either: + +- Track the next nonce outside of the Besu node (as MetaMask does). +- Configure the load balancer in sticky mode to send requests from a specific account to a single node, unless that node is unavailable. + +## Subscriptions + +You can subscribe to events using: + +- [RPC Pub/Sub over WebSockets](../use-besu-api/rpc-pubsub.md). +- [Filters over HTTP](../use-besu-api/access-logs.md). + +We recommend using [RPC Pub/Sub over WebSocket](../use-besu-api/rpc-pubsub.md) because WebSockets connections associate with a specific node and do not require using the load balancer in sticky mode. + +If using [filters over HTTP](../use-besu-api/access-logs.md), configure the load balancer in sticky mode to associate the subscription with a specific node. + +## Recover from dropped subscriptions + +Dropped subscriptions can occur because of: + +- A disconnected WebSockets connection +- The removal of the node serving the subscription from the ready pool. + +If there is a dropped subscription, missed events might occur while reconnecting to a different node. To recover dropped messages, create another subscription and follow the process for that [subscription type](../use-besu-api/rpc-pubsub.md#subscribe): + +- [`newHeads`](#new-headers) +- [`logs`](#logs) +- [`newPendingTransactions`](#new-pending-transactions) +- [`droppedPendingTransactions`](#dropped-pending-transactions) +- [`syncing`](#syncing). + +### New headers + +To request information on blocks from the last block before the subscription dropped to the first block received from the new subscription, use [`eth_getBlockByNumber`](../../reference/api/index.md#eth_getblockbynumber). + +### Logs + +To request logs from the block number of the last log received before the subscription dropped to the current chain head, use [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). + +### New pending transactions + +To request all pending transactions for the new node, use [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). + +:::note + +Nodes do not all store the same pending transactions. + +::: + +### Dropped pending transactions + +To request all pending transactions for the new node, use [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). + +:::note + +Nodes do not all store the same pending transactions. + +::: + +### Syncing + +The syncing state of each node is specific to that node. To retrieve the syncing state of the new node, use [`eth_syncing`](../../reference/api/index.md#eth_syncing). diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/configure-ha/sample-configuration.md b/versioned_docs/version-23.4.0/public-networks/how-to/configure-ha/sample-configuration.md new file mode 100644 index 00000000000..ab74bb0bfd2 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/configure-ha/sample-configuration.md @@ -0,0 +1,98 @@ +--- +title: Sample load balancer configurations +sidebar_position: 1 +description: Sample load balancers +tags: + - private networks +--- + +# Sample load balancer configurations + +## AWS + +For AWS, we recommend the Classic Load Balancer. The Classic Load Balancer is the easiest to configure and work with. Register the Hyperledger Besu instances to the load balancer and use the [liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) for health checks. + +For finer grain control, use the Application Load Balancer: + +- Configure one target group with n nodes. +- Configure multiple listeners with one per port (for example, `30303`, `8545`) you are using and route to the target group. +- Use the [liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) for health checks. +- Register the Besu instances multiple times with different ports. This is like configuring microservices on Elastic Container Service (ECS) or Elastic Kubernetes Service (EKS). + +### HTTPS redirection + +With either AWS load balancer, you can add certificates using ACM (Amazon Certificate Manager), add them to the load balancers, and redirect all HTTP calls to HTTPS. + +## Elastic Kubernetes Service + +For Elastic Kubernetes Service (AWS Kubernetes service) use the same load balancer configuration as when running nodes in Kubernetes. Use labels to specify nodes for the load balanced group. + +## Manual configurations + +Where applicable, we strongly recommend using service discovery. That is, pair your load balancer configuration with something that dynamically detects new nodes and removed failed nodes. + +For Nginx, use multiple upstreams (one for each port). Pair each upstream with a separate server block. + +```conf title="Upstreams paired with server blocks" +upstream discovery_tcp_30303 { + server 10.0.1.1:30303; + server 10.0.1.2:30303; +} + +upstream rpc_tcp_8545 { + server 10.0.1.1:8545; + server 10.0.1.2:8545; +} + +server { + listen 30303; + server_name some.host; + location / { + proxy_pass http://discovery_tcp_30303; + } +} + +server { + listen 8545; + server_name some.host; + location / { + proxy_pass http://rpc_tcp_8545; + } +} +... +``` + +For HAProxy, create multiple backend and frontend sets. + +```text title="Multiple backend and frontend sets" +frontend discovery-tcp-30303 + bind *:30303 + acl ... + ... + default_backend back-discovery-tcp-30303 + +frontend rpc-tcp-8545 + bind *:8545 + acl ... + ... + default_backend back-rpc-tcp-8545 + +backend back-discovery-tcp-30303 + balance leastconn + server node-01 10.0.1.1:30303 weight 1 check + server node-02 10.0.1.2:30303 weight 1 check + option ... + timeout server 600s + +backend back-rpc-tcp-8545 + balance leastconn + server node-01 10.0.1.1:8545 weight 1 check + server node-02 10.0.1.2:8545 weight 1 check + option .... + timeout server 600s +... +``` + +### HTTPS redirection + +To add HTTPS capability, update the above server blocks to include the certificates and specific ciphers. If you require an HTTP to HTTPS redirection, add separate blocks to return a 301 code with the new URI. diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/_category_.json b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/_category_.json new file mode 100644 index 00000000000..bb5cfebb77f --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure the Java Virtual Machine", + "position": 8 +} diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/index.md b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/index.md new file mode 100644 index 00000000000..0cc9cfaacc6 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/index.md @@ -0,0 +1,11 @@ +--- +title: Configure Java and Besu +tags: + - private networks +hide: + - feedback +--- + +# Configure the Java Virtual Machine + +This section contains information on configuring Besu and the Java Virtual Machine (JVM). diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/java-flight-recorder.md b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/java-flight-recorder.md new file mode 100644 index 00000000000..b858b85915f --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/java-flight-recorder.md @@ -0,0 +1,35 @@ +--- +title: Use Java Flight Recorder +sidebar_position: 3 +description: Using Java Flight Recorder with Hyperledger Besu +tags: + - private networks +--- + +# Use Java Flight Recorder + +[Java Flight Recorder (JFR)](https://docs.oracle.com/javacomponents/jmc-5-4/jfr-runtime-guide/about.htm#JFRUH170) is a monitoring tool that collects information about the Java Virtual Machine (JVM) when Hyperledger Besu is running. Use the JFR as a tool to analyze Besu performance. + +## Enable Java Flight Recorder + +To enable JFR, set `BESU_OPTS` to the JFR tags as follows: + +```bash +export BESU_OPTS=-XX:StartFlightRecording=disk=true,delay=15s,dumponexit=true,\ +filename=/tmp/recording.jfr,maxsize=1024m,maxage=1d,\ +settings=profile,path-to-gc-roots=true +``` + +:::tip + +When recording, cleanly exiting Besu results in better data. If not possible to cleanly exit, the file may be missing some information not flushed to disk. + +::: + +Inspect the file written to `/tmp/recording.jfr` with tools such as [Mission Control](https://docs.oracle.com/javacomponents/jmc-5-5/jmc-user-guide/intro.htm#JMCCI109). + +:::danger + +If providing the output file to [ConsenSys Quorum support](https://consensys.net/quorum/support/), be aware that while JFR files don't contain secrets such as private keys, some details about the user configuration can be inferred from the JFR output. + +::: diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/manage-memory.md b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/manage-memory.md new file mode 100644 index 00000000000..4d1eaa5561f --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/manage-memory.md @@ -0,0 +1,73 @@ +--- +title: Manage JVM memory +sidebar_position: 2 +description: Besu memory management +tags: + - private networks +--- + +# Manage JVM memory + +You can manage Java Virtual Machine (JVM) memory usage for Besu by modifying the maximum heap size. + +By default, the JVM uses 25% of system RAM. For example, if you have 16 GB RAM installed, the JVM uses 4 GB by default. + +On public networks, we recommend setting the maximum heap size to: + +- 3 GB on an 8 GB RAM system. +- 5 GB on a 16 GB RAM system. +- 8 GB on a system with at least 24 GB RAM. + +:::note + +Setting a higher maximum heap size speeds up the sync period but doesn't have much impact after sync. Thus, we recommend setting it to 8 GB only when you have available RAM. + +::: + +You can set the maximum heap size using the `BESU_OPTS` environment variable and the `-Xmx` option. The following examples set the maximum heap size to 8 GB: + + + +# Exported environment variable example + +Set the variable for the whole shell before running Besu. + +```bash +export BESU_OPTS=-Xmx8g +``` + +# Inline environment variable example + +Set the variable only for the specific Besu command. + +```bash +BESU_OPTS=-Xmx8g besu [Besu options] +``` + +# `.service` file example + +```bash +[Service] +... +Environment="BESU_OPTS=-Xmx8g" +ExecStart=besu [Besu options] +... +``` + + + +## Manage the heap dump + +Heap dump file generation is disabled by default. To enable it, set the `-XX:+HeapDumpOnOutOfMemoryError` Java option. + +```bash +BESU_OPTS="-XX:+HeapDumpOnOutOfMemoryError" +``` + +When heap dump file generation is enabled, and an out-of-memory error occurs, the heap dump file is saved in the Besu runtime directory by default. + +The heap dump file might be large and can saturate your drive. It can be up to the size of the allocated memory. For example, for 8 GB heap memory, the file can be up to 8 GB. Specify the directory where you want the dump to be saved using the `-XX:HeapDumpPath` Java option. + +```bash +BESU_OPTS="-XX:HeapDumpPath=///" +``` diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/pass-jvm-options.md b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/pass-jvm-options.md new file mode 100644 index 00000000000..88b0916fb27 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/configure-jvm/pass-jvm-options.md @@ -0,0 +1,20 @@ +--- +title: Pass JVM options +sidebar_position: 1 +description: Passing Java virtual machine JVM options to Hyperledger Besu at runtime +tags: + - private networks +--- + +# Pass JVM options + +To perform tasks such as attaching a debugger or configuring the garbage collector, pass Java Virtual Machine (JVM) options to Hyperledger Besu. + +Besu passes the contents of the `BESU_OPTS` environment variable to the JVM. Set standard JVM options in the `BESU_OPTS` variable. + +For Bash-based executions, you can set the variable for only the scope of the program execution by setting it before starting Besu. + +```bash +BESU_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \ +besu --network=goerli +``` diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/connect/_category_.json b/versioned_docs/version-23.4.0/public-networks/how-to/connect/_category_.json new file mode 100644 index 00000000000..cce59e7c3f8 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/connect/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Find and connect to peers", + "position": 5 +} diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/connect/configure-ports.md b/versioned_docs/version-23.4.0/public-networks/how-to/connect/configure-ports.md new file mode 100644 index 00000000000..de19037db2d --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/connect/configure-ports.md @@ -0,0 +1,47 @@ +--- +title: Configure ports +sidebar_position: 2 +description: To enable communication you must expose Hyperledger Besu ports appropriately +tags: + - private networks +--- + +# Configure ports + +To enable communication you must expose Hyperledger Besu ports appropriately. The following shows an example port configuration for a Besu node on AWS. + +![Port Configuration](../../../assets/images/PortConfiguration.png) + +When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), [expose ports](../../get-started/install/run-docker-image.md#exposing-ports). + +:::tip + +Besu supports [UPnP](specify-nat.md) for home or small office environments where a wireless router or modem provides NAT isolation. + +::: + +## P2P networking + +To enable peer discovery, the P2P UDP port must be open for inbound connections. Specify the P2P port using the [`--p2p-port`](../../reference/cli/options.md#p2p-port) option. The default is `30303`. + +We also recommend opening the P2P TCP port for inbound connections. This is not strictly required because Besu attempts to open outbound TCP connections. But if no nodes on the network are accepting inbound TCP connections, nodes cannot communicate. + +Combine the P2P port with the values for the [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-interface`](../../reference/cli/options.md#p2p-interface) options when specifying the [P2P host](../../reference/cli/options.md#p2p-host) and [P2P network interface](../../reference/cli/options.md#p2p-interface). + +:::info + +By default, peer discovery listens on `0.0.0.0:30303` (all interfaces). If the device Besu is running on must bind to a specific network interface, specify the interface using the [`--p2p-interface`](../../reference/cli/options.md#p2p-interface) option. + +::: + +## JSON-RPC API + +To enable access to the [JSON-RPC API](../use-besu-api/json-rpc.md), open the HTTP JSON-RPC and WebSockets JSON-RPC ports to the intended users of the JSON-RPC API on TCP. + +Specify the HTTP and WebSockets JSON-RPC ports using the [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) and [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port) options. The defaults are `8545` and `8546`. + +## Metrics + +To enable [Prometheus to access Besu](../monitor/metrics.md), open the metrics port or metrics push port to Prometheus or the Prometheus push gateway on TCP. + +Specify the ports for Prometheus and Prometheus push gateway using the [`--metrics-port`](../../reference/cli/options.md#metrics-port) and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. The defaults are `9545` and `9001`. diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/connect/manage-peers.md b/versioned_docs/version-23.4.0/public-networks/how-to/connect/manage-peers.md new file mode 100644 index 00000000000..a2f5c9233ff --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/connect/manage-peers.md @@ -0,0 +1,87 @@ +--- +title: Manage peers +sidebar_position: 3 +description: Managing Hyperledger Besu peers +tags: + - private networks +--- + +# Manage peers + +Hyperledger Besu peer-to-peer (P2P) discovery happens periodically based on the number of peers in a network and the node's [peer limit](#limit-peers). + +The frequency of discovery isn't configurable, but you can [limit remote connections](#limit-remote-connections) in public networks and [randomly prioritize connections](../../reference/cli/options.md#random-peer-priority-enabled) in small, stable networks. + +:::info + +You can use [`admin_addPeer`](../../reference/cli/options.md#admin_addpeer) to attempt a specific connection, but this isn't P2P discovery. + +::: + +In private networks, we recommend [using bootnodes](../../../private-networks/how-to/configure/bootnodes.md) to initially discover peers. + +## Limit peers + +You can limit peers to reduce the bandwidth, CPU time, and disk access Besu uses to manage and respond to peers. + +To reduce the maximum number of peers, use the [`--max-peers`](../../reference/cli/options.md#max-peers) option. The default is 25. + +:::caution + +The minimum number of peers is set by the `--Xp2p-peer-lower-bound` option, which also has a default of 25. If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` option to the same value or lower. For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. + +Note, `Xp2p-peer-lower-bound` is an early access option. + +::: + +## Limit remote connections + +Prevent eclipse attacks when using [`--sync-mode`](../../reference/cli/options.md#sync-mode) and [`--fast-sync-min-peers`](../../reference/cli/options.md#fast-sync-min-peers) on public networks by enabling the [remote connection limits](../../reference/cli/options.md#remote-connections-limit-enabled). + +In private and permissioned networks with only trusted peers, enabling the remote connection limits is unnecessary and might adversely affect the speed at which nodes can join the network. Limiting remote connections can cause a closed group of peers to form when the number of nodes in the network is slightly higher than [`--max-peers`](../../reference/cli/options.md#max-peers). The nodes in this closed group are all connected to each other and can't accept more connections. + +:::tip + +You can use [`--random-peer-priority-enabled`](../../reference/cli/options.md#random-peer-priority-enabled) to help prevent closed groups of peers in small, stable networks. + +::: + +## Monitor peer connections + +JSON-RPC API methods to monitor peer connections include: + +- [`net_peerCount`](../../reference/api/index.md#net_peercount). +- [`admin_peers`](../../reference/api/index.md#admin_peers). +- [`debug_metrics`](../../reference/api/index.md#debug_metrics). + +Each peer entry returned by [`admin_peers`](../../reference/api/index.md#admin_peers) includes a `protocols` section. Use the information in the `protocols` section to: + +- Determine the health of peers. For example, an external process can use [`admin_peers`](../../reference/api/index.md#admin_peers) and [`admin_removePeer`](../../reference/api/index.md#admin_removepeer) to disconnect from peers that are stalled at a single difficulty for an extended period of time. + +- Monitor node health. For example, if peers report increasing difficulties but the node is stuck at the same block number, the node may be on a different fork to most peers. + +- Determine which protocol level peers are communicating with. For example, you can see if `"version": 65` is being used to reduce transaction sharing traffic. + +## List node connections + +The default logging configuration doesn't list node connection and disconnection messages. To enable listing them, set the [`--logging`](../../reference/cli/options.md#logging) option to `DEBUG`. For more verbosity, set the option to `TRACE`. + +The console logs connection and disconnection events when the log level is `DEBUG` or higher. If the message `Successfully accepted connection from ...` displays, connections are getting through the firewalls. + +```bash title="Sample log output" +2018-10-16 12:37:35.479-04:00 | nioEventLoopGroup-3-1 | INFO | NettyP2PNetwork | Successfully accepted connection from 0xa979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c +``` + +## Disable discovery + +To disable P2P discovery, set the [`--discovery-enabled`](../../reference/cli/options.md#discovery-enabled) option to `false`. + +With discovery disabled, peers can't open connections with the node unless they were previously discovered or manually peered (for example, using [`admin_addPeer`](../../reference/api/index.md#admin_addpeer)). [Static nodes](static-nodes.md) can also open connections. + +## Troubleshoot + +If your nodes fail to connect, ensure the [required ports are open](configure-ports.md). + +If your nodes are running in AWS, check you have appropriate `SecurityGroups` to allow access to the required ports. + +Check that the [enode URLs](../../concepts/node-keys.md#enode-url) specified for [bootnodes](../../../private-networks/how-to/configure/bootnodes.md) or [static nodes](static-nodes.md) match the enode URLs displayed when starting the remote nodes. diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/connect/specify-nat.md b/versioned_docs/version-23.4.0/public-networks/how-to/connect/specify-nat.md new file mode 100644 index 00000000000..89af5a5c962 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/connect/specify-nat.md @@ -0,0 +1,92 @@ +--- +title: Specify NAT method +sidebar_position: 4 +description: Configuring NAT with Hyperledger Besu +tags: + - private networks +--- + +# Specify the NAT method + +Use the [`--nat-method`](../../reference/cli/options.md#nat-method) option to specify the NAT method. Options are: [`UPNP`](#upnp), [`KUBERNETES`](#kubernetes), [`DOCKER`](#docker), [`AUTO`](#auto), and [`NONE`](#none). + +The [enode](../../concepts/node-keys.md#enode-url) advertised to other nodes during discovery is the external IP address and port. The [`admin_nodeInfo`](../../reference/api/index.md#admin_nodeinfo) JSON-RPC API method returns the external address and port for the `enode` and `listenAddr` properties. + +While Hyperledger Besu is running, the following are not supported: + +- IP address changes +- Changing NAT methods. To change the NAT method, restart the node with the [`--nat-method`](../../reference/cli/options.md#nat-method) option set. + +## Auto + +`AUTO` detects if Besu is running inside a Kubernetes cluster or a Docker container. + +- If Besu is running in a Kubernetes cluster, `AUTO` sets to [`KUBERNETES`](#kubernetes). +- If Besu is running in a Docker container, `AUTO` sets to [`DOCKER`](#docker). +- If Besu is not running in Kubernetes or Docker container, `AUTO` sets to [`NONE`](#none). + +`AUTO` is the default NAT method. + +The following log shows an automatic detection failure. + +```log title="The following log shows an automatic detection failure" +INFO | KubernetesNatManager | Starting kubernetes NAT manager. +DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. +DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used +INFO | NetworkRunner | Starting Network. +``` + +:::tip + +If automatic detection fails, set the IP and ports in [`NONE`](#none) mode. + +::: + +## UPnP + +Specify `UPNP` to quickly allow inbound peer connections without manual router configuration. Use UPnP in home or small office environments where a wireless router or modem provides NAT isolation. + +UPnP automatically detects if a node is running in a UPnP environment and provides port forwarding. UPnP might introduce delays during node startup, especially on networks without a UPnP gateway device. + +Use `UPNPP2PONLY` if you wish to enable UPnP only for p2p traffic. + +:::tip + +UPnP support is often disabled by default in networking firmware. If disabled by default, you must explicitly enable UPnP support. + +::: + +:::info + +When the NAT method is set to `UPNP`, the advertised port is the same as the [listening port](../../reference/cli/options.md#p2p-port). + +::: + +## Kubernetes + +Specify `KUBERNETES` to explicitly specify Hyperledger Besu is running inside a Kubernetes cluster. Besu automatically detects if it's running inside of a Kubernetes cluster and interacts with Kubernetes APIs as required to determine external IP addresses and exposed ports. + +In Kubernetes, the Ingress IP of the load balancer will be used as the external IP for Besu. A load balancer service can map any incoming port to a target port. These mapping rules will be the one retrieved by Besu. + +A tutorial to [Configure the Nat Manager for Kubernetes](../../../private-networks/tutorials/kubernetes/nat-manager.md) is available. + +## Docker + +Specify `DOCKER` to explicitly specify Hyperledger Besu is running inside a Docker container. If you specify `DOCKER`, you advertise the host IP address not the container IP address. + +The host IP address is the advertised host specified in the [`docker run` command](https://docs.docker.com/engine/reference/commandline/run/#add-entries-to-container-hosts-file---add-host). If not specified in the `docker run` command, the advertised host defaults to the values for [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-port`](../../reference/cli/options.md#p2p-port). + +## None + +Specify `NONE` to explicitly configure the external IP address and ports advertised using: + +- [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-port`](../../reference/cli/options.md#p2p-port) for the P2P service. +- [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) and [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) for the JSON-RPC HTTP service. + +The P2P and JSON-RPC HTTP hosts and ports are advertised in the [`net_services`](../../reference/api/index.md#net_services) method. + +:::tip + +When the NAT method is set to `NONE`, the advertised port is the same as the [listening port](../../reference/cli/options.md#p2p-port). + +::: diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/connect/static-nodes.md b/versioned_docs/version-23.4.0/public-networks/how-to/connect/static-nodes.md new file mode 100644 index 00000000000..9e16a4e81cf --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/connect/static-nodes.md @@ -0,0 +1,64 @@ +--- +title: Configure static nodes +sidebar_position: 1 +description: Configuring static nodes +tags: + - private networks +--- + +# Static nodes + +Static nodes are a configured set of trusted nodes. Static nodes are exempt from [maximum peer](manage-peers.md#limit-peers) and [remote connection](manage-peers.md#limit-remote-connections) limits. + +Besu attempts to maintain connections with static nodes by periodically initiating a connection to any unconnected static node. + +:::tip + +Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, you can use only bootnodes, only static nodes, or both bootnodes and static nodes. For example, you run multiple nodes on Mainnet (discovery using bootnodes), but want to ensure your nodes are always connected (using static nodes). + +To find peers, configure one or more [bootnodes](../../../private-networks/how-to/configure/bootnodes.md). To configure a specific set of peer connections, use static nodes. + +::: + +## Configure static nodes + +To configure a network of static nodes: + +1. List the [enode URLs](../../concepts/node-keys.md#enode-url) of the nodes in the [`static-nodes.json` file](#static-nodesjson-file). + +1. Save the `static-nodes.json` file in the data directory (specified by [`--data-path`](../../reference/cli/options.md#data-path)) of each node. Alternatively, you can explicitly specify the static nodes file on the command line using [`--static-nodes-file`](../../reference/cli/options.md#static-nodes-file). + +1. Start Besu with discovery disabled using [`--discovery-enabled=false`](../../reference/cli/options.md#discovery-enabled). + +To update the list of static peers at run time, use the [`admin_addPeer`](../../reference/api/index.md#admin_addpeer) and [`admin_removePeer`](../../reference/api/index.md#admin_removepeer) JSON-RPC API methods. + +:::note + +Runtime modifications of static nodes are not persisted between runs. The `static-nodes.json` file is not updated by the `admin_addPeer` and `admin_removePeer` methods. + +Nodes not in the list of the static nodes are not prevented from connecting. To prevent nodes from connecting, use [Permissioning](../../../private-networks/concepts/permissioning/index.md). + +::: + +:::tip + +If the added peer does not appear in the peer list (returned by [`admin_peers`](../../reference/api/index.md#admin_peers)), check the the supplied [enode URL](../../concepts/node-keys.md#enode-url) is correct, the node is running, and the node is listening for TCP connections on the endpoint. + +::: + +### `static-nodes.json` file + +The `static-nodes.json` file must be in the data directory (specified by [`--data-path`](../../reference/cli/options.md#data-path)) and contain a JSON array of [enode URLs](../../concepts/node-keys.md#enode-url). + +```json title="Example" +[ + "enode://cea71cb65a471037e01508cebcc178f176f9d5267bf29507ea1f6431eb6a5dc67d086dc8dc54358a72299dab1161febc5d7af49d1609c69b42b5e54544145d4f@127.0.0.1:30303", + "enode://ca05e940488614402705a6b6836288ea902169ecc67a89e1bd5ef94bc0d1933f20be16bc881ffb4be59f521afa8718fc26eec2b0e90f2cd0f44f99bc8103e60f@127.0.0.1:30304" +] +``` + +:::note + +Each node has a `static-nodes.json` file. We recommend each node in the network has the same `static-nodes.json` file. + +::: diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/develop/_category_.json b/versioned_docs/version-23.4.0/public-networks/how-to/develop/_category_.json new file mode 100644 index 00000000000..8c8a280b930 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/develop/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Develop dapps", + "position": 9 +} diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/develop/client-libraries.md b/versioned_docs/version-23.4.0/public-networks/how-to/develop/client-libraries.md new file mode 100644 index 00000000000..f737f150e1f --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/develop/client-libraries.md @@ -0,0 +1,30 @@ +--- +title: Use client libraries +sidebar_position: 2 +description: Hyperledger Besu client libraries +tags: + - private networks +--- + +# Use client libraries + +Dapps use client libraries, such as [web3.js](https://github.com/ethereum/web3.js/), [web3j](https://github.com/web3j/web3j), or [ethereumj](https://github.com/ethereum/ethereumj), to forward JSON-RPC requests to Hyperledger Besu. Any client library implementing core Ethereum RPC methods works with Besu. + +Use the [web3js-quorum library](../../../private-networks/how-to/use-privacy/web3js-quorum.md) with Besu for [privacy features](../../../private-networks/concepts/privacy/index.md). + +![Client Libraries](../../../assets/images/Hyperledger-Besu-Client-Libraries.png) + +Use client libraries to: + +- Create signed transactions +- [Create and send private transactions]. + +:::note + +[Hyperledger Besu does not support key management inside the client](../send-transactions.md#use-wallets-for-key-management). + +::: + + + +[Create and send private transactions]: ../../../private-networks/how-to/send-transactions/private-transactions.md diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/develop/truffle.md b/versioned_docs/version-23.4.0/public-networks/how-to/develop/truffle.md new file mode 100644 index 00000000000..63782f70f1b --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/develop/truffle.md @@ -0,0 +1,64 @@ +--- +title: Use Truffle +sidebar_position: 1 +description: Using Hyperledger Besu with Truffle +tags: + - private networks +--- + +# Use Truffle + +Developing for Hyperledger Besu using Truffle is the same as developing for public Ethereum networks using Truffle. Truffle supports Besu with the only difference being Besu does not support private key management. To use Besu with Truffle, you must configure a Truffle wallet. + +## Install a Truffle wallet + +To install a Truffle wallet: + +```bash +npm install --save @truffle/hdwallet-provider +``` + +:::note + +With Truffle 5, you must use a Web3 1.0 enabled wallet or the Truffle tasks hang. + +::: + +### Update the Truffle configuration file + +To add the wallet provider, update the `truffle-config.js` file in the project directory. Replace: + +- `` with the JSON-RPC endpoint (IP address and port) of a Besu node. +- `` with the private key of an Ethereum account containing Ether. + +```javascript +const PrivateKeyProvider = require("@truffle/hdwallet-provider"); +const privateKey = ""; +const privateKeyProvider = new PrivateKeyProvider( + privateKey, + "", +); + +module.exports = { + // See + // for more about customizing your Truffle configuration! + networks: { + besuWallet: { + provider: privateKeyProvider, + network_id: "*", + }, + }, +}; +``` + +### Start a Besu node + +Start a Besu node with JSON-RPC enabled on the endpoint specified in the Truffle configuration file. + +### Deploy a contract + +To deploy a contract onto the Besu network: + +```bash +truffle migrate --network besuWallet +``` diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/monitor/_category_.json b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/_category_.json new file mode 100644 index 00000000000..9be56b91890 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Monitor nodes", + "position": 6 +} diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/monitor/index.md b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/index.md new file mode 100644 index 00000000000..3d1ef6d74a7 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/index.md @@ -0,0 +1,14 @@ +--- +description: Monitoring using metrics and logging +tags: + - private networks +--- + +# Monitor Besu + +Monitoring enables identification of node and network issues. Specifically, configuring metrics and logging enables: + +- [Visual representation of declining node or network performance](metrics.md) +- [Collection of log files to enable issue diagnosis](logging.md). + +For an overview of monitoring Hyperledger Besu, view [this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/monitor/logging.md b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/logging.md new file mode 100644 index 00000000000..c885fee0fbe --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/logging.md @@ -0,0 +1,76 @@ +--- +title: Configure logging +sidebar_position: 3 +description: Hyperledger Besu log level setting and log formatting +path: blob/master/besu/src/main/resources/ +source: log4j2.xml +tags: + - private networks +--- + +# Use logging + +Hyperledger Besu uses Log4J2 for logging and provides two methods to configure logging behavior: + +- [Basic](#basic-logging) - Changes the log level. +- [Advanced](#advanced-logging) - Configures the output and format of the logs. + +[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) provides an [example implementation using Elastic Stack](../../../private-networks/how-to/monitor/elastic-stack.md) for log management. + +## Basic logging + +Use the [`--logging`](../../reference/cli/options.md#logging) command line option to specify logging verbosity. The [`--logging`](../../reference/cli/options.md#logging) option changes the volume of events displayed in the log. Valid log levels are `OFF`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. The default level is `INFO`. + +For most use cases, the basic method provides enough configurability. + +:::tip + +Use the [`admin_changeLogLevel`](../../reference/api/index.md#admin_changeloglevel) API method to change the log level while Besu is running. + +::: + +## Advanced logging + +You can provide your own logging configuration using the standard Log4J2 configuration mechanisms. For example, the following Log4J2 configuration is the same as the [default configuration] except for the exclusion of logging of stack traces for exceptions. + +```xml title="debug.xml" + + + + INFO + + + + + + + + + + + + + +``` + +To use your custom configuration, set the environment variable `LOG4J_CONFIGURATION_FILE` to the location of your configuration file. + +If you have more specific requirements, you can create your own [log4j2 configuration](https://logging.apache.org/log4j/2.x/manual/configuration.html). + +For Bash-based executions, you can set the variable for only the scope of the program execution by setting it before starting Besu. + +To set the debug logging and start Besu connected to the Goerli testnet: + +```bash +LOG4J_CONFIGURATION_FILE=./debug.xml besu --network=goerli +``` + +### Log rotation + +[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) logging configuration defines a [log rotation to restrict the size of the log files]. + + + +[default configuration]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/besu/src/main/resources/log4j2.xml +[log rotation to restrict the size of the log files]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/besu/config/besu/log-config.xml +[default configuration]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/besu/src/main/resources/log4j2.xml diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/monitor/metrics.md b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/metrics.md new file mode 100644 index 00000000000..8299310283d --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/metrics.md @@ -0,0 +1,296 @@ +--- +title: Use metrics +sidebar_position: 1 +description: Monitoring and metrics +tags: + - private networks +--- + +# Use metrics to monitor node performance + +To enable the [Prometheus](https://prometheus.io/) monitoring and alerting service to access Hyperledger Besu metrics, use the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. Use [Grafana](https://grafana.com/) to visualize the collected data. See the sample [Besu Full Grafana dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). + +The Besu example networks have [monitoring with Prometheus and Grafana configured]. + +Use Prometheus to monitor the number of blocks your Besu node is behind the chain head, and to alert you that your node is not keeping up with the chain head. + +[This recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be) shows examples of monitoring Hyperledger Besu. + +## Install Prometheus + +To use Prometheus with Besu, install the [Prometheus main component](https://prometheus.io/download/). On MacOS, install with [Homebrew](https://formulae.brew.sh/formula/prometheus): + +```bash +brew install prometheus +``` + +:::tip + +You can also install: + +- Exporters that send system metrics to Prometheus to monitor non-Besu-specific items such as disk and CPU usage. +- Other Prometheus components, such as the Alert Manager. Additional configuration is not required for these components because Prometheus handles and analyzes data directly from the feed. + +::: + +## Set up and run Prometheus with Besu + +To configure Prometheus and run with Besu: + +1. Configure Prometheus to poll Besu. For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: + + + + # Fragment to insert in prometheus.yml + + ```yml + - job_name: besu + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9545 + ``` + + # Full prometheus.yml example + + ```yml + global: + scrape_interval: 15s + + scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: besu + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9545 + ``` + + + + Prometheus requires 3 MB of space per node per hour for metrics, with a `scrape_interval` of 15 seconds. + +2. Start Besu with the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. To start a single node for testing with metrics enabled, run the following command: + + + + # Syntax + + ```bash + besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled + ``` + + # Example + + ```bash + besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled + ``` + + + + To specify the host and port on which Prometheus accesses Besu, use the [`--metrics-host`](../../reference/cli/options.md#metrics-host) and [`--metrics-port`](../../reference/cli/options.md#metrics-port) options. The default host and port are 127.0.0.1 (`localhost`) and 9545. + + :::danger + + To avoid DNS rebinding attacks, if running Prometheus on a different host than your Besu node (any host other than `localhost`), add the hostname that Prometheus uses to [`--host-allowlist`](../../reference/cli/options.md#host-allowlist). + + For example, if Prometheus is configured to get metrics from `http://besu.local:8008/metrics`, then `besu.local` has to be in `--host-allowlist`. + + ::: + +3. In another terminal, run Prometheus specifying the `prometheus.yml` file: + + ```bash + prometheus --config.file=prometheus.yml + ``` + +4. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). + + :::tip + + Use a log ingestion tool, such as Logstash, to parse the logs and alert you to configured anomalies. + + ::: + +## Run Prometheus with Besu in push mode + +The [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option enables Prometheus polling of Besu, but sometimes metrics are hard to poll (for example, when running inside Docker containers with varying IP addresses). To enable Besu to push metrics to a [Prometheus push gateway](https://github.com/prometheus/pushgateway), use the [`--metrics-push-enabled`](../../reference/cli/options.md#metrics-push-enabled) option. + +To configure Prometheus and run with Besu pushing to a push gateway: + +1. Configure Prometheus to read from a push gateway. For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: + + ```yml + - job_name: push-gateway + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9091 + ``` + +1. Start the push gateway. You can deploy the push gateway using the Docker image: + + ```bash + docker pull prom/pushgateway + docker run -d -p 9091:9091 prom/pushgateway + ``` + +1. Start Besu specifying the `--metrics-push-enabled` option and port of the push gateway: + + + + # Syntax + + ```bash + besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 + ``` + + # Example + + ```bash + besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 + ``` + + + +1. In another terminal, run Prometheus specifying the `prometheus.yml` file: + + ```bash + prometheus --config.file=prometheus.yml + ``` + +1. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). + +## View Prometheus graphical interface + +1. Open a Web browser to [`http://localhost:9090`](http://localhost:9090) to view the Prometheus graphical interface. + +1. Choose **Graph** from the menu bar and click the **Console** tab below. + +1. From the **Insert metric at cursor** drop-down, select a [metric](#metrics-list) such as `besu_blockchain_difficulty_total` or `ethereum_blockchain_height` and click **Execute**. The values display. + +1. Click the **Graph** tab to view the data as a time-based graph. The query string displays below the graph. For example, `{ethereum_blockchain_height{instance="localhost:9545",job="prometheus"}`. + +## Metrics list + +The following table lists available metrics. Each metric starts with a metric category prefix. Metrics specific to Besu use the `besu_` prefix, followed by another metric category. Metric categories can be enabled using the [`metrics-category`](../../reference/cli/options.md#metrics-category) command line option. If a metric has a JSON-RPC equivalent, it is included in the definition column. + +| Name | Metric type | Definition | +| --- | --- | --- | +| `besu_blockchain_chain_head_gas_limit` | Gauge | Block gas limit of the current chain head block | +| `besu_blockchain_chain_head_gas_used` | Gauge | Gas used by the current chain head block | +| `besu_blockchain_chain_head_ommer_count` | Gauge | Number of uncles in the current chain head block (JSON-RPC equivalent: [`eth_getUncleCountByBlockHash`](../../reference/api/index.md#eth_getunclecountbyblockhash) or [`eth_getUncleCountByBlockNumber`](../../reference/api/index.md#eth_getunclecountbyblocknumber)) | +| `besu_blockchain_chain_head_timestamp` | Gauge | Timestamp from the current chain head | +| `besu_blockchain_chain_head_transaction_count` | Gauge | Number of transactions in the current chain head block (JSON-RPC equivalent: [`eth_getBlockTransactionCountByHash`](../../reference/api/index.md#eth_getblocktransactioncountbyhash) or [`eth_getBlockTransactionCountByNumber`](../../reference/api/index.md#eth_getblocktransactioncountbynumber)) | +| `besu_blockchain_difficulty_total` | Gauge | Difficulty of the chain head (JSON-RPC equivalent: `difficulty` of [`admin_peers`](../../reference/api/index.md#admin_peers)) | +| `besu_executors_ethscheduler_computation_active_threads_current` | Gauge | Current number of threads executing computation tasks | +| `besu_executors_ethscheduler_computation_completed_tasks_total` | Gauge | Total number of computation tasks executed | +| `besu_executors_ethscheduler_computation_pool_size_current` | Gauge | Current number of threads in the computation thread pool | +| `besu_executors_ethscheduler_computation_queue_length_current` | Gauge | Current number of computation tasks awaiting execution | +| `besu_executors_ethscheduler_computation_rejected_tasks_total` | Counter | Total number of tasks rejected by this computation executor | +| `besu_executors_ethscheduler_computation_submitted_tasks_total` | Gauge | Total number of computation tasks submitted | +| `besu_executors_ethscheduler_timer_active_threads_current` | Gauge | Current number of threads executing timer tasks | +| `besu_executors_ethscheduler_timer_completed_tasks_total` | Gauge | Total number of timer tasks executed | +| `besu_executors_ethscheduler_timer_pool_size_current` | Gauge | Current number of threads in the timer thread pool | +| `besu_executors_ethscheduler_timer_queue_length_current` | Gauge | Current number of timer tasks awaiting execution | +| `besu_executors_ethscheduler_timer_rejected_tasks_total` | Counter | Total number of tasks rejected by this timer executor | +| `besu_executors_ethscheduler_timer_submitted_tasks_total` | Gauge | Total number of timer tasks submitted | +| `besu_executors_ethscheduler_workers_active_threads_current` | Gauge | Current number of threads executing worker tasks | +| `besu_executors_ethscheduler_workers_completed_tasks_total` | Gauge | Total number of worker tasks executed | +| `besu_executors_ethscheduler_workers_pool_size_current` | Gauge | Current number of threads in the worker thread pool | +| `besu_executors_ethscheduler_workers_queue_length_current` | Gauge | Current number of worker tasks awaiting execution | +| `besu_executors_ethscheduler_workers_rejected_tasks_total` | Counter | Total number of tasks rejected by this worker executor | +| `besu_executors_ethscheduler_workers_submitted_tasks_total` | Gauge | Total number of worker tasks submitted | +| `besu_network_discovery_inflight_interactions_current` | Gauge | Current number of inflight discovery interactions | +| `besu_network_discovery_interaction_count` | Counter | Total number of discovery interactions initiated | +| `besu_network_discovery_interaction_retry_count` | Counter | Total number of interaction retries performed | +| `besu_network_discovery_messages_inbound` | Counter | Total number of P2P discovery messages received | +| `besu_network_discovery_messages_outbound` | Counter | Total number of P2P discovery messages sent | +| `besu_network_netty_boss_pending_tasks` | Gauge | Number of pending tasks in Netty boss event loop | +| `besu_network_netty_workers_pending_tasks` | Gauge | Number of pending tasks in Netty workers event loop | +| `besu_network_p2p_messages_inbound` | Counter | Total number of P2P messages received | +| `besu_network_vertx_eventloop_pending_tasks` | Gauge | Number of pending tasks in Vertx event loop | +| `besu_network_vertx_worker_pool_completed_total` | Counter | Total number of tasks completed by Vertx worker pool | +| `besu_network_vertx_worker_pool_rejected_total` | Counter | Total number of tasks rejected by Vertx worker pool | +| `besu_network_vertx_worker_pool_submitted_total` | Counter | Total number of tasks submitted to Vertx worker pool | +| `besu_peers_connected_total` | Counter | Total number of peers connected | +| `besu_peers_disconnected_total` | Counter | Total number of peers disconnected | +| `besu_peers_pending_peer_requests_current` | Gauge | Current number of peer requests pending because peers are busy | +| `besu_pruner_mark_time_duration` | Gauge | Cumulative number of seconds spent marking the state trie across all pruning cycles | +| `besu_pruner_mark_operations_total` | Counter | Total number of mark operations performed | +| `besu_pruner_marked_nodes_total` | Counter | Total number of nodes marked as in use | +| `besu_pruner_sweep_operations_total` | Counter | Total number of sweep operations performed | +| `besu_pruner_swept_nodes_total` | Counter | Total number of unused nodes removed | +| `besu_stratum_connections` | Counter | Number of connections over time | +| `besu_stratum_difficulty` | Gauge | Current mining difficulty | +| `besu_stratum_disconnections` | Counter | Number of disconnections over time | +| `besu_stratum_miners` | Gauge | Number of connected miners | +| `besu_synchronizer_chain_download_pipeline_processed_total` | Counter | Number of entries processed by each chain download pipeline stage | +| `besu_synchronizer_chain_download_pipeline_restarts` | Counter | Number of times chain download pipeline has been restarted | +| `besu_synchronizer_fast_sync_pivot_block_current` | Gauge | The current fast sync pivot block | +| `besu_synchronizer_fast_sync_pivot_block_selected_count` | Counter | Number of times a fast sync pivot block has been selected | +| `besu_synchronizer_fast_sync_validation_mode` | Counter | Number of blocks validated using light vs full validation during fast sync | +| `besu_synchronizer_in_sync` | Gauge | Whether or not the local node has caught up to the best known peer (1 or 0) | +| `besu_synchronizer_task` | Summary | Internal processing tasks | +| `besu_synchronizer_world_state_completed_requests_total` | Counter | Total number of node data requests completed as part of fast sync world state download | +| `besu_synchronizer_world_state_existing_nodes_total` | Counter | Total number of node data requests completed using existing data | +| `besu_synchronizer_world_state_inflight_requests_current` | Gauge | Number of in progress requests for world state data | +| `besu_synchronizer_world_state_node_requests_since_last_progress_current` | Gauge | Number of world state requests made since the last time new data was returned | +| `besu_synchronizer_world_state_pending_requests_cache_size` | Gauge | Pending request cache size for fast sync world state download | +| `besu_synchronizer_world_state_pending_requests_current` | Gauge | Number of pending requests for fast sync world state download | +| `besu_synchronizer_world_state_pipeline_processed_total` | Counter | Number of entries processed by each world state download pipeline stage | +| `besu_synchronizer_world_state_retried_requests_total` | Counter | Total number of node data requests repeated as part of fast sync world state download | +| `besu_transaction_pool_pending_transactions_messages_skipped_total` | Counter | Total number of pending transactions messages skipped by the processor | +| `besu_transaction_pool_transactions` | Gauge | Current size of the transaction pool (JSON-RPC equivalent: result number of [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions)) | +| `besu_transaction_pool_transactions_added_total` | Counter | Count of transactions added to the transaction pool | +| `besu_transaction_pool_transactions_messages_skipped_total` | Counter | Total number of transactions messages skipped by the processor. | +| `ethereum_best_known_block_number` | Gauge | Estimated highest block available (JSON-RPC equivalent: `highestBlock` of [`eth_syncing`](../../reference/api/index.md#eth_syncing), or [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) if not syncing) | +| `ethereum_blockchain_height` | Gauge | Current height of the canonical chain (JSON-RPC equivalent: [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber)) | +| `ethereum_peer_count` | Gauge | Current number of peers connected (JSON-RPC equivalent: [`net_peerCount`](../../reference/api/index.md#net_peercount)) | +| `ethereum_peer_limit` | Gauge | Maximum number of peers this node allows to connect | +| `jvm_buffer_pool_capacity_bytes` | Gauge | Bytes capacity of a given JVM buffer pool | +| `jvm_buffer_pool_used_buffers` | Gauge | Used buffers of a given JVM buffer pool | +| `jvm_buffer_pool_used_bytes` | Gauge | Used bytes of a given JVM buffer pool | +| `jvm_classes_loaded` | Gauge | Current number of classes loaded in the JVM | +| `jvm_classes_loaded_total` | Counter | Total number of classes loaded since the JVM started execution | +| `jvm_classes_unloaded_total` | Counter | Total number of classes unloaded since the JVM started execution | +| `jvm_gc_collection_seconds` | Summary | Seconds spent in a given JVM garbage collector | +| `jvm_memory_bytes_committed` | Gauge | Committed bytes of a given JVM memory area | +| `jvm_memory_bytes_init` | Gauge | Initial bytes of a given JVM memory area | +| `jvm_memory_bytes_max` | Gauge | Maximum bytes of a given JVM memory area | +| `jvm_memory_bytes_used` | Gauge | Used bytes of a given JVM memory area | +| `jvm_memory_pool_bytes_committed` | Gauge | Committed bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_init` | Gauge | Initial bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_max` | Gauge | Maximum bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_used` | Gauge | Used bytes of a given JVM memory pool | +| `jvm_threads_current` | Gauge | Current thread count of a JVM | +| `jvm_threads_daemon` | Gauge | Daemon thread count of a JVM | +| `jvm_threads_deadlocked` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors or ownable synchronizers | +| `jvm_threads_deadlocked_monitor` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors | +| `jvm_threads_peak` | Gauge | Peak thread count of a JVM | +| `jvm_threads_started_total` | Counter | Started thread count of a JVM | +| `jvm_threads_state` | Gauge | Current count of threads by state | +| `process_cpu_seconds_total` | Counter | Total user and system CPU time spent in seconds | +| `process_max_fds` | Gauge | Maximum number of open file descriptors | +| `process_open_fds` | Gauge | Number of open file descriptors | +| `process_start_time_seconds` | Gauge | Start time of the process since Unix epoch in seconds | + +:::info + +- The `ethereum_best_known_block_number` metric always has a value. When the [`eth_syncing` JSON-RPC method](../../reference/api/index.md#eth_syncing) returns false, the current chain height displays. +- Although the `ethereum_peer_limit` metric does not have a JSON-RPC equivalent, the [`max peers` command line option](../../reference/cli/options.md#max-peers) sets the maximum number of P2P connections that can be established. + +::: + + + +[monitoring with Prometheus and Grafana configured]: ../../../private-networks/tutorials/quickstart.md#monitor-nodes-with-prometheus-and-grafana diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/monitor/understand-metrics.md b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/understand-metrics.md new file mode 100644 index 00000000000..863798555be --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/monitor/understand-metrics.md @@ -0,0 +1,101 @@ +--- +title: Understand metrics +sidebar_position: 2 +description: Understand Besu performance metrics +tags: + - public networks +--- + +# Understand metrics + +When running Besu on Ethereum Mainnet using [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), you might notice graphical patterns that stand out in different metrics charts. These patterns are related to the [CPU usage](#cpu-usage) and [block time](#block-time) of the Besu sync process. + +## CPU usage + +The following screenshot from [monitoring Besu with Prometheus and Grafana] shows patterns related to CPU usage. + +![CPU Grafana Besu dashboard patterns screenshot](../../../assets/images/besu-cpu-pattern-during-sync.png) + +The CPU pattern is a "staircase" pattern, where each step represents one of the Besu running stages. + +### 1. Blocks import and world state download + +Step 1 highlights blocks import and world state download, two tasks executed in parallel in Besu. Besu manages these two tasks with two different pipelines. + +This step is CPU-bound.[^1] The two pipeline stages run on multiple threads. + +As displayed in the following screenshot (for a VM with 8 CPUs) the CPU load average is about 7.5 and sometimes exceeds 10 (a 100% load for the 8 CPUs is 8). This means there's more work to be done than what the CPUs can handle. + +![System load metrics screenshot](../../../assets/images/system-load.png) + +### 2. World state healing + +Step 2, world state healing, starts just after the world state download in step 1 is complete. The peak in system CPU is related to the high rate of input and output (IO) required during this step. IO usage is around 61% during healing, and it's only 39% during the remaining sync. + +![IO utilization metrics screenshot](../../../assets/images/io-utilization.png) + +### 3. Blocks import + +After steps 1 and 2, world state is downloaded and healed, and block import continues. + +The visible drop in CPU shows that Besu finished the world state nodes download. + +The block import step is long because Besu can't parallelize block import -- it must validate each parent block before importing a child. + +:::note + +The Besu team is currently working on other algorithm and implementations to make this block import faster. + +::: + +### 4. Blocks full import + +In step 4, Besu executes all transactions of each block. This is when Besu updates the world state after the healing step. + +The quantity of imported blocks in this step depends on the speed of the sync. This number indicates the cumulated blocks quantity behind head since the last healing step. + +This step consumes less CPU than the previous steps because the sequential part -- executing transactions on the EVM -- must be single-threaded, reducing the concurrent work at the CPU level. + +### 5. Blocks production and propagation + +Once Besu is completely synced, it propagates blocks and executes the transactions inside each block. Step 5, block production and propagation, shows a reduction in CPU consumption due to the idle time while waiting for the new block and the sequential nature of executing transactions on the EVM. + +## Block time + +Block time measures the duration of getting new blocks in Besu. Block time is closely related to [CPU usage](#cpu-usage). + +The following screenshot shows patterns related to block time as available in the [Besu Grafana full dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). + +![Block time Grafana Besu dashboard patterns screenshot](../../../assets/images/block-time.png) + +The block time pattern is also a "staircase" pattern. + +### 1. Block import time + +Step 1, block import time, is the duration of importing a block. + +Import includes: + +- Data retrieval over the network. +- Headers, body, and receipt validation. +- Persisting the block in the database. + +Block import takes between a few and tens of milliseconds. + +### 2. Block full import time + +Step 2, block full import time, is the duration of importing a block (step 1) and executing all its transactions. + +Block full import takes between 1 and 2 seconds per block, depending on the number and complexity of the transactions. + +### 3. Block network time + +Step 3, block network time, is the duration of propagating a block over the network and executing all its transactions. + +Block network takes between 13 and 16 seconds. + + + +[monitoring Besu with Prometheus and Grafana]: ../../../private-networks/tutorials/quickstart.md#monitor-nodes-with-prometheus-and-grafana + +[^1]: A CPU-bound task means that the time required to execute the task is determined only by the CPU speed. diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/send-transactions.md b/versioned_docs/version-23.4.0/public-networks/how-to/send-transactions.md new file mode 100644 index 00000000000..5fe27dfa9c3 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/send-transactions.md @@ -0,0 +1,63 @@ +--- +title: Create and send transactions +sidebar_position: 4 +description: Some use cases of creating transactions on a Hyperledger Besu network +--- + +# Create and send transactions + +You can send signed transactions using the [`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction) JSON-RPC API method. + +Signed transactions can be simple value transfers, contract creation, or contract invocation. Set the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../reference/cli/options.md#rpc-tx-feecap) CLI option. + +To accept signed transactions from remote connections, set the [API listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0`. + +[Use client libraries](develop/client-libraries.md) to create and send a signed raw transaction to transfer Ether and create a smart contract. + +:::danger Private keys + +Don't use the accounts from the examples on Mainnet or any public network except for testing. The private keys are displayed which means the accounts are not secure. + +All accounts and private keys in the examples are from the `dev.json` genesis file in the [`/besu/config/src/main/resources`](https://github.com/hyperledger/besu/tree/master/config/src/main/resources) directory. + +In production environments avoid exposing your private keys by creating signed transactions offline, or use [EthSigner](https://docs.ethsigner.consensys.net/) to isolate your private keys and sign transactions with [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). + +::: + +:::caution + +Setting the [listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0` exposes the API service connection on your node to any remote connection. In a production environment, ensure you are using a firewall to avoid exposing your node to the internet. + +::: + +:::tip + +Libraries such as [web3j](https://github.com/web3j/web3j) or [ethereumj](https://github.com/ethereum/ethereumj) and tools such as [MyCrypto](https://mycrypto.com/) can also create signed transactions. + +::: + +## `eth_call` vs `eth_sendRawTransaction` + +You can interact with contracts using [`eth_call`](../reference/api/index.md#eth_call) or [`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction). The table below compares the characteristics of both calls. + +| `eth_call` | `eth_sendRawTransaction` | +| --- | --- | +| Read-only | Write | +| Invokes contract function locally | Broadcasts to the network | +| Does not change state of blockchain | Updates the blockchain (for example, transfers ether between accounts) | +| Does not consume gas | Requires gas | +| Synchronous | Asynchronous | +| Returns the value of a contract function available immediately | Returns transaction hash only. A block might not include all possible transactions (for example, if the gas price is too low). | + +## Use wallets for key management + +Besu doesn't support key management inside the client. Use: + +- [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu to provide access to your key store and sign transactions. +- Third-party tools (for example, [MetaMask](https://metamask.io/) and [web3j](https://web3j.io/)) for creating accounts. + +:::tip + +[EthSigner](http://docs.ethsigner.consensys.net/en/latest/) implements [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction) and [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +::: diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/_category_.json b/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/_category_.json new file mode 100644 index 00000000000..cf5f9653813 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Troubleshoot", + "position": 12 +} diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/evm-tool.md b/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/evm-tool.md new file mode 100644 index 00000000000..e8f56816381 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/evm-tool.md @@ -0,0 +1,73 @@ +--- +title: Use EVM tool +sidebar_position: 1 +description: Hyperledger Besu EVM tool +tags: + - private networks +--- + +# Use the EVM tool + +The Besu EVM tool is a CLI program that executes arbitrary EVM programs and Ethereum State Tests outside the context of an operating node. Use the EVM tool for benchmarking and fuzz testing. + +## Get the EVM tool + +The Besu EVM tool does not have a standard zip file distribution. To use, you need to either build from the source repository or use a pre-published docker image. + +### Build from source + +To build from source, run the following from the root of the Besu repository: + +```bash +./gradlew :ethereum:evmTool:installDist +``` + +An extractable archive files is created in `ethereum/evmtool/build/distributions` and an executable installation in `ethereum/evmtool/build/install/evmtool`. + +Execute the EVM tool: + +```bash +ethereum/evmtool/build/install/evmtool/bin/evm +``` + +### Execute with Docker + +To run the Besu EVM tool in a container: + +```bash +docker run -rm hyperledger/besu-evmtool:develop +``` + +- Because no data is stored in local directories we recommended using the `-rm` docker option. The `-rm` option deletes the container at the end of execution. +- If you use an option that requires input from standard in, use the `-i` docker option. The `-i` option pipes standard input to the EVM tool. +- If you need to reference files we recommend using a docker file binding, such as `-v ${PWD}:/opt/data`, which maps the current directory to the `/opt/data` directory in the container. + +:::note + +The `latest` tag is the latest released version of Besu, starting with 1.5.3. The `develop` tag is the current main branch code that will go into a future release version of Besu. + +::: + +## EVM tool run options + +The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. [Command line options](../../reference/evm-tool.md) specify the code and other contextual information. + +The EVM tool also has a [`state-test` subcommand](../../reference/evm-tool.md#state-test-options) that allows [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) to be evaluated, and a [`code-validate` subcommand](../../reference/evm-tool.md#eof-code-validation) that allows [Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. Most of the options from EVM execution don't apply. + + + +# `state-test` + +```bash +evm state-test --nomemory +``` + +# `code-validate` + +```bash +evm code-validate --file +``` + + + +The [EVM tool reference](../../reference/evm-tool.md) provides more information on these modes. diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/peering.md b/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/peering.md new file mode 100644 index 00000000000..3a3a9d872e8 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/peering.md @@ -0,0 +1,67 @@ +--- +title: Troubleshoot peering +sidebar_position: 3 +description: How to troubleshoot peering +--- + +# Troubleshoot peering + +Many factors can affect the ability of your node to find and maintain peers. Your network router, machine environment, and node configuration are all important. If you have peering issues, start by [configuring your ports](../connect/configure-ports.md) and [managing peers](../connect/manage-peers.md). + +## Peering FAQ + +### "Why can’t I find enough peers to sync?" + +One or more of the following may be the cause: + +- Your hardware doesn't have enough CPU, disk IOPS, or bandwidth to handle all the peers. +- Your ports aren't open in your firewall and/or router. +- Your node is sending large numbers of DNS requests. See [issue #4375](https://github.com/hyperledger/besu/issues/4375). +- You're using [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), which doesn't download all historical block data, so your peers may disconnect you when fetching those blocks. +- Your node is experiencing the normal behavior of peers connecting and disconnecting. This is especially normal soon after you start your node. + +You can try the following to find more peers: + +- Set [`p2p-host`](../../reference/cli/options.md#p2p-host) to your external IP address to allow inbound connections. +- Restart Besu. This can take a while to build up again. +- Set `-Xdns-enabled` to `true` (only for private networks). +- Set `-Xp2p-peer-lower-bound` to a minimum number of peers. +- Delete the node key (which is autogenerated in your data directory). There are two reasons that this might help find more peers: + 1. Your node (identified by the address associated with this key) has been put onto other peers' bad peer lists for some reason. + 2. Peer discovery is influenced by the value of the node key. This is related to the node "distance" in the [discovery algorithm](https://github.com/ethereum/devp2p/wiki/Discovery-Overview#kademlia). + +You can read the [Prysm EL and CL peering documentation](https://docs.prylabs.network/docs/prysm-usage/p2p-host-ip) for more information. + +### "What network or router/modem settings should I check?" + +Check the following settings: + +- Your machine and router's specified DNS should support TCP. You can check your DNS online for TCP support. Google and Cloudflare, 8.8.8.8 and 1.1.1.1, support TCP over port 853. Other DNS might as well. +- The appropriate ports should be open on your router, or your router should have UPNP enabled. See the next FAQ for more information on router settings. +- If you use [Docker](https://docs.docker.com/network/network-tutorial-host/) or virtualization, the container should be able to create outbound connections on the host machine. + +### "How do I open/forward my ports?" + +If you’re behind NAT, you probably need to set up port forwarding in your router. You might also need to configure your firewall. Forward and open `30303` (if using the default p2p port) for both UDP and TCP. If your router supports UPNP, you can set [`--nat-method`](../../reference/cli/options.md#nat-method) to [`UPNPP2PONLY`](../connect/specify-nat.md#upnp). + +### "How do I test that my ports are open?" + +You can use this [open port checker](https://www.yougetsignal.com/tools/open-ports/). + +### "What's the ideal number of peers for Besu?" + +The default maximum is 25. Increasing the number of peers increases the bandwidth, CPU, and disk access Besu uses to respond to peers. Hardware with low specifications might result in low peer numbers. You'll experience diminishing returns with a larger number of peers (>100). + +### question "What's the benefit of increasing the number of peers?" + +Increasing the number of max peers won't speed up Besu syncing, because the bottleneck during sync is disk IO and CPU. + +Note that Besu's peers are only used for the initial sync and transaction gossip, neither of which affects attestation performance. The beacon node connectivity controls how quickly you receive blocks and how attestations are published. Increasing Besu's peer count increases the load on your node, which may hurt attestations. + +## Metrics + +Capture [metrics](../monitor/index.md) to gain insights into peering behavior over time. + +To [enable Prometheus to access Besu](../monitor/metrics.md), open the metrics port or metrics push port to Prometheus or the Prometheus push gateway on TCP. + +Specify the ports for Prometheus and Prometheus push gateway using the [`--metrics-port`](../../reference/cli/options.md#metrics-port) and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. The defaults are `9545` and `9001`. diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/trace-transactions.md b/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/trace-transactions.md new file mode 100644 index 00000000000..d0221d325bd --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/troubleshoot/trace-transactions.md @@ -0,0 +1,39 @@ +--- +title: Trace transactions +sidebar_position: 2 +description: How to trace transactions +tags: + - private networks +--- + +# Trace transactions + +To get detailed information about transaction processing, use the [`TRACE` API](../../reference/api/index.md#trace-methods). Enable the `TRACE` API using the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api) command line options. + +The `TRACE` API has two sets of trace calls, [ad-hoc tracing APIs](#ad-hoc-tracing-apis) and [transaction-trace filtering APIs](#transaction-trace-filtering-apis). + +## Ad-hoc tracing APIs + +These APIs allow you to use the [`trace`, `vmTrace`, or `stateDiff`](../../reference/trace-types.md) diagnostic options when tracing calls or transactions. + +To use the ad-hoc tracing APIs, the requested block or transaction must be within the number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) (by default, 1024). + +The ad-hoc tracing APIs are: + +- [`trace_call`](../../reference/api/index.md#trace_call) +- [`trace_callMany`](../../reference/api/index.md#trace_callmany) +- [`trace_rawTransaction`](../../reference/api/index.md#trace_rawtransaction) +- [`trace_replayBlockTransactions`](../../reference/api/index.md#trace_replayblocktransactions) + +## Transaction-trace filtering APIs + +These APIs allow you to filter and search by specific information such as the block, address, or transaction. These APIs only use the [`trace` type](../../reference/trace-types.md#trace). + +To use the transaction-trace filtering APIs, your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block or transaction must be within the number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) (by default, 1024). + +The transaction-trace filtering APIs are: + +- [`trace_block`](../../reference/api/index.md#trace_block) +- [`trace_filter`](../../reference/api/index.md#trace_filter) +- [`trace_get`](../../reference/api/index.md#trace_get) +- [`trace_transaction`](../../reference/api/index.md#trace_transaction) diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/upgrade-node.md b/versioned_docs/version-23.4.0/public-networks/how-to/upgrade-node.md new file mode 100644 index 00000000000..149a0ba4c6d --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/upgrade-node.md @@ -0,0 +1,31 @@ +--- +title: Upgrade Besu +sidebar_position: 11 +description: Upgrade Besu +--- + +# Upgrade your Besu node + +When upgrading your Besu node, we recommend: + +- Using an orchestration method (for example, Ansible or Chef) to keep all nodes in sync with your desired configuration. +- Storing your configuration under version control. + +## Ansible + +You can use the [Ansible role on Galaxy](https://galaxy.ansible.com/consensys/hyperledger_besu) directly or customize it to suit your needs. + +Upgrade the Besu version on nodes by running the play with the new version. For more information, For more information, select **Read Me** on the [Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). + +The playbook: + +1. Stops Besu. +1. Downloads the updated version. +1. Applies any new configuration. +1. Starts Besu. + +## Find peers on restarting + +Nodes store known peers in the peer table. The peer table is not persisted to disk. When a node restarts, the node connects to the specified bootnodes and discovers other nodes through the peer discovery process. The node continues collecting data from where it left off before the restart (assuming there was no data corruption in a failure scenario). + +Before the node restarted, connected peers saved the node details in their peer tables. These peers can reconnect to the restarted node. The restarted node uses these peers and the bootnodes, to discover more peers. To ensure that the restarted node successfully rejoins the network, ensure you specify at least one operational bootnode. diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/_category_.json b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/_category_.json new file mode 100644 index 00000000000..300deff1cbe --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use the Besu API", + "position": 1 +} diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/access-logs.md b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/access-logs.md new file mode 100644 index 00000000000..04dbfd60d34 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/access-logs.md @@ -0,0 +1,194 @@ +--- +title: Access logs using JSON-RPC +sidebar_position: 5 +description: Accessing logs using the Hyperledger Besu API +tags: + - private networks +--- + +# Access logs using the Hyperledger Besu API + +Subscribe to events, such as logs, using either [RPC Pub/Sub over WebSockets](rpc-pubsub.md) or filters over HTTP. + +Access logs using the following Hyperledger Besu API methods: + +- [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) +- [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs) +- [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). + +Use [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) to create the filter before using [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) and [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs)). + +Access logs for [private contracts](../../../private-networks/concepts/privacy/index.md) using the equivalent [`priv_*` methods and specifying the privacy group ID](#filters-for-private-contracts). For example, [`priv_getLogs`](../../reference/api/index.md#priv_getlogs). + +:::note + +The following examples use the sample contract included in [events and logs](../../concepts/events-and-logs.md). + +::: + +## Create a filter + +Create a filter using [`eth_newFilter`](../../reference/api/index.md#eth_newfilter). + +If the [example contract](../../concepts/events-and-logs.md) was deployed to 0x42699a7612a82f1d9c36148af9c77354759b210b, the following request for `eth_newFilter` creates a filter to log when `valueIndexed` is set to 5: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_newFilter", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + ["0x0000000000000000000000000000000000000000000000000000000000000005"] + ] + } + ], + "id": 1 +} +``` + +[`eth_newFilter`](../../reference/api/index.md#eth_newfilter) returns a filter ID hash (for example, `0x1ddf0c00989044e9b41cc0ae40272df3`). + +### Poll a filter for changes + +To poll the filter for changes since the last poll, use [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) with the filter ID hash returned by [`eth_newFilter`](../../reference/api/index.md#eth_newfilter). + +If the contract had been executed twice since the last poll, with `valueIndexed` set to 1 and 5, [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) returns only the log where the [topic](../../concepts/events-and-logs.md#event-parameters) for `valueIndexed` is 5: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x21c", + "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", + "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + ] +} +``` + +### Get all logs for a filter + +To get all logs for a filter, use [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). + +If the contract had been executed twice with `valueIndexed` set to 5 since the filter was created using `eth_newFilter`, `eth_getFilterLogs` returns: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x1a7", + "blockHash": "0x4edda22a242ddc7bc51e2b6b11e63cd67be1af7389470cdea9c869768ff75d42", + "transactionHash": "0x9535bf8830a72ca7d0020df0b547adc4d0ecc4321b7d5b5d6beb1eccee5c0afa", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x21c", + "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", + "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + ] +} +``` + +:::tip + +You can use [`eth_getLogs`](#get-logs-using-a-filter-options-object) with a filter options object to get all logs matching the filter options instead of using [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) followed by [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). + +::: + +## Uninstall a filter + +When a filter is no longer required, use [`eth_uninstallFilter`](../../reference/api/index.md#eth_uninstallfilter) to remove the filter. + +## Filters for private contracts + +Filters for private contracts are created, accessed, and uninstalled using: + +- [`priv_getFilterChanges`](../../reference/api/index.md#priv_getfilterchanges) +- [`priv_getFilterLogs`](../../reference/api/index.md#priv_getfilterlogs) +- [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) +- [`priv_newFilter`](../../reference/api/index.md#priv_newfilter) +- [`priv_uninstallFilter`](../../reference/api/index.md#priv_uninstallfilter). + +The [privacy group ID](../../../private-networks/concepts/privacy/index.md) must be specified as parameter 0 for the `priv` methods. + +```json +{ + "jsonrpc": "2.0", + "method": "priv_newFilter", + "params": [ + "4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=", + { + "fromBlock": "earliest", + "toBlock": "latest", + "addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"], + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410" + ] + } + ], + "id": 1 +} +``` + +## Get logs using a filter options object + +To get all logs for a filter options object, use [`eth_getLogs`](../../reference/api/index.md#eth_getlogs) or [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) for a private contract. + +The following request for `eth_getLogs` returns all the logs where the example contract has been deployed to `0x42699a7612a82f1d9c36148af9c77354759b210b` and executed with `valueIndexed` set to 5. + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + ["0x0000000000000000000000000000000000000000000000000000000000000005"] + ] + } + ], + "id": 1 +} +``` + +The above example returns the same result as calling [eth_newFilter](#creating-a-filter) followed by [eth_getFilterLogs](#getting-all-logs-for-a-filter). diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/authenticate.md b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/authenticate.md new file mode 100644 index 00000000000..747debefe94 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/authenticate.md @@ -0,0 +1,272 @@ +--- +title: Authenticate over JSON-RPC requests +sidebar_position: 4 +description: Hyperledger Besu authentication and authorization for JSON-RPC +tags: + - private networks +--- + +# Authenticate and authorize JSON-RPC + +Authentication identifies a user, and authorization verifies user access to requested JSON-RPC methods. Hyperledger Besu verifies users using [JSON Web Tokens (JWT)](https://jwt.io/introduction/). JWT is also used in [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md) to verify tenant data access. + +Besu supports two mutually exclusive authentication methods: + +- [Username and password](#username-and-password-authentication) +- [JWT public key](#jwt-public-key-authentication). + +Besu creates JWT internally with [username and password authentication](#username-and-password-authentication), and externally with [JWT public key authentication](#jwt-public-key-authentication). + +:::info + +Using JSON-RPC authentication and authorization with [MetaMask](https://metamask.io/) is not supported. + +::: + +:::caution + +To prevent interception of authentication credentials and authenticated tokens, make authenticated requests over HTTPS. We recommend running production deployments behind a network layer that provides SSL termination. Besu does not provide a HTTPS connection natively. + +::: + +## Username and password authentication + +Enable authentication from the command line. Supply the credentials file and send a request to the `/login` endpoint using the username and password. The `/login` endpoint creates a JWT for making permitted JSON-RPC requests. + +Using [public key authentication](#jwt-public-key-authentication) disables the `/login` endpoint. + +### 1. Create the credentials file + +The `toml` credentials file defines user details and the JSON-RPC methods they can access. + +:::info Sample `auth.toml` credentials file + +```toml +[Users.username1] +password = "$2a$10$l3GA7K8g6rJ/Yv.YFSygCuI9byngpEzxgWS9qEg5emYDZomQW7fGC" +permissions=["net:*","eth:blockNumber"] +privacyPublicKey="U7ANiOOd5L9Z/dMxRFjdbhA1Qragw6fLuYgmgCvLoX4=" + +[Users.username2] +password = "$2b$10$6sHt1J0MVUGIoNKvJiK33uaZzUwNmMmJlaVLkIwinkPiS1UBnAnF2" +permissions=["net:version","admin:*"] +privacyPublicKey="quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=" +``` + +::: + +Each user requiring JSON-RPC access the configuration file lists the: + +- Username. `Users.` is mandatory and followed by the username. That is, replace `` in `[Users.]` with the username. +- Hash of the user password. Use the [`password hash`](../../reference/cli/subcommands.md#password) subcommand to generate the hash. +- [JSON-RPC permissions](#json-rpc-permissions). +- Optional. The tenant's Tessera public key using `privacyPublicKey`. Only used for [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). + + + +# Command + +```bash +besu password hash --password=MyPassword +``` + +# Hash output + +```text +$2a$10$L3Xb5G/AJOsEK5SuOn9uzOhpCCfuVWTajc5hwWerY6N5xBM/xlrMK +``` + + + +### 2. Enable authentication + +To require authentication for the JSON-RPC API, use the [`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) options. + +To specify the [credentials file](#1-create-the-credentials-file), use the [`--rpc-http-authentication-credentials-file`](../../reference/cli/options.md#rpc-http-authentication-credentials-file) and [`--rpc-ws-authentication-credentials-file`](../../reference/cli/options.md#rpc-ws-authentication-credentials-file) options. + +### 3. Generate an authentication token + +To generate an authentication token, make a request to the `/login` endpoint with your username and password. Specify the HTTP port or the WS port to generate a token to authenticate over HTTP or WS respectively. HTTP and WS requires a different token. + + + +# Generate a token for HTTP + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login +``` + +# Example for HTTP + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8545/login +``` + +# Generate a token for WS + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login +``` + +# Example for WS + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8546/login +``` + +# JSON result + +```json +{ + "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MDYwNCwiZXhwIjoxNTUwNDYwOTA0fQ.l2Ycqzl_AyvReXBeUSayOlOMS_E8-DCuz3q0Db0DKD7mqyl6q-giWoEtfdWzUEvZbRRi2_ecKO3N6JkXq7zMKQAJbVAEzobfbaaXWcQEpHOjtnK4_Yz-UPyKiXtu7HGdcdl5Tfx3dKoksbqkBl3U3vFWxzmFnuu3dAISfVJYUNA" +} +``` + + + +Authentication tokens expire five minutes after generation. If you require access after the token expires, you need to generate a new token. + +## JWT public key authentication + +Enable authentication from the command line and supply the external JWT provider's public key. + +:::danger + +JWT public authentication disables the Besu `/login` endpoint, meaning [username and password authentication](#username-and-password-authentication) will not work. + +::: + +### 1. Generate a private and public key pair + +The private and accompanying public key files must be in `.pem` format. + +The [key algorithm](https://datatracker.ietf.org/doc/html/rfc7518#section-3.1) can be: + +- RSA with private key length of at least 2048 bits using algorithm `RS256`, `RS384` or `RS512`. +- ECDSA private key, using `ES256` (`secp256r1` or `secp256k1`), `ES384` or `ES512`. + +Besu default is `RS256`. + + + +# `RS256` RSA Keys + +1. Generate the private key: + + ```bash + openssl genrsa -out privateRSAKey.pem 2048 + ``` + +2. Generate the public key: + + ```bash + openssl rsa -pubout -in privateRSAKey.pem -pubout -out publicRSAKey.pem + ``` + +# `ES256` `secp256r1` ECDSA Keys + +1. Generate the private key: + + ```bash + openssl ecparam -name secp256r1 -genkey -out privateECDSAKey.pem + ``` + +2. Generate the public key: + + ```bash + openssl ec -in privateECDSAKey.pem -pubout -out publicECDSAKey.pem + ``` + + + +:::danger Private key security + +The private key must be kept secret. Never share private keys publicly or on a Web site, even if advertised as secure. + +Always keep your private keys safe -- ideally using [hardware](https://connect2id.com/products/nimbus-jose-jwt/examples/pkcs11) or [vault](https://www.vaultproject.io/docs/secrets/identity/identity-token) -- and define a strong security policy and [best practices](https://auth0.com/docs/best-practices/token-best-practices). + +Compromised keys can provide attackers access to you nodes RPC-API. + +::: + +### 2. Create the JWT + +Create the JWT using a trusted authentication provider[^1] or [library](https://jwt.io/libraries) in your own code. + +[^1]: for example [Auth0](https://auth0.com/) or [Keycloak](https://www.keycloak.org/) + +See [Java code sample to generate JWT using Vertx](https://github.com/NicolasMassart/java-jwt-sample-generation/) for an example implementation. + +:::caution + +The JWT must use one of the `RS256`, `RS384`, `RS512`, `ES256`, `ES384`, or `ES512` algorithms. + +::: + +Each payload for the JWT must contain: + +- [JSON-RPC permissions](#json-rpc-permissions) +- [`exp` (Expiration Time) claim](https://tools.ietf.org/html/rfc7519#section-4.1.4) +- Optionally, the tenant's Tessera public key using `privacyPublicKey`. Only used for [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). + + + +# Example JSON Payload + +```json +{ + "permissions": ["*:*"], + "privacyPublicKey": "2UKH3VJThkOoKskrLFpwoxCnnRARyobV1bEdgseFHTs=", + "exp": 1600899999002 +} +``` + +# Example JWT result + +![Example result](jwt.png) + + + +### 3. Enable authentication + +To require authentication for the JSON-RPC API, use the [`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) options. + +To specify the JWT provider's public key file to use with the externally created JWT, use the [`--rpc-http-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) or [`--rpc-ws-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-ws-authentication-jwt-public-key-file) options. + +## JSON-RPC permissions + +Each user has a list of permissions strings defining the methods they can access. To give access to: + +- All API methods, specify `["*:*"]`. +- All API methods in an API group, specify `[":*"]`. For example, `["eth:*"]`. +- Specific API methods, specify `[":"]`. For example, `["admin:peers"]`. + +With authentication enabled, to explicitly specify a user cannot access any methods, include the user with an empty permissions list (`[]`). Users with an empty permissions list and users not included in the credentials file cannot access any JSON-RPC methods. + +## Use an authentication token to make requests + +Specify the authentication token as a `Bearer` token in the JSON-RPC request header. + +### Postman + +In the **Authorization** tab in the **TYPE** drop-down list, select **Bearer Token** and specify the token (generated either [externally](#2-create-the-jwt) or by the [`login` request](#3-generate-an-authentication-token)). + +### cURL + +Specify the `Bearer` in the header. + + + +# cURL Request with authentication placeholders + +```bash +curl -X POST -H 'Authorization: Bearer ' -d '{"jsonrpc":"2.0","method":"","params":[],"id":1}' +``` + +# cURL Request with authentication + +```bash +curl -X POST -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MTQxNiwiZXhwIjoxNTUwNDYxNzE2fQ.WQ1mqpqzRLHaoL8gOSEZPvnRs_qf6j__7A3Sg8vf9RKvWdNTww_vRJF1gjcVy-FFh96AchVnQyXVx0aNUz9O0txt8VN3jqABVWbGMfSk2T_CFdSw5aDjuriCsves9BQpP70Vhj-tseaudg-XU5hCokX0tChbAqd9fB2138zYm5M' -d '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":1}' http://localhost:8545 +``` + + diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/graphql.md b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/graphql.md new file mode 100644 index 00000000000..ba369af65a3 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/graphql.md @@ -0,0 +1,102 @@ +--- +title: Use GraphQL over HTTP +sidebar_position: 3 +description: How to access the Hyperledger Besu API using GraphQL +tags: + - private networks +--- + +# Use GraphQL over HTTP + +GraphQL can reduce the overhead needed for common queries. For example, instead of querying each receipt in a block, GraphQL can get the same result with a single query for the entire block. + +The [Besu GraphQL schema] describes the GraphQL implementation for Ethereum. Enable the GraphQL service using [command line options](index.md#enable-api-access). + +:::note + +GraphQL is not supported over WebSocket. + +::: + +Access the GraphQL endpoint at `http://:/graphql`. Configure `` and `` using [`graphql-http-host`](../../reference/cli/options.md#graphql-http-host) and [`graphql-http-port`](../../reference/cli/options.md#graphql-http-port). The default endpoint is `http://127.0.0.1:8547/graphql`. + +## GraphQL requests with cURL + +[Hyperledger Besu JSON-RPC API methods](../../reference/api/index.md) with an equivalent [GraphQL](graphql.md) query include a GraphQL request and result in the method example. + +The following [`syncing`](../../reference/api/index.md#eth_syncing) request returns data about the synchronization status. + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock}}"}' http://localhost:8547/graphql +``` + +## GraphQL requests with GraphiQL app + +The third-party tool, [GraphiQL](https://github.com/skevy/graphiql-app), provides a tabbed interface for editing and testing GraphQL queries and mutations. GraphiQL also provides access to the [Besu GraphQL schema] from within the app. + +![GraphiQL](../../../assets/images/GraphiQL.png) + +## Pending + +`transactionCount` and `transactions` supports the Pending query. + +:::info + +Besu does not execute pending transactions so results from `account`, `call`, and `estimateGas` for Pending do not reflect pending transactions. + +::: + + + +# Pending transaction count + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactionCount}}"}' http://localhost:8547/graphql +``` + +# Result + +```json +{ + "data": { + "pending": { + "transactionCount": 2 + } + } +} +``` + + + + + +# Pending transactions + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactions{hash}}}"}' http://localhost:8547/graphql +``` + +# Result + +```json +{ + "data": { + "pending": { + "transactions": [ + { + "hash": "0xbb3ab8e2113a4afdde9753782cb0680408c0d5b982572dda117a4c72fafbf3fa" + }, + { + "hash": "0xf6bd6b1bccf765024bd482a71c6855428e2903895982090ab5dbb0feda717af6" + } + ] + } + } +} +``` + + + + + +[Besu GraphQL schema]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/ethereum/api/src/main/resources/schema.graphqls diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/index.md b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/index.md new file mode 100644 index 00000000000..1c2c1a3c72c --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/index.md @@ -0,0 +1,97 @@ +--- +description: Hyperledger Besu API +tags: + - private networks +--- + +# Access the Hyperledger Besu API + +Access the [Hyperledger Besu API](../../reference/api/index.md) using: + +- [JSON-RPC over HTTP, WebSocket, or IPC](json-rpc.md) +- [RPC Pub/Sub over WebSockets](rpc-pubsub.md) +- [GraphQL over HTTP](graphql.md). + +The following sections provide information about JSON-RPC, RPC Pub/Sub, and GraphQL. + +## Enable API access + +To enable API access, use the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled), [`--ws-http-enabled`](../../reference/cli/options.md#rpc-ws-enabled), [`--graphql-http-enabled`](../../reference/cli/options.md#graphql-http-enabled), and `--Xrpc-ipc-enabled` options. + +:::caution + +`--Xrpc-ipc-enabled` is an early access option. + +::: + +## Service hosts + +To specify the host the API service listens on, use the [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host), [`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host), and [`--graphql-http-host`](../../reference/cli/options.md#graphql-http-host) options. The default host is `127.0.0.1`. + +To allow remote connections, set the host to `0.0.0.0`. + +:::caution + +Setting the host to `0.0.0.0` exposes the API service connection on your node to any remote connection. In a production environment, ensure you use a firewall to avoid exposing your node to the internet. + +::: + +## Service ports + +To specify the port the API service listens on, use the [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), and [`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port) options. + +The default ports are: + +- 8545 for JSON-RPC over HTTP. +- 8546 for JSON-RPC over WebSocket. +- 8547 for GraphQL over HTTP. + +Ports must be [exposed appropriately](../connect/configure-ports.md). + +## Socket path + +To specify the socket path for the IPC socket, use the `--Xrpc-ipc-path` option. The default path is `besu.ipc` in the Besu data directory. + +:::caution + +`--Xrpc-ipc-path` is an early access option. + +::: + +## Host allowlist + +To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL requests. Besu accepts requests only when hostnames specified using the [`--host-allowlist`](../../reference/cli/options.md#host-allowlist) option matches the request host headers. By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the API, we recommend using the [Besu authentication mechanism](authenticate.md) with username and password authentication or JWT public key authentication. + +::: + +If your application publishes RPC ports, specify the hostnames when starting Besu. + +```bash +besu --host-allowlist=example.com +``` + +Specify `*` for `--host-allowlist` to effectively disable host protection. + +:::caution + +Specifying `*` for `--host-allowlist` is not recommended for production code. + +::: + +## Not supported by Besu + +### Account management + +Account management relies on private key management in the client, which is not supported by Besu. + +To send signed transactions, use [`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction). `eth_sendTransaction` is not implemented. + +For [account management](../send-transactions.md#use-wallets-for-key-management), use third-party wallets. + +### Protocols + +Besu does not support the Whisper and Swarm protocols. diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/json-rpc.md b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/json-rpc.md new file mode 100644 index 00000000000..f7890d9bd12 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/json-rpc.md @@ -0,0 +1,291 @@ +--- +title: Use JSON-RPC over HTTP, WS, and IPC +sidebar_position: 1 +description: How to access the Hyperledger Besu API using JSON-RPC +tags: + - private networks +--- + +import Postman from '../../../global/postman.md'; + +# Use JSON-RPC over HTTP, WebSocket, and IPC + +JSON-RPC APIs allow you to interact with your node. JSON-RPC endpoints are not enabled by default. + +:::caution + +You should secure access to your node's JSON-RPC endpoints. Users with access to your node via JSON-RPC can make calls directly to your node, causing your node to consume resources. + +::: + +To enable JSON-RPC over HTTP or WebSocket, use the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) and [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) options. + +To enable JSON-RPC over an [IPC socket](index.md#socket-path), use the `--Xrpc-ipc-enabled` option. + +:::caution + +`--Xrpc-ipc-enabled` is an early access option. + +::: + + + +## Geth console + +The geth console is a REPL (Read, Evaluate, & Print Loop) JavaScript console. Use JSON-RPC APIs supported by geth and Hyperledger Besu directly in the console. + +To use the geth console with Besu: + +1. Start Besu with the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) or `--Xrpc-ipc-enabled` option. +1. Specify which APIs to enable using the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or `--Xrpc-ipc-api` option. +1. Start the geth console specifying the JSON-RPC endpoint: + + + +# HTTP endpoint + +```bash +geth attach http://localhost:8545 +``` + +# IPC endpoint + +```bash +geth attach /path/to/besu.ipc +``` + +Use the geth console to call [JSON-RPC API methods](../../reference/api/index.md) that geth and Besu share. + +```bash +eth.syncing +``` + +## JSON-RPC authentication + +Besu disables [Authentication](authenticate.md) by default. + +## HTTP and WebSocket requests + +### HTTP + +To make RPC requests over HTTP, you can use [`curl`](https://curl.haxx.se/download.html). + + + +# Syntax + +```bash +curl -X POST --data '{"jsonrpc":"2.0","id":,"method":"","params":[]}' +``` + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}' http://127.0.0.1:8555 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": "1", + "result": "0x60e" +} +``` + + + +You can use `curl` to make multiple RPC requests (batch requests) over HTTP at the same time. Send the requests as an array, and receive an array of responses. The default number of allowed requests in a RPC batch request is `1024`. Use the [`--rpc-http-max-batch-size`](../../reference/cli/options.md#rpc-http-max-batch-size) command line option to update the default value. + + + +# curl HTTP request + +```bash +curl -X POST --data '[{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}]' http://127.0.0.1:8555 +``` + +# JSON result + +```json +[ + { + "jsonrpc": "2.0", + "id": "1", + "result": "0x60e" + }, + { + "jsonrpc": "2.0", + "id": "2", + "result": [] + } +] +``` + + + +### WebSocket + +To make RPC requests over WebSocket, you can use [`wscat`](https://github.com/websockets/wscat), a Node.js based command-line tool. + +First connect to the WebSocket server using `wscat` (you only need to connect once per session): + +```bash +wscat -c ws:// +``` + +After you establish a connection, the terminal displays a '>' prompt. Send individual requests as a JSON data package at each prompt. + + + +# Syntax + +```bash +{"jsonrpc":"2.0","id":,"method":"","params":[]} +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": "1", + "result": "0x23" +} +``` + + + +You can use `wscat` to make multiple RPC requests over WebSocket at the same time. Send the requests as an array, and receive an array of responses. + + + +# wscat WS request + +```bash +[{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}] +``` + +# JSON result + +```json +[ + { + "jsonrpc": "2.0", + "id": "1", + "result": "0x23" + }, + { + "jsonrpc": "2.0", + "id": "2", + "result": [] + } +] +``` + + + +:::note + +`wscat` does not support headers. [Authentication](authenticate.md) requires you to pass an authentication token in the request header. To use authentication with WebSocket, you need an app that supports headers. + +::: + +## Readiness and liveness endpoints + +Besu provides readiness and liveness endpoints to confirm the Besu node status. Both return a `200 OK` status when ready or live and a `503 Service Unavailable` status if not ready or live. + +### Readiness + +By default, the readiness check requires a connected peer and the node to be within two blocks of the best known block. If you have [disabled P2P communication](../../reference/cli/options.md#p2p-enabled), you do not need peers. A live node with P2P disabled is always ready. + +Use the query parameters `minPeers` and `maxBlocksBehind` to adjust the number of peers required and the number of blocks tolerance. + + + +# Readiness endpoint + +```bash +http:///readiness +``` + +# curl request example + +```bash +curl -v 'http://localhost:8545/readiness' +``` + +# Query parameters example + +```bash +curl -v 'http://localhost:8545/readiness?minPeers=0&maxBlocksBehind=10' +``` + + + +### Liveness + +The liveness check requires the JSON-RPC server to be up. You can use the endpoint to verify that the node can respond to RPC calls. The status in the response will always be `UP`. + + + +# Liveness endpoint + +```bash +http:///liveness +``` + +# curl request example + +```bash +curl -v 'http://localhost:8545/liveness' +``` + + + +## API methods enabled by default + +Besu enables the `ETH`, `NET`, and `WEB3` API methods by default. + +To enable the `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `IBFT`, `MINER`, `PERM`, `PLUGINS`, `PRIV`, `TRACE`, and `TXPOOL` API methods, use the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api), [`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api), or `--Xrpc-ipc-api` options. + +:::caution + +`--Xrpc-ipc-api` is an early access option. + +::: + +## Block parameter + +When you make requests that might have different results depending on the block accessed, the block parameter specifies the block. Methods such as [`eth_getTransactionByBlockNumberAndIndex`](../../reference/api/index.md#eth_gettransactionbyblocknumberandindex) have a block parameter. + +The block parameter can have one of the following values: + +- `blockNumber` : _quantity_ - The block number, specified in hexadecimal or decimal. 0 represents the genesis block. +- `blockHash` : _string_ or _object_ - 32-byte block hash or JSON object specifying the block hash. If using a JSON object, you can specify `requireCanonical` to indicate whether the block must be a canonical block. See [this example](https://github.com/hyperledger/besu/blob/a2dedb0b2c7980cdc35db8eb4c094f2eb0dc7deb/ethereum/api/src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/eth/eth_getBalance_blockHashObjectCanonical.json). + + :::note + + Only the following methods support the `blockHash` parameter: + + - [`eth_call`](../../reference/api/index.md#eth_call) + - [`eth_getBalance`](../../reference/api/index.md#eth_getbalance) + - [`eth_getCode`](../../reference/api/index.md#eth_getcode) + - [`eth_getProof`](../../reference/api/index.md#eth_getproof) + - [`eth_getStorageAt`](../../reference/api/index.md#eth_getstorageat) + - [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) + + ::: + +- `earliest` : _tag_ - The earliest (genesis) block. +- `latest` : _tag_ - The last block mined. +- `pending` : _tag_ - The last block mined plus pending transactions. Use only with [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). +- `finalized` : _tag_ - The most recent crypto-economically secure block. It cannot be reorganized outside manual intervention driven by community coordination. +- `safe` : _tag_ - The most recent block that is safe from reorganization under honest majority and certain synchronicity assumptions. diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/jwt.png b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/jwt.png new file mode 100644 index 00000000000..ee676469c77 Binary files /dev/null and b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/jwt.png differ diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/rpc-pubsub.md b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/rpc-pubsub.md new file mode 100644 index 00000000000..4bc56782d7b --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-besu-api/rpc-pubsub.md @@ -0,0 +1,532 @@ +--- +title: Use RPC Pub/Sub over WS +sidebar_position: 2 +description: Using RPC Pub/Sub with Hyperledger Besu WebSockets +tags: + - private networks +--- + +# Use RPC Pub/Sub over WebSockets + +## Introduction + +Subscribe to events by using either RPC Pub/Sub over WebSockets or [filters over HTTP](access-logs.md). + +Use RPC Pub/Sub over WebSockets to wait for events instead of polling for them. For example, dapps subscribe to logs and receive notifications when a specific event occurs. + +Methods specific to RPC Pub/Sub are: + +- `eth_subscribe` and `eth_unsubscribe` - create or cancel a subscription for specific events. +- `priv_subscribe` and `priv_unsubscribe` - create or cancel a subscription for [private logs](../../../private-networks/concepts/privacy/index.md). + +:::info + +Unlike other [Hyperledger Besu API methods](../../reference/api/index.md), you cannot call the RPC Pub/Sub methods over HTTP. Use the [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) option to enable the WebSockets JSON-RPC service. + +::: + +### Use RPC Pub/Sub + +[WebSockets](json-rpc.md#http-and-websocket-requests) supports the RPC Pub/Sub API. + +To create subscriptions, use `eth_subscribe` or `priv_subscribe`. Once subscribed, the API publishes notifications using `eth_subscription` or `priv_subscription`. + +Subscriptions couple with connections. If a connection is closed, all subscriptions created over the connection are removed. + +### Subscription ID + +`eth_subscribe` and `priv_subscribe` return a subscription ID for each subscription created. Notifications include the subscription ID. + +For example, to create a synchronizing subscription: + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["syncing"] } +``` + +The result includes the subscription ID of `"0x1"`: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +The notifications also include the subscription ID of `"0x1"`: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": { + "startingBlock": "0x0", + "currentBlock": "0x50", + "highestBlock": "0x343c19" + } + } +} +``` + +### Notifications when synchronizing + +Subscribing to some events (for example, logs) can cause a flood of notifications while the node is synchronizing. + +## Subscribe + +Use `eth_subscribe` to create subscriptions for the following event types: + +- [Use RPC Pub/Sub over WebSockets](#use-rpc-pubsub-over-websockets) + - [Introduction](#introduction) + - [Use RPC Pub/Sub](#use-rpc-pubsub) + - [Subscription ID](#subscription-id) + - [Notifications when synchronizing](#notifications-when-synchronizing) + - [Subscribe](#subscribe) + - [New headers](#new-headers) + - [Logs](#logs) +- [All logs](#all-logs) +- [Specific address, topic, fromBlock and toBlock](#specific-address-topic-fromblock-and-toblock) +- [Result](#result) +- [Notification](#notification) +- [All logs for privacy group](#all-logs-for-privacy-group) +- [Specific address and topic](#specific-address-and-topic) +- [Result](#result-1) +- [Notification](#notification-1) + - [Pending transactions](#pending-transactions) + - [Dropped transactions](#dropped-transactions) + - [Synchronizing](#synchronizing) + - [Unsubscribe](#unsubscribe) + +Use `priv_subscribe` to [create subscriptions for logs on private contracts](#logs). + +:::tip + +Only logs subscriptions are relevant for private transactions because private transactions are anchored to the public chain rather than having their own private blockchain. + +::: + +### New headers + +To notify you about each block added to the blockchain, use the `newHeads` parameter with `eth_subscribe`. + +If a chain reorganization occurs, the subscription publishes notifications for blocks in the new chain. This means the subscription can publish notifications for multiple blocks at the same height on the blockchain. + +The new headers notification returns [block objects](../../reference/api/objects.md#block-object). The second parameter is optional. If specified, the notifications include whole [transaction objects](../../reference/api/objects.md#transaction-object), Otherwise, the notifications include transaction hashes. + +To subscribe to new header notifications: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newHeads", { "includeTransactions": true }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 2, "result": "0x1" } +``` + +Example notification without the `{"includeTransactions": true}` parameter included: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": { + "number": "0x40c22", + "hash": "0x16af2ee1672203c7ac13ff280822008be0f38e1e5bdc675760015ae3192c0e3a", + "parentHash": "0x1fcf5dadfaf2ab4d985eb05d40eaa23605b0db25d736610c4b87173bfe438f91", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00008000000000080000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000040000000000000000000000000000000000000000001000000000000000000000040000000000000000000000000000000000000400000000010000000000000000100000000000020000000000000000000000000000000000010000000000000000000000000000000000000000000", + "transactionsRoot": "0x5b2e3c1a49352f1ca9fb5dfe74b7ffbbb6d70e23a12693444e26058d8a8e6296", + "stateRoot": "0xbe8d3bc58bd982421a3ea8b66753404502df0f464ae78a17661d157c406dd38b", + "receiptsRoot": "0x81b175ec1f4d44fbbd6ba08f1bd3950663b307b7cb35751c067b535cc0b58f12", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x7c16e", + "extraData": "0xd783010600846765746887676f312e372e33856c696e757800000000000000002160f780bb1f61eda045c67cdb1297ba37d8349df8035533cb0cf82a7e45f23f3d72bbec125a9f499b3eb110b7d1918d466cb2ede90b38296cfe2aaf452c513f00", + "size": "0x3a1", + "gasLimit": "0x47e7c4", + "gasUsed": "0x11ac3a", + "timestamp": "0x592afc24", + "uncles": [], + "transactions": [ + "0x419c69d21b14e2e8f911def22bb6d0156c876c0e1c61067de836713043364d6c", + "0x70a5b2cb2cee6e0b199232a1757fc2a9d6053a4691a7afef8508fd88aeeec703", + "0x4b3035f1d32339fe1a4f88147dc197a0fe5bbd63d3b9dec2dad96a3b46e4fddd" + ] + } + } +} +``` + +Example notification with the `{"includeTransactions": true}` parameter included: + +```json +{ +"jsonrpc": "2.0", +"method": "eth_subscription", +"params":{ + "subscription":"0x1", + "result": { + .... + "transactions":[ + { + "blockHash":"0xa30ee4d7c271ae5150aec494131c5f1f34089c7aa8fb58bd8bb916a55275bb90", + "blockNumber":"0x63", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0x5208", + "gasPrice":"0x3b9aca00", + "hash":"0x11f66c3e96a92e3c14c1c33ad77381221bf8b58a887b4fed6aee456fc6f39b24", + "input":"0x", + "nonce":"0x1", + "to":"0x627306090abab3a6e1400e9345bc60c78a8bef57", + "transactionIndex":"0x0", + "value":"0x56bc75e2d63100000", + "v":"0xfe8", + "r":"0x4b57d179c74885ef5f9326fd000665ea7fae44095c1e2016a2817fc671beb8cc", + "s":"0x7ec060b115746dda392777df07ae1feacc0b83b3646f0a3de9a5fc3615af9bb8", + } + ], + }, + } +} +``` + +### Logs + +To notify you about [logs](../../concepts/events-and-logs.md) included in new blocks, use the `logs` parameter with `eth_subscribe` or `priv_subscribe`. Specify a filter object to receive notifications only for logs matching your filter. + +Logs subscriptions have an filter object parameter with the following fields: + +- `address` - (optional) Either an address or an array of addresses. Returns only logs created from these addresses. +- `topics` - (optional) Returns only logs that match the [specified topics](../../concepts/events-and-logs.md#topic-filters). +- `fromBlock` - (optional) The earliest block from which to return logs. +- `toBlock` - (optional) The last block from which to return logs. + +For private contracts, the privacy group ID must be specified. Only members of a privacy group receive logs for a private contract subscription. If you create a subscription for a privacy group you are not a member of, you will not receive any notifications. + +If a chain reorganization occurs, the subscription publishes notifications for logs from the old chain with the `removed` property in the [log object](../../reference/api/objects.md#log-object) set to `true`. This means the subscription can publish notifications for multiple logs for the same transaction. + +The logs subscription returns [log objects](../../reference/api/objects.md#log-object). + + + +# All logs + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["logs", {}] } +``` + +# Specific address, topic, fromBlock and toBlock + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": [ + "logs", + { + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "topics": [ + "0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902" + ], + "fromBlock": "0x0", + "toBlock": "latest" + } + ] +} +``` + +# Result + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x2" } +``` + +# Notification + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x2", + "result": { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x2174", + "blockHash": "0x7bc83837534aa13df55ff7db77784b1d1ba666d4c4bdd223cae9fe09c7c37eba", + "transactionHash": "0x942179373e413824c6bc7045e92295aff91b679215446549b4aeb084da46495b", + "transactionIndex": "0x0", + "address": "0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517", + "data": "0x", + "topics": [ + "0x199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca072787", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + } +} +``` + + + + + +# All logs for privacy group + +```json +{ + "id": 1, + "method": "priv_subscribe", + "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "logs", {}] +} +``` + +# Specific address and topic + +```json +{ + "id": 1, + "method": "priv_subscribe", + "params": [ + "4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", + "logs", + { + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "topics": [ + "0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902" + ] + } + ] +} +``` + +# Result + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +# Notification + +```json +{ + "jsonrpc": "2.0", + "method": "priv_subscription", + "params": { + "subscription": "0x1", + "privacyGroupId": "4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", + "result": { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x285", + "blockHash": "0x98490766b16de2a4d044c04d92599d71e626bc96e42f0c74274ef4e03fafd579", + "transactionHash": "0x40034ef14e3a22946693dd2a11efddf3a8850ddcad46b408198df6c176c53ffb", + "transactionIndex": "0x0", + "address": "0x61f96a7ed09877197d4fff0c29b8e523913651a9", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + } +} +``` + + + +### Pending transactions + +To notify you about pending transactions added to the transaction pool for the node, use the `newPendingTransactions` parameter with `eth_subscribe`. + +The pending transactions subscription returns the transaction hashes or transaction details of the pending transactions. If the `includeTransactions` parameter is not included, the default is transaction hashes only. + +If a chain reorganization occurs, Besu resubmits transactions for inclusion in the new canonical chain. This means the subscription can publish notifications for the same pending transaction more than once. + +To subscribe to pending transaction notifications and receive transaction hashes only: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newPendingTransactions", { "includeTransactions": false }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": "0x5705bc8bf875ff03e98adb98489428835892dc6ba6a6b139fee1becbc26db0b8" + } +} +``` + +To subscribe to pending transaction notifications and receive transaction details: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newPendingTransactions", { "includeTransactions": true }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x2" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x2", + "result": { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0x2540be400", + "hash": "0x7a4185f40ee93cb27eb132f301d0a5414c1f871051f166fc8804c376aab3ffec", + "input": "0x", + "nonce": "0x13", + "to": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f", + "value": "0x8ac7230489e80000", + "v": "0xfe7", + "r": "0xdd9013c67469d2fe79afdc61777c55bdced33c90fa6f9b83d8f9b7e445085123", + "s": "0x45823a1ab22ae9c83876ea435dc5ecc4fe3a83c1bfbc340a5f57df2f5a474fa5" + } + } +} +``` + +### Dropped transactions + +To notify you about transactions dropped from the transaction pool for the node, use the `droppedPendingTransactions` parameter with `eth_subscribe`. + +The dropped transactions subscription returns the transaction hashes of the dropped transactions. + +Dropped transactions can be re-added to the transaction pool from a variety of sources. For example, receiving a previously dropped transaction from a peer. As a result, it's possible to receive multiple dropped transaction notifications for the same transaction. + +To subscribe to dropped transaction notifications: + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["droppedPendingTransactions"] } +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": "0xf57d6a90a7fb30880cfbdf6b432b487d0e94a3b55b34dc4b45e3b0b237ecab4c" + } +} +``` + +### Synchronizing + +To notify you about synchronization progress, use the `syncing` parameter with `eth_subscribe`. + +When behind the chain head, the synchronizing subscription returns an object indicating the synchronization progress. When fully synchronized, returns `false`. + +To subscribe to synchronizing notifications: + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["syncing"] } +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x4" } +``` + +Example notification while synchronizing: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4", + "result": { + "startingBlock": "0x0", + "currentBlock": "0x3e80", + "highestBlock": "0x67b93c" + } + } +} +``` + +Example notification when synchronized with chain head: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4", + "result": false + } +} +``` + +## Unsubscribe + +To cancel a subscription, use the [subscription ID](#subscription-id) with `eth_unsubscribe` or `priv_unsubscribe`. Only the connection that created a subscription can unsubscribe from it. + +When cancelling a subscription for private logs, the privacy group ID must be specified. + +`eth_unsubscribe` and `priv_unsubscribe` return `true` if subscription successfully unsubscribed; otherwise, returns an error. + +To unsubscribe from a subscription with subscription ID of `0x1`: + +```json +{ "id": 1, "method": "eth_unsubscribe", "params": ["0x1"] } +``` + +To unsubscribe from private logs subscription: + +```json +{ + "id": 1, + "method": "priv_unsubscribe", + "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "0x2"] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": true } +``` diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-engine-api.md b/versioned_docs/version-23.4.0/public-networks/how-to/use-engine-api.md new file mode 100644 index 00000000000..87e9cf04abf --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-engine-api.md @@ -0,0 +1,218 @@ +--- +title: Use the Engine API +sidebar_position: 2 +description: How to enable and use the Engine API +--- + +# Use the Engine API + +[Consensus and execution clients](../concepts/the-merge.md#execution-and-consensus-clients) communicate with each other using the [Engine API](../reference/engine-api/index.md). These API methods are a separate subsection of the [JSON-RPC API](../how-to/use-besu-api/index.md). + +## Configure the Engine API + +To configure the Engine API: + +- [Enable the Engine API](#enable-the-engine-api) (it's disabled by default). +- [Enable the JSON-RPC API](use-besu-api/index.md#enable-api-access). Ensure the [`ETH` method is enabled](use-besu-api/json-rpc.md#api-methods-enabled-by-default) (it's enabled by default). +- Specify the [service ports](#service-ports). +- Specify the [host allowlist](#host-allowlist). + +```bash title="Example Engine API configuration" +besu --engine-rpc-enabled --rpc-http-enabled --engine-rpc-port=8551 --engine-host-allowlist=localhost,127.0.0.1 --engine-jwt-secret=jwt.hex +``` + +### Enable the Engine API + +Enable the Engine API with the [`--engine-rpc-enabled`](../reference/cli/options.md#engine-rpc-enabled) CLI option. + +:::note + +The `--engine-rpc-enabled` CLI option enables the Engine API even if no consensus client configuration exists. + +::: + +### Service ports + +To specify the port the Engine API service listens on for HTTP and WebSocket, use the [`--engine-rpc-port`](../reference/cli/options.md#engine-rpc-port) option. The default is `8551`. + +### Host allowlist + +To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL requests. Besu accepts requests only when hostnames specified using the [`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) option matches the request host headers. By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the Engine API, we recommend using [authentication](#authentication). + +::: + +If your application publishes RPC ports, specify the hostnames when starting Besu. + +Specify `*` for `--engine-host-allowlist` to effectively disable host protection. + +:::caution + +We don't recommend specifying `*` for `--engine-host-allowlist` in production. + +::: + +## Authentication + +By default, [authentication](../how-to/use-besu-api/authenticate.md) for the Engine API is enabled. To disable, set the [`--engine-jwt-disabled`](../reference/cli/options.md#engine-jwt-disabled) option to `true`. + +:::caution + +Don't disable JWT authentication in production environments. + +Disable only for testing purposes. + +::: + +Set the [JWT secret](use-besu-api/authenticate.md#jwt-public-key-authentication) by using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. + +## Send a payload using the Engine API + +### 1. Prepare a payload + +Prepare to send a payload using [`engine_forkchoiceUpdatedV1`](../reference/engine-api/index.md#engine_forkchoiceupdatedv1). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "safeBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "finalizedBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000"},{"timestamp": "0x5","prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000","suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"}],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } +} +``` + + + +### 2. Get the payload + +Get the payload using [`engine_getPayloadV1`](../reference/engine-api/index.md#engine_getpayloadv1) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x1"],"id":1}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +} +``` + + + +### 3. Execute the payload + +Execute the payload using [`engine_newPayloadV1`](../reference/engine-api/index.md#engine_newpayloadv1) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } +} +``` + + + +### 4. Update the fork choice + +Update the fork choice using [`engine_forkchoiceUpdatedV1`](../reference/engine-api/index.md#engine_forkchoiceupdatedv1) again. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": null + } +} +``` + + diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-pow/_category_.json b/versioned_docs/version-23.4.0/public-networks/how-to/use-pow/_category_.json new file mode 100644 index 00000000000..1381dd9fc66 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-pow/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use proof of work", + "position": 10 +} diff --git a/versioned_docs/version-23.4.0/public-networks/how-to/use-pow/mining.md b/versioned_docs/version-23.4.0/public-networks/how-to/use-pow/mining.md new file mode 100644 index 00000000000..1bbd789c5ae --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/how-to/use-pow/mining.md @@ -0,0 +1,110 @@ +--- +title: Configure mining +sidebar_position: 1 +description: Using Hyperledger Besu for PoW CPU mining +tags: + - private networks +--- + +# Configure mining + +Hyperledger Besu supports CPU and GPU mining, which are configured using command line options. + +GPU mining tests used [Ethminer](https://github.com/ethereum-mining/ethminer) with the `stratum+tcp` and `getwork` schemes. + +Ethminer has been used with Hyperledger Besu to mine blocks on the [Ropsten testnet](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine), [ETC Mainnet (uncle block only)](https://etc.tokenview.com/en/uncleblock/10555173) and Mordor ETC testnet. + +:::note + +- Some mining software supports the `getwork` scheme as the `http` scheme. + +- The Ropsten testnet is now deprecated. It transitioned to proof of stake consensus before deprecation. + +::: + +## Configure CPU mining + +To enable CPU mining, start Hyperledger Besu with the following options: + +```bash +besu --rpc-http-api=ETH,MINER --miner-enabled --miner-coinbase= +``` + +Where `` is the account you pay mining rewards to. For example, `fe3b557e8fb62b89f4916b721be55ceb828dbd73`. + +Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and [`miner_stop`](../../reference/api/index.md#miner_stop) APIs. + +## Configure GPU mining + +Besu supports GPU mining, tested using [Ethminer](https://github.com/ethereum-mining/ethminer) with the `stratum+tcp` scheme. + +To enable GPU mining, start Hyperledger Besu with the following options: + +```bash +besu --rpc-http-api=ETH,MINER --miner-enabled --miner-stratum-enabled --miner-coinbase= +``` + +Where `` is the account you pay mining rewards to. For example, `fe3b557e8fb62b89f4916b721be55ceb828dbd73`. + +Optional command line options are: + +- [`--miner-stratum-host`](../../reference/cli/options.md#miner-stratum-host) to specify the host of the mining service. +- [`--miner-stratum-port`](../../reference/cli/options.md#miner-stratum-port) to specify the port of the mining service. + +:::note + +Besu also supports the `getwork` scheme. Use the [`--miner-stratum-enabled`](../../reference/cli/options.md#miner-stratum-enabled) option and [enable the `ETH` RPCs](../../reference/cli/options.md#rpc-http-api). + +The `getwork` scheme is supported as the `http` scheme in certain mining software. + +::: + +Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and [`miner_stop`](../../reference/api/index.md#miner_stop) APIs. + +## Mining APIs + +The JSON-RPC API methods for mining are: + +- [`miner_start`](../../reference/api/index.md#miner_start) to start mining. +- [`miner_stop`](../../reference/api/index.md#miner_stop) to stop mining. +- [`eth_mining`](../../reference/api/index.md#eth_mining) to determine whether the client is actively mining new blocks. +- [`eth_getMinerDataByBlockHash`](../../reference/api/index.md#eth_getminerdatabyblockhash) and [`eth_getMinerDataByBlockNumber`](../../reference/api/index.md#eth_getminerdatabyblocknumber) to get the miner data for a specified block. +- [`eth_hashrate`](../../reference/api/index.md#eth_hashrate) to get the number of hashes per second with which the node is mining. Not supported for GPU mining. +- [`eth_getWork`](../../reference/api/index.md#eth_getwork) to get the hash of the current block, the seed hash, and the target boundary condition. Only used when using the `getwork` scheme. +- [`eth_submitWork`](../../reference/api/index.md#eth_submitwork) to submit the PoW solution. Only used when using the `getwork` scheme. + +## Besu mined blocks + +Besu has successfully mined blocks on the Ropsten testnet, ETC Mainnet (uncle block only) and Mordor ETC testnet. Blocks mined by the Hyperledger Besu team contain the version number used in the block's `extraData` field. The following accounts have been used to mine on public networks with Hyperledger Besu: + +- **Ropsten**: [`0x2f14582947E292a2eCd20C430B46f2d27CFE213c`](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine) +- **ETC**: [`0x3125309aa670f5e60493b50884a7e7abf9ebb701`](https://etc.tokenview.com/en/address/0x3125309aa670f5e60493b50884a7e7abf9ebb701) +- **Mordor**: `0x2f14582947E292a2eCd20C430B46f2d27CFE213c` + +## Troubleshoot + +### Check block creation + +On mining nodes, log messages indicate block creation. + +```bash +2019-05-08 20:28:27.026+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=660, Round=0}, hash=0x759afaba4e923d89175d850ceca4b8ef81f7d9c727b0b0b8e714b624a4b8e8cc +2019-05-08 20:28:29.020+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=661, Round=0}, hash=0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14 +``` + +On non-mining nodes, log messages indicate importing blocks. + +```bash +2019-05-08 20:28:29.026+10:00 | EthScheduler-Workers-1 | INFO | BlockPropagationManager | Imported #661 / 0 tx / 0 om / 0 (0.0%) gas / (0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14) in 0.000s. +2019-05-08 20:28:31.031+10:00 | EthScheduler-Workers-0 | INFO | BlockPropagationManager | Imported #662 / 0 tx / 0 om / 0 (0.0%) gas / (0x0ead4e20123d3f1433d8dec894fcce386da4049819b24b309963ce7a8a0fcf03) in 0.000s. +``` + +To confirm the block number is increasing, use the [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) JSON-RPC API method. + +If there's no block creation in [Clique](../../../private-networks/how-to/configure/consensus/clique.md#extra-data) or [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md#extra-data) networks, ensure the validator addresses in the genesis file match running nodes. + +### No mined transactions + +If you add a transaction to the [transaction pool](../../concepts/transactions/pool.md) and the transaction hash returns, but the transaction is never mined, check the [`--min-gas-price`](../../reference/cli/options.md#min-gas-price) option on mining nodes. If the `gasPrice` on a [transaction](../send-transactions.md) is lower than the `min-gas-price` for the mining node, the transaction will never mine. + +In [free gas networks](../../../private-networks/how-to/configure/free-gas.md), you must set [`--min-gas-price`](../../reference/cli/options.md#min-gas-price) to zero. diff --git a/versioned_docs/version-23.4.0/public-networks/index.md b/versioned_docs/version-23.4.0/public-networks/index.md new file mode 100644 index 00000000000..95556604cb1 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/index.md @@ -0,0 +1,22 @@ +--- +# page icon, insider only, see https://squidfunk.github.io/mkdocs-material/reference/#setting-the-page-icon +title: Public networks +sidebar_position: 1 +description: Public networks overview +--- + +# Hyperledger Besu for public networks + +Besu serves as an [execution client](concepts/the-merge.md#execution-clients) on public proof-of-stake Ethereum networks such as Ethereum Mainnet, Goerli, and Sepolia. + +You can also run Besu using proof of work on [Ethereum Classic (ETC)](how-to/use-pow/mining.md). + +Get started by [installing Besu](get-started/install/index.md). + +## Architecture + +The following diagram outlines the high-level architecture of Besu for public networks. + +![Public architecture](../assets/images/public-architecture.jpeg) + +If you have any questions about Besu for public networks, contact us on the [Besu channel on Hyperledger Discord](https://discord.gg/hyperledger). diff --git a/versioned_docs/version-23.4.0/public-networks/reference/_category_.json b/versioned_docs/version-23.4.0/public-networks/reference/_category_.json new file mode 100644 index 00000000000..3ce2f2b757b --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Reference", + "position": 6 +} diff --git a/versioned_docs/version-23.4.0/public-networks/reference/api/index.md b/versioned_docs/version-23.4.0/public-networks/reference/api/index.md new file mode 100644 index 00000000000..2f84cb0bb3d --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/api/index.md @@ -0,0 +1,6658 @@ +--- +title: Besu API +sidebar_position: 2 +description: Hyperledger Besu JSON-RPC API methods reference +tags: + - private networks +--- + +import Postman from '../../../global/postman.md' + +# Besu API methods + +:::caution + +- This reference contains API methods that apply to both public and private networks. For private-network-specific API methods, see the [private network API reference](../../../private-networks/reference/api/index.md). +- All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If using the [--rpc-http-host](../cli/options.md#rpc-http-host) or [--rpc-http-port](../cli/options.md#rpc-http-port) options, update the endpoint. +- Most example requests are made against private networks. Depending on network configuration and activity, your example results might be different. + +::: + + + +## `ADMIN` methods + +The `ADMIN` API methods provide administrative functionality to manage your node. + +:::note + +The `ADMIN` API methods are not enabled by default for JSON-RPC. To enable the `ADMIN` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `admin_addPeer` + +Adds a [static node](../../how-to/connect/static-nodes.md). + +:::caution + +If connections are timing out, ensure the node ID in the [enode URL](../../concepts/node-keys.md#enode-url) is correct. + +::: + +#### Parameters + +`enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of peer to add + +#### Returns + +`result`: _boolean_ - `true` if peer added or `false` if peer already a [static node](../../how-to/connect/static-nodes.md) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `admin_changeLogLevel` + +Changes the log level without restarting Besu. You can change the log level for all logs, or you can change the log level for specific packages or classes. + +You can specify only one log level per RPC call. + +#### Parameters + +- `level`: _string_ - [log level](../cli/options.md#logging) + +- `log_filter`: _array_ - (optional) packages or classes for which to change the log level + +#### Returns + +`result`: _string_ - `Success` if the log level has changed, otherwise `error` + +The following example changes the debug level for specified classes to `DEBUG`. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +The following example changes the debug level of all logs to `WARN`. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_changeLogLevel","params":["WARN"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_changeLogLevel", + "params": ["WARN"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `admin_generateLogBloomCache` + +Generates cached log bloom indexes for blocks. APIs such as [`eth_getLogs`](#eth_getlogs) and [`eth_getFilterLogs`](#eth_getfilterlogs) use the cache for improved performance. + +:::tip + +Manually executing `admin_generateLogBloomCache` is not required unless the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option is set to false. + +::: + +:::note + +Each index file contains 100000 blocks. The last fragment of blocks less than 100000 are not indexed. + +::: + +#### Parameters + +- `startBlock`: _string_ - block to start generating indexes + +- `endBlock`: _string_ - block to stop generating indexes + +#### Returns + +`result`: _object_ - log bloom index details: + +- `startBlock`: _string_ - starting block for the last requested cache generation + +- `endBlock`: _string_ - ending block for the last requested cache generation + +- `currentBlock`: _string_ - most recent block added to the cache + +- `indexing`: _boolean_ - indicates if indexing is in progress + +- _boolean_ - indicates acceptance of the request from this call to generate the cache + + + +# curl HTTP request + +```bash +curl -X POST --data '{jsonrpc":"2.0","method":"admin_generateLogBloomCache", "params":["0x0", "0x10000"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_generateLogBloomCache", + "params": ["0x0", "0x10000"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "startBlock": "0x0", + "endBlock": "0x10000", + "currentBlock": "0x0", + "indexing": true, + "requestAccepted": true + } +} +``` + + + +### `admin_logsRemoveCache` + +Removes cache files for the specified range of blocks. + +#### Parameters + +- `fromBlock`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlock`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +You can skip a parameter by using an empty string, `""`. If you specify: + +- No parameters, the call removes cache files for all blocks. + +- Only `fromBlock`, the call removes cache files for the specified block. + +- Only `toBlock`, the call removes cache files from the genesis block to the specified block. + +#### Returns + +`result`: _object_ - `Cache Removed` status or `error`. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRemoveCache","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_logsRemoveCache", + "params": ["1", "100"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "Status": "Cache Removed" + } +} +``` + + + +### `admin_logsRepairCache` + +Repairs cached logs by fixing all segments starting with the specified block number. + +#### Parameters + +`startBlock`: _string_ - decimal index of the starting block to fix; defaults to the head block + +#### Returns + +`result`: _object_ - status of the repair request; `Started` or `Already running` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRepairCache","params":["1200"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_logsRepairCache", + "params": ["1200"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "Status": "Started" + } +} +``` + + + +### `admin_nodeInfo` + +Returns networking information about the node. The information includes general information about the node and specific information from each running Ethereum sub-protocol (for example, `eth`). + +#### Parameters + +None + +#### Returns + +`result`: _object_ - node object with the following fields: + +- `enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of the node + +- `listenAddr`: _string_ - host and port for the node + +- `name`: _string_ - client name + +- `id`: _string_ - [node public key](../../concepts/node-keys.md#node-public-key) + +- `ports`: _object_ - peer discovery and listening [ports](../../how-to/connect/manage-peers.md#port-configuration) + +- `protocols`: _object_ - list of objects containing information for each Ethereum sub-protocol + +:::note + +If the node is running locally, the host of the `enode` and `listenAddr` display as `[::]` in the result. When advertising externally, the external address displayed for the `enode` and `listenAddr` is defined by [`--nat-method`](../../how-to/connect/specify-nat.md). + +::: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enode": "enode://87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3@[::]:30303", + "listenAddr": "[::]:30303", + "name": "besu/v1.0.1-dev-0d2294a5/osx-x86_64/oracle-java-1.8", + "id": "87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3", + "ports": { + "discovery": 30303, + "listener": 30303 + }, + "protocols": { + "eth": { + "config": { + "chainId": 2018, + "homesteadBlock": 0, + "daoForkBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "constantinopleFixBlock": 0, + "ethash": { + "fixeddifficulty": 100 + } + }, + "difficulty": 78536, + "genesis": "0x43ee12d45470e57c86a0dfe008a5b847af9e372d05e8ba8f01434526eb2bea0f", + "head": "0xc6677651f16d07ae59cab3a5e1f0b814ed2ec27c00a93297b2aa2e29707844d9", + "network": 2018 + } + } + } +} +``` + + + +### `admin_peers` + +Returns networking information about connected remote nodes. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _objects_ - list of objects returned for each remote node, with the following fields. + +- `version`: _string_ - P2P protocol version + +- `name`: _string_ - client name + +- `caps`: _array_ of _strings_ - list of Ethereum sub-protocol capabilities + +- `network`: _object_ - local and remote addresses established at time of bonding with the peer (the remote address might not match the hex value for `port`; it depends on which node initiated the connection.) + +- `port`: _string_ - port on the remote node on which P2P discovery is listening + +- `id`: _string_ - node public key (excluding the `0x` prefix, the node public key is the ID in the [enode URL](../../concepts/node-keys.md#enode-url) `enode://@:`.) + +- `protocols`: _object_ - [current state of peer](../../how-to/connect/manage-peers.md#monitor-peer-connections) including `difficulty` and `head` (`head` is the hash of the highest known block for the peer.) + +- `enode`: _string_ - enode URL of the remote node + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "version": "0x5", + "name": "besu/v20.10.4-dev-0905d1b2/osx-x86_64/adoptopenjdk-java-11", + "caps": ["eth/62", "eth/63", "eth/64", "eth/65", "IBF/1"], + "network": { + "localAddress": "192.168.1.229:50115", + "remoteAddress": "168.61.153.255:40303" + }, + "port": "0x765f", + "id": "0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc", + "protocols": { + "eth": { + "difficulty": "0x1ac", + "head": "0x964090ae9277aef43f47f1b8c28411f162243d523118605f0b1231dbfdf3611a", + "version": 65 + } + }, + "enode": "enode://e143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc@127.0.0.1:30303" + } + ] +} +``` + + + +### `admin_removePeer` + +Removes a [static node](../../how-to/connect/static-nodes.md). + +#### Parameters + +`enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of peer to remove + +#### Returns + +`result`: _boolean_ - `true` if peer removed or `false` if peer not a [static node](../../how-to/connect/static-nodes.md) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `DEBUG` methods + +The `DEBUG` API methods allow you to inspect and debug the network. The `DEBUG` API is a more verbose alternative to the [`TRACE` API](#trace-methods), and its main purpose is compatibility with tools such as [Remix](https://remix.ethereum.org/). Where these APIs overlap, we recommend using the [`TRACE` API](#trace-methods) for production use over the `DEBUG` API. Specifically, we recommend `trace_block` over `debug_traceBlock`, and `trace_transaction` over `debug_traceTransaction`. + +:::note + +The `DEBUG` API methods are not enabled by default for JSON-RPC. To enable the `DEBUG` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `debug_accountAt` + +Returns account information at the specified index of the specified block. + +#### Parameters + +- `blockHashOrNumber`: _string_ - block hash or number at which to retrieve account information + +- `txIndex`: _number_ - transaction index at which to retrieve account information + +- `address`: _string_ - contract or account address for which to retrieve information + +#### Returns + +`result`: _object_ - account details object with the following fields: + +- `code`: _data_ - code for the account. Displays `0x0` if the address is an externally owned account. + +- `nonce`: _quantity_ - number of transactions made by the account before this one + +- `balance`: _quantity_ - balance of the account in Wei + +- `codehash`: _data_ - code hash for the account + +This example uses an externally owned account address for the `address` parameter. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", 0, "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountAt", + "params": [ + "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", + 0, + "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "code": "0x0", + "nonce": "0x5", + "balance": "0xad78ebc5ac6200000", + "codehash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + } +} +``` + + + +This example uses a contract address for the `address` parameter. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", 0, "0x0e0d2c8f7794e82164f11798276a188147fbd415"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountAt", + "params": [ + "0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", + 0, + "0x0e0d2c8f7794e82164f11798276a188147fbd415" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "code": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b27b880414610030575b600080fd5b61004a60048036038101906100459190610108565b61004c565b005b60606000806000604051935036600085376000803686885af490503d9150816000853e806000811461007d57610093565b60008311156100925761012085019350836040525b5b5060008114156100ec578473ffffffffffffffffffffffffffffffffffffffff167f410d96db3f80b0f89b36888c4d8a94004268f8d42309ac39b7bcba706293e099856040516100e3919061016e565b60405180910390a25b5050505050565b60008135905061010281610227565b92915050565b60006020828403121561011e5761011d610211565b5b600061012c848285016100f3565b91505092915050565b600061014082610190565b61014a818561019b565b935061015a8185602086016101de565b61016381610216565b840191505092915050565b600060208201905081810360008301526101888184610135565b905092915050565b600081519050919050565b600082825260208201905092915050565b60006101b7826101be565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156101fc5780820151818401526020810190506101e1565b8381111561020b576000848401525b50505050565b600080fd5b6000601f19601f8301169050919050565b610230816101ac565b811461023b57600080fd5b5056fea2646970667358221220fdfb5c371055342507b8fb9ca7b0c234f79819bd5cb05c0d467fb605de979eb564736f6c63430008060033", + "nonce": "0x1", + "balance": "0x0", + "codehash": "0xf5f334d41776ed2828fc910d488a05c57fe7c2352aab2d16e30539d7726e1562" + } +} +``` + + + +### `debug_accountRange` + +[Retesteth](https://github.com/ethereum/retesteth/wiki/Retesteth-Overview) uses `debug_accountRange` to implement debugging. + +Returns the accounts for a specified block. + +#### Parameters + +- `blockHashOrNumber`: _string_ - block hash or number at which to retrieve account information + +- `txIndex`: _number_ - transaction index at which to retrieve account information + +- `address`: _string_ - address hash from which to start + +- `limit`: _integer_ - maximum number of account entries to return + +#### Returns + +`result`: _object_ - account details object with the following fields: + +- `addressMap`: _map_ of _strings_ to _strings_ - map of address hashes and account addresses + +- `nextKey`: _string_ - hash of the next address if any addresses remain in the state, otherwise zero + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountRange","params":["12345", 0, "0", 5],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountRange", + "params": ["12345", 0, "0", 5], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "addressMap": { + "0x005e5...86960": "0x0000000000000000000000000000000000000000", + "0x021fe...6ffe3": "0x0000000000000000000000000000000000000000", + "0x028e6...ab776": "0x0000000000000000000000000000000000000000", + "0x02cb5...bc4d8": "0x0000000000000000000000000000000000000000", + "0x03089...23fd5": "0x0000000000000000000000000000000000000000" + }, + "nextKey": "0x04242954a5cb9748d3f66bcd4583fd3830287aa585bebd9dd06fa6625976be49" + } +} +``` + + + +### `debug_batchSendRawTransaction` + +Sends a list of [signed transactions](../../how-to/send-transactions.md). This is used to quickly load a network with a lot of transactions. This does the same thing as calling [`eth_sendRawTransaction`](#eth_sendrawtransaction) multiple times. + +#### Parameters + +`data`: _string_ - signed transaction data array + +#### Returns + +`result`: _array_ of _objects_ - object returned for each transaction, with the following fields: + +- `index`: _string_ - index of the transaction in the request parameters array + +- `success`: _boolean_ - indicates whether or not the transaction has been added to the transaction pool + +- `errorMessage`: _string_ - (optional) error message + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "index": 0, + "success": true + }, + { + "index": 1, + "success": false, + "errorMessage": "Invalid raw transaction hex" + }, + { + "index": 2, + "success": true + }, + { + "index": 3, + "success": false, + "errorMessage": "TRANSACTION_REPLACEMENT_UNDERPRICED" + } + ] +} +``` + + + +### `debug_getBadBlocks` + +Returns a list of invalid blocks. This is used to detect and analyze consensus flaws. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _objects_ - list of [block objects](objects.md#block-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "block": { + "number": "0xd", + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x02c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41", + "stateRoot": "0x861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5", + "receiptsRoot": "0xccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x1", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a488", + "timestamp": "0x5f5b6824", + "uncles": [], + "transactions": [ + { + "blockHash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "blockNumber": "0xd", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a49e", + "gasPrice": "0x3e8", + "hash": "0xdd8cf045113754c306ba9ac8ac8786235e33bc5c087678084ef260a2a583f127", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0xa7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7", + "s": "0x130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fca" + } + ] + }, + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "rlp": "0xf9039df9025ca0544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5a002c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41a0ccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d86ffffffffffff8301a488845f5b6824b86100000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a49e8080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da0a7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7a0130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fcac0" + }, + { + "block": { + "number": "0x8", + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x98ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x8ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486", + "stateRoot": "0x140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3bac", + "receiptsRoot": "0x2b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x2", + "totalDifficulty": "0x2", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a4c9", + "timestamp": "0x5f5b6b80", + "uncles": [], + "transactions": [ + { + "blockHash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "blockNumber": "0x8", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a4c9", + "gasPrice": "0x3e8", + "hash": "0x675e336a4281b29c619dfd4ccfbd2f930f3728b20caf9e0067284aa3224e6758", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0x2e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4", + "s": "0x50e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0" + } + ] + }, + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "rlp": "0xf9039df9025ca098ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3baca08ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486a02b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020886ffffffffffff8301a4c9845f5b6b80b86100000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a4c98080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da002e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4a050e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0c0" + } + ] +} +``` + + + +### `debug_getRawBlock` + +Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) of the specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _object_ - RLP-encoded [block object](objects.md#block-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xf96096f90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9bf95c56f8ac82d51f8502540be4008303c9e294a68d4c1e3de1b721ad1356bbf827d6bc8cef304f80b844b1bb4d351300dbc7e12342566318001b83aefc9f20080000f3ef25472407fe9c9c69a1470000000242692bb4cd506c409651ab80eb3acfa54551d3dbc9af4493605d79871ba01e474fb147b16b9538d7a59a57738e406158d9cc306a9062b1b7a9f544c35abfa061aabb714c760f2243a16a024811679d402c8822e8b25dfd0038d84298fb5205b87502f87283aa36a754849502f900849502f9108302222794102554afa6b5dbccc86176faef2b2d854201756e8084e2bc7b43c001a04f2398f24bc950db1f5439de3cf6431ea277236595ae8dc5815c0cc671c9f97ca029898786a59c56f086fc0f7a16859f366cf46084add999fe137cbf43693712e8b87c02f87983aa36a7830293748459682f00850165a0bc008255f094fafb56bb5b37c3b0b0ee9d7c31f018aac91dfb778806f05b59d3b2000080c080a0b069dd8967533a773e592c26b1b36df0793d0b9f6eceba34da246f602c2fae58a002009dab32ab63a25b705d9a00e311f7cd5d85e73f9b2c03ffd0e5135c0bb2c6b89502f89283aa36a7018459682f008459682f0983011fec945b9fedd37f0b92e7e282b19cebcf06f57b77c60480a46a62784200000000000000000000000019a1fcc6fcc5832cd2db7704d75efbc800f5a742c001a0c65eb0e48090a8f8830de47f430b9ad11071a62a5db9555619a990d7e9b81738a05a6e826610a5b2ee529a22942ebcd3abd2a8a10228098c8158380e8fcceb962fb9028002f9027c83aa36a7178459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e17852000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f16827000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a004f8666c8e5d0f3c7110994f624d24aa47a1327814289698c3e2777284a5cfdca04ff05f1b8c5beb58972d40e5a7b894d5e28ad2f15a3429c7d2bee6b6a9633730b9019f02f9019b83aa36a70b8459682f008459682f098303644f944284890d4acd0bcb017ece481b96fd4cb457cac88715c0f4db6e0ea0b90124ee1490b20000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d40000000000000000000000001e8c104d068f22d351859cdbfe41a697a98e6ea20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000222e00000000000000000000000000000000000000000000000000015c0f4db6e0ea00000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d400000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000c080a0e5270f6291acc162885656bedf64fbcb904c41951221dc0cbbbdca03bb33ce43a01f08c7ed3c231403b55f37a157d80e121b653baa810add8c02aea722631450dcb87c02f87983aa36a7830293758459682f00850165a0bc008255f0948d247f4fbbe81429d3d164a5c9ae0063210edbdc8806f05b59d3b2000080c080a0bb83dd6181c9a7ae3069af3bdf1820b5e556eaf99e385b8d7b3571321fb2966ba02ac193773704524adcd02824796df83407a42cdd81e786b591eba43c4ffc6c40b9028002f9027c83aa36a7048459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e178520000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac6790000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c00000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac679000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c001a0fc882968005f717a74a2c2fb345f691091cab084f4bd3934358741807bd5a66ea03f81c68d05d06bf851a6ef5ea6874557a221cbadde24f3fa51f777699b5d2804b8d802f8d583aa36a7822c0b8459682f008459682f098303534f943367dfa11e3148a07c2da773e1f65b155b0abe5680b864ad58bdd100000000000000000000000053844f9577c2334e541aec7df7174ece5df1fcf0000000000000000000000000e9e12c660e77a732940bab3c2cf385c843b834b800000000000000000000000000000000000000000006015d637c177581800000c001a0a292e7723d3c950aa8a557bd91dece34ec527d9efe2cc413d582dcd9fc6bf6eba03386ce6f58e862f329946bf32897f7df5d1c8f818fecfafc1223052fb251d97eb8b602f8b383aa36a7138459682f008459682f09832dc6c094ba175fdab00e7fcf603f43be8f68db7f4de9f3a980b844095ea7b300000000000000000000000084a0cc1ab353da6b7817947f7b116b8ea982c3d20000000000000000000000000000000000000000000000068f365aea1e440000c001a0968ed0274829918071d9cef28e1adbf1fd15ec76e5a4f809971e887b4c9f34b6a001ce26485bc7e3ea71fb99866bd43002b264b2ed80e10850203c2f07b78856bdb87c02f87983aa36a7830293768459682f00850165a0bc008255f0946d3b93db4e4078cf6541a68532d00705d9a4da618806f05b59d3b2000080c080a083c831630788e7ee57c87128d18582e29aa51f1f233e91d916c06d0750578156a0549b5a00477f3fb4d8fbf95ba3a636c3a14ff011c1bbf3a717e00d61735cbf34b87c02f87983aa36a7830293778459682f00850165a0bc008255f0940d3a7d69859a0dd6971d39703b15379e05ae2ec48806f05b59d3b2000080c001a0082660b5db2d3a8a58c0b863673ab27f7cfe4c049dcc52c76a00ab45b0358db5a05a7519a2d399cb534480383ac21262fbde2dd85241495d7832dee8bb02c49c87b87c02f87983aa36a7830293788459682f00850165a0bc008255f0941be13f64a2463fc7a76b4092c53328cc965a77fb8806f05b59d3b2000080c001a0e6ee9b85c3b729518524fdaeb25d47f89f6fc6c4d2c4df707187bef74d73f958a0756bbf4ab119805b77466957b5895c1d5bf422c5f65d8a06f7efd37dcb2c87afb87c02f87983aa36a7830293798459682f00850165a0bc008255f094a90b28fd6f8e46ac668fcb688414184a163e2cd28806f05b59d3b2000080c080a0d394dd43c58591e5dda8a7f3a2f4eae1bfd65655b9e9eec5facc6dcb39aa77baa002eeabf3fe9c0a56eae476d2f6452ea72e63a9c9b1180290b792883258f939f5b8f802f8f583aa36a7830283818459682f008459682f1082962494d0f723c6b2226df56fe41e63b9eaa66eb540bcb880b884abac047b000000000000000000000000000000000000000000000000000000000103e9f0f3471dc445d8f209ef546e0d20eaccc12ed0a5b4100007f57d9bc8638dacaf6480000000000000000000000000000000000000000000000000000000001d209b1ea11d77d1ab457eb3e2954cb2b98e77b5b07e2a4f48507af0adc61329ddc210c001a0efa10ab60f3bd1e7c4a8d52a275a568fbe2f5edc9e1eaf386299577ff9ddbd6ba06e62cf2f66b58f655ddd3eae47ce40408445b086f6ea858edb7bd847ee206207f86f82e6e582014482f618949ebf6b12e7e33b8672788e7b2b3330356f6f2c41880de0b6b3a7640000808401546d72a008d6be7aa21be0a43e08e960620f4c40c44010a743ead9919ef9423863c08b12a06a63a7caae4504ee5528e50387ca09974f7124035328a62d1085da2fee6618f9f86f82e1c382014482f618949c68eb31c4d00b94c3e3d4c2887946f8b076b24c880de0b6b3a7640000808401546d72a0c22d48d72c70ccf0a44d0950daf16741838f9333ee0bc5e05ff02b058da1e010a06a20c9f74cbc14c0d5bf3b3c38d3c33a5ace9194cddc2c533afb16459eaa7647f86f82e4cb82014482f61894d531e7aa3c0bee832aaff22642c7a3128d48a81a880de0b6b3a7640000808401546d72a01dbaeffc8e11964c06a722bae73e35bb5de55b8f959592868f2ff5fc13b69bd3a002acadc04665570a2032cdb616de15bdca79127f21302d62db5baf96ae4734e6f86e830176e381d882520894ad346e81c5b26fe563ab1ba2aa4ff811655882ca872386f26fc10000808401546d72a0b6de11598824e338100d5ebe70c0b0f4d6893fbb36f11ad55cf74b2f43afc5dda05101e65e7e84ea9edba6e5bf1a1e07028ae3fa5213240e812e57cf6b29080726b9235302f9234f83aa36a7830137d564748315f52194ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5000000000000000000000000000077770000000000000000000000000000000191c15235c348207e935e72b9151056a9661d73631d1e2c3f89ffddf8e74efe8a42ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000030ef2c000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000ec15abee257256da1a964434000f59ddd45b1ce67d5df44f1c82fd5bfe95c3b31dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000777700000000000000000000000000000001d4b5b35d93f51c8143f6a4cc3d7b320d37ce03989cd88c28601f4ea94cd6554249cff83e4dd8e99a8ef9004b2ac7518996f4784af1f9e52debb6223a697e9652530feda219f333e01f8cd0b31ee83b9c250ee51fde9718ef5fa305cbcd01901200200100002020000400000280000006004000c0020000000000000000000100000000029000000000000000090000000000008000200040000012004020000800000000240002400008000800000020000000001040000000000040824000000000000002040000400000002000080000000000000804000000001001000c84000208000000000180020000014000000000210100510008000082c0000000001200002000000024000008400000000220001800400000008010000052000200000200028000000000800000040200000110000010000010000001020000210004100002000000000900280000010008001000000018004000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc0000000000000000000000000000000000000000000000000000000000034bfbc00000000000000000000000000000000000000000000000000000000002ddb24000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000002e042ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b2a7122720155935f15da0807d0054f1a4c3db2a92ec4124bf590ce7a16594f3f1812f260acb049d01ad534a937840a80c0f56fd9a54ca5a8628ed896d14a5f8b2570f5813e35c990656f6300a1a1849429135ada6337646248f6ea03a7f70ac426c1d805216d154ea5a8e5ff953bc04b71b049b4b5bd549b6b0cfa7f8b21dba72a3805c7093d8589f2d4c55b6211441041e8bd7916daed5093fcebd377c31e810a6499e6e26840e3afadc9b339c6abc86b7f89fc3559f4242d373a71389db20219195f6e13069701f6d539dcf63a049726cdd8cadc412d1c43cf3fc0095ae5e2157dc668bdb924d7d7afc2b4632ab8a0e4ef71941a0a6a65645f6cd8570302f90b98bbdd01be238dc07780ee9b93e22ab87f26170d7fc5531347fb9fadcb65dc2ca20442a70be9e785292d533fa9496308a7b1588b50b45c17ea765de525259f036edd3984782399b46793acd5abb9f49e38b309c2363aead57264ac1a44e6432b81127a0bfdc29f01bd04e7db2b2545ed8426d2fe9b3e561793ec8fc875f2a71f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f11fcba848e01c60438611958101321898e95c8fdc936d31389bdba8073b382e5b1e2cd25993ad31586d7525f165fb25a1cf8c22623f983c025d21f0e52ecfec5f0232a753addaad88340ca39f00e9722f35dd25fbe8fdd8846bfc0288215d0638004009396bfcd5e6eb0c587797ae8297decbca48b02407219b910ce163552ed230438292cec430007886beabe7cdf5c6f9c3740a3dd6c52ba88e6d652ce43f90044193c4a42335291795c2cc160dc68b6225edb425a88d27cae159f77df3a2241fbe809c8f1122d245bf439df0761bec97358b96d6653bc83702b559bde5a2d12f771a2a11bc9dc32580bc3ccf9dfacd0a5379587ac5160b45d333a85cde46810ad2875b406f00438aee245ecc63815528a185e9e2a029147db7fcffcb8875e5259f15c3e467de02e035891b131bc715e54e7e27a7acc437bb9f6f84fa4456aa016b3578a73ed8a4706efb935be8b6abe0697e46d878d9c74e274f2816d2fd88146b316731719e125d227e002af95aa13f468a9bae4ff41a4a6036ee7fc321b3249aed4dfb6e75089ec0656ee4e87e1fffefbd74edf55a20d752a85caccf583c0d9e2ef1040b4d36a8e992ad50ce1c4bd2b300b344ca881725c164886a5f8f18035f6e75e67a3eaa2064fc24ff79897edb624e1a67f34deb414d5efaf4c55d482da108aa2ab7504fd5d7f78d91da5c20230380ec013b910b01a26b8bed8a05a004d52db30b7fb01f16347692e9f19f303f48ea8cbbed2d3a3eb277ddf4e9ed8026af5ce92a618c8942caf28b3249044347e14e5c3c2ed5ec0f9cccf1d11a5b290c00773e12c25feafbcceeb8ae6c25a88c9657c627187af6fe0bfea0b3cc36c908a76f90e965bc4135c8596534f444c91aaaaaa6277985e36248bd53ef0f74f103eeac98ba92c5350e4a0c586c851ad25df982e16b2d408de37c687efc6915a41197df379614aa657ab5100627c47896b51b000cb95505bac77e4e440ecd1fe50252fc98f15ee41cafbf717e144da35f424e141639de04ebe5d333e9df8c06821c689d1ef2abbfd12e8a1edc059a9279db7ff44bac1962b5f7297da5c989528229e98a91a3a2e351f371dfa34d4c3676725baa5fa4696f67f4239b5fe1e3fa351d66aa5a2df992426d94ba049bbb4eea0ab22e3b9a7409f2b6719ede64353f4112e4da3919adc16dcd99c545966256493d2699ae529e365c20515d95c013ba2627576fb75a030ffd25b85ed3fc40dbbedbca54427f8dc2255c16b742b3e2b82e1bb634ae73a402927e6dc424d1908942b9b0f2cc17909ed050defe85d24a1986291facbb4ecf9b7ff66c27f8e771d28ec6866e3d24bc97e7be388013df8ba8f407b9147ed9b3581784003a22eeada55656d2be271afce06ef3fca32ac9b77b4f2420d60e892c95418b2a1b7d3dae2738a073ef105e66c08488e8a91e8ebdb5a10e979611bd29245c13cc4c0f5b33eedc5263edd6c27666e0c3f02161114120230511406f9f82102fd8c37c36d4e383e445df4afc6e7dbaa570cfe05b3f6038ec1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5006f155ac97d6757728caceba5530eb745e72277723ad34268b34008a97a27c370e9bc006aeaca4ac36414f35aa41ff400f698623a447c949f7f004f3c3fdb09f2af3c96042e215f0d4bbb23fda72d4f01dd9a55dbdec930919715a23e2cd772a260e2b91324c244d88ce1b83c92dce1aa0e0c255b80ed9325dec0e677563984a1c559ddb4a544eadeb2a38e8ed7736174a30d2bee6e0b65f3766e0b7a4e4d8022dd9f82493a9b1fadd1907147ac29edeb8cf8c7c58fbfa9b82ed3d9f9f05bfc900e52e29a05ca8d445b5245b16928dd61800ebb63933d9c471c2fb38776459641e9debdc606abf6ccfdf8fb41da88ba0745d96fd4557a879fee82e33df32d18b18d7360529f89f3dea680a5cb0c6a7652ee38589e1997f3e64ce4db1d3c04cd628fc0fd6e7ef1944108d48eb742a28467fa4bca693dbc8f923945256da2a83222d172286c82b1949803c54409de4653f258d0cf4266c83d5675ca9b5b3a3fb322b9c493ed7bff0a6165babb19c94d9e2014b13b099f09894fbcf32959b9d4ce71ddf9d24dee8bc40d6be92ee6e1220d84d68ecf1a0424132315c0612802b477b0acabcf346b0ad5ea329ea72f4de7524530bc00ad36baeee835908655faecd350463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea0908c560e84b404afb45f69169d28348ca20bb4f5693db19304d154f60a91ec4e9255be05739f5dc7e0b420d4bde4b188a8520bf39202f81dd3e2f4adcc6f4b4be16880103e0ab232f509729c91ddf0006d6a099a769b38affb89d7489b3bf261106aec362c77acdbb0a71c3da369067eb0f2ee9866a0bbdc4ee41ae81a88d860f1784565b7b1cdd350e8e12241103ff9d57c86c368775530773bafc058cbcea6309bd6d9c144cf6657cac5084ac5fe63ef038a71b3d79e6b7a32cc70039e182052f5cd5e415128e9ab1f553f13c165ea122d089975c1daf617766e12d9f3abb2501571eefde182b767e4b63568d37a8c553671adcee2ee4c7c6d77493e4599cd70d002a718fe0d7c31b7df3893f8b9993c90d7d55eea1c38292f1eae3a7887cfd182977403d5c029a42809f2c6fb8d04aff1c60106ba36367ecca0699866e5ec922ebaeffc4e624d0cc2c748f9c446da0c293d8ba7a28125145ce0936a2dd47172c4502ccf050145fc0584ad8608ee8f6c34c3e718fa5ca616722c5b3549ddb5e2f6a96e82c3d706bf255afda0272c199da51f9a4a869ce8b164694f6ef7593ce08b4bb0afda822eed4a0a7863f532fc0a22de9de5d3456574021b711c42eb1c9190de35ea592568f8ba5528c0f5fadc38e10b14a89a1e49fba9a76ca2478dcca20f8a3c78bb3e1b9869b7375d0deb87819ce7209ad4d73d84a92d08d23649bb50ecb4a1763050b7860afb055461b3158647b453d7977bddde0fac9415327e7eb2ea373fc8abd6793f576e72a47c92d6f6e19fadfdf2c6912365b74929d9b483c19f5146ac5a8dd943caf50b2e0a95fb19066a63a71862a540b2e41731ea66697094e51d309589ce9d25a37c06c9a12839c4c08a050a3ff9e502514f20d573c610466ac5399e11b0153954428f25d16958ab48614d34f768991f84411c401e6900fb0dfaab4108db0ad42fc9ae0a255e60fa4d92747ddda47d07de9f847e7a2be289798c5d34924aae419abdc41d30fb095c6ccabe5c5d5be73ec6197371ea74e08f0583b21901bd748db5348282cabaf57d883f5c55311f1304d7fcd30a9f0b22f810b1a7f089860e4ca0f23ddce9a23d7167762734b10b995d5bd2cf3b31f8f24b18d0a2f7ce1101d3a32d18988f162e91ac94b0f521f24fa287b0d2b97c408079336b89af9e842cf31886c701018ba98d5b0eb0e6d41b67b499f4c466cb1412db0e5937f7ffa83426c9234c713096444d0fc65d1b45f166e54d2a54bc103de110669fbc34555a6d16714ca37651e976b06a7ee96d80af9ff50162016a998451e2ce5819f3346b1fcdf6fe9ff3ec8420d4860a9980ce28fd8c55660983a3fb02cbedb5c638a49e5cdf0b69b71d78e071f1200608e235e6ed0ee8fea5567be12018bcd026412db0538c28bcd4a9afe799d5c677298646943c4200a039d2fced71d985d188f84dfd3132b6a015c50b8a60d712a97c89e0cd7d3a1740244c1522b117dad1220463f5d4af1004c1a2ad6b5708d7d6b28f8ae1e1e7dd1b2d3798b8c2e27a3559c7202aa268099eb3bbdf7c42d0d20b47e5623dba8e6aa1392ff532113c32bd836f4160abb287aefe648aaff6bb0a23928f580347046b64babf354790704538c6ce83f117ac7e83e1e0f54054466cc82b2144cf135be31f24f1b224e2a956827c303b0d82964e284b968c5ebe97688e49ca793a4aba81a3d36eefd8c12e3ce9409be63c3a308636a7b296b804d8125b4f29068ef44d3f2a3c9eb13e61d6365bb96d6973e88a70757b1d9213511d357d252df58d1e848d534d9517165263e803855e8caf387579f1ff0e7e9c3c8e532a2025d8016b70a45c24a546f0b21acf38d16b27eae6466e22396097090291184a7719beb4a55beb89275c6893e01f2075d3b73e165c39335d34a5aa7b280386e30a6df9ba917e1dc6774e2edaa0c87e8f5fcf89306a6fdbcf8cf52cf25f5df473fe350325d510421546765acd00b34ef53e56b01445deea042282e7d6ce20c8f967204c26bda9f2596fa378dc611091ab6db9e1e8d4e9b5c1cc4c4d6ee2ad82b32d08f8cb5a9dd9b03f7aa754f2738ddf2dc0c3318974ff3810765917c251c74ce3d7132c26b5f2ede12a6f62f2e8ddecd5e0d02f99f2ed8ac15641c586d68e093fbe80cefd6a7dbdac6d43e261160807eb82fc2aea870a22b25148d256a083325a5b97bcf0187f748b6c0a1691867344efdd53809fb9edea57669c33780a4aa9e65149937817d3d845d9fccae1876575d5383d06adeacd0f3371209a30e1a9c98446174b0b98560652d0643f120bdabd5484435871b42ad0ce36aa8330c7edd26e64e89eb84e0c72a2c6e49fb24088ae2bdaf7ef07af9bfe381dd6a9ed430a553de1bad4dcefd5239b389090925a69e44e25800d9fccda11ff4e1e4d3049386397f1145c3595ab5115255bc1c1eabb379a37504eda27b1a103b88ae8f174e1d182e3dfbb0b8317d05d6e08c191661b04537421fd84057a9ff5a6eceb68c5bf1f0e356df6e93d936bb6bdccb42127cba43e7615d522242df13f08e5fa162a641430c1431a7d7181dec65202fb618a690c2bf3361d7dc689d5e4a97a550a9b17c8a5ada8f32db3f774e9ed047c02eb7d1ba7add29fa07ab90f290e77bd91ee9b5208b1fb19a37f29dd1a492fa32156a7d43146a336fe6144d19228f975c54ab304565269124e069e864873c0eef23f2e7b012e84ad0c71d76e1b23b8b9a0a66edcd59f4b203a9773ce26baee206254b49efb10cc48bad814b2e299bd478fd4bd8b1ae2c8bd99070b259a9e204e42fc5f65f9e25cb4e4a1a3b67872314fcaeede2abbbc6978660c3e685f6dccb53160d1f7517bbda54177495c23fcf45cdd66363a70a84f2699e239b5071c9e6cb19069f3e0be9f4390c8028ae9960851e34ea18ff88d36ee826c0a4db4e33e94f0ec6651a728a1a2b0c15b30a1783ad4b1d224d87264779a817d107d40c75b77c25addd7b7d6a8b73b2d551f125daed95786920c4130d2061178604f9604a0e2f1c6cdbf3066fd28bf276ee0aee379bc049bc8eba361f4052bd2a698da312c991015c0fbc43ea1d2e72426279fc5181851a15a2f4883018ab01ff8745625f388f05f5fa9abc5d87a710a1227322626115b60f781f4ddd91e205c1cca582a5e37e005396703375846be4f36fdb76c277dc1a2ff1f183cbafc6db485a562f4d08262a207844a3d12261fa0ac479abca76f417df42b037e611b1b6acfda94d5dacc620c3edf5744db24bcc41ef1722dc0e620f8a35c50585a7cecfc97f05bfec21f919420e62a9c4f28ea9585cc056aee08ed8891d077a9647d9c0b5c3141f8c517f13b05bf0a18b99111d2d6e7b4892e78fab35d882e4e153060f0c44cb946d20ad0897a34d2a24d3800b54acd68fdd797aa362560dcede6d12909948bd6f4726a20142eec9c6b78d224b2c24885490bfb492217c6809e0628164579d2c2c16a90f28aa5393ad44c45d4e1500fccdcc684023d7cac4e2cca889333f048cd9a29de018e958d00553c77c74ab50d974df5f654233fb923e809ef6ceabe6a860386603003cc376e90b8bee74f2477343a5ae923aea4ffe99a91b9d9289ddcc3ca316b026b3d369aca474b7941588fc6e9cb062528b10f13b90dd55afd64f7b0ab79163163ce02aed379af25740ac5e37c5628c0b868b7ccfed0ae521c964846f0287d3006952539b2dffaf891bd01fe98a1685e71536d7f33ae85775d11545eb379e0916be616206968605e5033267f6f79cc651c2ce71a790ae5cef19fea7604e479c0793f82db1f8e85bec40d8c6a2dbc9bf76d02a616aced611ae1a7a3756d87dab2855ca585d0048e1e4222ed9d6fa24e3e13677256fbb9959b965727c192696a11474a7f6a6b6c8efb649b1f601c76576f36996ec7a20eee84208232c20e8502903d4e303e4ad7139c654b7e5d2aa262d75672cbb4f653e62ed8e4d28835f7d6d0efb3f39c40558d9cbf19f250681a5c8a59143fec80d6a69d8a265835d6562ef248fa4ac508bd60c9283f6e731baa786828d0f7a635e1d14a448383c8b0243570df4a42799afe03143c227e3fcf0b1393bdf8bacbd26f1041d5e3112c84755942fac77981fe16f048cd882243a8787b09bdc38847a5a9cc9aaf4d30544181ff014dca8b2892c00a933333df6d8ef79041483f2d8c6416897ae7897ca1da85e8f0a493be4520595cd0dd7d32c87999e703704ba0ac7d8b444dba807746123100e2cf7573843a0a755eebad6045d2970a0ef8c9adddff093e79731d5e506f1c43318fb25144ff5fb63041574e89216ebe0ac75d7dcffc35d095691723493c94dcc11d4480bf3fe7b76ba53cae5b409c002f2d1bb5eab08ac993054ec297543798700fe3e2877a4a0cce53599a66eb4f1fef5cafc774277f0e694ebd7f8748fb5140735282e5e0b9bb35b8aeb098775a33820c9b8decad3ad6ce36f79c347dcc2c60a5442d2eab4368827acae1f0ccd52f0475fab95ac57c3c9d7c2649d355756140d5a1e8c6eab8b67a5c169cb899230c4be1dc702323f2b07ee1fcf5657361e250ccbe93bb403abd857eee4335e454e8485a3b055c908c957dca3f9a288299729216103089910386fb994285602ce12b04be1819a2c80394b2410767d9aabdb591e4c4dcd08d1d5bc1bcb532496ff1fc968ac3ff59bc7266d8ecbb67f34b681331685a99b781c9752dfe83d145bd4f3c8ec634f028e850e246aa81f1d03aef40d000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a0bf32b9037b600aae3ecd3dd1838bc9f18ae1661f615cf3d70bc270b6c31f55fb80808080808080a0a2381991afea644ece5cba0d8d69f838f7b123d2e0057a54509e0c61e8b293028080808080808080b8b2f8b030b8adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a0529f2d89256fc038782a4d70b40bf127de906cbe211e7acaa3e928e0fd5cf11d80808080808080a0b4f4d0be01c65da5308bab41d52d8a7c93a1693c170c44d1f619b8364d40e3428080808080808080b90190f9018d30b90189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa50000000000000000000000000000000000000000000000c080a0ae5e67673b90f2d6802e8dba26aadb2e8b81e059d1611afd1908e743e3c0b75da004886b0ac3a810519aa2395bffdd94fbcfe4a2de989ec95d1aea0fcd09afd931b9235302f9234f83aa36a7830137d664748315f42594ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000007777000000000000000000000000000000010012f20d5ba20a09e185d452c999c129d712b83c75480e2e029fc895986d361a781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000004f9456000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000bbe20eedcc0216c615d3a0550a5507bdb2f9912eba7b608300486e871a4e42491dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000007777000000000000000000000000000000014852ab81d236f35c396d4836a6f82239f5672a4b6136ab9ebdd8669a9f9e831b87a26944e5c04f16b79426135ac11b155922c14178bf3d1ecbb1fb12ccc8119a22df5003de2d5956c745f9e825a8f0ca1bb1e265d4d431781b00765e0fe37280000000000004a00000000000800000020400004002001000000000000000010000000002800000000000100009000000000000a000000050000010004020000000000000000412000008002900000000000000000000000000000000820000000000000002000000400000000000080000000000000800000000001000040c0400000000000000010000000001400000000081000001800800008280000000001200002000000000000008440000000000001000000000004000000000000200200040028000000000000000000200000000000000000010000000020200290004100000000000000902080400010000001000000008000000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc100000000000000000000000000000000000000000000000000000000005364e600000000000000000000000000000000000000000000000000000000004456ed000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000002e0781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b21ad05b7c1eb0d208d17426c52831c6347a8db75b12bfeb2970c4dc6666e4eba0492d2ec318089b11ee7ec6087ab6a3df335770526cc0c1679b764d847b4ec1e303d400c12e690aa26a3771e5676e7ac95e2dc7a1b33be698f077c598f880d4203defa26ad36b84573e923af347475c7c7671be245e9859ca1db3c047faeee4b1c0e81d8a92915c2b94ff300e18f77f70ffec15631161e0bc3cdc9143c43422c208187652c1ec83c5d282e10587216eaf56689e5fe236f72c13eb9574afabc622a739cefbbe11aaa4e2e3d4c5415818914fe554a07be374f565d9bcebc0134940e8921b87bd4f6b42a6432e6e176be5ec82bb8eb6bdb7e4acc1f1e99725bd3ab2e3fa52e02c2741dfe6eddf5a3846dfd57f6a72e834faa048cb007826a293d9e163d47f9ea635871b25afcc3561dfce77b3a2604b3c8de90aa24916f41aed62d2e0c0d18f9c259bf614f1321c5b7cf7b5bd73cec408dd85f046bf36302e20f3603b7832071796022e893386de4e3b170135a591b1a44117240ba85876dba586b1f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f12f7e30e74b0329222f6067cad3b4324a80f570506985d729f7780955333f40e615f065023fb607d975d7a2b9f234137e72260d8f6b586baecf42819f8328dfb3304441f2c9e97d1fab9a3625073ac3d2bff6ba2f8d659cbc6f66e8d9afde1ef229ff39bac1ecd65eddc4953e2726a72daefa76f00d58e11c9a9ba3448fbe0d3a03db78d70ed9c574ddc45de5c73efdf3113ee70a4b42cea9884f85c1b995516912800abeb70f3022d5de6d9f49469161a36a6a309099ca43e388908635ed4ae825a14b7cf5213454a1f345497008ed417e5d33ef84c4934368b36f27606072192a1b43396f89647f0541dd25f55b42c5295d3ab2a22355664608b8dfec3c9d76045b27d8c2bdba7f376a44826bbf4044aed0d57068489fd32a2bf52f8613aa150185aafe655d2b86bf8867a6f7728c4133fb95776545b19767a0d7144f60f5ef038eac390d1cac6f9882211d7302137efc82b93b8f9c55db629f47a2c61931c21d01d5ad967c9dc6c1abfd496a74df2ac4714cfb027bc4d8c0153543ca663ded2af64f7396ed3b2ebd1976386814e94b7f7fcc3a19a4dd876288b905c381bc8f008de145083d6404890a863e1af1dd897aeef2516b20df50befb6c708c9728a22cb31d80b0e953aa71230d2462bb0668dd8701e11bc5240d85184f9298e2c5a3257b5dcc3e138df8b7d4162d6253fb5c21a65e952600c8764c613c6f43d22c861d4380cd688c286e9ffad6bb8582421fcab96b075769cf48b3160f056dfac4041b08287533a769bed0f08fdee9a16c5c8f414eb35830793c7b64341fef79dbc529a7b99f85d4e2e88b64954be967c5ee6386f9131b80b454ce70209f78f2101d0ca71da273735bcbcdc5ea5d3d54b607820b9bc852abb1b733cb7bb5018276d30c4c0a7f9ffcd318499a2041043494b82456ca8ac6f07678a8b770329b7c00f31e70e97ce48bc796570be27577e8986ee4c7fa51da44bdecfddfcf18686cbddc02ca206d9132d451ab55cce8069f631412ad2ae02b1a8245d31c0a65854d07370259f632fe253b2412c5a785148248d660d7cb6bef5240749d6ac4a4ac59384b27e7019c6cae15ef7c82e5a952f4da079b6205f9e16f3d3c84e94b490530c5b602d4bf5e9d34f2a785cdb7f7755d6d467a9d88071bbdf8c79195730db7d0b7872cbdcdabab02bd4b8487b726c5ce6492344ae7e900a21893e7b840b46380ba99278ce95322dc23daa97995d1149d425952913428c8ef8659dd2cc2895f12b08e0532a254fd5674fcac1b0992472ef75337d8d77f6fef3720d4b7b17302478c7d2e3b8dec7af4c681aba5e25d8aa3f4382b0082066c3f7a0b4e42c4637df90d9a1e2f3fd1cffa7e0d5577f5da89353521ed02cb1c39eb5746cef10ceb74c3fdba13199b42516ebfe29af40da64ad81b46b7bf04bf25994255c7a51f6839848810025bb52fe7500cf1ef628a07747894e3b73d53e6b2997d0654f1ffd0c070455400fd7e9d670984ac807a0f8131977ed1806fd3c0927c34b7b4dabf011d31e86b1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5020d266b1ccea774955484405f58ad161251d879a87c43d5dbaecd976ac5d04dd2586d70031a86b0dcade14028f36a04508494c7a20e98b3b21f7765e7b3ef68f10960709e63eea35a26ff47424e18df8cc271ff3049262c855d6a131695a395f2ba2f1b039012ac8a2abdf6d9f6b0c432f0ae78b9bccb99f89759434477257ce1f44cc61e95b9c9843ec8efb17c640fc4c837ec125fb25323d3f0644615d21721607fee4d68e2dc9bd29f5b13fafe39b0710d0365dccda35e3c937aed1b6949b2a0a7523011eb706357b85e174376ea7cadbd01ed0dd1bc6a8e5a5a11bc6131f0661dd6365b13c6e2de50b98cba1cde58a921d19936c711424eb625b7c35cba01a0f7dfa8d6f86a2a02425ab48e2c28f8f2f61adbb744c221b9c4f35b16c749c227bcee1202e87537c7441f421c855ce87d858a679f09dcf814bfa1f26f7d9ce18f723d2f84d4b25ec60adbb6367e92270836d03c71ed43413767342a4fb8d6801b8755bf65e7947ed4459ad6486fc1cca1f1cc89df3d307f01d8ac68aa1d08d18aa35a46bf245589c599eddc6337e764c36426f7b7f5d2afde0a76fd3aa536d1a165f9f23cfc65866f574f2289aa5be056dd32c72a204ba8328dd9b0b4643790463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea09160db3fa7477a2fff436ecee95aa2d51ff42ca9d4fcf021b6e501410fd41098a1a8f6021636ece98c27bd74740b7280d3a5e13d9850fcf7f2118c4c91572ba5826fcc4b0837d0b394f6683cba38fa35a5e2bd242041533bd25939cc873d1f5852a2f57cb172eb17c2e3c351240a0b2b334978b90ac18041b09aead26649b1c1c019e41731e77c6b2211d7da94630507bad027561dc625b7e84094378e599a57b09eb32c2a67cf5f2f0bf9250e6da07b165f97dca10517e9f3fe3561d02ec83a722b544bd6e25ef27d9825d13651443c4d984d7e5d0fd70c2a7f983b3ae8c698d27a2a0bf2d35655f477adc99c56f48773922831746f8af58de941a020986ad7c23fb7d31c2f17f305174db26b40447e64c66216dce98e7a8316dd91dee468e602206a4d1d18fa7827f733037fa87dfc9c74c9df0960867087c776382b94db9420a19e5338e17e8a68cb7621f0b56984610bedd3d9b77dc5447cdb129ecc33596079cf206e93904368cae07f0d449e2095f8abd95f26603d2db047647babc8342200be0095aa5489fd18cd00a52f59b70ff04c4b1e572db76d08bad419abbabb00b9e485e3f017807c12b427b5e0e648cf7b16065e313c1c073ce354a5fc6812c02b8d4b6aa1168c575dad9875087fe9f61702309febfb99b895387cc1104c35e123b713019b5e51c320fc2521cdb5cfca20f617773fd46d3872128b87df6f66a21fb3fa16711245ab65eef629c5e6073efaff5b707657f4442f2eb2637fa71000f14fc691a71aacf902c0c1a1a5d7d8d351b8b3cad57acd0a9e47a1abdcaf2b70aed8b7370a6bb2bb4f3d679c4f9793e4b256deefaef1e6dbcdbb648b917e34822d833d2ac1614aebcf360d328d9271f27c52c93de4a9455ce6cd8d2140ebf6b21c9b172cf47556efc5dff9afb913e328a708292bfb65c96d668f4d0b3a9a21b222039156cba9980d6bf11efbd8dd893378e5dc1b323c57d8f702076c22d125d1489bab2553c5521631c35f7b5236007ce8f37012cace78d6eb39718904b5dc31ddcb6f4f175e52bcf6c6008f6f5a572925600194b9af7ae074dbf85119e3afd141b2ff2652a58f043e97f11b77997a9da1c96c18b5254a107f24e997a3ea61c2069b9d04d49bd1bcd2495b19bc71848f28bfb4f0346b682a1b474e040b056e60a32b5e8aa532103101cb45ca41c6a690c8688523b8566d507f29eb44fe2d2490e81f4343ca61c8783b83e40e3ce66532f186e9d09bd2667cf974a763072a910121aa5e86e151d92a868508b680f795bc30b4502769f41e3afef5f321be9ce2f1cff3eb3308d65aa0ed780cc889f605f35eb5e02ba772d08db2579f8561c61fa09a8e23ea1416fb95ca0c7e139ddd16f04b0c872499e44cb5a03868d6c5fa1300c19a96b8586b8f33bd760c6350713696b7d3236acb0eb35bde2e6378e9ef9b117b02290ead7824d42452e332f6ec95a7f871da9ebdf6ad02c959a1a36ba33ff0089a4f5217b7bfa5379a507b1e994fb7b8fef489f1f2cf6fdedf0e530635ef31faaa1a37457c445836376dc5cdefc7770fbbad8c326955655efe4ecde89bd2f1dc62a2551a45206fd7d42605aa1c0fc80476b741bd7df1f0f2db0fc387614240e78427bb3a8cbbaf9bb112da06ea6942335f88c65d42d17816136509ec39b51079b5eb2a8cd15c3d1fbc56dd72c3499c101e2fc9126e8f194c6c8006faef30917c5e535439c6b0d78be52a4d17a3a25d0878649b668db027eecbbafcfac7a612138c77d1511f9cc5e763eaddbad6d9d8770705ef7b4d062b4c6dc72f30d1d272dca8700ae03a4c6d2cc6a0a03f9bfb2615b2b294515ca80827ec9cbaa7746112530f5e70f236a641c05bbc8647dd130f02db3561f9dfaa1d687235bccb0498202af478a6070dfa49df99785a61eb5fe5f18777569c18b08d2042ae8639abbc225b832a2fbcd95ff43a3fee4fb2962983af8304ef995716110a7ad35c538697c109c01c427ca6cefef3a842fcf74b1c49a3f2da88b85fdb1d05e20cd567538942fa2f0ffbb5d2ff73d60d562d9a0a6894bec3d85a709b43e42ab64e2306cb96919e078b899f3155af56390d06ddc662afe8d2c91fc091e2c5cbbfab3fdb3f49423a5a5f7741f2d70c6736adc66e7c2caa89c6bbc678bb4b445a8a63d120867f01f164dc87adc853633ca7bd4b9d585c2a637d1469da612b5210476fc8d66f90029bdbf7fa5eddc8335cd23deb4bb47e1582e64a03dd021292d34435419af80af178cdfab0fb9374fa0fade48108cd3a571b814231784ac37c9f6071fc6ac0bb018595c9d8afbfcd6f31832b2581f7f7ce7c45d22817aab8ac6df0e0995e12dbd1595c3377b707b816c96ceb1893b9e7c747a577bb7540b89eb3ff7cac878a7a121a37b38fcd3248abfd24b50e25948dcaeff8c1c7ab8b745a93adb87cd54fca223dd940ef4d7eca9dd69243c74ea128ed624e52c7a2257f3950d0c7409d665d912495f8a8a2cf2482c1d51cd7793d3d31f32ffc24374d8606daa2a423931d97019ba2fd3ba773645b7fd01cf75e8201dd29f694a72136b585d940bff8867654223c28d0603d85fe4472d93ee30e35f46e27b8f40f9a9ad03992d9ff23305fc062c7d95971baae1ab074df88d41e09ec9752efff012c482e0cf9aea2b78cc26db146a278d584575ed615f5d168e6df7a832322da093f0aea706cee594207427d3005fd910843f3dc54b14f8b187e3b495b7474792743fc2e43f62bbc7fd50a76513f1fa4073b15a42d1e78a708134238f2521c749d086deeef512823b514aa64122b365efd51e11415de40826971c234d571c3e2a0507226c6ccc540e43a9aa32244b29784ac824c20d3d1b72dc7262f61cce4eefbe9a4ea4cb1061e4a71925aa13f31d6ce80bb7c56bf47b91cf107ab17168dd4fb60614757d7c7f4ebe0320692235fb502621ed9b15b9b3fa23aa1bf266a2a2c3f2386b52625e42e0cd85c37319e3266185419bcf6dea997e52ec8fca5887a68530002fcc5b3619e88d4dc9a918cc36bac2416ffa9b9734ac4e67a93a800f36d7aba4ecfed8d65f62cf6ad13d184a8c6406e3ba17b8aee6af0721ed091e1d225d044629a4ef5153c294a3e87e243e03bdcf6eaf7ee56d9d969a1f054d5774a7e2c363b160386b909c89717aa7015385f4ab8b6c97805c12c37d981ca945134cb1306d39a4d136b42c36d8aacd2c37575a11b17fa50ede8072d667f64bb55e3b54aff2c3c61782e442e088db7c1ce62287477132bef00c17e9992dd42f35b5e098eb97724fc4e697d75812635203abe8f96000d9553012be065980fb16d6d1c0c80457585c6eb699b0e8a6e36c1cd518dd1ffc517afcb9114a4ff629d06cd2f0be1495c4ee09243e96529e6c3a228c923ca2a703930ea94f7a5803645324ba9ea1a08e6c3241fe57a80bd24f780566342561189baed15e85ba9257b701d651754ff534e51279961ff379974e34010d80773b169a140e0ee7c5e2c0312c9dee46fb7b309710d448a43805c7eab513e84e346411b7145f77ff4ced7b32eb641528f78d88af0fe88e0840e9c16f2210e18c1da605bb04a4c963441c06fa839f722b0c67345168bc0fbb1c826f20472c7551a1327eae9eddbc24e63814fb81320cbc6f03488d64587f3e5f53c03db02cb15412e622f9ec9944643d4b5530b0cd4d577489d8ee499ecf2b74fb72423412aca8530fe53c3fc584ed8e39f900843ac73e36fb113c343cc197cd689a09e12f29203c1dfe839630f6932f3a29de81ba787f6044e70dff8981b71fe82f8a4d01f45770a53b090026a003b3e639eca0e6a1e5bdd0aad456e89d83012ea1f53e1a5fe848b33528f7195a7b0c36d4315f1b96b62d5603e87a13e12a97ec335e3922d4339d9575cb26d5691da78a738aa5c84aecc22a93033a6912f84360d13e2e23b0185bdc2cd331bd26ababcc91894935db5c7e1800b8a10db884a7614ceea91f38bbf623c5e7e7238eef06cd9fc9e43507c56e8d6212b7d03ef2db0dfceb040c0b206e1b7eee6ae564b15e4c02e9c3e4179d78bc68a9fbc2166cb8458342f218dc631705602b2ef1c6716dbc08f30810c9e2ab3ac7a03e300e9c21cd2a0240025ed5eda13e6daa246241669acfae65302dbca5c579d3b5c3a4c16a976209e22845337f9ca033329f849f3ccebc69ff01b301d99dbe9e79058fade67bf881c70283f41eaca130d1423e733ccd520f26ebbe8d304cbb8fa2f4bf67e2e041e5e90e840d5510d33a9f700219fbead699901ea3b3f8aa3d5ff0c028ceee5b5e711c29e7740bc98f4b78f15f2aa1e01449f1f15e68023861f540d2ae0541273c641914ea0e6abadbb2f11618bb678c8b7abff1f6d4e9f789706cdbd8dcc1acd4bbd506e42e928d134366d3f32d8caa4b86736bb065b1a3f89354835b7ba5ae1e53cc1bd9f5dfa3e0d49c0a0a8d32670c382712e30f8f4cb8fc980785fb6012df752e02c923d3f56f5764a41629646f9fd7641c8365f0917f85a64d0ba36179e2c2b3045d7b3c6ccfdb60cd5c365c43d88e231465c6616f7d2cab0db88cd79268e5ba0cecb98875958ee3827af7842e35d9cc89c3776e5640f2433a6afccf0e6fff9321e31802746639bf2bf77f375dd6799baa184b48815f24d3fca5d534dfe61d1306d15e97d3a320457ddd2239cc52fb31dbf98709cf090ae59afabbda6da75f4e1373a28bcadc2405e0a7f6dbf9a3e26511fc600a496b4623593213283a1fd33f000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a04dd5a916917c46969db2e2093e73972daa52d5582e183eb0bd08362e7aca1dc280808080808080a03605d0d2c4765be29883abb71f1c4b162f9d6786835ccabb068a243ff819909f8080808080808080b8b2f8b030b8adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a087eef6c6fab228bc280138441d870592a3910f042806b16f257faf5f1542f9a280808080808080a00ac60a3a5bafa4560edb7bd978a6b8980fa818c5edea7c010986328de4d9b4ba8080808080808080b90190f9018d30b90189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d67440000000000000000000000000000000000000000000000c080a0d86a71e8e531bae3b2a2e70d98e516ccf31b6583d936ffa31c3772ac265db828a0420f5a8067c7eec5214117647da149eaa4e7c78a10d8ee6fa62001ee1b680f9fb9060002f905fc83aa36a7823d3f647482a9c494bac000000000000000000000000000000000000380b905930001536cb8da3dd105e94414690798c7f100000000057b78da8ccffb3bd38b03c0f12199bb964b426dd6b091efd7dc3ad1a9d321d1713b2ea1189d39280b4791c5c858729090c3b6182ac75951eef74b38191686b35c4669656ca9dc5a0ce7e9399f7efffc03afe7fd6e7485887f6264e97e9856a6978b65c5db3b4ce57cf4812abeba0de10d0d6ee5a2cbc9885a2163a58d1895524adbfd86d795eac74ec74d783b599861bf4b7b3e6daf70b3ae0e5740c88a4dc15b893f76fe074a718bcead52fb2a06d6e5f1cf3ca344ad05dcf5ca10bd9bc2809cd8ecd40a2dd0e03200dadd8f921f0e9953a7e6d8c7dc99e60cf6fe81465175e0cf99b702ac6a13706e64ac349a1119796eb0b6e7d5ae48ad74a5c997d679ef9c637c619587cb98ecf88e620dacdc57701500c74e087533f978831a78bf3857cb6044a8c66e41645cdee74ac7cdac69a8484083eb003827ccfd6b92c77b7097a15f38a419f6f0578f3568465e6fb639f1a8d6e52e9d17a0413100ca8d08b210a2e5adb2bead3dfaada14b2513113802f3996daccac89014dafd1368700300053ad7daeea2a4d4d9e8502aa44337c6ff91165a25de84fe5273b2e5b7f4dda3a0410900125e7778d5c2a59a2ca2ce36bacc9e95812ae1b69a478fc7ecf5ded14b68a80a010d6e03e07137d5de8082773f8a422390cd0a592d81e6e623a42bc69547e6b343e1d9a14e64ac3486116e29a8315486a2324d93d3e33a8344ffdbc2655b76dbf72077e43c13961a6a52f0565f2000881576c7a113e7aa6e9a6ed4679014533f8d1bf80ff44ae5599813e80d2c1f2fd0a03400864952137916724a4504bb118ccaf9236f217a1e43c97e471397a3f86672226dd0e02e00d4dcbfe4dd250a97d0c830b3d93213fd048fed38ea8378018c726be68728e22c687037000e3bb6d2858fba82db877c2e28fa1e2cca4ce57b6bdfdba7513dcd2649da93544083d06f85c8f4d21559e8e7651dcaa0c3aafc4a691fdfb27f2f39ea08ea62feff43cf0d80061500b0b00cb246f3641d83f5c934c477ca641a5c545da8aa0e4662c4c5f26ee70525a04125006cf268fbdcaddb151168bf24d3fa2e09f7445d859ff9e5ba2fe71e7ef8861ba61834a80280ebddf1bc99e8d00ae5d2a0893d64774d4cea1bad7146fc964526b6c4617cd70a68500d00f7e8131b976b9537ab4e2b9c9cf086fcfd82e235cf6c6eabbf8030cc3fd1e395071a840120bfbd7fd4a54397eca0c0f7adc1231dd539950f508f92e237e3aeb91468c38d4083ea0068a89abd38178e2e9f67559758419b6908d48d58967547c9edfe98ba016e050734a809807957936c079272b238748593ee3a73f5c7647d0ece20a5c208769c484474aa2f192b6dcc780a770c9b40b42348219a34a746cb495f3f1efb710a816ac142121461c6f7bf82fb00b0dec5bfbcaa2e32983075c84989e439154bfc7df1d0549680a6c1a4999c18aa010dee074028fcade2995b7daec4562449ccbced0caf7a660f49ac4ea07d485b22348948a0415d001ce8e16f70ca5813141f7f7544586da1364d2f77dd8fbb7cc937c6d46136f93d68f000009a72d59e5a9bdf1de5e60bbb17358bc65e8ff1566fabad6d6eb42ef2781f6d6d40837000bce21c64847942319b4ac1c92b2ee02fe2bfbf43b685908b92a0c3cd25f21641a0417d0084138599419cf73489312bda0d53e1fa748e1f7927380961470ec9fda73b36978c953661c8065aaafe09fb847fb54e35b3c68f771b6953941b2b4e619b486d81761ee187bf828700301cd34529763c60738c12e1ccce6ddff8b8338cda8fda245e5d8d5613d20734408306df96bd65c7b8d5c27299269dd9335ef7cb1f3357145983f365ec2f933686fc6d77d0a01100ca3a3773d3f0a52559ee691776b714fedc8c7b2cd672c7065c295693d0616d37408318007c18e9a9f6e4929e20d8efd4c2428065720ed1938af8e5348c14b373b0a845d1063468d2f96f000000ffff86f9aa5001c001a08f785a1c8e4c549c415dd948da80f86e3aaabc4e7a784604b6362208e0fb6b85a011d366d57b6ad95cda2eb6b618704859b4d433ad7557cad177eff6f6bae578cbc0f90200df8345de7e8203e494e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de7f8203e594e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de8082062294388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de8182062394388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de828201949425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de838201979425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de848201999425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8582019a9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8682019b9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8782019e9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de888201a29425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de898201a59425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8a8201a89425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8b8201a99425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8c8201aa9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8d8201ac9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08" +} +``` + + + +### `debug_getRawHeader` + +Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) of the header of specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - RLP-encoded block header or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawHeader","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_getRawHeader", + "params": ["0x32026E"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xf90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9b" +} +``` + + + +### `debug_metrics` + +Returns metrics providing information on the internal operation of Besu. + +The available metrics might change over time. The JVM metrics might vary based on the JVM implementation used. + +The metric types are: + +- Timer + +- Counter + +- Gauge + +#### Parameters + +None + +#### Returns + +`result`: _object_ - metrics object + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_metrics","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_metrics", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "jvm": { + "memory_bytes_init": { + "heap": 268435456, + "nonheap": 2555904 + }, + "threads_current": 41, + "memory_bytes_used": { + "heap": 696923976, + "nonheap": 63633456 + }, + "memory_pool_bytes_used": { + "PS Eden Space": 669119360, + "Code Cache": 19689024, + "Compressed Class Space": 4871144, + "PS Survivor Space": 2716320, + "PS Old Gen": 25088296, + "Metaspace": 39073288 + }, + ... + }, + "process": { + "open_fds": 546, + "cpu_seconds_total": 67.148992, + "start_time_seconds": 1543897699.589, + "max_fds": 10240 + }, + "rpc": { + "request_time": { + "debug_metrics": { + "bucket": { + "+Inf": 2, + "0.01": 1, + "0.075": 2, + "0.75": 2, + "0.005": 1, + "0.025": 2, + "0.1": 2, + "1.0": 2, + "0.05": 2, + "10.0": 2, + "0.25": 2, + "0.5": 2, + "5.0": 2, + "2.5": 2, + "7.5": 2 + }, + "count": 2, + "sum": 0.015925392 + } + } + }, + "blockchain": { + "difficulty_total": 3533501, + "announcedBlock_ingest": { + "bucket": { + "+Inf": 0, + "0.01": 0, + "0.075": 0, + "0.75": 0, + "0.005": 0, + "0.025": 0, + "0.1": 0, + "1.0": 0, + "0.05": 0, + "10.0": 0, + "0.25": 0, + "0.5": 0, + "5.0": 0, + "2.5": 0, + "7.5": 0 + }, + "count": 0, + "sum": 0 + }, + "height": 1908793 + }, + "peers": { + "disconnected_total": { + "remote": { + "SUBPROTOCOL_TRIGGERED": 5 + }, + "local": { + "TCP_SUBSYSTEM_ERROR": 1, + "SUBPROTOCOL_TRIGGERED": 2, + "USELESS_PEER": 3 + } + }, + "peer_count_current": 2, + "connected_total": 10 + } + } +} +``` + + + +### `debug_replayBlock` + +Re-imports the block matching the specified block number, by rolling the head of the local chain back to the block right before the specified block, then importing the specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_replayBlock","params":["0x1"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_replayBlock", "params": ["0x1"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `debug_resyncWorldstate` + +Triggers a re-synchronization of the world state while retaining imported blocks. This is useful if there are world state database inconsistencies (for example, Bonsai database issues). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"debug_resyncWorldstate","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_resyncWorldstate", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `debug_setHead` + +Sets the current head of the local chain to the block matching the specified block number. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_setHead","params":["0x1"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_setHead", "params": ["0x1"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `debug_standardTraceBlockToFile` + +Generates files containing the block trace. A separate file is generated for each transaction in the block. + +You can also specify a trace file for a specific transaction in a block. + +Use [`debug_standardTraceBadBlockToFile`](#debug_standardtracebadblocktofile) to view the trace for an invalid block. + +#### Parameters + +`blockHash`: _string_ - block hash + +`txHash`: _string_ - (optional) transaction hash; if omitted, a trace file is generated for each transaction in the block. + +`disableMemory`: _boolean_ - (optional) specifies whether to capture EVM memory during the trace; defaults to `true` + +#### Returns + +`result`: _string_ - location of the generated trace files + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBlockToFile","params":["0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", { +"txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", "disableMemory": false}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_standardTraceBlockToFile", + "params": [ + "0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", + { + "txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", + "disableMemory": false + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "/Users/me/mynode/goerli/data/traces/block_0x2dc0b6c4-4-0x4ff04c4a-1612820117332" + ] +} +``` + + + +### `debug_standardTraceBadBlockToFile` + +Generates files containing the block trace of invalid blocks. A separate file is generated for each transaction in the block. + +Use [`debug_standardTraceBlockToFile`](#debug_standardtraceblocktofile) to view the trace for a valid block. + +#### Parameters + +`blockHash`: _string_ - block hash + +#### Returns + +`result`: _string_ - location of the generated trace files + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBadBlockToFile","params":["0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_standardTraceBadBlockToFile", + "params": [ + "0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "/Users/me/mynode/goerli/data/traces/block_0x53741e9e-0-0x407ec43d-1600951088172" + ] +} +``` + + + +### `debug_storageRangeAt` + +[Remix](https://remix.ethereum.org/) uses `debug_storageRangeAt` to implement debugging. Use the _Debugger_ tab in Remix instead of calling `debug_storageRangeAt` directly. + +Returns the contract storage for the specified range. + +#### Parameters + +- `blockHash`: _string_ - block hash + +- `txIndex`: _number_ - transaction index from which to start + +- `address`: _string_ - contract address + +- `startKey`: _string_ - start key + +- `limit`: _number_ - number of storage entries to return + +#### Returns + +`result`: _object_ - [range object](objects.md#range-object). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_storageRangeAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c",0,"0x0e0d2c8f7794e82164f11798276a188147fbd415","0x0000000000000000000000000000000000000000000000000000000000000000",1], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_storageRangeAt", + "params": [ + "0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", + 0, + "0x0e0d2c8f7794e82164f11798276a188147fbd415", + "0x0000000000000000000000000000000000000000000000000000000000000000", + 1 + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "storage": { + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": { + "key": null, + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + }, + "nextKey": "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6" + } +} +``` + +::: + +### `debug_traceTransaction` + +[Remix](https://remix.ethereum.org/) uses `debug_traceTransaction` to implement debugging. Use the _Debugger_ tab in Remix instead of calling `debug_traceTransaction` directly. + +Reruns the transaction with the same state as when the transaction executed. + +#### Parameters + +- `transactionHash`: _string_ - transaction hash + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _object_ - [trace object](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e",{"disableStorage":true}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceTransaction", + "params": [ + "0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e", + { "disableStorage": true } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null + } + ] + } +} +``` + + + +### `debug_traceBlock` + +Returns full trace of all invoked opcodes of all transactions included in the block. + +#### Parameters + +- `block`: _string_ - RLP of the block + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _object_ - [trace object](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlock","params":["0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlock", + "params": [ + "0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null + } + ] + } +} +``` + + + +### `debug_traceBlockByHash` + +Returns full trace of all invoked opcodes of all transactions included in the block. + +#### Parameters + +- `blockHash`: _string_ - block hash + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _array_ of _objects_ - list of [trace objects](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByHash","params":["0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlockByHash", + "params": [ + "0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": {}, + "reason": null + } + ] + } + ] +} +``` + + + +### `debug_traceBlockByNumber` + +Returns full trace of all invoked opcodes of all transactions included in the block. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _array_ of _objects_ - list of [trace objects](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByNumber","params":["0x7224",{"disableStorage":true}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlockByNumber", + "params": ["0x7224", { "disableStorage": true }], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null, + "reason": null + } + ] + } + ] +} +``` + + + +## `ETH` methods + +The `ETH` API methods allow you to interact with the blockchain. + +:::note + +Methods with an equivalent [GraphQL](../../how-to/use-besu-api/graphql.md) query include a GraphQL request and result in the method example. The parameter and result descriptions apply to the JSON-RPC requests. The GraphQL specification is defined in the [schema]. + +::: + +### `eth_accounts` + +Returns a list of account addresses a client owns. + +:::note + +This method returns an empty object because Besu [doesn't support key management](../../how-to/send-transactions.md) inside the client. + +To provide access to your key store and and then sign transactions, use [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu. + +::: + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - list of 20-byte account addresses owned by the client + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_accounts", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": [] +} +``` + + + +### `eth_blockNumber` + +Returns the index corresponding to the block number of the current chain head. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - hexadecimal integer representing the index corresponding to the block number of the current chain head + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 51 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x2377" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{number}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + number + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 16221 + } + } +} +``` + + + +### `eth_call` + +Invokes a contract function locally and does not change the state of the blockchain. + +You can interact with contracts using [`eth_sendRawTransaction`](#eth_sendrawtransaction) or `eth_call`. + +If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the `eth_call` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + +#### Parameters + +`call`: _object_ - [transaction call object](objects.md#transaction-call-object) + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +:::note + +By default, `eth_call` does not fail if the sender account has an insufficient balance. This is done by setting the balance of the account to a large amount of ether. To enforce balance rules, set the [`strict` parameter](objects.md#transaction-call-object) in the transaction call object to `true`. + +::: + +#### Returns + +`result`: _string_ - return value of the executed contract + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","value":"0x1"}, "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_call", + "params": [ + { "to": "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", "value": "0x1" }, + "latest" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + number + call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { + data + status + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17449, + "call": { + "data": "0x", + "status": 1 + } + } + } +} +``` + + + +:::info Example of a simulated contract creation + +The following example creates a simulated contract by not including the `to` parameter from the [transaction call object](objects.md#transaction-call-object) in the `call` parameter. Besu simulates the data to create the contract. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "data":"0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005057600080fd5b5061021e806100606000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032","gas":"0x439cf","gasPrice":"0x0"},"latest"],"id":53}' http://127.0.0.1:8545 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032" +} +``` + + + +::: + +### `eth_chainId` + +Returns the [chain ID](../../concepts/network-and-chain-id.md). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - chain ID in hexadecimal + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_chainId", "params": [], "id": 51 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x7e2" +} +``` + + + +### `eth_coinbase` + +Returns the client coinbase address. The coinbase address is the account to pay mining rewards to. + +To set a coinbase address, start Besu with the `--miner-coinbase` option set to a valid Ethereum account address. You can get the Ethereum account address from a client such as MetaMask or Etherscan. For example: + +```bash title="Example" +besu --miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" --rpc-http-enabled +``` + +#### Parameters + +None + +#### Returns + +`result`: _string_ - coinbase address + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_coinbase", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +} +``` + + + +### `eth_createAccessList` + +Creates an [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) access list that you can [include in a transaction](../../concepts/transactions/types.md#access_list-transactions). + +#### Parameters + +`transaction`: _object_ - [transaction call object](objects.md#transaction-call-object) + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). + +#### Returns + +`result`: _object_ - access list object with the following fields: + +- `accessList`: _array_ of _objects_ - list of objects with the following fields: + - `address`: _string_ - addresses to be accessed by the transaction + - `storageKeys`: _array_ - storage keys to be accessed by the transaction +- `gasUsed`: _string_ - approximate gas cost for the transaction if the access list is included + + + +# curl HTTP + +```bash +curl -X POST --data '{"method":"eth_createAccessList","params":[{"from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", "data": "0x608060806080608155"}, "pending"],"id":1,"jsonrpc":"2.0"}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "method": "eth_createAccessList", + "params": [ + { + "from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", + "data": "0x608060806080608155" + }, + "pending" + ], + "id": 1, + "jsonrpc": "2.0" +} +``` + +# JSON result + +```json +{ + "accessList": [ + { + "address": "0xa02457e5dfd32bda5fc7e1f1b008aa5979568150", + "storageKeys": [ + "0x0000000000000000000000000000000000000000000000000000000000000081", + ] + } + ] + "gasUsed": "0x125f8" +} +``` + + + +### `eth_estimateGas` + +Returns an estimate of the gas required for a transaction to complete. The estimation process does not use gas and the transaction is not added to the blockchain. The resulting estimate can be greater than the amount of gas the transaction ends up using, for reasons including EVM mechanics and node performance. + +The `eth_estimateGas` call does not send a transaction. You must call [`eth_sendRawTransaction`](#eth_sendrawtransaction) to execute the transaction. + +If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the `eth_estimateGas` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + +#### Parameters + +For `eth_estimateGas`, all fields are optional because setting a gas limit is irrelevant to the estimation process (unlike transactions, in which gas limits apply). + +`call`: _object_ - [transaction call object](objects.md#transaction-call-object) + +#### Returns + +`result`: _string_ - amount of gas used + +The following example returns an estimate of 21000 wei (`0x5208`) for the transaction. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"from":"0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73","to":"0x44Aa93095D6749A706051658B970b941c72c1D53","value":"0x1"}],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_estimateGas", + "params": [ + { + "from": "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "to": "0x44Aa93095D6749A706051658B970b941c72c1D53", + "value": "0x1" + } + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5208" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{estimateGas (data: {from :\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", to :\"0x8888f1f195afa192cfee860698584c030f4c9db1\"})}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + estimateGas(data: {from: "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f", to: "0x8888f1f195afa192cfee860698584c030f4c9db1"}) + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "estimateGas": 21000 + } + } +} +``` + + + +The following example request estimates the cost of deploying a simple storage smart contract to the network. The data field contains the hash of the compiled contract you want to deploy. (You can get the compiled contract hash from your IDE, for example, **Remix > Compile tab > details > WEB3DEPLOY**.) The result is 113355 wei. + + + +# curl HTTP request + +```bash +curl -X POST \ +http://127.0.0.1:8545 \ +-H 'Content-Type: application/json' \ +-d '{ + "jsonrpc": "2.0", + "method": "eth_estimateGas", + "params": [{ + "from": "0x8bad598904ec5d93d07e204a366d084a80c7694e", + "data": "0x608060405234801561001057600080fd5b5060e38061001f6000396000f3fe6080604052600436106043576000357c0100000000000000000000000000000000000000000000000000000000900480633fa4f24514604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b806000819055505056fea165627a7a7230582020d7ad478b98b85ca751c924ef66bcebbbd8072b93031073ef35270a4c42f0080029" + }], + "id": 1 +}' +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1bacb" +} +``` + + + +### `eth_feeHistory` + +Returns base fee per gas and transaction effective priority fee per gas history for the requested block range, allowing you to track trends over time. + +#### Parameters + +- `blockCount`: _integer_ or _string_ - Number of blocks in the requested range. Between 1 and 1024 blocks can be requested in a single query. If blocks in the specified block range are not available, then only the fee history for available blocks is returned. Accepts hexadecimal or integer values. + +- `newestBlock`: _string_ - Integer representing the highest number block of the requested range or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). + +- `array` of `integers` - (optional) A monotonically increasing list of percentile values to sample from each block's effective priority fees per gas in ascending order, weighted by gas used. + +#### Returns + +`result`: _object_ - [Fee history results object](objects.md#fee-history-results-object). + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_feeHistory","params": ["0x5", "latest", [20,30]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_feeHistory", + "params": ["0x5", "latest", [20, 30]], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "baseFeePerGas": [ + "0x3da8e7618", + "0x3e1ba3b1b", + "0x3dfd72b90", + "0x3d64eee76", + "0x3d4da2da0", + "0x3ccbcac6b" + ], + "gasUsedRatio": [ + 0.5290747666666666, 0.49240453333333334, 0.4615576, 0.49407083333333335, + 0.4669053 + ], + "oldestBlock": "0xfab8ac", + "reward": [ + ["0x59682f00", "0x59682f00"], + ["0x59682f00", "0x59682f00"], + ["0x3b9aca00", "0x59682f00"], + ["0x510b0870", "0x59682f00"], + ["0x3b9aca00", "0x59682f00"] + ] + }, + "id": 1 +} +``` + + + +### `eth_gasPrice` + +Returns a percentile gas unit price for the most recent blocks, in Wei. By default, the last 100 blocks are examined and the 50th percentile gas unit price (that is, the median value) is returned. + +If there are no blocks, the value for [`--min-gas-price`](../cli/options.md#min-gas-price) is returned. The value returned is restricted to values between [`--min-gas-price`](../cli/options.md#min-gas-price) and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max). By default, 1000 Wei and 500GWei. + +Use the [`--api-gas-price-blocks`](../cli/options.md#api-gas-price-blocks), [`--api-gas-price-percentile`](../cli/options.md#api-gas-price-percentile) , and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max) command line options to configure the `eth_gasPrice` default values. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - percentile gas unit price for the most recent blocks, in Wei, as a hexadecimal value + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_gasPrice", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x3e8" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{gasPrice}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + gasPrice +} +``` + +# GraphQL result + +```json +{ + "data": { + "gasPrice": "0x3e8" + } +} +``` + + + +### `eth_getBalance` + +Returns the account balance of the specified address. + +#### Parameters + +- `address`: _string_ - 20-byte account address from which to retrieve the balance + +- `blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - current balance, in Wei, as a hexadecimal value + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBalance", + "params": ["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x1cfe56f3795885980000" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account ( address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") { balance } }"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + balance + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "balance": "0x1ce96a1ffe7620d00000" + } + } +} +``` + + + +### `eth_getBlockByHash` + +Returns information about the block matching the specified block hash. + +#### Parameters + +- `hash`: _string_ - 32-byte hash of a block + +- `verbose`: _boolean_ - if `true`, returns the full [transaction objects](objects.md#transaction-object); if `false`, returns the transaction hashes + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object), or `null` when there is no block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", false],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockByHash", + "params": [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + false + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": { + "number": "0x68b3", + "hash": "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "mixHash": "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", + "parentHash": "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", + "nonce": "0x378da40ff335b070", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", + "transactionsRoot": "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", + "stateRoot": "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", + "receiptsRoot": "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", + "miner": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "difficulty": "0x66e619a", + "totalDifficulty": "0x1e875d746ae", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "size": "0x334", + "gasLimit": "0x47e7c4", + "gasUsed": "0x37993", + "timestamp": "0x5835c54d", + "uncles": [], + "transactions": [ + "0xa0807e117a8dd124ab949f460f08c36c72b710188f01609595223b325e58e0fc", + "0xeae6d797af50cb62a596ec3939114d63967c374fa57de9bc0f4e2b576ed6639d" + ], + "baseFeePerGas": "0x7" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (hash : \"0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92\") {number transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92") { + number + transactions { + hash + } + timestamp + difficulty + totalDifficulty + gasUsed + gasLimit + hash + nonce + ommerCount + logsBloom + mixHash + ommerHash + extraData + stateRoot + receiptsRoot + transactionCount + transactionsRoot + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17607, + "transactions": [], + "timestamp": "0x5cdbdfb5", + "difficulty": "0x1", + "totalDifficulty": "0x44c8", + "gasUsed": 0, + "gasLimit": 4700000, + "hash": "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92", + "nonce": "0x0000000000000000", + "ommerCount": 0, + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b841fae6d25da0b91e3e88669d0a765c98479d86d53e9ea1f3fb6b36d7ff22fa622a3da0c49c20e5562c774e90acae8ad487936f6b6019cd8a782db684693cba1e9800", + "stateRoot": "0xa7086c266aed46cd3bc45579178f8acb36d9d147de575a3ecbf8c7e6f1c737fc", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "transactionCount": 0, + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "baseFeePerGas": "0x7" + } + } +} +``` + + + +### `eth_getBlockByNumber` + +Returns information about the block matching the specified block number. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, `pending`, `finalized`, or `safe` as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `verbose`: _boolean_ - if `true`, returns the full [transaction objects](objects.md#transaction-object); if `false`, returns only the hashes of the transactions. + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object), or `null` when there is no block. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x68B3", true],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": ["0x68B3", true], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "number": "0x68b3", + "hash": "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "mixHash": "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", + "parentHash": "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", + "nonce": "0x378da40ff335b070", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", + "transactionsRoot": "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", + "stateRoot": "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", + "receiptsRoot": "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", + "miner": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "difficulty": "0x66e619a", + "totalDifficulty": "0x1e875d746ae", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "size": "0x334", + "gasLimit": "0x47e7c4", + "gasUsed": "0x37993", + "timestamp": "0x5835c54d", + "uncles": [], + "transactions": [], + "baseFeePerGas": "0x7" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (number : 100) {transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot ommers{hash} ommerAt(index : 1){hash} miner{address} account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){balance} parent{hash} }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 100) { + transactions { + hash + } + timestamp + difficulty + totalDifficulty + gasUsed + gasLimit + hash + nonce + ommerCount + logsBloom + mixHash + ommerHash + extraData + stateRoot + receiptsRoot + transactionCount + transactionsRoot + ommers { + hash + } + ommerAt(index: 1) { + hash + } + miner { + address + } + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + balance + } + parent { + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactions": [], + "timestamp": "0x5cd10933", + "difficulty": "0x1", + "totalDifficulty": "0x65", + "gasUsed": 0, + "gasLimit": 4700000, + "hash": "0x63b3ea2bc37fec8f82680eb823652da6af8acebb4f6c4d0ff659c55be473c8b0", + "nonce": "0x0000000000000000", + "ommerCount": 0, + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8414d877d8d0ced37ea138fab55a978f3740367a24a31731322ecdc3368f11e0d4966c9ce17ae59a76fb94eb436e8a386868f6bd6b0a5678e58daf49f5dd940558b00", + "stateRoot": "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "transactionCount": 0, + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "ommers": [], + "ommerAt": null, + "miner": { + "address": "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + }, + "account": { + "balance": "0xad0f47f269cbf31ac" + }, + "parent": { + "hash": "0x7bca25e1fa5e395fd6029eb496a70b6b5495843976bf9e49b993c723ded29d9e" + }, + "baseFeePerGas": "0x7" + } + } +} +``` + + + +### `eth_getBlockTransactionCountByHash` + +Returns the number of transactions in the block matching the specified block hash. + +#### Parameters + +`hash`: _string_ - 32-byte block hash + +#### Returns + +`result`: _number_ - integer representing the number of transactions in the specified block, or `null` if no matching block hash is found + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockTransactionCountByHash", + "params": [ + "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": null +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097\"){transactionCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097") { + transactionCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionCount": 1 + } + } +} +``` + + + +### `eth_getBlockTransactionCountByNumber` + +Returns the number of transactions in a block matching the specified block number. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - integer representing the number of transactions in the specified block, or `null` if no matching block number is found + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0xe8"],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockTransactionCountByNumber", + "params": ["0xe8"], + "id": 51 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x8" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:232){transactionCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 232) { + transactionCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionCount": 1 + } + } +} +``` + + + +### `eth_getCode` + +Returns the code of the smart contract at the specified address. Besu stores compiled smart contract code as a hexadecimal value. + +#### Parameters + +`address`: _string_ - 20-byte contract address + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _data_ - code stored at the specified address + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getCode", + "params": ["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{account(address: \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\"){ code }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xa50a51c09a5c451c52bb714527e1974b686d8e77") { + code + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "code": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" + } + } +} +``` + + + +### `eth_getFilterChanges` + +Polls the specified filter and returns an array of changes that have occurred since the last poll. + +#### Parameters + +`filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _strings_ or _objects_ - if nothing changed since the last poll, an empty list; otherwise: + +- For filters created with `eth_newBlockFilter`, returns block hashes. + +- For filters created with `eth_newPendingTransactionFilter`, returns transaction hashes. + +- For filters created with `eth_newFilter`, returns [log objects](objects.md#log-object). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0xf8bf5598d9e04fbe84523d42640b9b0e"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getFilterChanges", + "params": ["0xf8bf5598d9e04fbe84523d42640b9b0e"], + "id": 1 +} +``` + +# JSON result + +```json title="Example result from a filter created with eth_newBlockFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0xda2bfe44bf85394f0d6aa702b5af89ae50ae22c0928c18b8903d9269abe17e0b", + "0x88cd3a37306db1306f01f7a0e5b25a9df52719ad2f87b0f88ee0e6753ed4a812", + "0x4d4c731fe129ff32b425e6060d433d3fde278b565bbd1fd624d5a804a34f8786" + ] +} +``` + +```json title="Example result from a filter created with eth_newPendingTransactionFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x1e977049b6db09362da09491bee3949d9362080ce3f4fc19721196d508580d46", + "0xa3abc4b9a4e497fd58dc59cdff52e9bb5609136bcd499e760798aa92802769be" + ] +} +``` + +```json title="Example result from a filter created with eth_newFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x233", + "blockHash": "0xfc139f5e2edee9e9c888d8df9a2d2226133a9bd87c88ccbd9c930d3d4c9f9ef5", + "transactionHash": "0x66e7a140c8fa27fe98fde923defea7562c3ca2d6bb89798aabec65782c08f63d", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000004", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x238", + "blockHash": "0x98b0ec0f9fea0018a644959accbe69cd046a8582e89402e1ab0ada91cad644ed", + "transactionHash": "0xdb17aa1c2ce609132f599155d384c0bc5334c988a6c368056d7e167e23eee058", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000007", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + + + +### `eth_getFilterLogs` + +Returns an array of [logs](../../concepts/events-and-logs.md) for the specified filter. + +Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option at the default value of `true` to improve log retrieval performance. + +:::note + +`eth_getFilterLogs` is only used for filters created with `eth_newFilter`. To specify a filter object and get logs without creating a filter, use `eth_getLogs`. + +::: + +#### Parameters + +`filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](objects.md#log-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x5ace5de3985749b6a1b2b0d3f3e1fb69"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getFilterLogs", + "params": ["0x5ace5de3985749b6a1b2b0d3f3e1fb69"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb3", + "blockHash": "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", + "transactionHash": "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000003", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb6", + "blockHash": "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", + "transactionHash": "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + + + +### `eth_getLogs` + +Returns an array of [logs](../../concepts/events-and-logs.md) matching a specified filter object. + +Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option at the default value of `true` to improve log retrieval performance. + +:::caution + +Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from its genesis block, might cause Besu to hang for an indeterminable amount of time while generating the response. We recommend setting a range limit using the [`--rpc-max-logs-range`](../cli/options.md#rpc-max-logs-range) option (or leaving it at its default value of 1000). + +::: + +#### Parameters + +`filterOptions`: _object_ - [filter options object](objects.md#filter-options-object) + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](objects.md#log-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":"earliest", "toBlock":"latest", "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", "topics":[]}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "topics": [] + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb3", + "blockHash": "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", + "transactionHash": "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000003", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb6", + "blockHash": "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", + "transactionHash": "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{logs(filter:{fromBlock: 1486000, toBlock: 1486010, addresses: [\"0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d\"], topics: [[\"0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d\"]]}) {index topics data account{address} transaction{hash} }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + logs(filter: {fromBlock: 1486000, toBlock: 1486010, addresses: ["0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d"], topics: [["0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d"]]}) { + index + topics + data + account { + address + } + transaction { + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "logs": [ + { + "index": 0, + "topics": [ + "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000508918" + ], + "data": "0xa5a04999ec29a8bd19ce32b859280ef9dbb464d846be06f64a1b1012ec08ab03", + "account": { + "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" + }, + "transaction": { + "hash": "0x36a2186344c6a32760e7700fdf3685936220876c51ff39d071eb48c17f7e802f" + } + }, + { + "index": 0, + "topics": [ + "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000648c72" + ], + "data": "0x0ee96b660ad82c8010c90760a03edfbb40b4af5e3634a8c214e4ac7fa1f61492", + "account": { + "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" + }, + "transaction": { + "hash": "0x9e2cc9e84a9e78839d6f4b591dfd98cc7a454a8ee3cd6ccd0a18e662e22d3818" + } + } + ] + } +} +``` + + + +### `eth_getMinerDataByBlockHash` + +Returns miner data for the specified block. + +#### Parameters + +`hash`: _string_ - 32-byte block hash + +#### Returns + +`result`: _object_ - [miner data object](objects.md#miner-data-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockHash","params": ["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getMinerDataByBlockHash", + "params": [ + "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "netBlockReward": "0x47c6f3739f3da800", + "staticBlockReward": "0x4563918244f40000", + "transactionFee": "0x38456548220800", + "uncleInclusionReward": "0x22b1c8c1227a000", + "uncleRewards": [ + { + "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", + "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" + } + ], + "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "difficulty": "0x7348c20", + "totalDifficulty": "0xa57bcfdd96" + } +} +``` + + + +### `eth_getMinerDataByBlockNumber` + +Returns miner data for the specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _object_ - [miner data object](objects.md#miner-data-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockNumber","params": ["0x7689D2"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getMinerDataByBlockNumber", + "params": ["0x7689D2"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "netBlockReward": "0x47c6f3739f3da800", + "staticBlockReward": "0x4563918244f40000", + "transactionFee": "0x38456548220800", + "uncleInclusionReward": "0x22b1c8c1227a000", + "uncleRewards": [ + { + "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", + "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" + } + ], + "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "difficulty": "0x7348c20", + "totalDifficulty": "0xa57bcfdd96" + } +} +``` + + + +### `eth_getProof` + +Returns the account and storage values of the specified account, including the Merkle proof. + +The API allows IoT devices or mobile apps which are unable to run light clients to verify responses from untrusted sources, by using a trusted block hash. + +#### Parameters + +`address`: _string_ - 20-byte address of the account or contract + +`keys`: _array_ of _strings_ - list of 32-byte storage keys to generate proofs for + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _object_ - account details object with the following fields: + +- `balance`: _string_ - account balance + +- `codeHash`: _string_ - 32-byte hash of the account code + +- `nonce`: _string_ - number of transactions sent from the account + +- `storageHash`: _string_ - 32-byte SHA3 of the `storageRoot` + +- `accountProof`: _array_ of _strings_ - list of RLP-encoded Merkle tree nodes, starting with the `stateRoot` + +- `storageProof`: _array_ of _objects_ - list of storage entry objects with the following fields: + + - `key`: _string_ - storage key + + - `value`: _string_ - storage value + + - `proof`: _array_ of _strings_ - list of RLP-encoded Merkle tree nodes, starting with the `storageHash` + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getProof","params": [ +"0a8156e7ee392d885d10eaa86afd0e323afdcd95", ["0x0000000000000000000000000000000000000000000000000000000000000347"], "latest"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getProof", + "params": [ + "0a8156e7ee392d885d10eaa86afd0e323afdcd95", + ["0x0000000000000000000000000000000000000000000000000000000000000347"], + "latest" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "accountProof": [ + "0xf90211a0...608d898380", + "0xf90211a0...ec33f19580", + "0xf901d1a0...9e55584480", + "0xf8718080...18e5777142" + ], + "address": "0x0a8156e7ee392d885d10eaa86afd0e323afdcd95", + "balance": "0x0", + "codeHash": "0x2b6975dcaf69f9bb9a3b30bb6a37b305ce440250bf0dd2f23338cb18e5777142", + "nonce": "0x5f", + "storageHash": "0x917688de43091589aa58c1dfd315105bc9de4478b9ba7471616a4d8a43d46203", + "storageProof": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000347", + "value": "0x0", + "proof": [ + "0xf90211a0...5176779280", + "0xf901f1a0...c208d86580", + "0xf8d180a0...1ce6808080" + ] + } + ] + } +} +``` + + + +### `eth_getStorageAt` + +Returns the value of a storage position at a specified address. + +#### Parameters + +`address`: _string_ - 20-byte storage address + +`index`: _string_ - integer index of the storage position + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result` : _string_ - value at the specified storage position + +Calculating the correct position depends on the storage you want to retrieve. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getStorageAt","params": ["0x‭3B3F3Eâ€Ŧ","0x0","latest"],"id": 53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getStorageAt", + "params": ["0x‭3B3F3Eâ€Ŧ", "0x0", "latest"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") {storage(slot: \"0x04\")}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + storage(slot: "0x04") + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "storage": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } +} +``` + + + +### `eth_getTransactionByBlockHashAndIndex` + +Returns transaction information for the specified block hash and transaction index position. + +#### Parameters + +`block`: _string_ - 32-byte hash of a block + +`index`: _string_ - integer representing the transaction index position + +#### Returns + +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", "0x2"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByBlockHashAndIndex", + "params": [ + "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "0x2" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "blockNumber": "0x1442e", + "chainId": 2018, + "from": "0x70c9217d814985faef62b124420f8dfbddd96433", + "gas": "0x3d090", + "gasPrice": "0x57148a6be", + "hash": "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", + "input": "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", + "nonce": "0x2cb2", + "to": "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", + "transactionIndex": "0x2", + "value": "0x0", + "v": "0x2a", + "r": "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", + "s": "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{ block(hash: \"0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69\") { transactionAt(index: 0) {block{hash} hash } } }"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69") { + transactionAt(index: 0) { + block { + hash + } + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionAt": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" + } + } + } +} +``` + + + +### `eth_getTransactionByBlockNumberAndIndex` + +Returns transaction information for the specified block number and transaction index position. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +`index`: _string_ - transaction index position + +#### Returns + +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +This request returns the third transaction in the 82990 block on the Ropsten testnet. You can also view this [block](https://ropsten.etherscan.io/txs?block=82990) and [transaction] on Etherscan. + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["82990", "0x2"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByBlockNumberAndIndex", + "params": ["82990", "0x2"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "blockNumber": "0x1442e", + "chainId": 2018, + "from": "0x70c9217d814985faef62b124420f8dfbddd96433", + "gas": "0x3d090", + "gasPrice": "0x57148a6be", + "hash": "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", + "input": "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", + "nonce": "0x2cb2", + "to": "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", + "transactionIndex": "0x2", + "value": "0x0", + "v": "0x2a", + "r": "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", + "s": "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{block(number:20303) {transactionAt(index: 0) {block{hash} hash}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 20303) { + transactionAt(index: 0) { + block { + hash + } + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionAt": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" + } + } + } +} +``` + + + +### `eth_getTransactionByHash` + +Returns transaction information for the specified transaction hash. + +#### Parameters + +`transaction`: _string_ - 32-byte transaction hash + +#### Returns + +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByHash", + "params": [ + "0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": { + "blockHash": "0x510efccf44a192e6e34bcb439a1947e24b86244280762cbb006858c237093fda", + "blockNumber": "0x422", + "chainId": 2018, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0x3b9aca00", + "hash": "0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44", + "input": "0x", + "nonce": "0x1", + "to": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "transactionIndex": "0x0", + "value": "0x4e1003b28d9280000", + "v": "0xfe7", + "r": "0x84caf09aefbd5e539295acc67217563438a4efb224879b6855f56857fa2037d3", + "s": "0x5e863be3829812c81439f0ae9d8ecb832b531d651fb234c848d1bf45e62be8b9" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash : \"0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d\") { block{hash} gas gasPrice hash nonce value from {address} to {address} status}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + transaction(hash: "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d") { + block { + hash + } + gas + gasPrice + hash + nonce + value + from { + address + } + to { + address + } + status + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "transaction": { + "block": { + "hash": "0xb1ef35744bade6980c3a933024b2557a8c724a19e5fdd2116bac712aa5e57198" + }, + "gas": 21000, + "gasPrice": "0x2540be400", + "hash": "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d", + "nonce": 6, + "value": "0x8ac7230489e80000", + "from": { + "address": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + }, + "to": { + "address": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" + }, + "status": 1 + } + } +} +``` + + + +### `eth_getTransactionCount` + +Returns the number of transactions sent from a specified address. Use the `pending` tag to get the next account nonce not used by any pending transactions. + +#### Parameters + +`address`: _string_ - 20-byte account address + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - integer representing the number of transactions sent from the specified address + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xc94770007dda54cF92009BFF0dE90c06F603a09f","latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionCount", + "params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f", "latest"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account (address:\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){transactionCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + transactionCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "transactionCount": 5 + } + } +} +``` + + + +### `eth_getTransactionReceipt` + +Returns the receipt of a transaction by transaction hash. Receipts for pending transactions are not available. + +If you enabled [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md), the receipt includes available revert reasons in the response. + +#### Parameters + +`transaction`: _string_ - 32-byte hash of a transaction + +#### Returns + +`result`: _object_ - [transaction receipt object](objects.md#transaction-receipt-object), or `null` when there is no receipt + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionReceipt", + "params": [ + "0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": null, + "cumulativeGasUsed": "0x5208", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gasUsed": "0x5208", + "effectiveGasPrice": "0x1", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", + "transactionIndex": "0x0" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash: \"0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86\") {block{hash logsBloom} hash createdContract{address} cumulativeGasUsed gas gasUsed logs{topics} from{address} to{address} index}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + transaction(hash: "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86") { + block { + hash + logsBloom + } + hash + createdContract { + address + } + cumulativeGasUsed + gas + gasUsed + logs { + topics + } + from { + address + } + to { + address + } + index + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "transaction": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86", + "createdContract": null, + "cumulativeGasUsed": 21000, + "gas": 21000, + "gasUsed": 21000, + "effectiveGasPrice": "0x1", + "logs": [], + "from": { + "address": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + }, + "to": { + "address": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" + }, + "index": 0 + } + } +} +``` + + + +### `eth_getUncleByBlockHashAndIndex` + +Returns uncle specified by block hash and index. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +`uncleIndex`: _string_ - index of the uncle + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object) + +:::note + +Uncles don't contain individual transactions. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", "0x0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleByBlockHashAndIndex", + "params": [ + "0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", + "0x0" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x76b123df93230", + "extraData": "0x50505945206e616e6f706f6f6c2e6f7267", + "gasLimit": "0x7a121d", + "gasUsed": "0x7a0175", + "hash": "0xc20189c0b1a4a23116ab3b177e929137f6e826f17fc4c2e880e7258c620e9817", + "logsBloom": "0x890086c024487ca422be846a201a10e41bc2882902312116c1119609482031e9c000e2a708004a10281024028020c505727a12570c4810121c59024490b040894406a1c23c37a0094810921da3923600c71c03044b40924280038d07ab91964a008084264a01641380798840805a284cce201a8026045451002500113a00de441001320805ca2840037000111640d090442c11116d2112948084240242340400236ce81502063401dcc214b9105194d050884721c1208800b20501a4201400276004142f118e60808284506979a86e050820101c170c185e2310005205a82a2100382422104182090184800c02489e033440218142140045801c024cc1818485", + "miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", + "mixHash": "0xf557cc827e058862aa3ea1bd6088fb8766f70c0eac4117c56cf85b7911f82a14", + "nonce": "0xd320b48904347cdd", + "number": "0x768964", + "parentHash": "0x98d752708b3677df8f439c4529f999b94663d5494dbfc08909656db3c90f6255", + "receiptsRoot": "0x0f838f0ceb73368e7fc8d713a7761e5be31e3b4beafe1a6875a7f275f82da45b", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "size": "0x21a", + "stateRoot": "0xa0c7d4fca79810c89c517eff8dadb9c6d6f4bcc27c2edfb301301e1cf7dec642", + "timestamp": "0x5cdcbba6", + "totalDifficulty": "0x229ad33cabd4c40d23d", + "transactionsRoot": "0x866e38e91d01ef0387b8e07ccf35cd910224271ccf2b7477b8c8439e8b70f365", + "uncles": [] + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\"){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7") { + ommerAt(index: 0) { + difficulty + extraData + gasLimit + gasUsed + hash + logsBloom + mixHash + nonce + number + receiptsRoot + stateRoot + timestamp + totalDifficulty + transactionsRoot + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "difficulty": "0x1", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8418e98ef756acdae1e510b1df4b507b7af04eb3802db7fa0f3e73e7d0721b3645e76f4eb3d0dbf0de75620c4405bd5a663247cdd9616482c883053856d857f884a01", + "gasLimit": 4700000, + "gasUsed": 0, + "hash": "0x0efe67972b982eb6be5df84e5238eb07475f86afa8a7de708f6a13ac0ff60d6c", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "nonce": "0x0000000000000000", + "number": 200, + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", + "timestamp": "0x5cd109fb", + "totalDifficulty": "0xc9", + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" + } + } +} +``` + + + +### `eth_getUncleByBlockNumberAndIndex` + +Returns uncle specified by block number and index. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `uncleIndex`: _string_ - index of the uncle + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object) + +:::note + +Uncles do not contain individual transactions. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x7689D2", "0x0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleByBlockNumberAndIndex", + "params": ["0x7689D2", "0x0"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x77daec467bf93", + "extraData": "0x50505945206e616e6f706f6f6c2e6f7267", + "gasLimit": "0x7a121d", + "gasUsed": "0x7a0f7b", + "hash": "0x42d83ae9c0743f4b1f9c61ff7ea8b164c1bab3627decd49233760680be006ecf", + "logsBloom": "0x888200800000340120220008640200500408006100038400100581c000080240080a0014e8002010080004088040004022402a000c18010001400100002a041141a0610a0052900600041018c0002a0003090020404c00206010010513d00020005380124e08050480710000000108401012b0901c1424006000083a10a8c1040100a0440081050210124400040044304070004001100000012600806008061d0320800000b40042160600002480000000800000c0002100200940801c000820800048024904710000400640490026000a44300309000286088010c2300060003011380006400200812009144042204810209020410a84000410520c08802941", + "miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", + "mixHash": "0xf977fcdb52868be410b75ef2becc35cc312f13ab0a6ce400ecd9d445f66fa3f2", + "nonce": "0x628b28403bf1e3d3", + "number": "0x7689d0", + "parentHash": "0xb32cfdfbf4adb05d30f02fcc6fe039cc6666402142954051c1a1cb9cc91aa11e", + "receiptsRoot": "0x9c7c8361d1a24ea2841432234c81974a9920d3eba2b2b1c496b5f925a95cb4ac", + "sha3Uncles": "0x7d972aa1b182b7e93f1db043f03fbdbfac6874fe7e67e162141bcc0aefa6336b", + "size": "0x21a", + "stateRoot": "0x74e97b77813146344d75acb5a52a006cc6dfaca678a10fb8a484a8443e919272", + "timestamp": "0x5cdcc0a7", + "totalDifficulty": "0x229b0583b4bd2698ca0", + "transactionsRoot": "0x1d21626afddf05e5866de66ca3fcd98f1caf5357eba0cc6ec675606e116a891b", + "uncles": [] + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:2587){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 2587) { + ommerAt(index: 0) { + difficulty + extraData + gasLimit + gasUsed + hash + logsBloom + mixHash + nonce + number + receiptsRoot + stateRoot + timestamp + totalDifficulty + transactionsRoot + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerAt": null + } + } +} +``` + + + +### `eth_getUncleCountByBlockHash` + +Returns the number of uncles in a block from a block matching the given block hash. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +#### Returns + +`result`: _string_ - integer representing the number of uncles in the specified block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleCountByBlockHash", + "params": [ + "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 0x0 +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426\"){ommerCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426") { + ommerCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerCount": 2 + } + } +} +``` + + + +### `eth_getUncleCountByBlockNumber` + +Returns the number of uncles in a block matching the specified block number. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - integer representing the number of uncles in the specified block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleCountByBlockNumber", + "params": ["0xe8"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:\"0x59fd\"){ommerCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: "0x59fd") { + ommerCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerCount": 0 + } + } +} +``` + + + +### `eth_getWork` + +Returns the hash of the current block, the seed hash, and the required target boundary condition. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - array with the following items: + +- `header`: _string_ - 32-byte hash of the current block header (PoW-hash) + +- `seed`: _string_ - 32-byte seed hash used for the DAG + +- `target`: _string_ - 32-byte required target boundary condition: 2^256 / difficulty + +- `blockNumber`: _string_ - hexadecimal integer representing the current block number + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getWork","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_getWork", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0xce5e32ca59cb86799a1879e90150b2c3b882852173e59865e9e79abb67a9d636", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3", + "0x42" + ] +} +``` + + + +### `eth_hashrate` + +Returns the number of hashes per second with which the node is mining. + +When the stratum server is enabled, this method returns the cumulative hashrate of all sealers reporting their hashrate. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - number of hashes per second + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x12b" +} +``` + + + +### `eth_mining` + +Whether the client is actively mining new blocks. Besu pauses mining while the client synchronizes with the network regardless of command settings or methods called. + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - indicates if the client is actively mining new blocks + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_mining", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": true +} +``` + + + +### `eth_newBlockFilter` + +Creates a filter to retrieve new block hashes. To poll for new blocks, use [`eth_getFilterChanges`](#eth_getfilterchanges). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_newBlockFilter", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x9d78b6780f844228b96ecc65a320a825" +} +``` + + + +### `eth_newFilter` + +Creates a [log filter](../../concepts/events-and-logs.md). To poll for logs associated with the created filter, use [`eth_getFilterChanges`](#eth_getfilterchanges). To get all logs associated with the filter, use [`eth_getFilterLogs`](#eth_getfilterlogs). + +#### Parameters + +`filterOptions`: _object_ - [filter options object](objects.md#filter-options-object) + +:::note + +`fromBlock` and `toBlock` in the filter options object default to `latest`. + +::: + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"fromBlock":"earliest", "toBlock":"latest", "topics":[]}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_newFilter", + "params": [{ "fromBlock": "earliest", "toBlock": "latest", "topics": [] }], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1ddf0c00989044e9b41cc0ae40272df3" +} +``` + + + +### `eth_newPendingTransactionFilter` + +Creates a filter to retrieve new pending transactions hashes. To poll for new pending transactions, use [`eth_getFilterChanges`](#eth_getfilterchanges). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_newPendingTransactionFilter", + "params": [], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x443d6a77c4964707a8554c92f7e4debd" +} +``` + + + +### `eth_protocolVersion` + +Returns current Ethereum protocol version. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - Ethereum protocol version + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_protocolVersion", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x3f" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{protocolVersion}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + protocolVersion +} +``` + +# GraphQL result + +```json +{ + "data": { + "protocolVersion": 63 + } +} +``` + + + +### `eth_sendRawTransaction` + +Sends a [signed transaction](../../how-to/send-transactions.md). A transaction can send ether, deploy a contract, or interact with a contract. Set the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../cli/options.md#rpc-tx-feecap) CLI option. + +You can interact with contracts using `eth_sendRawTransaction` or [`eth_call`](#eth_call). + +To avoid exposing your private key, create signed transactions offline and send the signed transaction data using `eth_sendRawTransaction`. + +:::info + +Besu doesn't implement [`eth_sendTransaction`](../../how-to/send-transactions.md). + +[EthSigner](https://docs.ethsigner.consensys.net/) provides transaction signing and implements [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). + +::: + +#### Parameters + +`transaction`: _string_ - signed transaction serialized to hexadecimal format + +:::note + +[Creating and sending transactions](../../how-to/send-transactions.md) includes examples of creating signed transactions using the [web3.js](https://github.com/ethereum/web3.js/) library. + +::: + +#### Returns + +`result`: _string_ - 32-byte transaction hash + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_sendRawTransaction", + "params": [ + "0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation {sendRawTransaction(data: \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\")}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +mutation { + sendRawTransaction(data: "0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833") +} +``` + +# GraphQL result + +```json +{ + "data": { + "sendRawTransaction": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" + } +} +``` + + + +### `eth_submitHashrate` + +Submits the mining hashrate. This is used by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer). + +#### Parameters + +- `hashrate`: _string_ - 32-byte hexadecimal string representation of the hashrate + +- `id`: _string_ - 32-byte random hexadecimal ID identifying the client + +#### Returns + +`result`: _boolean_ - indicates if submission is successful + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitHashrate", "params":["0x0000000000000000000000000000000000000000000000000000000000500000", "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_submitHashrate", + "params": [ + "0x0000000000000000000000000000000000000000000000000000000000500000", + "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `eth_submitWork` + +Submits a proof of work (Ethash) solution. This is used by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer). + +#### Parameters + +- `nonce`: _string_ - retrieved 8-byte nonce + +- `header`: _string_ - 32-byte hash of the block header (PoW-hash) + +- `digest`: _string_ - 32-bytes mix digest + +#### Returns + +`result`: _boolean_ - indicates if the provided solution is valid + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":73} +``` + +# JSON result + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": true +} +``` + + + +### `eth_syncing` + +Returns an object with data about the synchronization status, or `false` if not synchronizing. + +:::note + +Once the node reaches the head of the chain, `eth_syncing` returns false, indicating that there is no active syncing target. + +::: + +#### Parameters + +None + +#### Returns + +`result`: _object_ or _boolean_ - synchronization status data object with the following fields, or `false` if not synchronizing: + +- `startingBlock`: _string_ - index of the highest block on the blockchain when the network synchronization starts + +- `currentBlock`: _string_ - index of the latest block (also known as the best block) for the current node (this is the same index that [`eth_blockNumber`](#eth_blocknumber) returns.) + +- `highestBlock`: _string_ - index of the highest known block in the peer network (that is, the highest block so far discovered among peer nodes. This is the same value as `currentBlock` if the current node has no peers.) + +- `pulledStates`: _string_ - if fast synchronizing, the number of state entries fetched so far, or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, this field is not returned.) + +- `knownStates`: _string_ - if fast synchronizing, the number of states the node knows of so far, or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, this field is not returned.) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_syncing", "params": [], "id": 51 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x1518", + "highestBlock": "0x9567a3", + "pulledStates": "0x203ca", + "knownStates": "0x200636" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock pulledStates knownStates}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + syncing { + startingBlock + currentBlock + highestBlock + pulledStates + knownStates + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "syncing": { + "startingBlock": 0, + "currentBlock": 5400, + "highestBlock": 9791395, + "pullStates": 132042, + "knownStates": 2098742 + } + } +} +``` + + + +### `eth_uninstallFilter` + +Uninstalls a filter with the specified ID. When a filter is no longer required, call this method. + +Filters time out when not requested by [`eth_getFilterChanges`](#eth_getfilterchanges) or [`eth_getFilterLogs`](#eth_getfilterlogs) for 10 minutes. + +#### Parameters + +`filterId`: _string_ - filter ID + +#### Returns + +`result`: _boolean_ - indicates if the filter is successfully uninstalled + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0x70355a0b574b437eaa19fe95adfedc0a"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_uninstallFilter", + "params": ["0x70355a0b574b437eaa19fe95adfedc0a"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `MINER` methods + +The `MINER` API methods allow you to control the node’s mining operation. + +:::note + +The `MINER` API methods are not enabled by default for JSON-RPC. To enable the `MINER` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `miner_changeTargetGasLimit` + +Updates the target gas limit set using the [`--target-gas-limit`](../cli/options.md#target-gas-limit) command line option. + +#### Parameters + +`gasPrice`: _number_ - target gas price in Wei + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_changeTargetGasLimit","params":[800000], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "miner_changeTargetGasLimit", + "params": [800000], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `miner_setCoinbase` + +Sets the coinbase, the address for the mining rewards. + +:::note + +You can also use `miner_setEtherbase` as an alternative method. They both work the same way. Etherbase is a historic name for coinbase. + +::: + +#### Parameters + +`coinbase`: _string_ - Account address you pay mining rewards to + +#### Returns + +`result`: _boolean_ - `true` when address is set + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_setCoinbase","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "miner_setCoinbase", + "params": ["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `miner_start` + +Starts the mining process. To start mining, you must first specify a miner coinbase using the [`--miner-coinbase`](../cli/options.md#miner-coinbase) command line option or using [`miner_setCoinbase`](#miner_setcoinbase). + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - `true` if mining starts, or if the node is already mining + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_start","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "miner_start", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `miner_stop` + +Stops the mining process on the client. + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - `true` if mining stops, or if the node is not mining + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_stop","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "miner_stop", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `NET` methods + +The `NET` API methods provide network-related information. + +### `net_enode` + +Returns the [enode URL](../../concepts/node-keys.md#enode-url). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of the node + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_enode","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"net_enode","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "enode://6a63160d0ccef5e4986d270937c6c8d60a9a4d3b25471cda960900d037c61988ea14da67f69dbfb3497c465d0de1f001bb95598f74b68a39a5156a608c42fa1b@127.0.0.1:30303" +} +``` + + + +### `net_listening` + +Whether the client is actively listening for network connections. + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - indicates if the client is actively listening for network connections + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"net_listening","params":[],"id":53} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": true +} +``` + + + +### `net_peerCount` + +Returns the number of peers currently connected to the client. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - number of connected peers in hexadecimal + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "net_peerCount", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5" +} +``` + + + +### `net_services` + +Returns enabled services (for example, `jsonrpc`) and the host and port for each service. + +:::note + +The [`--nat-method`](../cli/options.md#nat-method) setting affects the JSON-RPC and P2P host and port values, but not the metrics host and port values. + +::: + +#### Parameters + +None + +#### Returns + +`result`: _object_ - enabled services + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_services","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"net_services","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "jsonrpc": { + "host": "127.0.0.1", + "port": "8545" + }, + "p2p": { + "host": "127.0.0.1", + "port": "30303" + }, + "metrics": { + "host": "127.0.0.1", + "port": "9545" + } + } +} +``` + + + +### `net_version` + +Returns the [network ID](../../concepts/network-and-chain-id.md). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - current network ID + +| Network ID | Chain | Network | Description | +| ---------- | ----- | ------- | ----------------------------- | +| `1` | ETH | Mainnet | Main Ethereum network | +| `5` | ETH | Goerli | PoS test network | +| `11155111` | ETH | Sepolia | PoS test network | +| `2018` | ETH | Dev | PoW development network | +| `1` | ETC | Classic | Main Ethereum Classic network | +| `7` | ETC | Mordor | PoW test network | +| `6` | ETC | Kotti | PoA test network using Clique | +| `212` | ETC | Astor | PoW test network | + +:::note + +For almost all networks, network ID and chain ID are the same. + +The only networks in the table above with different network and chain IDs are Classic with a chain ID of `61` and Mordor with a chain ID of `63`. + +::: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "net_version", "params": [], "id": 53 } +``` + +# JSON result for Mainnet + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "1" +} +``` + +# JSON result for Goerli + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "5" +} +``` + + + +## `PLUGINS` methods + +The `PLUGINS` API methods provide plugin-related functionality. + +:::note + +The `PLUGINS` API methods are not enabled by default for JSON-RPC. To enable the `PLUGINS` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `plugins_reloadPluginConfig` + +Reloads specified plugin configuration. + +#### Parameters + +`plugin`: _string_ - plugin + +#### Returns + +`result`: _string_ - `Success` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"plugins_reloadPluginConfig","params":["tech.pegasys.plus.plugin.kafka.KafkaPlugin"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "plugins_reloadPluginConfig", + "params": ["tech.pegasys.plus.plugin.kafka.KafkaPlugin"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +## `TRACE` methods + +The `TRACE` API is a more concise alternative to the [`DEBUG` API](#debug-methods). + +:::note + +The `TRACE` API methods are not enabled by default for JSON-RPC. To enable the `TRACE` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `trace_block` + +Provides transaction processing of [type `trace`](../trace-types.md#trace) for the specified block. + +:::tip + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_block","params":["0x6"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "trace_block", "params": ["0x6"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad82", + "input": "0x0000000000000000000000000000000000000999", + "to": "0x0020000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": { + "gasUsed": "0x7536", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "call" + }, + { + "action": { + "address": "0x0020000000000000000000000000000000000000", + "balance": "0x300", + "refundAddress": "0x0000000000000999000000000000000000000000" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": null, + "subtraces": 0, + "traceAddress": [0], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "suicide" + }, + { + "action": { + "author": "0x0000000000000000000000000000000000000000", + "rewardType": "block", + "value": "0x1bc16d674ec80000" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": null, + "subtraces": 0, + "traceAddress": [], + "transactionHash": null, + "transactionPosition": null, + "type": "reward" + } + ], + "id": 1 +} +``` + + + +### `trace_call` + +Executes the given call and returns a number of possible traces for it. + +:::info + +The requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `call`: _object_ - [transaction call object](objects.md#transaction-call-object) + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73","to":"0x0010000000000000000000000000000000000000","gas":"0xfffff2","gasPrice":"0xef","value":"0x0","data":"0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002","nonce":"0x0"},["trace"],"latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_call", + "params": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "to": "0x0010000000000000000000000000000000000000", + "gas": "0xfffff2", + "gasPrice": "0xef", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002", + "nonce": "0x0" + }, + ["trace"], + "latest" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas" : "0xffabba", + "input" : "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002", + "to" : "0x0010000000000000000000000000000000000000", + "value" : "0x0" + }, + "result" : { + "gasUsed" : "0x9c58", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, +"id" : 2 +}, +``` + + + +### `trace_callMany` + +Performs multiple call traces on top of the same block. You can trace dependent transactions. + +:::info + +The requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "gas" : "0x1dcd12f8", + "input" : "0x", + "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "0x186a0" + }, + "result" : { + "gasUsed" : "0x0", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, + { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "gas" : "0x1dcd12f8", + "input" : "0x", + "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "0x186a0" + }, + "result" : { + "gasUsed" : "0x0", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, + ], +"id" : 1 +}, +``` + + + +### `trace_filter` + +Returns traces matching the specified filter. + +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +`traceFilterOptions`: _object_ - [trace filter options object](objects.md#trace-filter-options-object) + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_filter","params":[{"fromBlock":"0x1","toBlock":"0x21","after":2,"count":2,"fromAddress":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"]}],"id":415}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_filter", + "params": [ + { + "fromBlock": "0x1", + "toBlock": "0x21", + "after": 2, + "count": 2, + "fromAddress": ["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"] + } + ], + "id": 415 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad82", + "input": "0x0000000000000000000000000000000000000999", + "to": "0x0020000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0xcd5d9c7acdcbd3fb4b24a39e05a38e32235751bb0c9e4f1aa16dc598a2c2a9e4", + "blockNumber": 6, + "result": { + "gasUsed": "0x7536", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "call" + }, + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad52", + "input": "0xf000000000000000000000000000000000000000000000000000000000000001", + "to": "0x0030000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0xeed85fe57db751442c826cfe4fdf43b10a5c2bc8b6fd3a8ccced48eb3fb35885", + "blockNumber": 7, + "result": { + "gasUsed": "0x1b", + "output": "0xf000000000000000000000000000000000000000000000000000000000000002" + }, + "subtraces": 0, + "traceAddress": [], + "transactionHash": "0x47f4d445ea1812cb1ddd3464ab23d2bfc6ed408a8a9db1c497f94e8e06e85286", + "transactionPosition": 0, + "type": "call" + } + ], + "id": 415 +} +``` + + + +### `trace_get` + +Returns trace at given position. + +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `transaction`: _string_ - transaction hash + +- `indexPositions`: _array_ - Index positions of the traces + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_get","params":["0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3",["0x0"]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_get", + "params": [ + "0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3", + ["0x0"] + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "action" : { + "callType" : "call", + "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", + "gas" : "0x13e99", + "input" : "0x16c72721", + "to" : "0x2bd2326c993dfaef84f696526064ff22eba5b362", + "value" : "0x0" + }, + "blockHash" : "0x7eb25504e4c202cf3d62fd585d3e238f592c780cca82dacb2ed3cb5b38883add" + "blockNumber": 3068185, + "result": { + "gasUsed": "0x183", + "output" : "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "subtraces" : 0, + "traceAddress" : [ + 0 + ], + "transactionHash": "0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3", + "transactionPosition": 2, + "type" : "call" + }, +"id" : 1 +}, +``` + + + +### `trace_rawTransaction` + +Traces a call to `eth_sendRawTransaction` without making the call, returning the traces. + +:::info + +The requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `data` - _string_ - Raw transaction data + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_rawTransaction","params":["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",["trace"]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_rawTransaction", + "params": [ + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", + ["trace"] + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "output" : "0x" + "stateDiff": null, + "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", + "trace": [{ + "action": { ... }, + "result": { + "gasUsed": "0x0", + "output": "0x" + } + "subtraces": 0, + "traceAddress": [], + "type": "call" + }], + "vmTrace": null + }, +"id" : 1 +}, +``` + + + +### `trace_replayBlockTransactions` + +Provides transaction processing tracing per block. + +:::info + +When using [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries), the requested block must be within the number of [blocks retained](../cli/options.md#bonsai-maximum-back-layers-to-load) (by default, 512 from the head of the chain). + +When using [Forest](../../concepts/data-storage-formats.md#forest-of-tries), the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024 from head of the chain). + +::: + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +#### Returns + +`result`: _array_ of _objects_ - list of [transaction trace objects](objects.md#transaction-trace-object) containing one object per transaction, in transaction execution order; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the [`trace`](../trace-types.md#trace) list items in the returned transaction trace object include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_replayBlockTransactions","params": ["0x12",["trace","vmTrace","stateDiff"]],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_replayBlockTransactions", + "params": ["0x12", ["trace", "vmTrace", "stateDiff"]], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result":[ + { + "output":"0x", + "vmTrace":{ + "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", + "ops":[ + { + "cost":3, + "ex":{ + "mem":null, + "push":[ + "0x8" + ], + "store":null, + "used":16756175 + }, + "pc":72, + "sub":null + }, + ... + ] + }, + "trace":[ + { + "action":{ + "callType":"call", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0xffadea", + "input":"0x", + "to":"0x0100000000000000000000000000000000000000", + "value":"0x0" + }, + "result":{ + "gasUsed":"0x1e", + "output":"0x" + }, + "subtraces":0, + "traceAddress":[ + ], + "type":"call" + } + ], + "stateDiff":{ + "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ + "balance":{ + "*":{ + "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", + "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" + } + }, + "code":"=", + "nonce":{ + "*":{ + "from":"0x14", + "to":"0x15" + } + }, + "storage":{ + } + } + }, + "transactionHash":"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd", + }, + {...} + ] +} +``` + + + +### `trace_transaction` + +Provides transaction processing of [type `trace`](../trace-types.md#trace) for the specified transaction. + +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +`transaction`: _string_ - transaction hash + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_transaction","params": ["0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_transaction", + "params": [ + "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "creationMethod": "create", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gas": "0xff2e26", + "init": "0x60006000600060006000732c2b9c9a4a25e24b174f26114e8926a9f2128fe45af2600060006000600060007300a00000000000000000000000000000000000005af2", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "address": "0x30753e4a8aad7f8597332e813735def5dd395028", + "code": "0x", + "gasUsed": "0x1c39" + }, + "subtraces": 2, + "traceAddress": [], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "create" + }, + { + "action": { + "callType": "callcode", + "from": "0x30753e4a8aad7f8597332e813735def5dd395028", + "gas": "0xfb2ea9", + "input": "0x", + "to": "0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "gasUsed": "0x138e", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [0], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "call" + }, + { + "action": { + "address": "0x30753e4a8aad7f8597332e813735def5dd395028", + "balance": "0x0", + "refundAddress": "0x0000000000000000000000000000000000000000" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": null, + "subtraces": 0, + "traceAddress": [0, 0], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "suicide" + }, + { + "action": { + "callType": "callcode", + "from": "0x30753e4a8aad7f8597332e813735def5dd395028", + "gas": "0xfb18a5", + "input": "0x", + "to": "0x00a0000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "gasUsed": "0x30b", + "output": "0x" + }, + "subtraces": 0, + "traceAddress": [1], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "call" + } + ], + "id": 1 +} +``` + + + +## `TXPOOL` methods + +The `TXPOOL` API methods allow you to inspect the contents of the transaction pool. + +:::note + +The `TXPOOL` API methods are not enabled by default for JSON-RPC. To enable the `TXPOOL` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `txpool_besuPendingTransactions` + +Lists pending transactions that match the supplied filter conditions. + +#### Parameters + +- `numResults`: _number_ - integer representing the maximum number of results to return + +- `fields`: _object_ - object of fields used to create the filter condition + +Each field in the object corresponds to a field name containing an operator, and a value for the operator. A field name can only be specified once, and can only contain one operator. For example, you cannot query transactions with a gas price between 8 and 9 Gwei by using both the `gt` and `lt` operator in the same field name instance. + +All filters must be satisfied for a transaction to be returned. + +| Field name | Value | Value type | Supported operators | +| --- | --- | :-: | --- | +| `from` | Address of the sender. | _Data_, 20 bytes | `eq` | +| `to` | Address of the receiver, or `"contract_creation"`. | _Data_, 20 bytes | `eq`, `action` | +| `gas` | Gas provided by the sender. | _Quantity_ | `eq`, `gt`, `lt` | +| `gasPrice` | Gas price, in wei, provided by the sender. | _Quantity_ | `eq`, `gt`, `lt` | +| `value` | Value transferred, in wei. | _Quantity_ | `eq`, `gt`, `lt` | +| `nonce` | Number of transactions made by the sender. | _Quantity_ | `eq`, `gt`, `lt` | + +Supported operators: + +- `eq` (equal to) + +- `lt` (less than) + +- `gt` (greater than) + +- `action` + +:::note + +The only supported `action` is `"contract_creation"`. + +::: + +#### Returns + +`result`: _array_ of _objects_ - list of objects with [details of the pending transaction](objects.md#pending-transaction-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuPendingTransactions","params":[2,{"from":{"eq":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"},"gas":{"lt":"0x5209"},"nonce":{"gt":"0x1"}}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "txpool_besuPendingTransactions", + "params": [ + 2, + { + "from": { "eq": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" }, + "gas": { "lt": "0x5209" }, + "nonce": { "gt": "0x1" } + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0xab5d04c00", + "hash": "0xb7b2f4306c1c228ec94043da73b582594007091a7dfe024b1f8d6d772284e54b", + "input": "0x", + "nonce": "0x2", + "to": "0xf8be4ebda7f62d79a665294ec1263bfdb59aabf2", + "value": "0x0", + "v": "0xfe8", + "r": "0x5beb711e652c6cf0a589d3cea904eefc4f45ce4372652288701d08cc4412086d", + "s": "0x3af14a56e63aa5fb7dcb444a89708363a9d2c1eba1f777c67690288415080ded" + } + ] +} +``` + + + +### `txpool_besuStatistics` + +Lists statistics about the node transaction pool. + +#### Parameters + +None + +#### Returns + +`result`: _object_ - transaction pool statistics object with the following fields: + +- `maxSize`: _number_ - maximum number of transactions kept in the transaction pool; use the [`--tx-pool-max-size`](../cli/options.md#tx-pool-max-size) option to configure the maximum size. + +- `localCount`: _number_ - number of transactions submitted directly to this node + +- `remoteCount`: _number_ - number of transactions received from remote nodes + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "maxSize": 4096, + "localCount": 1, + "remoteCount": 0 + } +} +``` + + + +### `txpool_besuTransactions` + +Lists transactions in the node transaction pool. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _objects_ - list of transactions + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuTransactions","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "txpool_besuTransactions", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "hash": "0x8a66830098be4006a3f63a03b6e9b67aa721e04bd6b46d420b8f1937689fb4f1", + "isReceivedFromLocalSource": true, + "addedToPoolAt": "2019-03-21T01:35:50.911Z" + }, + { + "hash": "0x41ee803c3987ceb5bcea0fad7a76a8106a2a6dd654409007d9931032ea54579b", + "isReceivedFromLocalSource": true, + "addedToPoolAt": "2019-03-21T01:36:00.374Z" + } + ] +} +``` + + + +## `WEB3` methods + +The `WEB3` API methods provide functionality for the Ethereum ecosystem. + +### `web3_clientVersion` + +Returns the current client version. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - current client version + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "web3_clientVersion", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "besu/" +} +``` + + + +### `web3_sha3` + +Returns a [SHA3](https://en.wikipedia.org/wiki/SHA-3) hash of the specified data. The result value is a [Keccak-256](https://keccak.team/keccak.html) hash, not the standardized SHA3-256. + +#### Parameters + +`data`: _string_ - data to convert to a SHA3 hash + +#### Returns + +`result`: _string_ - SHA3 result of the input data + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c00"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "web3_sha3", + "params": ["0x68656c6c6f20776f726c00"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5e39a0a66544c0668bde22d61c47a8710000ece931f13b84d3b2feb44ec96d3f" +} +``` + + + +## Miscellaneous methods + +### `rpc_modules` + +Lists [enabled APIs](../../how-to/use-besu-api/json-rpc.md#api-methods-enabled-by-default) and the version of each. + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _strings_ - enabled APIs and their versions + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "web3": "1.0", + "eth": "1.0", + "net": "1.0" + } +} +``` + + + + + +[schema]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/ethereum/api/src/main/resources/schema.graphqls +[eth_sendRawTransaction or eth_call]: ../../how-to/send-transactions.md#eth_call-or-eth_sendrawtransaction +[transaction]: https://ropsten.etherscan.io/tx/0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6 diff --git a/versioned_docs/version-23.4.0/public-networks/reference/api/objects.md b/versioned_docs/version-23.4.0/public-networks/reference/api/objects.md new file mode 100644 index 00000000000..3d602c6aeba --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/api/objects.md @@ -0,0 +1,264 @@ +--- +title: Objects +description: Hyperledger Besu API objects reference +tags: + - private networks +--- + +# Besu API objects + +The following objects are parameters for or returned by Besu API methods. + +:::info + +This reference contains API objects that apply to both public and private networks. For private-network-specific API objects, see the [private network API object reference](../../../private-networks/reference/api/objects.md). + +::: + +## Block object + +Returned by [`eth_getBlockByHash`](index.md#eth_getblockbyhash) and [`eth_getBlockByNumber`](index.md#eth_getblockbynumber). + +| Key | Type | Value | +| --- | :-: | --- | +| `number` | _Quantity_, Integer | Block number. `null` when block is pending. | +| `hash` | _Data_, 32 bytes | Hash of the block. `null` when block is pending. | +| `parentHash` | _Data_, 32 bytes | Hash of the parent block. | +| `nonce` | _Data_, 8 bytes | Hash of the generated proof of work. `null` when block is pending. | +| `sha3Uncles` | _Data_, 32 bytes | SHA3 of the uncle's data in the block. | +| `logsBloom` | _Data_, 256 bytes | Bloom filter for the block logs. `null` when block is pending. | +| `transactionsRoot` | _Data_, 32 bytes | Root of the transaction trie for the block. | +| `stateRoot` | Data, 32 bytes | Root of the final state trie for the block. | +| `receiptsRoot` | Data, 32 bytes | Root of the receipts trie for the block. | +| `miner` | Data, 20 bytes | Address to pay mining rewards to. | +| `difficulty` | Quantity, Integer | Difficulty for this block. | +| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. This value will always be `0` for an uncle block. | +| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. Stores extra data when used with [Clique](../../../private-networks/how-to/configure/consensus/clique.md#genesis-file) and [IBFT](../../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | +| `size` | Quantity, Integer | Size of block in bytes. | +| `gasLimit` | Quantity | Maximum gas allowed in this block. | +| `gasUsed` | Quantity | Total gas used by all transactions in this block. | +| `timestamp` | Quantity | Unix timestamp for block assembly. | +| `transactions` | Array | Array of [transaction objects](#transaction-object), or 32 byte transaction hashes depending on the specified boolean parameter. | +| `uncles` | Array | Array of uncle hashes. | +| `baseFeePerGas` | Quantity | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | + +## Fee history results object + +Returned by [`eth_feeHistory`](index.md#eth_feehistory) for the requested block range. If blocks in the specified block range are not available, then only the fee history for available blocks is returned. + +| Key | Type | Value | +| --- | :-: | --- | +| `oldestBlock` | Quantity, Integer | Lowest number block of the returned range. | +| `baseFeePerGas` | Array | Array of block base fees per gas, including an extra block value. The extra value is the next block after the newest block in the returned range. Returns zeroes for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | +| `gasUsedRatio` | Array | Array of block gas used ratios. These are calculated as the ratio of `gasUsed` and `gasLimit`. | +| `reward` | Array | Array of effective priority fee per gas data points from a single block. All zeroes are returned if the block is empty. | + +## Filter options object + +Parameter for [`eth_newFilter`](index.md#eth_newfilter), [`eth_getLogs`](index.md#eth_getlogs), and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). Used to [`filter logs`](../../how-to/use-besu-api/access-logs.md). + +| Key | Type | Required/Optional | Value | +| --- | :-: | :-: | --- | +| `fromBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | +| `toBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | +| `address` | Data | Array | Optional | Contract address or array of addresses from which [logs](../../concepts/events-and-logs.md) originate. | +| `topics` | Array of Data, 32 bytes each | Optional | Array of topics by which to [filter logs](../../concepts/events-and-logs.md#topic-filters). | + +[`eth_getLogs`](index.md#eth_getlogs) and [`priv_getLogs`](index.md#priv_getlogs) have an extra key. + +| Key | Type | Required/Optional | Value | +| --- | :-: | :-: | --- | +| `blockHash` | Data, 32 bytes | Optional. | Hash of block for which to return logs. If you specify `blockHash`, you cannot specify `fromBlock` and `toBlock`. | + +## Log object + +Returned by [`eth_getFilterChanges`](index.md#eth_getfilterchanges) and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). [`Transaction receipt objects`](#transaction-receipt-object) can contain an array of log objects. + +| Key | Type | Value | +| --- | :-: | --- | +| `removed` | Tag | `true` if log removed because of a chain reorganization. `false` if a valid log. | +| `logIndex` | Quantity, Integer | Log index position in the block. `null` when log is pending. | +| `transactionIndex` | Quantity, Integer | Index position of the starting transaction for the log. `null` when log is pending. | +| `transactionHash` | Data, 32 bytes | Hash of the starting transaction for the log. `null` when log is pending. | +| `blockHash` | Data, 32 bytes | Hash of the block that includes the log. `null` when log is pending. | +| `blockNumber` | Quantity | Number of block that includes the log. `null` when log is pending. | +| `address` | Data, 20 bytes | Address the log originated from. | +| `data` | Data | Non-indexed arguments of the log. | +| `topics` | Array of Data, 32 bytes each | [Event signature hash](../../concepts/events-and-logs.md#event-signature-hash) and 0 to 3 [indexed log arguments](../../concepts/events-and-logs.md#event-parameters). | + +## Miner data object + +Returned by [`eth_getMinerDataByBlockHash`](index.md#eth_getminerdatabyblockhash) and [`eth_getMinerDataByBlockNumber`](index.md#eth_getminerdatabyblocknumber). + +| Key | Type | Value | +| --- | :-: | --- | +| `netBlockReward` | Quantity, Integer | The net block reward, in Wei, is `staticBlockReward + transactionFee + uncleInclusionReward`. | +| `staticBlockReward` | Quantity, Integer | The static block reward, in Wei, is preset on a hard fork. | +| `transactionFee` | Quantity, Integer | The transaction fee, in Wei, is `sum of upfront cost - refund amount for all transactions`. | +| `uncleInclusionReward` | Quantity, Integer | The uncle inclusion reward, in Wei, is `static block reward * number of ommers/32`. | +| `uncleRewards` | Map | Map of uncle block hashes and uncle miner coinbase addresses. | +| `coinbase` | Data, 20 bytes | Coinbase address. | +| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. | +| `difficulty` | Quantity, Integer | Difficulty of this block. | +| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. | + +## Pending transaction object + +Returned by [`txpool_besuPendingTransactions`](index.md#txpool_besupendingtransactions). + +| Key | Type | Value | +| --- | :-: | --- | +| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Not used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `hash` | Data, 32 bytes | Hash of the transaction. | +| `input` | Data | Data sent with the transaction to create or invoke a contract. | +| `nonce` | Quantity | Number of transactions made by the sender before this one. | +| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `value` | Quantity | Value transferred, in Wei. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | + +## Range object + +Returned by [`debug_storageRangeAt`](index.md#debug_storagerangeat). + +| Key | Type | Value | +| --- | :-: | --- | +| `storage` | Object | Key hash and value. Pre-image key is `null` if it falls outside the cache. | +| `nextKey` | Hash | Hash of next key if further storage in range. Otherwise, not included. | + +### Structured log object + +Log information returned as part of the [Trace object](#trace-object). + +| Key | Type | Value | +| --- | :-: | --- | +| `pc` | Integer | Current program counter. | +| `op` | String | Current OpCode. | +| `gas` | Integer | Gas remaining. | +| `gasCost` | Integer | Cost in wei of each gas unit. | +| `depth` | Integer | Execution depth. | +| `exceptionalHaltReasons` | Array | One or more strings representing an error condition causing the EVM execution to terminate. These strings suggest that EVM execution terminated for reasons such as running out of gas or attempting to execute an unknown instruction. Generally a single exceptional halt reason returns but it's possible for more than one to occur at once. | +| `stack` | Array of 32 byte arrays | EVM execution stack before executing current operation. | +| `memory` | Array of 32 byte arrays | Memory space of the contract before executing current operation. | +| `storage` | Object | Storage entries changed by the current transaction. | + +## Trace object + +Returned by [`debug_traceBlock`](index.md#debug_traceblock), [`debug_traceBlockByHash`](index.md#debug_traceblockbyhash), [`debug_traceBlockByNumber`](index.md#debug_traceblockbynumber), and [`debug_traceTransaction`](index.md#debug_tracetransaction). + +| Key | Type | Value | +| --- | :-: | --- | +| `gas` | Integer | Gas used by the transaction. | +| `failed` | Boolean | True if transaction failed, otherwise, false. | +| `returnValue` | String | Bytes returned from transaction execution (without a `0x` prefix). | +| `structLogs` | Array | Array of structured log objects. | + +## Trace filter options object + +Parameter for [`trace_filter`](index.md#trace_filter). All parameters are optional. + +| Key | Type | Value | +| --- | :-: | --- | +| `fromBLock` | String | Tag | Trace starts at this block. | +| `toBlock` | String | Tag | Trace stops at this block. | +| `fromAddress` | String | Include only traces sent from this address. | +| `toAddress` | String | Include only traces with this destination address. | +| `after` | Quantity | The offset trace number. | +| `count` | Integer | Number of traces to display in a batch. | + +## Transaction object + +Returned by [`eth_getTransactionByHash`](index.md#eth_gettransactionbyhash), [`eth_getTransactionByBlockHashAndIndex`](index.md#eth_gettransactionbyblockhashandindex), and [`eth_getTransactionByBlockNumberAndIndex`](index.md#eth_gettransactionbyblocknumberandindex). + +| Key | Type | Value | +| --- | :-: | --- | +| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `blockHash` | Data, 32 bytes | Hash of the block containing this transaction. `null` when transaction is pending. | +| `blockNumber` | Quantity | Block number of the block containing this transaction. `null` when transaction is pending. | +| `chainId` | Quantity | [Chain ID](../../concepts/network-and-chain-id.md). | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | +| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `hash` | Data, 32 bytes | Hash of the transaction. | +| `input` | Data | Data sent with the transaction to create or invoke a contract. For [private transactions](../../../private-networks/concepts/privacy/index.md), it's a pointer to the transaction location in [Tessera](https://docs.tessera.consensys.net/). | +| `nonce` | Quantity | Number of transactions made by the sender before this one. | +| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | +| `transactionIndex` | Quantity, Integer | Index position of the transaction in the block. `null` when transaction is pending. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `value` | Quantity | Value transferred, in Wei. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | + +## Transaction call object + +Parameter for [`eth_call`](index.md#eth_call), [`eth_createAccessList`](index.md#eth_createAccessList), and [`eth_estimateGas`](index.md#eth_estimategas). + +All transaction call object parameters are optional. + +| Key | Type | Value | +| --- | :-: | --- | +| `from` | Data, 20 bytes | Address of the sender. | +| `to` | Data, 20 bytes | Address of the action receiver. | +| `gas` | Quantity, Integer | Gas provided by the sender. `eth_call` consumes zero gas, but other executions might need this parameter. `eth_estimateGas` ignores this value. | +| `gasPrice` | Quantity, Integer | Gas price, in Wei, provided by the sender. The default is `0`. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | +| `maxPriorityFeePerGas` | Quantity, Integer | Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxFeePerGas`. | +| `maxFeePerGas` | Quantity, Integer | Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxPriorityFeePerGas`. | +| `value` | Quantity, Integer | Value transferred, in Wei. | +| `data` | Data | Hash of the method signature and encoded parameters. For details, see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html). | +| `accessList` | Array | List of addresses and storage keys that the transaction plans to access. Used only in non-[`FRONTIER`](../../concepts/transactions/types.md#frontier-transactions) transactions. | +| `strict` | Tag | If `true`, checks that the `from` account’s ether balance is sufficient to cover the transaction and gas fee. If `false`, the `gasPrice` and `baseFee` are set to zero, in order to simulate a transaction without enforcing a balance check. The default is `false`. | + +## Transaction receipt object + +Returned by [`eth_getTransactionReceipt`](index.md#eth_gettransactionreceipt). + +| Key | Type | Value | +| --- | :-: | --- | +| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | +| `blockNumber` | Quantity | Block number of block containing this transaction. | +| `contractAddress` | Data, 20 bytes | Contract address created, if contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | +| `cumulativeGasUsed` | Quantity | Total amount of gas used by previous transactions in the block and this transaction. | +| `effectiveGasPrice` | Quantity | The [actual value per gas deducted](../../concepts/transactions/types.md#eip1559-transactions) from the sender's account. | +| `from` | Data, 20 bytes | Address of the sender. | +| `gasUsed` | Quantity | Amount of gas used by this specific transaction. | +| `logs` | Array | Array of [log objects](#log-object) generated by this transaction. | +| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | +| `status` | Quantity | Either `0x0` (failure), `0x1` (success), or `0x2` (invalid). | +| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | +| `transactionHash` | Data, 32 bytes | Hash of the transaction. | +| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | +| `type` | Quantity | Transaction type, `0x00` for legacy transactions, `0x01` for access list types, `0x02` for dynamic fees. | + +:::note + +For pre-Byzantium transactions, the transaction receipt object includes the following instead of `status`: + +| Key | Type | Value | +| ------ | :-----------------: | --------------------------- | +| `root` | Data, 32 bytes | Post-transaction state root | + +::: + +## Transaction trace object + +Returned by [`trace_replayBlockTransactions`](index.md#trace_replayblocktransactions). + +| Key | Type | Value | +| --- | :-: | --- | +| `output` | Boolean | Transaction result. 1 for success and 0 for failure. | +| `stateDiff` | Object | [State changes in the requested block](../trace-types.md#statediff). | +| `trace` | Array | [Ordered list of calls to other contracts](../trace-types.md#trace). | +| `vmTrace` | Object | [Ordered list of EVM actions](../trace-types.md#vmtrace). | +| `transactionHash` | Data, 32 bytes | Hash of the replayed transaction. | diff --git a/versioned_docs/version-23.4.0/public-networks/reference/cli/_category_.json b/versioned_docs/version-23.4.0/public-networks/reference/cli/_category_.json new file mode 100644 index 00000000000..e94b0c9a474 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/cli/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu command line", + "position": 1 +} diff --git a/versioned_docs/version-23.4.0/public-networks/reference/cli/options.md b/versioned_docs/version-23.4.0/public-networks/reference/cli/options.md new file mode 100644 index 00000000000..183cd8b0fc4 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/cli/options.md @@ -0,0 +1,3844 @@ +--- +title: Options +description: Hyperledger Besu command line interface reference +sidebar_position: 1 +tags: + - private networks +--- + +# Command line options + +This reference describes the syntax of the Hyperledger Besu command line interface (CLI) options. + +:::info + +This reference contains options that apply to both public and private networks. For private-network-specific options, see the [private network options reference](../../../private-networks/reference/cli/options.md). + +::: + +## Specify options + +You can specify Besu options: + +- On the command line. + + ```bash + besu [OPTIONS] [SUBCOMMAND] + ``` + +- As an environment variable. For each command line option, the equivalent environment variable is: + + - Uppercase. + - `_` replaces `-`. + - Has a `BESU_` prefix. + + For example, set `--miner-coinbase` using the `BESU_MINER_COINBASE` environment variable. + +- In a [configuration file](../../how-to/configuration-file.md). + +If you specify an option in more than one place, the order of priority is command line, environment variable, configuration file. + +If using Bash or Z shell, you can view option suggestions by entering `--` and pressing the Tab key twice. + +```bash +besu --Tab+Tab +``` + +:::caution + +Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em hyphens. + +::: + +## Options + +### `api-gas-price-blocks` + + + +# Syntax + +```bash +--api-gas-price-blocks= +``` + +# Example + +```bash +--api-gas-price-blocks=50 +``` + +# Environment variable + +```bash +BESU_API_GAS_PRICE_BLOCKS=50 +``` + +# Example configuration file + +```bash +api-gas-price-blocks=50 +``` + + + +Number of blocks back from the head block to examine for [`eth_gasPrice`](../api/index.md#eth_gasprice). The default is `100`. + +### `api-gas-price-max` + + + +# Syntax + +```bash +--api-gas-price-max= +``` + +# Example + +```bash +--api-gas-price-max=20000 +``` + +# Environment variable + +```bash +BESU_API_GAS_PRICE_MAX=20000 +``` + +# Example configuration file + +```bash +api-gas-price-max=20000 +``` + + + +Maximum gas price to return for [`eth_gasPrice`](../api/index.md#eth_gasprice), regardless of the percentile value measured. The default is `500000000000` (500 GWei). + +### `api-gas-price-percentile` + + + +# Syntax + +```bash +--api-gas-price-percentile= +``` + +# Example + +```bash +--api-gas-price-percentile=75 +``` + +# Environment variable + +```bash +BESU_API_GAS_PRICE_PERCENTILE=75 +``` + +# Example configuration file + +```bash +api-gas-price-percentile=75 +``` + + + +Percentile value to measure for [`eth_gasPrice`](../api/index.md#eth_gasprice). The default is `50.0`. + +For [`eth_gasPrice`](../api/index.md#eth_gasprice), to return the: + +- Highest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `100`. +- Lowest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `0`. + +### `auto-log-bloom-caching-enabled` + + + +# Syntax + +```bash +--auto-log-bloom-caching-enabled[=] +``` + +# Example + +```bash +--auto-log-bloom-caching-enabled=false +``` + +# Environment variable + +```bash +BESU_AUTO_LOG_BLOOM_CACHING_ENABLED=false +``` + +# Example configuration file + +```bash +auto-log-bloom-caching-enabled=false +``` + + + +Enables or disables automatic log bloom caching. APIs such as [`eth_getLogs`](../api/index.md#eth_getlogs) and [`eth_getFilterLogs`](../api/index.md#eth_getfilterlogs) use the cache for improved performance. The default is `true`. + +If automatic log bloom caching is enabled and a log bloom query reaches the end of the cache, Besu performs an uncached query for logs not yet written to the cache. + +Automatic log bloom caching has a small impact on performance. If you are not querying logs blooms for a large number of blocks, you might want to disable automatic log bloom caching. + +### `banned-node-ids` + + + +# Syntax + +```bash +--banned-node-ids=[,...]... +``` + +# Example + +```bash +--banned-node-ids=0xc35c3...d615f,0xf42c13...fc456 +``` + +# Environment variable + +```bash +BESU_BANNED_NODE_IDS=0xc35c3...d615f,0xf42c13...fc456 +``` + +# Configuration file + +```bash +banned-node-ids=["0xc35c3...d615f","0xf42c13...fc456"] +``` + + + +A list of node IDs with which this node will not peer. The node ID is the public key of the node. You can specify the banned node IDs with or without the `0x` prefix. + +:::tip + +The singular `--banned-node-id` and plural `--banned-node-ids` are available and are two names for the same option. + +::: + +### `bonsai-maximum-back-layers-to-load` + + + +# Syntax + +```bash +--bonsai-maximum-back-layers-to-load=256 +``` + +# Example + +```bash +--bonsai-maximum-back-layers-to-load=256 +``` + +# Environment variable + +```bash +BESU_BONSAI_MAXIMUM_BACK_LAYERS_TO_LOAD=256 +``` + +# Example configuration file + +```bash +bonsai-maximum-back-layers-to-load=256 +``` + + + +When using [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries), the [maximum number of layers back](../../concepts/data-storage-formats.md#accessing-data) Bonsai can reconstruct a historical state. The default is 512. + +### `bootnodes` + + + +# Syntax + +```bash +--bootnodes[=[,...]...] +``` + +# Example + +```bash +--bootnodes=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` + +# Environment variable + +```bash +BESU_BOOTNODES=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` + +# Example configuration file + +```bash +bootnodes=["enode://c35c3...d615f@1.2.3.4:30303","enode://f42c13...fc456@1.2.3.5:30303"] +``` + + + +A list of comma-separated [enode URLs](../../concepts/node-keys.md#enode-url) for [P2P discovery bootstrap](../../../private-networks/how-to/configure/bootnodes.md). + +When connecting to Mainnet or public testnets, the default is a predefined list of enode URLs. + +In private networks defined using [`--genesis-file`](#genesis-file) or when using [`--network=dev`](#network), the default is an empty list of bootnodes. + +### `color-enabled` + + + +# Syntax + +```bash +--color-enabled[=] +``` + +# Example + +```bash +--color-enabled=false +``` + +# Environment variable + +```bash +BESU_COLOR_ENABLED=false +``` + +# Example configuration file + +```bash +color-enabled=false +``` + + + +Enables or disables color output to console. The default is `true`. + +### `compatibility-eth64-forkid-enabled` + + + +# Syntax + +```bash +--compatibility-eth64-forkid-enabled[=] +``` + +# Example + +```bash +--compatibility-eth64-forkid-enabled=true +``` + +# Environment variable + +```bash +BESU_COMPATIBILITY_ETH64_FORKID_ENABLED=true +``` + +# Example configuration file + +```bash +compatibility-eth64-forkid-enabled=true +``` + + + +Enables or disables the legacy Eth/64 fork ID. For any networks with nodes using Besu v1.4 or earlier and nodes using Besu v20.10.1 or later, either: + +- All nodes must be upgraded to v20.10.1 or later. +- All nodes using v20.10.1 or later must have `--compatibility-eth64-forkid-enabled` set to `true`. + +The default is `false`. + +:::caution + +If networks have Besu nodes using v1.4 or earlier and other Besu nodes using v20.10.1 or later, the nodes on different versions cannot communicate unless `--compatibility-eth64-forkid-enabled` is set to `true`. + +::: + +### `config-file` + + + +# Syntax + +```bash +--config-file= +``` + +# Example + +```bash +--config-file=/home/me/me_node/config.toml +``` + +# Environment variable + +```bash +BESU_CONFIG_FILE=/home/me/me_node/config.toml +``` + + + +The path to the [TOML configuration file](../../how-to/configuration-file.md). The default is `none`. + +### `data-path` + + + +# Syntax + +```bash +--data-path= +``` + +# Example + +```bash +--data-path=/home/me/me_node +``` + +# Environment variable + +```bash +BESU_DATA_PATH=/home/me/me_node +``` + +# Configuration file + +```bash +data-path="/home/me/me_node" +``` + + + +The path to the Besu data directory. The default is the directory you installed Besu in, or `/opt/besu/database` if using the [Besu Docker image](../../get-started/install/run-docker-image.md). + +### `data-storage-format` + + + +# Syntax + +```bash +--data-storage-format= +``` + +# Example + +```bash +--data-storage-format=BONSAI +``` + +# Environment variable + +```bash +BESU_DATA_STORAGE_FORMAT=BONSAI +``` + +# Configuration file + +```bash +data-storage-format="BONSAI" +``` + + + +The [data storage format](../../concepts/data-storage-formats.md) to use. Set to `BONSAI` for Bonsai Tries or `FOREST` for Forest of Tries. The default is `FOREST`. + +### `discovery-dns-url` + + + +# Syntax + +```bash +--discovery-dns-url= +``` + +# Environment variable + +```bash +BESU_DISCOVERY_DNS_URL=enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org +``` + +# Example configuration file + +```bash +discovery-dns-url="enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" +``` + + + +The `enrtree` URL of the DNS node list for [node discovery via DNS](https://eips.ethereum.org/EIPS/eip-1459). The default is `null`. + +### `discovery-enabled` + + + +# Syntax + +```bash +--discovery-enabled[=] +``` + +# Example + +```bash +--discovery-enabled=false +``` + +# Environment variable + +```bash +BESU_DISCOVERY_ENABLED=false +``` + +# Example configuration file + +```bash +discovery-enabled=false +``` + + + +Enables or disables P2P discovery. The default is `true`. + +:::note + +You can override the default DNS server if it's unreliable or doesn't serve TCP DNS requests, using the [early access option](#xhelp) `--Xp2p-dns-discovery-server=`. + +::: + +### `engine-host-allowlist` + + + +# Syntax + +```bash +--engine-host-allowlist=[,...]... or "*" +``` + +# Example + +```bash +--engine-host-allowlist=localhost,127.0.0.1 +``` + +# Environment variable + +```bash +BESU_ENGINE_HOST_ALLOWLIST=localhost,127.0.0.1 +``` + +# Configuration file + +```bash +engine-host-allowlist=["localhost","127.0.0.1"] +``` + + + +A comma-separated list of hostnames to allow for Engine API access (applies to both HTTP and WebSocket). + +:::tip + +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames in production environments. + +::: + +### `engine-jwt-disabled` + + + +# Syntax + +```bash +--engine-jwt-disabled[=] +``` + +# Example + +```bash +--engine-jwt-disabled=true +``` + +# Environment variable + +```bash +BESU_ENGINE_JWT_DISABLED=true +``` + +# Configuration file + +```bash +engine-jwt-disabled=true +``` + + + +Disables or enables [authentication](../../how-to/use-engine-api.md#authentication) for Engine APIs. The default is `false` (authentication is enabled by default). + +### `engine-jwt-secret` + + + +# Syntax + +```bash +--engine-jwt-secret= +``` + +# Example + +```bash +--engine-jwt-secret=jwt.hex +``` + +# Environment variable + +```bash +BESU_ENGINE_JWT_SECRET="jwt.hex" +``` + +# Configuration file + +```bash +engine-jwt-secret="jwt.hex" +``` + + + +Shared secret used to authenticate [consensus clients](../../concepts/the-merge.md) when using the Engine JSON-RPC API (both HTTP and WebSocket). Contents of file must be at least 32 hex-encoded bytes and not begin with `0x`. May be a relative or absolute path. See an [example of how to generate this](../../get-started/connect/mainnet.md#1-generate-the-shared-secret). + +### `engine-rpc-enabled` + + + +# Syntax + +```bash +--engine-rpc-enabled[= +``` + +# Example + +```bash +--engine-rpc-enabled +``` + +# Environment variable + +```bash +BESU_ENGINE_RPC_ENABLED=true +``` + +# Configuration file + +```bash +engine-rpc-enabled=true +``` + + + +Enables or disables the [Engine API](../engine-api/index.md). The default is `false`. + +### `engine-rpc-port` + + + +# Syntax + +```bash +--engine-rpc-port= +``` + +# Example + +```bash +--engine-rpc-port=8551 +``` + +# Environment variable + +```bash +BESU_ENGINE_RPC_PORT=8551 +``` + +# Configuration file + +```bash +engine-rpc-port="8551" +``` + + + +The listening port for the Engine API calls (`ENGINE`, `ETH`) for JSON-RPC over HTTP and WebSocket. The default is `8551`. + +### `ethstats` + + + +# Syntax + +```bash +--ethstats= +``` + +# Example + +```bash +--ethstats=Dev-Node-1:secret@127.0.0.1:3001 +``` + +# Environment variable + +```bash +BESU_ETHSTATS=Dev-Node-1:secret@127.0.0.1:3001 +``` + +# Configuration file + +```bash +ethstats="Dev-Node-1:secret@127.0.0.1:3001" +``` + + + +Reporting URL of an [Ethstats](../../../private-networks/how-to/deploy/ethstats.md) server. If specified without a port, the default port is 443 for SSL connections and 80 for non-SSL connections. + +### `ethstats-cacert-file` + + + +# Syntax + +```bash +--ethstats-cacert-file= +``` + +# Example + +```bash +--ethstats-cacert-file=./root.cert +``` + +# Environment variable + +```bash +BESU_ETHSTATS_CACERT_FILE=./root.cert +``` + +# Configuration file + +```bash +ethstats-cacert-file="./root.cert" +``` + + + +Path to the root certificate authority (CA) certificate file of the Ethstats server specified by [`--ethstats`](#ethstats). This option is useful in non-production environments. + +### `ethstats-contact` + + + +# Syntax + +```bash +--ethstats-contact= +``` + +# Example + +```bash +--ethstats-contact=contact@mail.com +``` + +# Environment variable + +```bash +BESU_ETHSTATS_CONTACT=contact@mail.com +``` + +# Configuration file + +```bash +ethstats-contact="contact@mail.com" +``` + + + +Contact email address to send to the Ethstats server specified by [`--ethstats`](#ethstats). + +:::note + +A server must be specified by `--ethstats` in order to use this option. + +::: + +### `fast-sync-min-peers` + + + +# Syntax + +```bash +--fast-sync-min-peers= +``` + +# Example + +```bash +--fast-sync-min-peers=8 +``` + +# Environment variable + +```bash +BESU_FAST_SYNC_MIN_PEERS=8 +``` + +# Example configuration file + +```bash +fast-sync-min-peers=8 +``` + + + +The minimum number of peers required before starting [fast synchronization](../../get-started/connect/sync-node.md#fast-synchronization) in [proof of work](../../how-to/use-pow/mining.md) networks. The default is 5. + +:::info + +This option only applies to proof of work networks. + +::: + +### `genesis-file` + + + +# Syntax + +```bash +--genesis-file= +``` + +# Example + +```bash +--genesis-file=/home/me/me_node/customGenesisFile.json +``` + +# Environment variable + +```bash +BESU_GENESIS_FILE=/home/me/me_node/customGenesisFile.json +``` + +# Configuration file + +```bash +genesis-file="/home/me/me_node/customGenesisFile.json" +``` + + + +The path to the [genesis file](../../concepts/genesis-file.md). + +:::caution + +You can't use the [`--genesis-file`](#genesis-file) and [`--network`](#network) options at the same time. + +::: + +### `graphql-http-cors-origins` + + + +# Syntax + +```bash +--graphql-http-cors-origins= +``` + +# Example + +```bash +--graphql-http-cors-origins="http://medomain.com","https://meotherdomain.com" +``` + +# Environment variable + +```bash +BESU_GRAPHQL_HTTP_CORS_ORIGINS="http://medomain.com","https://meotherdomain.com" +``` + +# Configuration file + +```bash +graphql-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] +``` + + + +A list of comma-separated origin domain URLs for CORS validation. The default is none. + +### `graphql-http-enabled` + + + +# Syntax + +```bash +--graphql-http-enabled[=] +``` + +# Example + +```bash +--graphql-http-enabled +``` + +# Environment variable + +```bash +BESU_GRAPHQL_HTTP_ENABLED=true +``` + +# Configuration file + +```bash +graphql-http-enabled=true +``` + + + +Enables or disables the GraphQL HTTP service. The default is `false`. + +The default GraphQL HTTP service endpoint is `http://127.0.0.1:8547/graphql` if set to `true`. + +### `graphql-http-host` + + + +# Syntax + +```bash +--graphql-http-host= +``` + +# Example + +```bash +# to listen on all interfaces +--graphql-http-host=0.0.0.0 +``` + +# Environment variable + +```bash +# to listen on all interfaces +BESU_GRAPHQL_HTTP_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +graphql-http-host="0.0.0.0" +``` + + + +The host on which GraphQL HTTP listens. The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0`. + +### `graphql-http-port` + + + +# Syntax + +```bash +--graphql-http-port= +``` + +# Example + +```bash +# to listen on port 6175 +--graphql-http-port=6175 +``` + +# Environment variable + +```bash +# to listen on port 6175 +BESU_GRAPHQL_HTTP_PORT=6175 +``` + +# Configuration file + +```bash +graphql-http-port="6175" +``` + + + +The port (TCP) on which GraphQL HTTP listens. The default is `8547`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `help` + + + +# Syntax + +```bash +-h, --help +``` + + + +Show the help message and exit. + +### `host-allowlist` + + + +# Syntax + +```bash +--host-allowlist=[,...]... or "*" +``` + +# Example + +```bash +--host-allowlist=medomain.com,meotherdomain.com +``` + +# Environment variable + +```bash +BESU_HOST_ALLOWLIST=medomain.com,meotherdomain.com +``` + +# Configuration file + +```bash +host-allowlist=["medomain.com", "meotherdomain.com"] +``` + + + +A comma-separated list of hostnames to [access the JSON-RPC API](../../how-to/use-besu-api/index.md#host-allowlist) and [pull Besu metrics](../../how-to/monitor/metrics.md). By default, Besu accepts requests from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the API, we recommend using the [Besu authentication mechanism](../../how-to/use-besu-api/authenticate.md) with username and password authentication or JWT public key authentication. + +::: + +:::note + +If using [Prometheus](https://prometheus.io/) to pull metrics from a node, you must specify all the other nodes you want to pull metrics from in the list of allowed hostnames. + +::: + +:::tip + +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames for production environments. + +::: + +### `identity` + + + +# Syntax + +```bash +--identity= +``` + +# Example + +```bash +--identity=MyNode +``` + +# Environment variable + +```bash +BESU_IDENTITY=MyNode +``` + +# Configuration file + +```bash +identity="MyNode" +``` + + + +The name for the node. If specified, it's the second section of the client ID provided by some Ethereum network explorers. For example, in the client ID `besu/MyNode/v1.3.4/linux-x86_64/oracle_openjdk-java-11`, the node name is `MyNode`. + +If a name is not specified, the name section is not included in the client ID. For example, `besu/v1.3.4/linux-x86_64/oracle_openjdk-java-11`. + +### `key-value-storage` + + + +# Syntax + +```bash +--key-value-storage= +``` + +# Example + +```bash +--key-value-storage=rocksdb +``` + +# Environment variable + +```bash +BESU_KEY_VALUE_STORAGE=rocksdb +``` + +# Configuration file + +```bash +key-value-storage="rocksdb" +``` + + + +The key-value storage to use. Use this option only if using a storage system provided with a plugin. The default is `rocksdb`. + +For development use only, the `memory` option provides ephemeral storage for sync testing and debugging. + +### `logging` + + + +# Syntax + +```bash +-l, --logging= +``` + +# Example + +```bash +--logging=DEBUG +``` + +# Environment variable + +```bash +BESU_LOGGING=DEBUG +``` + +# Example configuration file + +```bash +logging="DEBUG" +``` + + + +Sets logging verbosity. Log levels are `OFF`, `FATAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. The default is `INFO`. + +### `max-peers` + + + +# Syntax + +```bash +--max-peers= +``` + +# Example + +```bash +--max-peers=42 +``` + +# Environment variable + +```bash +BESU_MAX_PEERS=42 +``` + +# Configuration file + +```bash +max-peers=42 +``` + + + +The maximum number of P2P connections you can establish. The default is 25. + +:::caution + +The minimum number of peers is set by the early access option `--Xp2p-peer-lower-bound`, which also has a default of 25. If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` option to the same value or lower. For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. + +::: + +### `metrics-category` + + + +# Syntax + +```bash +--metrics-category=[,metrics-category...]... +``` + +# Example + +```bash +--metrics-category=BLOCKCHAIN,PEERS,PROCESS +``` + +# Environment variable + +```bash +BESU_METRICS_CATEGORY=BLOCKCHAIN,PEERS,PROCESS +``` + +# Configuration file + +```bash +metrics-category=["BLOCKCHAIN","PEERS","PROCESS"] +``` + + + +A comma-separated list of categories for which to track metrics. The defaults are `BLOCKCHAIN`, `ETHEREUM`, `EXECUTORS`, `JVM`, `NETWORK`, `PEERS`, `PERMISSIONING`, `PROCESS`, `PRUNER`, `RPC`, `STRATUM`, `SYNCHRONIZER`, and `TRANSACTION_POOL`. + +Other categories are `KVSTORE_ROCKSDB`, `KVSTORE_PRIVATE_ROCKSDB`, `KVSTORE_ROCKSDB_STATS`, and `KVSTORE_PRIVATE_ROCKSDB_STATS`. + +Categories containing `PRIVATE` track metrics when you enable [private transactions](../../../private-networks/concepts/privacy/index.md). + +### `metrics-enabled` + + + +# Syntax + +```bash +--metrics-enabled[=] +``` + +# Example + +```bash +--metrics-enabled +``` + +# Environment variable + +```bash +BESU_METRICS_ENABLED=true +``` + +# Configuration file + +```bash +metrics-enabled=true +``` + + + +Enables or disables the [metrics exporter](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The default is `false`. + +You can't specify `--metrics-enabled` with [`--metrics-push-enabled`](#metrics-push-enabled). That is, you can enable either Prometheus polling or Prometheus push gateway support, but not both at once. + +### `metrics-host` + + + +# Syntax + +```bash +--metrics-host= +``` + +# Example + +```bash +--metrics-host=127.0.0.1 +``` + +# Environment variable + +```bash +BESU_METRICS_HOST=127.0.0.1 +``` + +# Configuration file + +```bash +metrics-host="127.0.0.1" +``` + + + +The host on which [Prometheus](https://prometheus.io/) accesses [Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The metrics server respects the [`--host-allowlist` option](#host-allowlist). + +The default is `127.0.0.1`. + +### `metrics-port` + + + +# Syntax + +```bash +--metrics-port= +``` + +# Example + +```bash +--metrics-port=6174 +``` + +# Environment variable + +```bash +BESU_METRICS_PORT=6174 +``` + +# Configuration file + +```bash +metrics-port="6174" +``` + + + +The port (TCP) on which [Prometheus](https://prometheus.io/) accesses [Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The default is `9545`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `metrics-protocol` + + + +# Syntax + +```bash +--metrics-protocol= +``` + +# Example + +```bash +--metrics-protocol=OPENTELEMETRY +``` + +# Environment variable + +```bash +BESU_METRICS_PROTOCOL=OPENTELEMETRY +``` + +# Configuration file + +```bash +metrics-protocol="OPENTELEMETRY" +``` + + + +Metrics protocol to use: `PROMETHEUS`, `OPENTELEMETRY`, or `NONE`. The default is `PROMETHEUS`. + +### `metrics-push-enabled` + + + +# Syntax + +```bash +--metrics-push-enabled[=] +``` + +# Example + +```bash +--metrics-push-enabled=true +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_ENABLED=true +``` + +# Configuration file + +```bash +metrics-push-enabled=true +``` + + + +Enables or disables [push gateway integration]. + +You can't specify `--metrics-push-enabled` with [`--metrics-enabled`](#metrics-enabled). That is, you can enable either Prometheus polling or Prometheus push gateway support, but not both at once. + +### `metrics-push-host` + + + +# Syntax + +```bash +--metrics-push-host= +``` + +# Example + +```bash +--metrics-push-host=127.0.0.1 +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_HOST=127.0.0.1 +``` + +# Configuration file + +```bash +metrics-push-host="127.0.0.1" +``` + + + +The host of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The default is `127.0.0.1`. The metrics server respects the [`--host-allowlist` option](#host-allowlist). + +:::note + +When pushing metrics, ensure you set `--metrics-push-host` to the machine on which the push gateway is. Generally, this is a different machine to the machine on which Besu is running. + +::: + +### `metrics-push-interval` + + + +# Syntax + +```bash +--metrics-push-interval= +``` + +# Example + +```bash +--metrics-push-interval=30 +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_INTERVAL=30 +``` + +# Configuration file + +```bash +metrics-push-interval=30 +``` + + + +The interval, in seconds, to push metrics when in `push` mode. The default is 15. + +### `metrics-push-port` + + + +# Syntax + +```bash +--metrics-push-port= +``` + +# Example + +```bash +--metrics-push-port=6174 +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_PORT=6174 +``` + +# Configuration file + +```bash +metrics-push-port="6174" +``` + + + +The port (TCP) of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The default is `9001`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `metrics-push-prometheus-job` + + + +# Syntax + +```bash +--metrics-push-prometheus-job= +``` + +# Example + +```bash +--metrics-push-prometheus-job="my-custom-job" +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_PROMETHEUS_JOB="my-custom-job" +``` + +# Configuration file + +```bash +metrics-push-prometheus-job="my-custom-job" +``` + + + +The job name when in `push` mode. The default is `besu-client`. + +### `min-block-occupancy-ratio` + + + +# Syntax + +```bash +--min-block-occupancy-ratio= +``` + +# Example + +```bash +--min-block-occupancy-ratio=0.5 +``` + +# Environment variable + +```bash +BESU_MIN_BLOCK_OCCUPANCY_RATIO=0.5 +``` + +# Configuration file + +```bash +min-block-occupancy-ratio="0.5" +``` + + + +Minimum occupancy ratio for a mined block if the transaction pool is not empty. When filling a block during mining, the occupancy ratio indicates the threshold at which the node stops waiting for smaller transactions to fill the remaining space. The default is 0.8. + +### `miner-coinbase` + + + +# Syntax + +```bash +--miner-coinbase= +``` + +# Example + +```bash +--miner-coinbase=fe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + +# Environment variable + +```bash +BESU_MINER_COINBASE=fe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + +# Configuration file + +```bash +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +``` + + + +The account you pay mining rewards to. You must specify a valid coinbase when you enable mining using the [`--miner-enabled`](#miner-enabled) option or the [`miner_start`](../api/index.md#miner_start) JSON-RPC API method. + +:::note + +Besu ignores this option in networks using [Clique](../../../private-networks/how-to/configure/consensus/clique.md), [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md), or [QBFT](../../../private-networks/how-to/configure/consensus/qbft.md) consensus protocols. + +::: + +### `miner-enabled` + + + +# Syntax + +```bash +--miner-enabled[=] +``` + +# Example + +```bash +--miner-enabled=true +``` + +# Environment variable + +```bash +BESU_MINER_ENABLED=true +``` + +# Configuration file + +```bash +miner-enabled=true +``` + + + +Enables or disables mining when you start the node. The default is `false`. + +### `miner-extra-data` + + + +# Syntax + +```bash +--miner-extra-data= +``` + +# Example + +```bash +--miner-extra-data=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 +``` + +# Environment variable + +```bash +BESU_MINER_EXTRA_DATA=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 +``` + +# Configuration file + +```bash +miner-extra-data="0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021" +``` + + + +A hex string representing the 32 bytes included in the extra data field of a mined block. The default is 0x. + +### `miner-stratum-enabled` + + + +# Syntax + +```bash +--miner-stratum-enabled +``` + +# Environment variable + +```bash +BESU_MINER_STRATUM_ENABLED=true +``` + +# Configuration file + +```bash +miner-stratum-enabled=true +``` + + + +Enables a node to perform stratum mining. The default is `false`. + +### `miner-stratum-host` + + + +# Syntax + +```bash +--miner-stratum-host= +``` + +# Example + +```bash +--miner-stratum-host=192.168.1.132 +``` + +# Environment variable + +```bash +BESU_MINER_STRATUM_HOST=192.168.1.132 +``` + +# Configuration file + +```bash +miner-stratum-host="192.168.1.132" +``` + + + +The host of the stratum mining service. The default is `0.0.0.0`. + +### `miner-stratum-port` + + + +# Syntax + +```bash +--miner-stratum-port= +``` + +# Example + +```bash +--miner-stratum-port=8010 +``` + +# Environment variable + +```bash +BESU_MINER_STRATUM_PORT=8010 +``` + +# Configuration file + +```bash +miner-stratum-port="8010" +``` + + + +The port of the stratum mining service. The default is `8008`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `min-gas-price` + + + +# Syntax + +```bash +--min-gas-price= +``` + +# Example + +```bash +--min-gas-price=1337 +``` + +# Environment variable + +```bash +BESU_MIN_GAS_PRICE=1337 +``` + +# Configuration file + +```bash +min-gas-price=1337 +``` + + + +The minimum price a transaction offers to include it in a mined block. The minimum gas price is the lowest value [`eth_gasPrice`](../api/index.md#eth_gasprice) can return. The default is 1000 Wei. + +:::tip + +In a [free gas network](../../../private-networks/how-to/configure/free-gas.md), ensure the minimum gas price is set to zero for every node. Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. You can query a node's gas configuration using [`eth_gasPrice`](../api/index.md#eth_gasprice). + +::: + +### `nat-method` + + + +# Syntax + +```bash +--nat-method=UPNP +``` + +# Example configuration file + +```bash +nat-method="UPNP" +``` + + + +Specify the method for handling [NAT environments](../../how-to/connect/specify-nat.md). The options are: + +- [`UPNP`](../../how-to/connect/specify-nat.md#upnp) +- [`UPNPP2PONLY`](../../how-to/connect/specify-nat.md#upnp) +- [`KUBERNETES`](../../how-to/connect/specify-nat.md#kubernetes) +- [`DOCKER`](../../how-to/connect/specify-nat.md#docker) +- [`AUTO`](../../how-to/connect/specify-nat.md#auto) +- [`NONE`](../../how-to/connect/specify-nat.md#none). + +The default is `AUTO`. `NONE` disables NAT functionality. + +:::tip + +UPnP support is often disabled by default in networking firmware. If disabled by default, explicitly enable UPnP support. + +::: + +:::tip + +Use `UPNPP2PONLY` if you wish to enable UPnP for p2p traffic but not JSON-RPC. + +::: + +:::note + +Specifying `UPNP` might introduce delays during node startup, especially on networks without a UPnP gateway device. + +You must specify `DOCKER` when using the [Besu Docker image](../../get-started/install/run-docker-image.md). + +::: + +### `network` + + + +# Syntax + +```bash +--network= +``` + +# Example + +```bash +--network=goerli +``` + +# Environment variable + +```bash +BESU_NETWORK=goerli +``` + +# Configuration file + +```bash +network="goerli" +``` + + + +The predefined network configuration. The default is `mainnet`. + +Possible values are: + +| Network | Chain | Type | Default Sync Mode | Description | +| :-- | :-- | :-- | :-- | :-- | +| `mainnet` | ETH | Production | [FAST](#sync-mode) | The main network | +| `goerli` | ETH | Test | [FAST](#sync-mode) | A PoA network using Clique | +| `sepolia` | ETH | Test | [FAST](#sync-mode) | A PoW network | +| `dev` | ETH | Development | [FULL](#sync-mode) | A PoW network with a low difficulty to enable local CPU mining | +| `classic` | ETC | Production | [FAST](#sync-mode) | The main Ethereum Classic network | +| `mordor ` | ETC | Test | [FAST](#sync-mode) | A PoW network | +| `kotti` | ETC | Test | [FAST](#sync-mode) | A PoA network using Clique | +| `astor` | ETC | Test | [FAST](#sync-mode) | A PoW network | + +:::tip + +Values are case insensitive, so either `mainnet` or `MAINNET` works. + +::: + +:::info + +- You can't use the `--network` and [`--genesis-file`](#genesis-file) options at the same time. + +- The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: + +### `network-id` + + + +# Syntax + +```bash +--network-id= +``` + +# Example + +```bash +--network-id=8675309 +``` + +# Environment variable + +```bash +BESU_NETWORK_ID=8675309 +``` + +# Configuration file + +```bash +network-id="8675309" +``` + + + +The [P2P network identifier](../../concepts/network-and-chain-id.md). + +Use this option to override the default network ID. The default value is the same as the chain ID defined in the genesis file. + +### `node-private-key-file` + + + +# Syntax + +```bash +--node-private-key-file= +``` + +# Example + +```bash +--node-private-key-file=/home/me/me_node/myPrivateKey +``` + +# Environment variable + +```bash +BESU_NODE_PRIVATE_KEY_FILE=/home/me/me_node/myPrivateKey +``` + +# Configuration file + +```bash +node-private-key-file="/home/me/me_node/myPrivateKey" +``` + + + +The private key file for the node. The default is the key file in the [data directory](#data-path). If no key file exists, Besu creates a key file containing the generated private key, otherwise, the existing key file specifies the node private key. + +:::danger + +The private key is not encrypted. + +::: + +This option is ignored if [`--security-module`](#security-module) is set to a non-default value. + +### `p2p-enabled` + + + +# Syntax + +```bash +--p2p-enabled[=] +``` + +# Example + +```bash +--p2p-enabled=false +``` + +# Environment variable + +```bash +BESU_P2P_ENABLED=false +``` + +# Configuration file + +```bash +p2p-enabled=false +``` + + + +Enables or disables all P2P communication. The default is `true`. + +### `p2p-host` + + + +# Syntax + +```bash +--p2p-host= +``` + +# Example + +```bash +# to listen on all interfaces +--p2p-host=0.0.0.0 +``` + +# Environment variable + +```bash +# to listen on all interfaces +BESU_P2P_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +p2p-host="0.0.0.0" +``` + + + +The advertised host that can be used to access the node from outside the network in [P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). The default is `127.0.0.1`. + +:::info + +If [`--nat-method`](#nat-method) is set to [`NONE`](../../how-to/connect/specify-nat.md), `--p2p-host` is not overridden and must be specified for the node to be accessed from outside the network. + +::: + +### `p2p-interface` + + + +Syntax + +```bash +--p2p-interface= +``` + +# Example + +```bash +--p2p-interface=192.168.1.132 +``` + +# Environment variable + +```bash +BESU_P2P_INTERFACE=192.168.1.132 +``` + +# Configuration file + +```bash +p2p-interface="192.168.1.132" +``` + + + +The network interface on which the node listens for [P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). Use the option to specify the required network interface when the device that Besu is running on has multiple network interfaces. The default is 0.0.0.0 (all interfaces). + +### `p2p-port` + + + +# Syntax + +```bash +--p2p-port= +``` + +# Example + +```bash +# to listen on port 1789 +--p2p-port=1789 +``` + +# Environment variable + +```bash +# to listen on port 1789 +BESU_P2P_PORT=1789 +``` + +# Configuration file + +```bash +p2p-port="1789" +``` + + + +The P2P listening ports (UDP and TCP). The default is `30303`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `pruning-block-confirmations` + + + +# Syntax + +```bash +--pruning-block-confirmations= +``` + +# Example + +```bash +--pruning-block-confirmations=5 +``` + +# Environment variable + +```bash +BESU_PRUNING_BLOCK_CONFIRMATIONS=5 +``` + +# Configuration file + +```bash +pruning-block-confirmations=5 +``` + + + +The minimum number of confirmations on a block before marking of newly-stored or in-use state trie nodes that cannot be pruned. The default is 10. + +:::info + +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) is not supported. + +::: + +### `pruning-blocks-retained` + + + +# Syntax + +```bash +--pruning-blocks-retained= +``` + +# Example + +```bash +--pruning-blocks-retained=10000 +``` + +# Environment variable + +```bash +BESU_PRUNING_BLOCKS_RETAINED=10000 +``` + +# Configuration file + +```bash +pruning-blocks-retained=10000 +``` + + + +The minimum number of recent blocks to keep the entire world state for. The default is 1024. + +:::info + +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. + +::: + +### `pruning-enabled` + + + +# Syntax + +```bash +--pruning-enabled +``` + +# Example + +```bash +--pruning-enabled=true +``` + +# Environment variable + +```bash +BESU_PRUNING_ENABLED=true +``` + +# Configuration file + +```bash +pruning-enabled=true +``` + + + +Enables [pruning](../../concepts/data-storage-formats.md#pruning) to reduce storage required for the world state. The default is `false`. + +:::info + +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. + +::: + +:::note + +Pruning is being deprecated for [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries) and is currently not being updated. + +::: + +### `random-peer-priority-enabled` + + + +# Syntax + +```bash +--random-peer-priority-enabled[=] +``` + +# Example + +```bash +--random-peer-priority-enabled=true +``` + +# Environment variable + +```bash +BESU_RANDOM_PEER_PRIORITY_ENABLED=true +``` + +# Configuration file + +```bash +random-peer-priority-enabled=true +``` + + + +Enables or disables random prioritization of incoming connections. Enable in small, stable networks to prevent closed groups of peers forming. The default is `false`. + +### `remote-connections-limit-enabled` + + + +# Syntax + +```bash +--remote-connections-limit-enabled[=] +``` + +# Example + +```bash +--remote-connections-limit-enabled=false +``` + +# Environment variable + +```bash +BESU_REMOTE_CONNECTIONS_LIMIT_ENABLED=false +``` + +# Configuration file + +```bash +remote-connections-limit-enabled=false +``` + + + +Enables or disables using the [`--remote-connections-max-percentage`](#remote-connections-max-percentage) option to limit the percentage of remote P2P connections initiated by peers. The default is `true`. + +:::tip + +In private and permissioned networks with a level of trust between peers, disabling the remote connection limits may increase the speed at which nodes can join the network. + +::: + +:::danger + +To prevent eclipse attacks, ensure you enable the remote connections limit when connecting to any public network, and especially when using [`--sync-mode`](#sync-mode) and [`--fast-sync-min-peers`](#fast-sync-min-peers). + +::: + +### `remote-connections-max-percentage` + + + +# Syntax + +```bash +--remote-connections-max-percentage= +``` + +# Example + +```bash +--remote-connections-max-percentage=25 +``` + +# Environment variable + +```bash +BESU_REMOTE_CONNECTIONS_MAX_PERCENTAGE=25 +``` + +# Configuration file + +```bash +remote-connections-max-percentage=25 +``` + + + +The percentage of remote P2P connections you can establish with the node. Must be between 0 and 100, inclusive. The default is 60. + +### `reorg-logging-threshold` + + + +# Syntax + +```bash +--reorg-logging-threshold= +``` + +# Example + +```bash +--reorg-logging-threshold=3 +``` + +# Environment variable + +```bash +BESU_REORG_LOGGING_THRESHOLD=3 +``` + +# Configuration file + +```bash +reorg-logging-threshold=3 +``` + + + +Minimum depth of chain reorganizations to log. The default is 6. + +### `required-block` + + + +# Syntax + +```bash +--required-block, --required-blocks[=BLOCK=HASH[,BLOCK=HASH...]...] +``` + +# Example + +```bash +--required-block=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 +``` + +# Environment variable + +```bash +BESU_REQUIRED_BLOCK=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 +``` + +# Configuration file + +```bash +required-block=["6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80"] +``` + + + +Requires a peer with the specified block number to have the specified hash when connecting, or Besu rejects that peer. + +### `revert-reason-enabled` + + + +# Syntax + +```bash +--revert-reason-enabled[=] +``` + +# Example + +```bash +--revert-reason-enabled=true +``` + +# Environment variable + +```bash +BESU_REVERT_REASON_ENABLED=true +``` + +# Configuration file + +```bash +revert-reason-enabled=true +``` + + + +Enables or disables including the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md) in the transaction receipt, [`eth_estimateGas`](../api/index.md#eth_estimategas) error response, [`eth_call`](../api/index.md#eth_call) error response, and [`trace`](../trace-types.md#trace) response. The default is `false`. + +:::caution + +Enabling revert reason may use a significant amount of memory. We don't recommend enabling revert reason when connected to public Ethereum networks. + +::: + +### `rpc-http-api` + + + +# Syntax + +```bash +--rpc-http-api=[,...]... +``` + +# Example + +```bash +--rpc-http-api=ETH,NET,WEB3 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_API=ETH,NET,WEB3 +``` + +# Configuration file + +```bash +rpc-http-api=["ETH","NET","WEB3"] +``` + + + +A comma-separated list of APIs to enable on the HTTP JSON-RPC channel. When you use this option you must also specify the `--rpc-http-enabled` option. The available API options are: `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, `TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. + +:::tip + +The singular `--rpc-http-api` and plural `--rpc-http-apis` are available and are two names for the same option. + +::: + +### `rpc-http-authentication-credentials-file` + + + +# Syntax + +```bash +--rpc-http-authentication-credentials-file= +``` + +# Example + +```bash +--rpc-http-authentication-credentials-file=/home/me/me_node/auth.toml +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml +``` + +# Configuration file + +```bash +rpc-http-authentication-credentials-file="/home/me/me_node/auth.toml" +``` + + + +The [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). + +### `rpc-http-authentication-enabled` + + + +# Syntax + +```bash +--rpc-http-authentication-enabled[=] +``` + +# Example + +```bash +--rpc-http-authentication-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_AUTHENTICATION_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-authentication-enabled=true +``` + + + +Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the HTTP JSON-RPC service. + +### `rpc-http-authentication-jwt-public-key-file` + + + +# Syntax + +```bash +--rpc-http-authentication-jwt-public-key-file= +``` + +# Example + +```bash +--rpc-http-authentication-jwt-public-key-file=publicKey.pem +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" +``` + +# Configuration file + +```bash +rpc-http-authentication-jwt-public-key-file="publicKey.pem" +``` + + + +The [JWT provider's public key file] used for JSON-RPC HTTP authentication with an external JWT. + +### `rpc-http-cors-origins` + + + +# Syntax + +```bash +--rpc-http-cors-origins=[,...]... or all or "*" +``` + +# Example + +```bash + +$# You can allow one or more domains with a comma-separated list. + +--rpc-http-cors-origins=http://medomain.com,https://meotherdomain.com +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_CORS_ORIGINS=http://medomain.com,https://meotherdomain.com +``` + +# Configuration file + +```bash +rpc-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] +``` + +# Remix example + +```bash + +$# The following allows Remix to interact with your Besu node. + +--rpc-http-cors-origins=http://remix.ethereum.org +``` + + + +A list of domain URLs for CORS validation. + +Listed domains can access the node using JSON-RPC. If your client interacts with Besu using a browser app (such as Remix or a block explorer), add the client domain to the list. + +The default value is `"none"`. If you do not list any domains, browser apps cannot interact with your Besu node. + +:::note + +To run a local Besu node with MetaMask, set `--rpc-http-cors-origins` to `chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn`. + +Remember to also include the dapp domain MetaMask interacts with, for example if your app is deployed on Remix and you're using MetaMask to interact with the contract, use `--rpc-http-cors-origins=chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn,http://remix.ethereum.org` + +::: + +:::tip + +For testing and development purposes, use `"all"` or `"*"` to accept requests from any domain. We don't recommend accepting requests from any domain for production environments. + +::: + +### `rpc-http-enabled` + + + +# Syntax + +```bash +--rpc-http-enabled[=] +``` + +# Example + +```bash +--rpc-http-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-enabled=true +``` + + + +Enables or disables the HTTP JSON-RPC service. The default is `false`. + +### `rpc-http-host` + + + +# Syntax + +```bash +--rpc-http-host= +``` + +# Example + +```bash +# to listen on all interfaces +--rpc-http-host=0.0.0.0 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +rpc-http-host="0.0.0.0" +``` + + + +The host on which HTTP JSON-RPC listens. The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0`. + +:::caution + +Setting the host to `0.0.0.0` exposes the RPC connection on your node to any remote connection. In a production environment, ensure you are using a firewall to avoid exposing your node to the internet. + +::: + +### `rpc-http-max-active-connections` + + + +# Syntax + +```bash +--rpc-http-max-active-connections= +``` + +# Example + +```bash +--rpc-http-max-active-connections=100 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_MAX_ACTIVE_CONNECTIONS=100 +``` + +# Configuration file + +```toml +rpc-http-max-active-connections=100 +``` + + + +The maximum number of allowed HTTP JSON-RPC connections. Once this limit is reached, incoming connections are rejected. The default is 80. + +### `rpc-http-max-batch-size` + + + +# Syntax + +```bash +--rpc-http-max-batch-size= +``` + +# Example + +```bash +--rpc-http-max-batch-size=1200 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_MAX_BATCH_SIZE=1200 +``` + +# Configuration file + +```toml +rpc-http-max-batch-size=1200 +``` + + + +The maximum number of allowed requests in a [RPC batch request](../../how-to/use-besu-api/json-rpc.md#http). The default limit is `1024`, and `-1` specifies no limit. + +### `rpc-http-port` + + + +# Syntax + +```bash +--rpc-http-port= +``` + +# Example + +```bash +# to listen on port 3435 +--rpc-http-port=3435 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_PORT=3435 +``` + +# Configuration file + +```bash +rpc-http-port="3435" +``` + + + +The port (TCP) on which HTTP JSON-RPC listens. The default is `8545`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `rpc-http-tls-ca-clients-enabled` + + + +# Syntax + +```bash +--rpc-http-tls-ca-clients-enabled[=] +``` + +# Example + +```bash +--rpc-http-tls-ca-clients-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_CA_CLIENTS_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-tls-ca-clients-enabled=true +``` + + + +Enables or disables clients with trusted CA certificates to connect. The default is `false`. + +:::note + +You must enable client authentication using the [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. + +::: + +### `rpc-http-tls-client-auth-enabled` + + + +# Syntax + +```bash +--rpc-http-tls-client-auth-enabled[=] +``` + +# Example + +```bash +--rpc-http-tls-client-auth-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_CLIENT_AUTH_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-tls-client-auth-enabled=true +``` + + + +Enables or disables TLS client authentication for the JSON-RPC HTTP service. The default is `false`. + +:::note + +You must specify [`--rpc-http-tls-ca-clients-enabled`](#rpc-http-tls-ca-clients-enabled) and/or [`rpc-http-tls-known-clients-file`](#rpc-http-tls-known-clients-file). + +::: + +### `rpc-http-tls-cipher-suite` + + + +# Syntax + +```bash +--rpc-http-tls-cipher-suite=[, ...] +``` + +# Example + +```bash +--rpc-http-tls-cipher-suite=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_CIPHER_SUITE=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +``` + +# Configuration file + +```bash +rpc-http-tls-cipher-suite=["TLS_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"] +``` + +::: + +A list of comma-separated TLS cipher suites to support. + +:::tip + +The singular `--rpc-http-tls-cipher-suite` and plural `--rpc-http-tls-cipher-suites` are available and are two names for the same option. + +::: + +### `rpc-http-tls-enabled` + + + +# Syntax + +```bash +--rpc-http-tls-enabled[=] +``` + +# Example + +```bash +--rpc-http-tls-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-tls-enabled=true +``` + +::: + +Enables or disables TLS for the JSON-RPC HTTP service. The default is `false`. + +:::note + +[`--rpc-http-enabled`](#rpc-http-enabled) must be enabled. + +::: + +### `rpc-http-tls-keystore-file` + + + +# Syntax + +```bash +--rpc-http-tls-keystore-file= +``` + +# Example + +```bash +--rpc-http-tls-keystore-file=/home/me/me_node/keystore.pfx +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_KEYSTORE_FILE=/home/me/me_node/keystore.pfx +``` + +# Configuration file + +```bash +rpc-http-tls-keystore-file="/home/me/me_node/keystore.pfx" +``` + +::: + +The Keystore file (in PKCS #12 format) that contains private key and the certificate presented to the client during authentication. + +### `rpc-http-tls-keystore-password-file` + + + +# Syntax + +```bash +--rpc-http-tls-keystore-password-file= +``` + +# Example + +```bash +--rpc-http-tls-keystore-password-file=/home/me/me_node/password +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password +``` + +# Configuration file + +```bash +rpc-http-tls-keystore-password-file="/home/me/me_node/password" +``` + + + +The path to the file containing the password to decrypt the keystore. + +### `rpc-http-tls-known-clients-file` + + + +# Syntax + +```bash +--rpc-http-tls-known-clients-file= +``` + +# Example + +```bash +--rpc-http-tls-known-clients-file=/home/me/me_node/knownClients +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_KNOWN_CLIENTS_FILE=/home/me/me_node/knownClients +``` + +# Configuration file + +```bash +rpc-http-tls-known-clients-file="/home/me/me_node/knownClients" +``` + + + +The path to the file used to [authenticate clients](../../../private-networks/how-to/configure/tls/client-and-server.md#create-the-known-clients-file) using self-signed certificates or non-public certificates. + +Must contain the certificate's Common Name, and SHA-256 fingerprint in the format ` `. + +:::note + +You must enable client authentication using the [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. + +::: + +### `rpc-http-tls-protocol` + + + +# Syntax + +```bash +--rpc-http-tls-protocol=[, ...] +``` + +# Example + +```bash +--rpc-http-tls-protocol=TLSv1.3,TLSv1.2 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_PROTOCOL=TLSv1.3,TLSv1.2 +``` + +# Configuration file + +```bash +rpc-http-tls-protocol=["TLSv1.3","TLSv1.2"] +``` + + + +A list of comma-separated TLS protocols to support. The default is `DEFAULT_TLS_PROTOCOLS`, a list which includes `TLSv1.3` and `TLSv1.2`. + +:::tip + +The singular `--rpc-http-tls-protocol` and plural `--rpc-http-tls-protocols` are available and are two names for the same option. + +::: + +### `rpc-max-logs-range` + + + +# Syntax + +```bash +--rpc-max-logs-range= +``` + +# Example + +```bash +--rpc-max-logs-range=500 +``` + +# Environment variable + +```bash +BESU_RPC_MAX_LOGS_RANGE=500 +``` + +# Configuration file + +```bash +rpc-max-logs-range=500 +``` + + + +When using [`eth_getLogs`](../api/index.md#eth_getlogs), the maximum number of blocks to retrieve logs from. Set to 0 to specify no limit. The default is 5000. + +:::caution + +Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from its genesis block, might cause Besu to hang for an indeterminable amount of time while generating the response. + +We recommend setting a range limit or leaving this option at its default value. + +::: + +### `rpc-tx-feecap` + + + +# Syntax + +```bash +--rpc-tx-feecap= +``` + +# Example + +```bash +--rpc-tx-feecap=1200000000000000000 +``` + +# Environment variable + +```bash +BESU_RPC_TX_FEECAP=1200000000000000000 +``` + +# Configuration file + +```bash +rpc-tx-feecap=1200000000000000000 +``` + + + +The maximum transaction fee (in Wei) accepted for transactions submitted through the [`eth_sendRawTransaction`](../api/index.md#eth_sendrawtransaction) RPC. The default is 1000000000000000000 (1 ether). + +If set to 0, then this option is ignored and no cap is applied. + +### `rpc-ws-api` + + + +# Syntax + +```bash +--rpc-ws-api=[,...]... +``` + +# Example + +```bash +--rpc-ws-api=ETH,NET,WEB3 +``` + +# Environment variable + +```bash +BESU_RPC_WS_API=ETH,NET,WEB3 +``` + +# Configuration file + +```bash +rpc-ws-api=["ETH","NET","WEB3"] +``` + + + +A comma-separated list of APIs to enable on the WebSockets channel. When you use this option you must also specify the `--rpc-ws-enabled` option. The available API options are: `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, `TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. + +:::tip + +The singular `--rpc-ws-api` and plural `--rpc-ws-apis` options are available and are two names for the same option. + +::: + +### `rpc-ws-authentication-credentials-file` + + + +# Syntax + +```bash +--rpc-ws-authentication-credentials-file= +``` + +# Example + +```bash +--rpc-ws-authentication-credentials-file=/home/me/me_node/auth.toml +``` + +# Environment variable + +```bash +BESU_RPC_WS_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml +``` + +# Configuration file + +```bash +rpc-ws-authentication-credentials-file="/home/me/me_node/auth.toml" +``` + +::: + +The path to the [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). + +### `rpc-ws-authentication-enabled` + + + +# Syntax + +```bash +--rpc-ws-authentication-enabled[=] +``` + +# Example + +```bash +--rpc-ws-authentication-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_WS_AUTHENTICATION_ENABLED=true +``` + +# Configuration file + +```bash +rpc-ws-authentication-enabled=true +``` + + + +Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the WebSocket JSON-RPC service. + +:::note + +`wscat` doesn't support headers. [Authentication](../../how-to/use-besu-api/authenticate.md) requires you to pass an authentication token in the request header. To use authentication with WebSockets, you need an app that supports headers. + +::: + +### `rpc-ws-authentication-jwt-public-key-file` + + + +# Syntax + +```bash +--rpc-ws-authentication-jwt-public-key-file= +``` + +# Example + +```bash +--rpc-ws-authentication-jwt-public-key-file=publicKey.pem +``` + +# Environment variable + +```bash +BESU_RPC_WS_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" +``` + +# Configuration file + +```bash +rpc-ws-authentication-jwt-public-key-file="publicKey.pem" +``` + + + +The [JWT provider's public key file] used for JSON-RPC WebSocket authentication with an external JWT. + +### `rpc-ws-enabled` + + + +# Syntax + +```bash +--rpc-ws-enabled[=] +``` + +# Example + +```bash +--rpc-ws-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_WS_ENABLED=true +``` + +# Configuration file + +```bash +rpc-ws-enabled=true +``` + + + +Enables or disables the WebSocket JSON-RPC service. The default is `false`. + +### `rpc-ws-host` + + + +# Syntax + +```bash +--rpc-ws-host= +``` + +# Example + +```bash +# to listen on all interfaces +--rpc-ws-host=0.0.0.0 +``` + +# Environment variable + +```bash +BESU_RPC_WS_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +rpc-ws-host="0.0.0.0" +``` + +::: + +The host on which WebSocket JSON-RPC listens. The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0` + +### `rpc-ws-max-active-connections` + + + +# Syntax + +```bash +--rpc-ws-max-active-connections= +``` + +# Example + +```bash +--rpc-ws-max-active-connections=100 +``` + +# Environment variable + +```bash +BESU_RPC_WS_MAX_ACTIVE_CONNECTIONS=100 +``` + +# Configuration file + +```toml +rpc-ws-max-active-connections=100 +``` + + + +The maximum number of WebSocket connections allowed for JSON-RPC. Once this limit is reached, incoming connections are rejected. The default is 80. + +### `rpc-ws-max-frame-size` + + + +# Syntax + +```bash +--rpc-ws-max-frame-size= +``` + +# Example + +```bash +--rpc-ws-max-frame-size=65536 +``` + +# Environment variable + +```bash +BESU_RPC_WS_MAX_FRAME_SIZE=65536 +``` + +# Configuration file + +```toml +rpc-ws-max-frame-size=65536 +``` + + + +The maximum size in bytes for JSON-RPC WebSocket frames. If this limit is exceeded, the WebSocket disconnects. The default is 1048576 (or 1 MB). + +### `rpc-ws-port` + + + +# Syntax + +```bash +--rpc-ws-port= +``` + +# Example + +```bash +# to listen on port 6174 +--rpc-ws-port=6174 +``` + +# Environment variable + +```bash +BESU_RPC_WS_PORT=6174 +``` + +# Configuration file + +```bash +rpc-ws-port="6174" +``` + + + +The port (TCP) on which WebSocket JSON-RPC listens. The default is `8546`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `security-module` + + + +# Syntax + +```bash +--security-module= +``` + +# Example + +```bash +--security-module=security_module +``` + +# Environment variable + +```bash +BESU_SECURITY_MODULE=security_module +``` + +# Configuration file + +```bash +security-module="security_module" +``` + + + +Name of the [security module plugin](https://docs.quorumplugins.consensys.net/) to use. For example, a Hardware Security Module (HSM) or V3 filestore plugin. + +The default is the node's local private key file specified using [`--node-private-key-file`](#node-private-key-file). + +### `static-nodes-file` + + + +# Syntax + +```bash +--static-nodes-file= +``` + +# Example + +```bash +--static-nodes-file=~/besudata/static-nodes.json +``` + +# Environment variable + +```bash +BESU_STATIC_NODES_FILE=~/besudata/static-nodes.json +``` + +# Configuration file + +```bash +static-nodes-file="~/besudata/static-nodes.json" +``` + + + +Static nodes JSON file containing the [static nodes](../../how-to/connect/static-nodes.md) for this node to connect to. The default is `datapath/static-nodes.json`. + +### `strict-tx-replay-protection-enabled` + + + +# Syntax + +```bash +--strict-tx-replay-protection-enabled[=] +``` + +# Example + +```bash +--strict-tx-replay-protection-enabled=false +``` + +# Environment variable + +```bash +STRICT_TX_REPLAY_PROTECTION_ENABLED=false +``` + +# Configuration file + +```bash +strict-tx-replay-protection-enabled=false +``` + + + +Enables or disables replay protection, in accordance with [EIP-155](https://eips.ethereum.org/EIPS/eip-155), on transactions submitted using JSON-RPC. The default is `false`. + +### `sync-mode` + + + +# Syntax + +```bash +--sync-mode=X_SNAP +``` + +# Example + +```bash +--sync-mode=X_SNAP +``` + +# Environment variable + +```bash +BESU_SYNC_MODE=X_SNAP +``` + +# Configuration file + +```bash +sync-mode="X_SNAP" +``` + + + +The synchronization mode. Use `X_SNAP` for [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), `X_CHECKPOINT` for [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), `FAST` for [fast sync](../../get-started/connect/sync-node.md#fast-synchronization), and `FULL` for [full sync](../../get-started/connect/sync-node.md#run-an-archive-node). + +- The default is `FULL` when connecting to a private network by not using the [`--network`](#network) option and specifying the [`--genesis-file`](#genesis-file) option. +- The default is `FAST` when using the [`--network`](#network) option with named networks, except for the `dev` development network. `FAST` is also the default if running Besu on the default network (Ethereum Mainnet) by specifying neither [network](#network) nor [genesis file](#genesis-file). + +:::tip + +- We recommend using snap sync over fast sync because snap sync can be faster by several days. +- Checkpoint sync is an early access feature. +- It might become impossible to sync Ethereum Mainnet using fast sync in the future. Update Besu to a version that supports newer sync methods. +- When synchronizing in a mode other than `FULL`, most historical world state data is unavailable. Any methods attempting to access unavailable world state data return `null`. + +::: + +### `target-gas-limit` + + + +# Syntax + +```bash +--target-gas-limit= +``` + +# Example + +```bash +--target-gas-limit=8000000 +``` + +# Environment variable + +```bash +BESU_TARGET_GAS_LIMIT=8000000 +``` + +# Configuration file + +```bash +target-gas-limit="8000000" +``` + + + +The gas limit toward which Besu will gradually move on an existing network, if enough miners are in agreement. To change the block gas limit set in the genesis file without creating a new network, use `target-gas-limit`. The gas limit between blocks can change only 1/1024th, so the target tells the block creator how to set the gas limit in its block. If the values are the same or within 1/1024th, Besu sets the limit to the specified value. Otherwise, the limit moves as far as it can within that constraint. + +If a value for `target-gas-limit` is not specified, the block gas limit remains at the value specified in the [genesis file](../genesis-items.md#genesis-block-parameters). + +Use the [`miner_changeTargetGasLimit`](../api/index.md#miner_changetargetgaslimit) API to update the `target-gas-limit` while Besu is running. Alternatively restart Besu with an updated `target-gas-limit` value. + +### `tx-pool-limit-by-account-percentage` + + + +# Syntax + +```bash +--tx-pool-limit-by-account-percentage= +``` + +# Example + +```bash +--tx-pool-limit-by-account-percentage=0.1 +``` + +# Environment variable + +```bash +BESU_TX_POOL_LIMIT_BY_ACCOUNT_PERCENTAGE=0.1 +``` + +# Configuration file + +```bash +tx-pool-limit-by-account-percentage=0.4 +``` + + + +The maximum percentage of future transactions kept in the transaction pool, per account. Accepted values are in the range (0–1]. The default is .001 or 0.1% of transactions from a single account to be kept in the pool. + +:::caution + +The default value is often unsuitable for [private networks](../../../private-networks/index.md). This feature mitigates future-nonce transactions from filling the pool without ever being executable by Besu. This is important for Mainnet, but may cause issues on private networks. Please update this value or set to 1 if you know the nodes gossiping transactions in your network. + +::: + +### `tx-pool-max-size` + + + +# Syntax + +```bash +--tx-pool-max-size= +``` + +# Example + +```bash +--tx-pool-max-size=2000 +``` + +# Environment variable + +```bash +BESU_TX_POOL_MAX_SIZE=2000 +``` + +# Configuration file + +```bash +tx-pool-max-size="2000" +``` + + + +The maximum number of transactions kept in the transaction pool. The default is 4096. + +### `tx-pool-price-bump` + + + +# Syntax + +```bash +--tx-pool-price-bump= +``` + +# Example + +```bash +--tx-pool-price-bump=25 +``` + +# Environment variable + +```bash +BESU_TX_POOL_PRICE_BUMP=25 +``` + +# Configuration file + +```bash +tx-pool-price-bump=25 +``` + + + +The price bump percentage to replace an existing transaction. The default is 10. + +### `tx-pool-retention-hours` + + + +# Syntax + +```bash +--tx-pool-retention-hours= +``` + +# Example + +```bash +--tx-pool-retention-hours=5 +``` + +# Environment variable + +```bash +BESU_TX_POOL_RETENTION_HOURS=5 +``` + +# Configuration file + +```bash +tx-pool-retention-hours=5 +``` + + + +The maximum period, in hours, to hold pending transactions in the transaction pool. The default is 13. + +### `Xhelp` + + + +# Syntax + +```bash +-X, --Xhelp +``` + + + +Displays the early access options and their descriptions, and exit. + +:::caution + +The displayed options are unstable and may change between releases. + +::: + +### `version` + + + +# Syntax + +```bash +-V, --version +``` + + + +Prints version information and exit. + + + +[push gateway integration]: ../../how-to/monitor/metrics.md#running-prometheus-with-besu-in-push-mode +[JWT provider's public key file]: ../../how-to/use-besu-api/authenticate.md#jwt-public-key-authentication diff --git a/versioned_docs/version-23.4.0/public-networks/reference/cli/subcommands.md b/versioned_docs/version-23.4.0/public-networks/reference/cli/subcommands.md new file mode 100644 index 00000000000..9cc82a00f15 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/cli/subcommands.md @@ -0,0 +1,261 @@ +--- +title: Subcommands +description: Hyperledger Besu command line interface subcommands +sidebar_position: 2 +tags: + - private networks +--- + +# Subcommands + +This reference describes the syntax of the Hyperledger Besu command line interface (CLI) subcommands. + +:::note + +This reference contains subcommands that apply to both public and private networks. For private-network-specific subcommands, see the [private network subcommands reference](../../../private-networks/reference/cli/subcommands.md). + +::: + +To start a Besu node using subcommands, run: + +```bash +besu [OPTIONS] [SUBCOMMAND] [SUBCOMMAND OPTIONS] +``` + +If using Bash or Z shell, you can view subcommand suggestions by pressing the Tab key twice. + +```bash +besu Tab+Tab +``` + +## `blocks` + +Provides blocks related actions. + +### `import` + + + +# Syntax + +```bash +besu blocks import [--skip-pow-validation-enabled] [--start-block=] [--end-block=] --from= +``` + +# Example + +```bash +besu blocks import --skip-pow-validation-enabled --start-block=100 --end-block=300 --from=/home/me/me_project/mainnet.blocks +``` + + + +Imports a block or range of blocks from the specified file into the blockchain database. + +You can specify the starting index of the block range to import with `--start-block`. If omitted, the default start block is 0 (the beginning of the chain). + +You can specify the ending index (exclusive) of the block range to import with `--end-block`. If omitted, all blocks after the start block will be imported. + +Including `--skip-pow-validation-enabled` skips validation of the `mixHash` when importing blocks. + +:::note + +Use `--skip-pow-validation-enabled` when performing [Ethereum Foundation hive testing](https://github.com/ethereum/hive). + +::: + +### `export` + + + +# Syntax + +```bash +besu blocks export [--start-block=] [--end-block=] --to= +``` + +# Example + +```bash +besu --network=goerli --data-path=/home/data/ blocks export --start-block=100 --end-block=300 --to=/home/exportblock.bin +``` + + + +Exports a block or range of blocks from storage to a file in RLP format. + +If you omit `--start-block`, the default start block is 0 (the beginning of the chain), and if you omit `--end-block`, the default end block is the current chain head. + +If you are not running the command against the default network (Mainnet), specify the `--network` or `--genesis-file` parameter. + +## `public-key` + +Provides node public key related actions. + +:::caution + +To get the public key or address of a node, ensure you use the [`--data-path`](options.md#data-path) or [`--node-private-key-file`](options.md#node-private-key-file) option with the `public-key` command. Otherwise, a new [node key](../../concepts/node-keys.md) is silently generated when starting Besu. + +::: + +### `export` + + + +# Syntax + +```bash +besu public-key export [--node-private-key-file=] [--to=] [--ec-curve=] +``` + +# Example (to standard output) + +```bash +besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 +``` + +# Example (to file) + +```bash +besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/not_precious_pub_key --ec-curve=secp256k1 +``` + + + +Outputs the node public key to standard output or to the file specified by `--to=`. You can output the public key associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between `secp256k1` or `secp256r1`. + +### `export-address` + + + +# Syntax + +```bash +besu public-key export-address [--node-private-key-file=] [--to=] [--ec-curve=] +``` + +# Example (to standard output) + +```bash +besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 +``` + +# Example (to file) + +```bash +besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/me_node_address --ec-curve=secp256k1 +``` + + + +Outputs the node address to standard output or to the file specified by `--to=`. You can output the address associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between `secp256k1` or `secp256r1`. + +## `password` + +Provides password related actions. + +### `hash` + + + +# Syntax + +```bash +besu password hash --password= +``` + +# Example + +```bash +besu password hash --password=myPassword123 +``` + + + +Generates the hash of a given password. Include the hash in the [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). + +## `operator` + +Provides operator actions. + +### `generate-log-bloom-cache` + + + +# Syntax + +```bash +besu operator generate-log-bloom-cache [--start-block=] [--end-block=] +``` + +# Example + +```bash +besu --network=goerli --data-path=/project/goerli operator generate-log-bloom-cache --start-block=0 --end-block=100000 +``` + + + +:::tip + +Manually executing `generate-log-bloom-cache` is not required unless you set the [`--auto-log-bloom-caching-enabled`](options.md#auto-log-bloom-caching-enabled) command line option to false. + +::: + +Generates cached log bloom indexes for blocks. APIs use the cached indexes for improved log query performance. + +:::note + +Each index file contains 100000 blocks. The last fragment of blocks less that 100000 are not indexed. + +::: + +To generate cached log bloom indexes while the node is running, use the [`admin_generateLogBloomCache`](../api/index.md#admin_generatelogbloomcache) API. + +## `retesteth` + + + +# Syntax + +```bash +besu retesteth [--data-path=] [--rpc-http-host=] [--rpc-http-port=] [-l=] [--host-allowlist=[,â€Ļ]â€Ļ or * or all] +``` + +# Example + +```bash +besu retesteth --data-path=/home/me/me_node --rpc-http-port=8590 --host-allowlist=* +``` + + + +Runs a Retesteth-compatible server. [Retesteth](https://github.com/ethereum/retesteth/wiki) is a developer tool that can generate and run consensus tests against any Ethereum client running such a server. + +The command accepts the following command line options: + +- [`--data-path`](options.md#data-path) +- [`--host-allowlist`](options.md#host-allowlist) +- [`--rpc-http-host`](options.md#rpc-http-host) +- [`--rpc-http-port`](options.md#rpc-http-port) +- [`--logging`](options.md#logging) + +## `validate-config` + + + +# Syntax + +```bash +besu validate-config --config-file +``` + +# Example + +```bash +besu validate-config --config-file ../besu-local-nodes/config/besu/besu1.conf +``` + + + +Performs basic syntax validation of the specified [TOML configuration file](../../how-to/configuration-file.md). Checks TOML syntax (for example, valid format and unmatched quotes) and flags unknown options. Doesn't check data types, and doesn't check dependencies between options (this is done at Besu startup). diff --git a/versioned_docs/version-23.4.0/public-networks/reference/disclosure.md b/versioned_docs/version-23.4.0/public-networks/reference/disclosure.md new file mode 100644 index 00000000000..927000e932e --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/disclosure.md @@ -0,0 +1,13 @@ +--- +title: Security disclosure policy +sidebar_position: 8 +description: Hyperledger Besu responsible disclosure statement +tags: + - private networks +--- + +# Security disclosure policy + +At Hyperledger Besu, security is a priority. But regardless of how much effort we put into system security, there might still be vulnerabilities present. If you discover a vulnerability, we need to know about it so we can take steps to address it as quickly as possible. We would like you to help us better protect our clients and our systems. + +Please follow the process explained on [Hyperledger defect response wiki page](https://wiki.hyperledger.org/display/SEC/Defect+Response). diff --git a/versioned_docs/version-23.4.0/public-networks/reference/engine-api/_category_.json b/versioned_docs/version-23.4.0/public-networks/reference/engine-api/_category_.json new file mode 100644 index 00000000000..0ea3b53ab2e --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/engine-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Engine API", + "position": 3 +} diff --git a/versioned_docs/version-23.4.0/public-networks/reference/engine-api/index.md b/versioned_docs/version-23.4.0/public-networks/reference/engine-api/index.md new file mode 100644 index 00000000000..960f153cd0b --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/engine-api/index.md @@ -0,0 +1,486 @@ +--- +title: Engine API +description: Engine API methods reference +--- + +# Engine API methods + +[Consensus and execution clients](../../concepts/the-merge.md#execution-and-consensus-clients) communicate with each other using the Engine API. When running Besu as an execution client, [use these API calls](../../how-to/use-engine-api.md) to communicate with a consensus client. + +:::info + +Ensure you enable the Engine API methods with the [`--engine-rpc-enabled`](../cli/options.md#engine-rpc-enabled) CLI option. + +::: + +See the [Ethereum Engine API specification](https://github.com/ethereum/execution-apis/blob/0b965fb714ccd3faa3c939fdce1726e56679cdec/src/engine/specification.md) for more information. Not all changes to the Engine API are documented on this page. + +## Methods + +### `engine_exchangeCapabilities` + +Exchanges a list of supported Engine API methods between the consensus client and Besu. + +#### Parameters + +`remoteCapabilities`: _array_ of _strings_ - Engine API method names that the consensus client supports + +#### Returns + +`localCapabilities`: _array_ of _strings_ - Engine API method names that Besu supports + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeCapabilities","params":[["engine_exchangeTransitionConfigurationV1","engine_forkchoiceUpdatedV1","engine_getPayloadBodiesByHash","engine_getPayloadBodiesByRangeV1","engine_getPayloadV1","engine_newPayloadV1"]],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_exchangeCapabilities", + "params": [ + [ + "engine_exchangeTransitionConfigurationV1", + "engine_forkchoiceUpdatedV1", + "engine_getPayloadBodiesByHash", + "engine_getPayloadBodiesByRangeV1", + "engine_getPayloadV1", + "engine_newPayloadV1" + ] + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [ + "engine_getPayloadV1", + "engine_getPayloadV2", + "engine_executePayloadV1", + "engine_newPayloadV1", + "engine_newPayloadV2", + "engine_forkchoiceUpdatedV1", + "engine_forkchoiceUpdatedV2", + "engine_exchangeTransitionConfigurationV1", + "engine_getPayloadBodiesByHashV1", + "engine_getPayloadBodiesByRangeV1" + ] +} +``` + + + +### `engine_exchangeTransitionConfigurationV1` + +Sends the transition configuration to the consensus client to verify the configuration between both clients. + +:::note + +The execution client runs this call every 60 seconds in the background. The log displays a warning message if the call hasn't been sent in 120 seconds. + +::: + +#### Parameters + +`transitionConfiguration`: _object_ - [Transition configuration object](objects.md#transition-configuration-object) + +#### Returns + +`transitionConfiguration`: _object_ - [Transition configuration object](objects.md#transition-configuration-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeTransitionConfigurationV1","params":[{"terminalTotalDifficulty": 0, "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "terminalBlockNumber": "0x1"}],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_exchangeTransitionConfigurationV1", + "params": [ + { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + } + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + }, + "payloadId": null +} +``` + + + +### `engine_forkchoiceUpdatedV1` + +Updates the fork choice with the consensus client. + +#### Parameters + +- `forkchoiceState`: _object_ - [Fork choice state object](objects.md#fork-choice-state-object) + +- `payloadAttributes`: _object_ - [Payload attribute object](objects.md#payload-attributes-object). Can be `null`. + +#### Returns + +- `payloadStatus`: _object_ - [Payload status object](objects.md#payload-status-object) + +- `payloadId`: _data_ - identifier of the payload build process or `null` + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_forkchoiceUpdatedV1", + "params": [ + { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + }, + null + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": null + } +} +``` + + + +### `engine_getPayloadBodiesByHashV1` + +Returns the bodies of the execution payloads corresponding to the specified block hashes. + +#### Parameters + +`blockHashes`: **array** of **strings** - Block hashes + +#### Returns + +`engineGetPayloadBodiesResultV1`: **array** of **objects** - Execution payload body objects + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByHashV1","params":[["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c","0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553"]],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadBodiesByHashV1", + "params": [ + [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553" + ] + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [{ + "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], + "withdrawals": [{ + "index" : "0xf0", + "validatorIndex" : "0xf0", + "address" : "0x00000000000000000000000000000000000010f0", + "amount" : "0x1" + }, { + "index" : "0xf1", + "validatorIndex" : "0xf1", + "address" : "0x00000000000000000000000000000000000010f1", + "amount" : "0x1" + }] + }, { + "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], + "withdrawals": [{ + "index" : "0xf2", + "validatorIndex" : "0xf2", + "address" : "0x00000000000000000000000000000000000010f2", + "amount" : "0x1" + }, { + "index" : "0xf3", + "validatorIndex" : "0xf3", + "address" : "0x00000000000000000000000000000000000010f3", + "amount" : "0x1" + }] + }] +} +``` + + + +### `engine_getPayloadBodiesByRangeV1` + +Returns the bodies of the execution payloads corresponding to the specified range of block numbers. + +#### Parameters + +- `startBlockNumber`: _string_ - Number of the starting block of the range, as a hexadecimal string + +- `count`: _string_ - Number of blocks in the range (including the starting block), as a hexadecimal string + +#### Returns + +`engineGetPayloadBodiesResultV1`: _array_ of _objects_ - Execution payload body objects + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByRangeV1","params":["0x20", "0x2"],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadBodiesByRangeV1", + "params": ["0x20", "0x2"], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [{ + "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], + "withdrawals": [{ + "index" : "0xf0", + "validatorIndex" : "0xf0", + "address" : "0x00000000000000000000000000000000000010f0", + "amount" : "0x1" + }, { + "index" : "0xf1", + "validatorIndex" : "0xf1", + "address" : "0x00000000000000000000000000000000000010f1", + "amount" : "0x1" + }] + }, { + "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], + "withdrawals": [{ + "index" : "0xf2", + "validatorIndex" : "0xf2", + "address" : "0x00000000000000000000000000000000000010f2", + "amount" : "0x1" + }, { + "index" : "0xf3", + "validatorIndex" : "0xf3", + "address" : "0x00000000000000000000000000000000000010f3", + "amount" : "0x1" + }] + }] +} +``` + + + +### `engine_getPayloadV1` + +Prepares the payload to send to the consensus client. + +#### Parameters + +`payloadId`: _data_ - Identifier of the payload build process + +#### Returns + +`executionPayload`: _object_ - [Execution payload object](objects.md#execution-payload-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x0000000021f32cc1"],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadV1", + "params": ["0x0000000021f32cc1"], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +} +``` + + + +### `engine_newPayloadV1` + +Executes the payload with the consensus client. + +#### Parameters + +`executionPayload`: _object_ - [Execution payload object](objects.md#execution-payload-object) + +#### Returns + +- `payloadStatus`: _object_ - [Payload status object](objects.md#payload-status-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_newPayloadV1", + "params": [ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } +} +``` + + diff --git a/versioned_docs/version-23.4.0/public-networks/reference/engine-api/objects.md b/versioned_docs/version-23.4.0/public-networks/reference/engine-api/objects.md new file mode 100644 index 00000000000..6cb6d5acb24 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/engine-api/objects.md @@ -0,0 +1,69 @@ +--- +title: Objects +description: Engine API objects reference +--- + +# Engine API objects + +The following objects are parameters for or returned by the [Engine API methods](index.md). + +## Execution payload object + +Parameter for [`engine_newPayloadV1`](index.md#engine_newpayloadv1). Returned by [`engine_getPayloadV1`](index.md#engine_getpayloadv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `parentHash` | _Data_, 32 Bytes | Hash of the parent block. | +| `feeRecipient` | _Data_, 20 Bytes | Beneficiary of the fee. | +| `stateRoot` | _Data_, 32 Bytes | Root of the final state trie for the block. | +| `receiptsRoot` | _Data_, 32 Bytes | Root of the receipts trie for the block. | +| `logsBloom` | _Data_, 256 Bytes | Bloom filter for light clients to quickly retrieve related logs. | +| `prevRandao` | _Data_, 32 Bytes | Difficulty for this block. | +| `blockNumber` | _Quantity_, 64 Bits | Block number of block containing this transaction. | +| `gasLimit` | _Quantity_, 64 Bits | Maximum gas allowed in this block. | +| `gasUsed` | _Quantity_, 64 Bits | Total gas used by all transactions in this block. | +| `timestamp` | _Quantity_, 64 Bits | Unix timestamp (milliseconds) for block assembly. | +| `extraData` | _Data_, 0 to 32 Bytes | Extra data field for this block. | +| `baseFeePerGas` | _Quantity_, 256 Bits | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | +| `blockHash` | _Data_, 32 Bytes | Hash of the execution block. | +| `transactions` | _Array_ | Array of transaction objects, each object is a list representing `TransactionType`, `TransactionPayload`, or `LegacyTransaction` as defined in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). | + +## Fork choice state object + +Parameter for [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `headBlockHash` | _Data_, 32 Bytes | Block hash of the head of the canonical chain. | +| `safeBlockHash` | _Data_, 32 Bytes | "Safe" block hash of the canonical chain under certain synchrony and honesty assumptions. This value MUST be either equal to or an ancestor of `headBlockHash`. | +| `finalizedBlockHash` | _Data_, 32 Bytes | Block hash of the most recent finalized block. | + +## Payload attributes object + +Parameter for [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `timestamp` | _Quantity_, 64 Bits | Value for the `timestamp` field of the new payload. | +| `prevRandao` | _Data_, 32 Bytes | Value for the `prevRandao` field of the new payload. | +| `suggestedFeeRecipient` | _Data_, 20 Bytes | Suggested value for the `feeRecipient` field of the new payload. | + +## Payload status object + +Returned by [`engine_newPayloadV1`](index.md#engine_newpayloadv1) and [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `status` | _Enumeration_ | Either `"VALID"`, `"INVALID"`, `"SYNCING"`, `"ACCEPTED"`, `"INVALID_BLOCK_HASH"`, or `"INVALID_TERMINAL_BLOCK"`. | +| `latestValidHash` | _Data_, 32 Bytes | Hash of the most recent valid block in the branch defined by payload and its ancestors. | +| `validationError` | _String_ | Message providing additional details on the validation error if the payload is classified as `INVALID`, `INVALID_BLOCK_HASH` or `INVALID_TERMINAL_BLOCK`. | + +## Transition configuration object + +Parameter for and returned by [`engine_exchangeTransitionConfigurationV1`](index.md#engine_exchangetransitionconfigurationv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `terminalTotalDifficulty` | _Quantity_, 256 Bits | Maps on the `TERMINAL_TOTAL_DIFFICULTY` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | +| `terminalBlockHash` | _Data_, 32 Bytes | Maps on the `TERMINAL_BLOCK_HASH` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | +| `terminalBlockNumber` | _Quantity_, 64 Bits | Maps on the `TERMINAL_BLOCK_NUMBER` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | diff --git a/versioned_docs/version-23.4.0/public-networks/reference/evm-tool.md b/versioned_docs/version-23.4.0/public-networks/reference/evm-tool.md new file mode 100644 index 00000000000..3cda4831718 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/evm-tool.md @@ -0,0 +1,561 @@ +--- +title: EVM tool options +sidebar_position: 5 +description: Hyperledger Besu EVM tool reference +tags: + - private networks +--- + +# EVM tool reference + +This reference describes options for running the following [using the EVM tool](../how-to/troubleshoot/evm-tool.md): + +- [Arbitrary EVM programs](#run-options) +- [Ethereum state tests](#state-test-options) +- [Ethereum object formatted code](#eof-code-validation) + +:::note + +Option names that include `trace`, such as [`--trace`](#json-trace) and [`--trace.[no]memory`](#nomemory-tracenomemory) exist to support [`t8ntool`](https://ethereum-tests.readthedocs.io/en/latest/t8ntool.html) reference testing, and are interchangeable with their standard option names. + +::: + +## Run options + +The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. Command line options specify the code and other contextual information. + +### `code` + + + +# Syntax + +```bash +--code= +``` + +# Example + +```bash +--code=5B600080808060045AFA50600056 +``` + + + +The code to be executed, in compiled hex code form. Execution fails if this is not set. + +### `gas` + + + +# Syntax + +```bash +--gas= +``` + +# Example + +```bash +--gas=100000000 +``` + + + +Amount of gas to make available to the EVM. The default is 10 billion, a number unlikely to be seen in any production blockchain. + +### `price` + + + +# Syntax + +```bash +--price= +``` + +# Example + +```bash +--price=10 +``` + + + +Price of gas in Gwei. The default is `0`. If set to a non-zero value, the sender account must have enough value to cover the gas fees. + +### `sender` + + + +# Syntax + +```bash +--sender=
+``` + +# Example + +```bash +--sender=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + + + +The account the invocation is sent from. The specified account must exist in the world state, which, unless specified by [`--genesis`](#genesis), is the set of [accounts used for testing](../../private-networks/reference/accounts-for-testing.md). + +### `receiver` + + + +# Syntax + +```bash +--receiver=
+``` + +# Example + +```bash +--receiver=0x588108d3eab34e94484d7cda5a1d31804ca96fe7 +``` + + + +The account the invocation is sent to. The specified account does not need to exist. + +### `input` + + + +# Syntax + +```bash +--input= +``` + +# Example + +```bash +--input=9064129300000000000000000000000000000000000000000000000000000000 +``` + + + +The data passed into the call. Corresponds to the `data` field of the transaction and is returned by the `CALLDATA` and related opcodes. + +### `value` + + + +# Syntax + +```bash +--value= +``` + +# Example + +```bash +--value=1000000000000000000 +``` + + + +The value, in wei, attached to this transaction. For operations that query the value or transfer it to other accounts this is the amount that is available. The amount is not reduced to cover intrinsic cost and gas fees. + +### `json`, `trace` + + + +# Syntax + +```bash +--json +``` + + + +Provides an operation-by-operation trace of the command in JSON. + +`--trace` is an alias for `--json`. + +### `json-alloc` + + + +# Syntax + +```bash +--json-alloc +``` + + + +Outputs a JSON summary of the post-execution world state and allocations. + +### `[no]memory`, `trace.[no]memory` + + + +# Syntax + +```bash +--nomemory, --memory +``` + + + +Setting `--nomemory` disables tracing the memory output for each operation. Setting `--memory` enables it. Memory traces are disabled by default. + +For memory heavy scripts, disabling memory traces may reduce the volume of JSON output. + +`--trace.[no]memory` is an alias for `--[no]memory`. + +### `trace.[no]stack` + + + +# Syntax + +```bash +--trace.nostack, --trace.stack +``` + + + +Setting `--trace.nostack` disables tracing the operand stack for each operation. Setting `--trace.stack` enables it. Stack traces are enabled by default. + +### `trace.[no]returndata` + + + +# Syntax + +```bash +--trace.noreturndata, --trace.returndata +``` + + + +Setting `--trace.noreturndata` disables tracing the return data for each operation. Setting `--trace.returndata` enables it. Return data traces are enabled by default. + +### `[no]time` + + + +# Syntax + +```bash +--notime, --time +``` + + + +Setting `--notime` disables including time data in the summary output. Setting `--time` enables it. + +This is useful for testing and differential evaluations. + +### `genesis` + + + +# Syntax + +```bash +--genesis= +``` + +# Example + +```bash +--genesis=/opt/besu/genesis.json +``` + + + +The [Besu genesis file](genesis-items.md) to use when evaluating the EVM. Most useful are the `alloc` items that set up accounts and their stored memory states. + +`--prestate` is a deprecated alias for `--genesis`. + +### `chain` + + + +# Syntax + +```bash +--chain= +``` + +# Example + +```bash +--chain=goerli +``` + + + +The well-known network genesis file to use when evaluating the EVM. These values are an alternative to the [`--genesis`](#genesis) option for well-known networks. + +### `repeat` + + + +# Syntax + +```bash +--repeat= +``` + +# Example + +```bash +--repeat=1000 +``` + + + +Number of times to repeat the contract before gathering timing information. This is useful when benchmarking EVM operations. The default is `0`. + +### `revert-reason-enabled` + + + +# Syntax + +```bash +--revert-reason-enabled +``` + + + +Enables tracing the reason included in `REVERT` operations. The revert reason is enabled by default. + +### `fork` + + + +# Syntax + +```bash +--fork= +``` + +# Example + +```bash +--fork=FutureEips +``` + + + +Specific fork to evaluate, overriding network settings. + +### `key-value-storage` + + + +# Syntax + +```bash +--key-value-storage= +``` + +# Example + +```bash +--key-value-storage=rocksdb +``` + + + +Kind of key value storage to use. + +It might be useful to execute isolated EVM calls in the context of an actual world state. The default is `memory`, which executes the call only in the context of the world provided by [`--genesis`](#genesis) or [`--chain`](#chain) at block zero. + +When set to `rocksdb` and combined with [`--data-path`](#data-path), [`--block-number`](#block-number), and [`--genesis`](#genesis), a Besu node that isn't currently running can be used to provide the appropriate world state for a transaction. This is useful when evaluating consensus failures. + +### `data-path` + + + +# Syntax + +```bash +--data-path= +``` + +# Example + +```bash +--data-path=/opt/besu/data +``` + + + +When [`--key-value-storage`](#key-value-storage) is set to `rocksdb`, specifies the location of the database on disk. + +### `block-number` + + + +# Syntax + +```bash +--block-number= +``` + +# Example + +```bash +--block-number=10000000 +``` + + + +The block number to evaluate the code against. Used to ensure that the EVM is evaluating the code against the correct fork, or to specify the world state when [`--key-value-storage`](#key-value-storage) is set to `rocksdb`. + +### `version` + + + +# Syntax + +```bash +--version +``` + + + +Displays the version information. + +`-v` is an alias for `--version`. + +## State test options + +The `state-test` subcommand allows the [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) to be evaluated. The only applicable options are `--json` and `--nomemory`. + +### `json`, `trace` + + + +# Syntax + +```bash +--json +``` + + + +Provides an operation-by-operation trace of the command in JSON. + +Set this option for EVM Lab Fuzzing. Whether or not `--json` is set, a summary JSON object is printed to standard output for each state test executed. + +`--trace` is an alias for `--json`. + +### `[no]memory`, `trace.[no]memory` + + + +# Syntax + +```bash +--[no]memory +``` + + + +Setting `--nomemory` disables tracing the memory output for each operation. Setting `--memory` enables it. Memory traces are disabled by default. + +For memory heavy scripts, disabling memory traces may reduce the volume of JSON output. + +`--trace.[no]memory` is an alias for `--[no]memory`. + +### Use command arguments + +If you use command arguments, you can list one or more state tests. All the state tests are evaluated in the order they are specified. + + + +# Docker example + +```bash +docker run --rm -v ${PWD}:/opt/referencetests hyperledger/besu-evmtool:develop --json state-test /opt/referencetests/GeneralStateTests/stExample/add11.json +``` + +# CLI example + +```bash +evm --json state-test stExample/add11.json +``` + + + +### Use standard input + +If no reference tests are passed in using the command line, the EVM tool loads one complete JSON object from standard input and executes that state test. + + + +# Docker example + +```bash +docker run --rm -i hyperledger/besu-evmtool:develop --json state-test < stExample/add11.json +``` + +# CLI example + +```bash +evm --json state-test < stExample/add11.json +``` + + + +## EOF code validation + +The `code-validate` subcommand allows [Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. It accepts candidate EOF containers or EVM bytecode using the `--file` option, command arguments, or standard input. + +### `file` + + + +# Syntax + +```bash +--file= +``` + +# Example + +```bash +--file=eof.txt +``` + + + +File containing one or more EOF containers or EVM bytecode. Each line in the file is considered a separate program. + +### Use command arguments + +If you use command arguments, each argument is considered a separate program. If a code segment includes spaces, it must be contained in quotes. + + + +# Docker example + +```bash +docker run --rm hyperledger/besu-evmtool:develop code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 +``` + +# CLI example + +```bash +evm code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 +``` + + + +### Use standard input + +If no reference tests are passed in using the command line, the EVM tool loads and validates code from standard input. Each line is considered a separate program. Comment lines and blanks are ignored. diff --git a/versioned_docs/version-23.4.0/public-networks/reference/genesis-items.md b/versioned_docs/version-23.4.0/public-networks/reference/genesis-items.md new file mode 100644 index 00000000000..d29d059ddbf --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/genesis-items.md @@ -0,0 +1,150 @@ +--- +title: Genesis file items +sidebar_position: 4 +description: Configuration items specified in the Hyperledger Besu genesis file +tags: + - private networks +--- + +# Genesis file items + +The [Besu genesis file](../concepts/genesis-file.md) contains [network configuration items](#configuration-items) and [genesis block parameters](#genesis-block-parameters). + +## Configuration items + +Network configuration items are specified in the genesis file in the `config` object. + +| Item | Description | +| --- | --: | +| Milestone blocks | [Milestone blocks for the network](#milestone-blocks). | +| `chainID` | [Chain ID for the network](../concepts/network-and-chain-id.md). | +| `ethash` | Specifies network uses [Ethash](../../private-networks/how-to/configure/consensus/index.md) and contains [`fixeddifficulty`](#fixed-difficulty). | +| `clique` | Specifies network uses [Clique](../../private-networks/how-to/configure/consensus/clique.md) and contains [Clique configuration items](../../private-networks/how-to/configure/consensus/clique.md#genesis-file). | +| `ibft2` | Specifies network uses [IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md) and contains [IBFT 2.0 configuration items](../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | +| `qbft` | Specifies network uses [QBFT](../../private-networks/how-to/configure/consensus/qbft.md) and contains [QBFT configuration items](../../private-networks/how-to/configure/consensus/qbft.md#genesis-file). | +| `transitions` | Specifies block at which to [change IBFT 2.0 or QBFT validators](../../private-networks/how-to/configure/consensus/add-validators-without-voting.md). | +| `contractSizeLimit` | Maximum contract size in bytes. Specify in [free gas networks](../../private-networks/how-to/configure/free-gas.md). The default is `24576` and the maximum size is `2147483647`. | +| `evmStackSize` | Maximum stack size. Specify to increase the maximum stack size in private networks with complex smart contracts. The default is `1024`. | +| `ecCurve` | Specifies [the elliptic curve to use](../../private-networks/how-to/configure/curves.md). Default is `secp256k1`. | +| `discovery` | Specifies [discovery configuration items](#discovery-configuration-items). The `discovery` object can be left empty. | + +## Genesis block parameters + +The purpose of some genesis block parameters varies depending on the consensus protocol (Ethash, [Clique](../../private-networks/how-to/configure/consensus/clique.md), [IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md), or [QBFT](../../private-networks/how-to/configure/consensus/qbft.md)). These parameters include: + +- `difficulty`. +- `extraData`. +- `mixHash`. + +The following table describes the genesis block parameters with the same purpose across all consensus protocols. + +| Item | Description | +| --- | --: | +| `coinbase` | Address to pay mining rewards to. Can be any value in the genesis block (commonly set to `0x0000000000000000000000000000000000000000`). | +| `gasLimit` | Block gas limit. Total gas limit for all transactions in a block. | +| `nonce` | Used in block computation. Can be any value in the genesis block (commonly set to `0x0`). | +| `timestamp` | Creation date and time of the block. Must be before the next block so we recommend specifying `0x0` in the genesis file. | +| `alloc` | Defines [accounts with balances](../../private-networks/reference/accounts-for-testing.md) or [contracts](../../private-networks/how-to/configure/contracts.md). | + +:::caution + +If a `Supplied genesis block does not match stored chain data` error occurs, use the genesis file matching the genesis block of the data directory, or use the [`--data-path`](../reference/cli/options.md#data-path) option to specify a different data directory. + +::: + +## Milestone blocks + +In public networks, the milestone blocks specify the blocks at which the network changed protocol. See a [full list of Ethereum protocol releases](https://github.com/ethereum/execution-specs#ethereum-protocol-releases) and their corresponding milestone blocks. + +```json title="Ethereum Mainnet milestone blocks" +{ + "config": { + ... + "homesteadBlock": 1150000, + "daoForkBlock": 1920000, + "daoForkSupport": true, + "eip150Block": 2463000, + "eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0", + "eip155Block": 2675000, + "eip158Block": 2675000, + "byzantiumBlock": 4370000, + "constantinopleBlock": 7280000, + "constantinopleFixBlock": 7280000, + "muirGlacierBlock": 9200000, + "berlinBlock": 12244000, + "londonBlock": 12965000, + "arrowGlacierBlock": 13773000, + "grayGlacierBlock": 15050000, + ... + }, +} +``` + +:::caution + +Ensure you include a milestone far enough in advance in the genesis file. Not doing so can lead to unexpected and inconsistent behavior without specific errors. + +::: + +In private networks, the milestone block defines the protocol version for the network. + +```json title="Private network milestone block" +{ + "config": { + ... + "berlinBlock": 0, + ... + }, +} +``` + +:::note + +In private networks, we recommend specifying the latest milestone block. It's implied this includes the preceding milestones. This ensures you use the most up-to-date protocol and have access to the most recent opcodes. + +::: + +## Fixed difficulty + +Use `fixeddifficulty` to specify a fixed difficulty in private networks using Ethash. This will keep the network's difficulty constant and override the `difficulty` parameter from the genesis file. + +```json +{ + "config": { + ... + "ethash": { + "fixeddifficulty": 1000 + }, + + }, + ... +} +``` + +:::tip + +Using `fixeddifficulty` is not recommended for use with Ethash outside of test environments. For production networks using Ethash, we recommend setting a low `difficulty` value in the genesis file instead. Ethash will adjust the difficulty of the network based on hashrate to produce blocks at the targeted frequency. + +::: + +## Discovery configuration items + +Use the `discovery` configuration items to specify the [`bootnodes`](cli/options.md#bootnodes) and [`discovery-dns-url`](cli/options.md#discovery-dns-url) in the genesis file, in place of using CLI options or listing them in the configuration file. If either CLI option is used, it takes precedence over the genesis file. Anything listed in the configuration file also takes precedence. + +```json +{ + "config": { + "discovery": { + "bootnodes": [ + "enode://c35c3...d615f@1.2.3.4:30303", + "enode://f42c13...fc456@1.2.3.5:30303" + ], + "dns": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" + } + } +} +``` + + + +[GoQuorum clients]: https://consensys.net/docs/goquorum/en/stable/ diff --git a/versioned_docs/version-23.4.0/public-networks/reference/projects-using-besu.md b/versioned_docs/version-23.4.0/public-networks/reference/projects-using-besu.md new file mode 100644 index 00000000000..a1a2e08ae7d --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/projects-using-besu.md @@ -0,0 +1,17 @@ +--- +title: Projects using Besu +sidebar_position: 7 +description: Projects using Besu +tags: + - private networks +--- + +# Projects using Besu + +## Block explorers + +The following block explorers are compatible with Besu: + +- [BlockScout](https://github.com/blockscout/blockscout#readme) - See the [project documentation](https://docs.blockscout.com/) for setup instructions. + +- [Sirato Blockchain Explorer](https://www.web3labs.com/sirato) - See how to [use Sirato with privacy-enabled networks](../../private-networks/how-to/monitor/sirato-explorer.md). diff --git a/versioned_docs/version-23.4.0/public-networks/reference/trace-types.md b/versioned_docs/version-23.4.0/public-networks/reference/trace-types.md new file mode 100644 index 00000000000..8c34148089a --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/reference/trace-types.md @@ -0,0 +1,159 @@ +--- +title: Transaction trace types +sidebar_position: 6 +description: Transaction trace types +tags: + - private networks +--- + +# Transaction trace types + +When [tracing transactions](../how-to/troubleshoot/trace-transactions.md), the trace type options are [`trace`](#trace), [`vmTrace`](#vmtrace), and [`stateDiff`](#statediff). + +## `trace` + +An ordered list of calls to other contracts, excluding precompiled contracts. + +```json title="trace example" +"trace":[ + { + "action":{ + "callType":"call", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0xffadea", + "input":"0x", + "to":"0x0100000000000000000000000000000000000000", + "value":"0x0" + }, + "result":{ + "gasUsed":"0x1e", + "output":"0x" + }, + "subtraces":0, + "traceAddress":[ + ], + "type":"call" + } +] +``` + +| Key | Value | +| --- | --- | +| `action` | Transaction details. | +| `callType` | Whether the transaction is `call` or `create`. | +| `from` | Address of the transaction sender. | +| `gas` | Gas provided by sender. | +| `input` | Transaction data. | +| `to` | Target of the transaction. | +| `value` | Value transferred in the transaction. | +| `result` | Transaction result. | +| `gasUsed` | Gas used by the transaction. Includes any refunds of unused gas. | +| `output` | Return value of the contract call. Contains only the actual value sent by a `RETURN` operation. If a `RETURN` was not executed, the output is empty bytes. | +| `subTraces` | Traces of contract calls made by the transaction. | +| `traceAddress` | Tree list address of where the call occurred, address of the parents, and order of the current sub call. | +| `type` | Whether the transaction is a `CALL` or `CREATE` series operation. | + +## `vmTrace` + +An ordered list of EVM actions when processing the transaction. + +`vmTrace` only reports actual data returned from a `RETURN` opcode and does not return the contents of the reserved output space for the call operations. As a result: + +- `vmTrace` reports `null` when a call operation ends because of a `STOP`, `HALT`, `REVERT`, running out of instructions, or any exceptional halts. +- When a `RETURN` operation returns data of a different length to the space reserved by the call, `vmTrace` reports only the data passed to the `RETURN` operation and does not include pre-existing memory data or trim the returned data. + +For out of gas operations, `vmTrace` reports the operation that caused the out of gas exception, including the calculated gas cost. `vmTrace` does not report `ex` values because the operation is not executed. + +```json title="vmTrace example" +"vmTrace":{ + "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", + "ops":[ + { + "cost":3, + "ex":{ + "mem":null, + "push":[ + "0x8" + ], + "store":null, + "used":16756175 + }, + "pc":72, + "sub":null + }, + ... + ] +} +``` + +| Key | Value | +| --- | --- | +| `code` | Code executed by the EVM. | +| `ops` | Sequence of EVM operations (opcodes) executed in the transaction. | +| `cost` | Gas cost of the opcode. Includes memory expansion costs but not gas refunds. For precompiled contract calls, reports only the actual cost. | +| `ex` | Executed operations. | +| `mem` | Memory read or written by the operation. | +| `push` | Adjusted stack items. For swap, includes all intermediate values and the result. Otherwise, is the value pushed onto the stack. | +| `store` | Account storage written by the operation. | +| `used` | Remaining gas taking into account the all but 1/64th rule for calls. | +| `pc` | Program counter. | +| `sub` | Sub call operations. | + +## `stateDiff` + +State changes in the requested block for each transaction represented as a map of accounts to an object. Besu lists the balance, code, nonce, and storage changes from immediately before the transaction to after the transaction. For the `key:value` pairs: + +- `+` indicates the field didn’t exist before and now has the specified value +- `-` indicates a deleted value +- `*` has a `from` and a `to` value. + +An absent value is distinct from zero when creating accounts or clearing storage. + +```json title="stateDiff example" +"stateDiff":{ + "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ + "balance":{ + "*":{ + "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", + "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" + } + }, + "code":"=", + "nonce":{ + "*":{ + "from":"0x14", + "to":"0x15" + } + }, + "storage":{ + } + } +} +``` + +| Key | Value | +| -------------- | ----------------------------------------- | +| `balance` | Change of balance event. | +| `balance.from` | Balance before the transaction. | +| `balance.to` | Balance after the transaction. | +| `code` | Changes to code. None in this example. | +| `nonce` | Change of nonce. | +| `nonce.from` | Nonce before the transaction. | +| `nonce.to` | Nonce after the transaction. | +| `storage` | Changes to storage. None in this example. | + +## Applicable API methods + +The trace options `trace`, `vmTrace`, and `stateDiff` are available for the following [ad-hoc tracing API methods](../how-to/troubleshoot/trace-transactions.md#ad-hoc-tracing-apis): + +- [`trace_call`](api/index.md#trace_call) +- [`trace_callMany`](api/index.md#trace_callmany) +- [`trace_rawTransaction`](api/index.md#trace_rawtransaction) +- [`trace_replayBlockTransactions`](api/index.md#trace_replayblocktransactions) + +Only the `trace` option is available for the following [transaction-trace filtering API methods](../how-to/troubleshoot/trace-transactions.md#transaction-trace-filtering-apis): + +- [`trace_block`](api/index.md#trace_block) +- [`trace_filter`](api/index.md#trace_filter) +- [`trace_get`](api/index.md#trace_get) +- [`trace_transaction`](api/index.md#trace_transaction) diff --git a/versioned_docs/version-23.4.0/public-networks/tutorials/_category_.json b/versioned_docs/version-23.4.0/public-networks/tutorials/_category_.json new file mode 100644 index 00000000000..ae26fa5135c --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/tutorials/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Tutorials", + "position": 5 +} diff --git a/versioned_docs/version-23.4.0/public-networks/tutorials/besu-teku-mainnet.md b/versioned_docs/version-23.4.0/public-networks/tutorials/besu-teku-mainnet.md new file mode 100644 index 00000000000..1d93c5def05 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/tutorials/besu-teku-mainnet.md @@ -0,0 +1,180 @@ +--- +title: Run Besu and Teku on Mainnet +sidebar_position: 1 +Description: How to run Besu and Teku on Mainnet +--- + +# Run Besu and Teku on Mainnet + +Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and [Teku](https://docs.teku.consensys.net/) as a [consensus client](../concepts/the-merge.md#consensus-clients) on Ethereum Mainnet. + +## 1. Install Besu and Teku + +Install [Besu](../get-started/install/binary-distribution.md) and [Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). + +Ensure you meet the prerequisites for the installation option you use. For example, you must have Java 17+ if using the Besu and Teku binary distributions. + +Ensure you meet the [system requirements for Besu on public networks](../get-started/system-requirements.md). + +## 2. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and Teku. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../how-to/use-engine-api.md). + +## 3. Generate validator keys + +If you're running Teku as a beacon node only, skip to the [next step](#4-start-besu). + +If you're also running Teku as a validator client, have a funded Ethereum address ready (32 ETH and gas fees for each validator). + +Generate validator keys and stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. + +You should also have a `.json` file for each validator key pair. + +::: + +## 4. Start Besu + +Run the following command or specify the options in a [configuration file](../how-to/configuration-file.md): + +```bash +besu \ + --sync-mode=X_SNAP \ + --data-storage-format=BONSAI \ + --rpc-http-enabled=true \ + --rpc-http-host="0.0.0.0" \ + --rpc-ws-enabled=true \ + --rpc-ws-host="0.0.0.0" \ + --host-allowlist=,127.0.0.1,localhost \ + --engine-host-allowlist=,127.0.0.1,localhost \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. +- The IP address of your Besu node using the [`--host-allowlist`](../reference/cli/options.md#host-allowlist) and [`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) options. + +Also, in the command: + +- [`--sync-mode`](../reference/cli/options.md#sync-mode) specifies using [snap sync](../get-started/connect/sync-node.md#snap-synchronization). +- [`--data-storage-format`](../reference/cli/options.md#data-storage-format) specifies using [Bonsai Tries](../concepts/data-storage-formats.md#bonsai-tries). +- [`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC service. +- [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--rpc-ws-enabled`](../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC service. +- [`--rpc-ws-host`](../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--engine-rpc-enabled`](../reference/cli/options.md#engine-rpc-enabled) enables the [Engine API](../reference/engine-api/index.md). + +You can modify the option values and add other [command line options](../reference/cli/options.md) as needed. + +## 5. Start Teku + +Open a new terminal window. + +### Beacon node only + +To run Teku as a beacon node only (without validator duties), run the following command or specify the options in the [Teku configuration file]: + +```bash +teku \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. + +Also, in the command: + +- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) is set to the default URL of Besu's Engine API. +- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) enables Teku's metrics exporter. +- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) enables Teku's REST API service. + +You can modify the option values and add other [Teku command line options] as needed. + +### Beacon node and validator client + +To run Teku as a beacon node and validator in a single process, run the following command or specify the options in the [Teku configuration file]: + +```bash +teku \ + --ee-endpoint http://localhost:8551 \ + --ee-jwt-secret-file \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --validators-proposer-default-fee-recipient= \ + --validator-keys=:[,:,...] +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. +- An Ethereum address you own as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 3](#3-generate-validator-keys) for each validator using the [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. + +Also, in the command: + +- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) is set to the default URL of Besu's Engine API. +- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) enables Teku's metrics exporter. +- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) enables Teku's REST API service. + +You can modify the option values and add other [Teku command line options] as needed. + +## 6. Wait for Besu and Teku to sync + +After starting Besu and Teku, your node starts syncing and connecting to peers. + + + +# Besu logs + +```json +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running Teku as a beacon node only, you're all set. If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. + +## 7. Stake ETH + +Stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +You can check your validator status by searching your Ethereum address on the [Beacon Chain explorer](https://beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + + + +[Teku configuration file]: https://docs.teku.consensys.net/HowTo/Configure/Use-Configuration-File/ +[Teku command line options]: https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/ diff --git a/versioned_docs/version-23.4.0/public-networks/tutorials/besu-teku-testnet.md b/versioned_docs/version-23.4.0/public-networks/tutorials/besu-teku-testnet.md new file mode 100644 index 00000000000..0df6556e440 --- /dev/null +++ b/versioned_docs/version-23.4.0/public-networks/tutorials/besu-teku-testnet.md @@ -0,0 +1,216 @@ +--- +title: Run Besu and Teku on a testnet +sidebar_position: 2 +Description: How to run Besu and Teku on a testnet +--- + +# Run Besu and Teku on a testnet + +Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and [Teku](https://docs.teku.consensys.net/) as a [consensus client](../concepts/the-merge.md#consensus-clients) on the [Goerli](https://github.com/eth-clients/goerli) and [Sepolia](https://github.com/eth-clients/sepolia) Ethereum testnets. + +:::note + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. You can connect your consensus client using the beacon node only, without any validator duties. + +::: + +## 1. Install Besu and Teku + +Install [Besu](../get-started/install/binary-distribution.md) and [Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). + +Ensure you meet the prerequisites for the installation option you use. For example, you must have Java 17+ if using the Besu and Teku binary distributions. + +Ensure you meet the [system requirements for Besu on public networks](../get-started/system-requirements.md). + +## 2. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and Teku. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../how-to/use-engine-api.md). + +## 3. Generate validator keys + +If you're running Teku as a beacon node only, skip to the [next step](#4-start-besu). + +If you're also running Teku as a validator client, create a test Ethereum address (you can do this in [MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and [Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). + +:::note + +If you can't get ETH using the faucet, you can ask for help on the [EthStaker Discord](https://discord.io/ethstaker). + +::: + +Generate validator keys for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or [request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: + +## 4. Start Besu + +Run the following command or specify the options in a [configuration file](../how-to/configuration-file.md): + + + +# Goerli + +```bash +besu \ + --network=goerli \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +# Sepolia + +```bash +besu \ + --network=sepolia \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. + +You can modify the option values and add other [command line options](../reference/cli/options.md) as needed. + +## 5. Start Teku + +Open a new terminal window. + +### Beacon node only + +To run Teku as a beacon node only (without validator duties), run the following command or specify the options in the [Teku configuration file]: + + + +# Goerli + +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + +# Sepolia + +```bash +teku \ + --network=sepolia \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. + +You can modify the option values and add other [Teku command line options] as needed. + +### Beacon node and validator client + +To run Teku as a beacon node and validator in a single process, run the following command or specify the options in the [Teku configuration file]: + + + +# Goerli + +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --validators-proposer-default-fee-recipient= \ + --validator-keys=:[,:,...] +``` + +# Sepolia + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. + + + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. +- The test Ethereum address created in [step 3](#3-generate-validator-keys) as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 3](#3-generate-validator-keys) for each validator using the [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. + +You can modify the option values and add other [Teku command line options] as needed. + +## 6. Wait for Besu and Teku to sync + +After starting Besu and Teku, your node starts syncing and connecting to peers. + + + +# Besu logs + +```json +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running Teku as a beacon node only, you're all set. If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. + +## 7. Stake ETH + +Stake your testnet ETH for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). + +You can check your validator status by searching your Ethereum address on the [Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + + + +[Teku configuration file]: https://docs.teku.consensys.net/HowTo/Configure/Use-Configuration-File/ +[Teku command line options]: https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/ diff --git a/versioned_docs/version-23.4.1/assets/images/Besu-Tessera-High-Availability.png b/versioned_docs/version-23.4.1/assets/images/Besu-Tessera-High-Availability.png new file mode 100644 index 00000000000..12c9f0c36f6 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/Besu-Tessera-High-Availability.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/Besu_TLS.png b/versioned_docs/version-23.4.1/assets/images/Besu_TLS.png new file mode 100644 index 00000000000..fafefc057b4 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/Besu_TLS.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/Bonsai_tries.png b/versioned_docs/version-23.4.1/assets/images/Bonsai_tries.png new file mode 100644 index 00000000000..7e15f349bc4 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/Bonsai_tries.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/CliqueOneIntialSigner.png b/versioned_docs/version-23.4.1/assets/images/CliqueOneIntialSigner.png new file mode 100644 index 00000000000..a04c660f776 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/CliqueOneIntialSigner.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/CliqueTwoIntialSigners.png b/versioned_docs/version-23.4.1/assets/images/CliqueTwoIntialSigners.png new file mode 100644 index 00000000000..57831af0240 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/CliqueTwoIntialSigners.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/EnodeStartup.png b/versioned_docs/version-23.4.1/assets/images/EnodeStartup.png new file mode 100644 index 00000000000..a0aea823b83 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/EnodeStartup.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/Execution-Consensus-Clients.png b/versioned_docs/version-23.4.1/assets/images/Execution-Consensus-Clients.png new file mode 100644 index 00000000000..97c7962619c Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/Execution-Consensus-Clients.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/GraphiQL.png b/versioned_docs/version-23.4.1/assets/images/GraphiQL.png new file mode 100644 index 00000000000..3a8f9705ff1 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/GraphiQL.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/Hyperledger-Besu-Client-Libraries.png b/versioned_docs/version-23.4.1/assets/images/Hyperledger-Besu-Client-Libraries.png new file mode 100644 index 00000000000..85bb59af754 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/Hyperledger-Besu-Client-Libraries.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/Hyperledger-Besu-Plugin-API.png b/versioned_docs/version-23.4.1/assets/images/Hyperledger-Besu-Plugin-API.png new file mode 100644 index 00000000000..b5c4e56ac98 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/Hyperledger-Besu-Plugin-API.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/JWT.png b/versioned_docs/version-23.4.1/assets/images/JWT.png new file mode 100644 index 00000000000..069e6488897 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/JWT.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/KibanaQuickstart.png b/versioned_docs/version-23.4.1/assets/images/KibanaQuickstart.png new file mode 100644 index 00000000000..395337842c8 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/KibanaQuickstart.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/LoadBalancer.png b/versioned_docs/version-23.4.1/assets/images/LoadBalancer.png new file mode 100644 index 00000000000..4c4c4aaf5f4 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/LoadBalancer.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/Multi-tenancy.png b/versioned_docs/version-23.4.1/assets/images/Multi-tenancy.png new file mode 100644 index 00000000000..cbc3b537074 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/Multi-tenancy.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/OrionNodes.png b/versioned_docs/version-23.4.1/assets/images/OrionNodes.png new file mode 100644 index 00000000000..a8fd413ccff Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/OrionNodes.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/PermissioningFlow.png b/versioned_docs/version-23.4.1/assets/images/PermissioningFlow.png new file mode 100644 index 00000000000..dafa2f6a94e Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/PermissioningFlow.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/PortConfiguration.png b/versioned_docs/version-23.4.1/assets/images/PortConfiguration.png new file mode 100644 index 00000000000..7522147db46 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/PortConfiguration.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/PrivacyGroups.png b/versioned_docs/version-23.4.1/assets/images/PrivacyGroups.png new file mode 100644 index 00000000000..8d01cfa2720 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/PrivacyGroups.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/PrivateTransactionProcessing.png b/versioned_docs/version-23.4.1/assets/images/PrivateTransactionProcessing.png new file mode 100644 index 00000000000..d8a2eecaa5f Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/PrivateTransactionProcessing.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/TesseraNodes.png b/versioned_docs/version-23.4.1/assets/images/TesseraNodes.png new file mode 100644 index 00000000000..5e195f403c5 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/TesseraNodes.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/alethio-light-explorer-screenshot.png b/versioned_docs/version-23.4.1/assets/images/alethio-light-explorer-screenshot.png new file mode 100644 index 00000000000..b3bf1125004 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/alethio-light-explorer-screenshot.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/besu-cpu-pattern-during-sync.png b/versioned_docs/version-23.4.1/assets/images/besu-cpu-pattern-during-sync.png new file mode 100644 index 00000000000..e345bb212dc Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/besu-cpu-pattern-during-sync.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/block-time.png b/versioned_docs/version-23.4.1/assets/images/block-time.png new file mode 100644 index 00000000000..914c186237d Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/block-time.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/create-resource-button-screenshot.png b/versioned_docs/version-23.4.1/assets/images/create-resource-button-screenshot.png new file mode 100644 index 00000000000..85de6d9eced Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/create-resource-button-screenshot.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/dapp-explorer-tx.png b/versioned_docs/version-23.4.1/assets/images/dapp-explorer-tx.png new file mode 100644 index 00000000000..700f5c47e74 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/dapp-explorer-tx.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/dapp-metamask-tx.png b/versioned_docs/version-23.4.1/assets/images/dapp-metamask-tx.png new file mode 100644 index 00000000000..766a6eb59a5 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/dapp-metamask-tx.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/dapp-ui.png b/versioned_docs/version-23.4.1/assets/images/dapp-ui.png new file mode 100644 index 00000000000..fc730254492 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/dapp-ui.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/dashboard.png b/versioned_docs/version-23.4.1/assets/images/dashboard.png new file mode 100644 index 00000000000..761579ac613 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/dashboard.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/deployment-complete-screenshot.png b/versioned_docs/version-23.4.1/assets/images/deployment-complete-screenshot.png new file mode 100644 index 00000000000..d16683d37bc Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/deployment-complete-screenshot.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/enterprise-ethereum-account-permissioning.png b/versioned_docs/version-23.4.1/assets/images/enterprise-ethereum-account-permissioning.png new file mode 100644 index 00000000000..684e01ccd8c Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/enterprise-ethereum-account-permissioning.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/ethstats.png b/versioned_docs/version-23.4.1/assets/images/ethstats.png new file mode 100644 index 00000000000..c491b24398a Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/ethstats.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/explorer.png b/versioned_docs/version-23.4.1/assets/images/explorer.png new file mode 100644 index 00000000000..6a3eb733ea5 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/explorer.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/fastsync.png b/versioned_docs/version-23.4.1/assets/images/fastsync.png new file mode 100644 index 00000000000..7ab329c8769 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/fastsync.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/forest_of_tries.png b/versioned_docs/version-23.4.1/assets/images/forest_of_tries.png new file mode 100644 index 00000000000..e6e73bbb954 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/forest_of_tries.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/grafana.png b/versioned_docs/version-23.4.1/assets/images/grafana.png new file mode 100644 index 00000000000..c9339f249a7 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/grafana.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/grafana_loki.png b/versioned_docs/version-23.4.1/assets/images/grafana_loki.png new file mode 100644 index 00000000000..7fcdbc9637d Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/grafana_loki.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/io-utilization.png b/versioned_docs/version-23.4.1/assets/images/io-utilization.png new file mode 100644 index 00000000000..fab930dd5d6 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/io-utilization.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kuberenetes-genesis-secrets.png b/versioned_docs/version-23.4.1/assets/images/kuberenetes-genesis-secrets.png new file mode 100644 index 00000000000..8b2b52441a9 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kuberenetes-genesis-secrets.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-1.jpeg b/versioned_docs/version-23.4.1/assets/images/kubernetes-1.jpeg new file mode 100644 index 00000000000..18ede0c091f Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-1.jpeg differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-2.jpeg b/versioned_docs/version-23.4.1/assets/images/kubernetes-2.jpeg new file mode 100644 index 00000000000..1e2c856f3c7 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-2.jpeg differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-3.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-3.png new file mode 100644 index 00000000000..8621c72f83d Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-3.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-bootnode-logs.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-bootnode-logs.png new file mode 100644 index 00000000000..a11a61f2df0 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-bootnode-logs.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-elastic.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-elastic.png new file mode 100644 index 00000000000..46c99465e65 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-elastic.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-contracts-1.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-contracts-1.png new file mode 100644 index 00000000000..d27681af61b Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-contracts-1.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-contracts-set.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-contracts-set.png new file mode 100644 index 00000000000..530c68deb13 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-contracts-set.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-explorer.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-explorer.png new file mode 100644 index 00000000000..9b169a4b7af Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-explorer.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-validators.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-validators.png new file mode 100644 index 00000000000..58fb91cd849 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-validators.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-wallet.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-wallet.png new file mode 100644 index 00000000000..2f9eba7b253 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer-wallet.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer.png new file mode 100644 index 00000000000..ecde2ef11c0 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-explorer.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-genesis-configmaps.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-genesis-configmaps.png new file mode 100644 index 00000000000..71318e36c65 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-genesis-configmaps.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-grafana.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-grafana.png new file mode 100644 index 00000000000..545dfd89bd7 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-grafana.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-ingress-ip.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-ingress-ip.png new file mode 100644 index 00000000000..f14f4d895d2 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-ingress-ip.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-monitoring.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-monitoring.png new file mode 100644 index 00000000000..185e8b0f6f7 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-monitoring.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-tx-Besu-logs.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-tx-Besu-logs.png new file mode 100644 index 00000000000..8227a8a11e2 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-tx-Besu-logs.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-tx-tessera-logs.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-tx-tessera-logs.png new file mode 100644 index 00000000000..a146712cdf2 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-tx-tessera-logs.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/kubernetes-validator-logs.png b/versioned_docs/version-23.4.1/assets/images/kubernetes-validator-logs.png new file mode 100644 index 00000000000..3b815e96012 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/kubernetes-validator-logs.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_0_landing.png b/versioned_docs/version-23.4.1/assets/images/mp_0_landing.png new file mode 100644 index 00000000000..4b44acaf580 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_0_landing.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_10_ssh.png b/versioned_docs/version-23.4.1/assets/images/mp_10_ssh.png new file mode 100644 index 00000000000..1229060dba3 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_10_ssh.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_1_basics.png b/versioned_docs/version-23.4.1/assets/images/mp_1_basics.png new file mode 100644 index 00000000000..ed6e98a9d24 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_1_basics.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_2_size.png b/versioned_docs/version-23.4.1/assets/images/mp_2_size.png new file mode 100644 index 00000000000..f0f41a0cafe Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_2_size.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_4_deployment.png b/versioned_docs/version-23.4.1/assets/images/mp_4_deployment.png new file mode 100644 index 00000000000..858b2a4b53d Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_4_deployment.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_5_deployment_complete.png b/versioned_docs/version-23.4.1/assets/images/mp_5_deployment_complete.png new file mode 100644 index 00000000000..b10380c738b Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_5_deployment_complete.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_6_resource.png b/versioned_docs/version-23.4.1/assets/images/mp_6_resource.png new file mode 100644 index 00000000000..8307edc60ae Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_6_resource.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_7_vm.png b/versioned_docs/version-23.4.1/assets/images/mp_7_vm.png new file mode 100644 index 00000000000..b9519fa6fa0 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_7_vm.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_8_block_explorer.png b/versioned_docs/version-23.4.1/assets/images/mp_8_block_explorer.png new file mode 100644 index 00000000000..c898b1ba5de Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_8_block_explorer.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/mp_9_grafana.png b/versioned_docs/version-23.4.1/assets/images/mp_9_grafana.png new file mode 100644 index 00000000000..e37c0b9bade Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/mp_9_grafana.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/node-permissioning-bad-actor.png b/versioned_docs/version-23.4.1/assets/images/node-permissioning-bad-actor.png new file mode 100644 index 00000000000..b5e8952b51f Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/node-permissioning-bad-actor.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/postman-logo.svg b/versioned_docs/version-23.4.1/assets/images/postman-logo.svg new file mode 100644 index 00000000000..8ca967adafd --- /dev/null +++ b/versioned_docs/version-23.4.1/assets/images/postman-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/versioned_docs/version-23.4.1/assets/images/private-architecture.jpeg b/versioned_docs/version-23.4.1/assets/images/private-architecture.jpeg new file mode 100644 index 00000000000..3d31c1a325f Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/private-architecture.jpeg differ diff --git a/versioned_docs/version-23.4.1/assets/images/public-architecture.jpeg b/versioned_docs/version-23.4.1/assets/images/public-architecture.jpeg new file mode 100644 index 00000000000..f96066ee909 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/public-architecture.jpeg differ diff --git a/versioned_docs/version-23.4.1/assets/images/sampleNetworks-poa.png b/versioned_docs/version-23.4.1/assets/images/sampleNetworks-poa.png new file mode 100644 index 00000000000..64ecea2a8c8 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sampleNetworks-poa.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-block-details.png b/versioned_docs/version-23.4.1/assets/images/sirato-block-details.png new file mode 100644 index 00000000000..6b8922515fd Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-block-details.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-blocks.png b/versioned_docs/version-23.4.1/assets/images/sirato-blocks.png new file mode 100644 index 00000000000..9d90941ce7e Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-blocks.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-contract-details.png b/versioned_docs/version-23.4.1/assets/images/sirato-contract-details.png new file mode 100644 index 00000000000..a662d4da7ab Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-contract-details.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-contracts.png b/versioned_docs/version-23.4.1/assets/images/sirato-contracts.png new file mode 100644 index 00000000000..a46eecbfb6d Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-contracts.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-dashboard.png b/versioned_docs/version-23.4.1/assets/images/sirato-dashboard.png new file mode 100644 index 00000000000..5a2effaadd2 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-dashboard.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-events.png b/versioned_docs/version-23.4.1/assets/images/sirato-events.png new file mode 100644 index 00000000000..ad40a9fdfcc Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-events.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-loading.png b/versioned_docs/version-23.4.1/assets/images/sirato-loading.png new file mode 100644 index 00000000000..e15bf4cc6d8 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-loading.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-network.png b/versioned_docs/version-23.4.1/assets/images/sirato-network.png new file mode 100644 index 00000000000..5d649b5eb5f Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-network.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-token-details.png b/versioned_docs/version-23.4.1/assets/images/sirato-token-details.png new file mode 100644 index 00000000000..d2b125df12e Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-token-details.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-tokens.png b/versioned_docs/version-23.4.1/assets/images/sirato-tokens.png new file mode 100644 index 00000000000..ba7d1fc5b48 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-tokens.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-transaction-details.png b/versioned_docs/version-23.4.1/assets/images/sirato-transaction-details.png new file mode 100644 index 00000000000..abbb4f650ab Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-transaction-details.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/sirato-transactions.png b/versioned_docs/version-23.4.1/assets/images/sirato-transactions.png new file mode 100644 index 00000000000..49ec42ae607 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/sirato-transactions.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/splunk-ui.png b/versioned_docs/version-23.4.1/assets/images/splunk-ui.png new file mode 100644 index 00000000000..d40b2b32ac8 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/splunk-ui.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/system-load.png b/versioned_docs/version-23.4.1/assets/images/system-load.png new file mode 100644 index 00000000000..f3b15ec8e09 Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/system-load.png differ diff --git a/versioned_docs/version-23.4.1/assets/images/transaction-validation.png b/versioned_docs/version-23.4.1/assets/images/transaction-validation.png new file mode 100644 index 00000000000..523139d8f9d Binary files /dev/null and b/versioned_docs/version-23.4.1/assets/images/transaction-validation.png differ diff --git a/versioned_docs/version-23.4.1/assets/postman/postman_collection.json b/versioned_docs/version-23.4.1/assets/postman/postman_collection.json new file mode 100644 index 00000000000..55bfdfcf814 --- /dev/null +++ b/versioned_docs/version-23.4.1/assets/postman/postman_collection.json @@ -0,0 +1,5780 @@ +{ + "info": { + "_postman_id": "f334929f-c8c3-43ed-bb73-69a6f0d728d8", + "name": "Hyperledger Besu JSON-RPC API", + "description": "Hyperledger Besu JSON-RPC API enables interaction with a Besu Ethereum node.\n\nRefer to [Besu documentation how to page](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API/) to learn how to use this API.\n", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "ADMIN", + "item": [ + { + "name": "admin_addPeer", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Result should be true\", () => {", + " //parse the response json", + " const responseJson = pm.response.json();", + " pm.expect(responseJson.id).to.eql(1);", + " pm.expect(responseJson.result).is.true;", + "});" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "content-length": true, + "host": true + } + }, + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_addPeer\",\n \"params\": [\n \"enode://c93f69ddd83d3db3e93e5165d60b4f5d93a9731df776beee94c5f8a0c770e41bdea69094136402db0cef7af63f0aa636ff676d4a88c6d37276dfa4160c21ed5f@127.0.0.1:30303\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Adds a static node\n\n> **Caution**\n>\n> If connections are timing out, ensure the node ID in the enode URL is correct.\n\n#### Parameters\n\n`string` : Enode URL of peer to add\n\n#### Returns\n\n`result` : `boolean` - `true` if peer added or `false` if peer already a static node." + }, + "response": [ + { + "name": "admin_addPeer", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_addPeer\",\n \"params\": [\n \"enode://c93f69ddd83d3db3e93e5165d60b4f5d93a9731df776beee94c5f8a0c770e41bdea69094136402db0cef7af63f0aa636ff676d4a88c6d37276dfa4160c21ed5f@127.0.0.1:30303\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "admin_changeLogLevel", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_changeLogLevel\",\n \"params\": [\n \"DEBUG\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Changes the log level without restarting Besu. You can change the log level for all logs, or you\ncan change the log level for specific packages or classes.\n\nYou can specify only one log level per RPC call.\n\n#### Parameters\n\n`level` - [Log level](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#logging)\n\n`log_filter`: `Array` - Packages or classes to change the log level for. Optional.\n\n#### Returns\n\n`result` : `Success` if the log level has changed, otherwise `error`." + }, + "response": [ + { + "name": "admin_changeLogLevel", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_changeLogLevel\",\n \"params\": [\n \"DEBUG\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "admin_generateLogBloomCache", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_generateLogBloomCache\",\n \"params\": [\n \"0x0\",\n \"0x10000\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Generates cached log bloom indexes for blocks. APIs such as [`eth_getLogs`](#eth_getlogs) and\n[`eth_getFilterLogs`](#eth_getfilterlogs) use the cache for improved performance.\n\n> **note**\n>\n> Each index file contains 100000 blocks. The last fragment of blocks less than 100000 are not indexed.\n\n> **tip**\n>\n> Manually executing `admin_generateLogBloomCache` is not required unless the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#auto-log-bloom-caching-enabled) command line option was set to false.\n\n#### Parameters\n\n`integer` - Block to start generating indexes.\n\n`integer` - Block to stop generating indexes.\n\n#### Returns\n\n`result` : *object* - Log bloom index details:\n\n* `quantity` : `startBlock` - Starting block for the last requested cache generation.\n* `quantity` : `endBlock` - Ending block for the last requested cache generation.\n* `quantity` : `currentBlock` - The most recent block added to the cache.\n* `boolean` : `indexing` - `true` if indexing is in progress.\n* `boolean` : `true` indicates acceptance of the request from this call to generate the cache." + }, + "response": [ + { + "name": "admin_generateLogBloomCache", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_generateLogBloomCache\",\n \"params\": [\n \"0x0\",\n \"0x10000\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"startBlock\": \"0x0\",\n \"endBlock\": \"0x10000\",\n \"currentBlock\": \"0x0\",\n \"indexing\": true,\n \"requestAccepted\": true\n }\n}" + } + ] + }, + { + "name": "admin_logsRepairCache", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_logsRepairCache\",\n \"params\": [\n \"1200\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Repairs cached logs by fixing all segments starting with the specified block number.\n\n#### Parameters\n\n`quantity` - Decimal index of the starting block to fix. If left empty, the head block\nis used as the starting point.\n\n#### Returns\n\n`result` - Status of the repair request. Either `Started`, or `Already running`." + }, + "response": [ + { + "name": "admin_logsRepairCache", + "originalRequest": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_logsRepairCache\",\n \"params\": [\n \"1200\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"Status\": \"Started\"\n }\n}" + } + ] + }, + { + "name": "admin_nodeInfo", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_nodeInfo\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns networking information about the node. The information includes general information about\nthe node and specific information from each running Ethereum sub-protocol (for example, `eth`).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : Node object\n\nProperties of the node object are:\n\n* `enode` - [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of the node.\n* `listenAddr` - Host and port for the node.\n* `name` - Client name.\n* `id` - [Node public key](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#node-public-key).\n* `ports` - Peer discovery and listening\n [ports](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Managing-Peers#port-configuration).\n* `protocols` - List of objects containing information for each Ethereum sub-protocol.\n\n> **note**\n>\n> If the node is running locally, the host of the `enode` and `listenAddr` display as `[::]` in the result. When advertising externally, the external address displayed for the `enode` and `listenAddr` is defined by [`--nat-method`](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Specifying-NAT).\n" + }, + "response": [ + { + "name": "admin_nodeInfo", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_nodeInfo\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"enode\": \"enode://87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3@[::]:30303\",\n \"listenAddr\": \"[::]:30303\",\n \"name\": \"besu/v1.0.1-dev-0d2294a5/osx-x86_64/oracle-java-1.8\",\n \"id\": \"87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3\",\n \"ports\": {\n \"discovery\": 30303,\n \"listener\": 30303\n },\n \"protocols\": {\n \"eth\": {\n \"config\": {\n \"chainId\": 2018,\n \"homesteadBlock\": 0,\n \"daoForkBlock\": 0,\n \"daoForkSupport\": true,\n \"eip150Block\": 0,\n \"eip155Block\": 0,\n \"eip158Block\": 0,\n \"byzantiumBlock\": 0,\n \"constantinopleBlock\": 0,\n \"constantinopleFixBlock\": 0,\n \"ethash\": {\n \"fixeddifficulty\": 100\n }\n },\n \"difficulty\": 78536,\n \"genesis\": \"0x43ee12d45470e57c86a0dfe008a5b847af9e372d05e8ba8f01434526eb2bea0f\",\n \"head\": \"0xc6677651f16d07ae59cab3a5e1f0b814ed2ec27c00a93297b2aa2e29707844d9\",\n \"network\": 2018\n }\n }\n }\n}" + } + ] + }, + { + "name": "admin_peers", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_peers\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns networking information about connected remote nodes.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *array* of *objects* - Object returned for each remote node.\n\nProperties of the remote node object are:\n\n* `version` - P2P protocol version.\n* `name` - Client name.\n* `caps` - List of Ethereum sub-protocol capabilities.\n* `network` - Local and remote addresses established at time of bonding with the peer. The remote\n address might not match the hex value for `port`. The remote address depends on which node\n initiated the connection.\n* `port` - Port on the remote node on which P2P discovery is listening.\n* `id` - Node public key. Excluding the `0x` prefix, the node public key is the ID in the enode\n URL `enode://@:`.\n* `protocols` - [Current state of peer](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Managing-Peers#monitoring-peer-connections)\n including `difficulty` and `head`. `head` is the hash of the highest known block for the peer." + }, + "response": [ + { + "name": "admin_peers", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_peers\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"version\": \"0x5\",\n \"name\": \"besu/v20.10.4-dev-0905d1b2/osx-x86_64/adoptopenjdk-java-11\",\n \"caps\": [\n \"eth/62\",\n \"eth/63\",\n \"eth/64\",\n \"eth/65\",\n \"IBF/1\"\n ],\n \"network\": {\n \"localAddress\": \"192.168.1.229:50115\",\n \"remoteAddress\": \"168.61.153.255:40303\"\n },\n \"port\": \"0x765f\",\n \"id\": \"0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc\",\n \"protocols\": {\n \"eth\": {\n \"difficulty\": \"0x1ac\",\n \"head\": \"0x964090ae9277aef43f47f1b8c28411f162243d523118605f0b1231dbfdf3611a\",\n \"version\": 65\n }\n }\n }\n ]\n}" + } + ] + }, + { + "name": "admin_removePeer", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_removePeer\",\n \"params\": [\n \"enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Removes a [static node](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Static-Nodes).\n\n#### Parameters\n\n`string` : [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of peer to remove.\n\n#### Returns\n\n`result` : `boolean` - `true` if peer removed or `false` if peer not a\n[static node](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Static-Nodes))." + }, + "response": [ + { + "name": "admin_removePeer", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_removePeer\",\n \"params\": [\n \"enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `ADMIN` API methods are not enabled by default for JSON-RPC. To enable the `ADMIN` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or\n[`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options.", + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [""] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [""] + } + } + ] + }, + { + "name": "CLIQUE", + "item": [ + { + "name": "clique_discard", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_discard\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Discards a proposal to [add or remove a signer with the specified address].\n\n#### Parameters\n\n`data` - 20-byte address of proposed signer.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "clique_discard", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_discard\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "clique_getSignerMetrics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides validator metrics for the specified range:\n\n* Number of blocks from each validator.\n* Block number of the last block proposed by each validator (if any proposed in the specified\n range).\n* All validators present in the last block.\n\n#### Parameters\n\n`fromBlockNumber` - Integer representing a block number or the string tag `earliest`, as described\nin [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`toBlockNumber` - Integer representing a block number or one of the string tags `latest` or\n`pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter)\n\nIf you specify:\n\n* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less\n than 100 blocks.\n* Only the first parameter, the call provides metrics for all blocks from the block specified to\n the latest block.\n\n#### Returns\n\n`result`: _object_ - List of validator objects.\n\n> **Note**\n>\n> The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`." + }, + "response": [ + { + "name": "clique_getSignerMetrics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"address\": \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x61\"\n },\n {\n \"address\": \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x63\"\n },\n {\n \"address\": \"0xb279182d99e65703f0076e4812653aab85fca0f0\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x62\"\n }\n ]\n}" + } + ] + }, + { + "name": "clique_getSigners", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSigners\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists [signers for the specified block].\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result: array of data` - List of 20-byte addresses of signers." + }, + "response": [ + { + "name": "clique_getSigners", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSigners\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"0xb279182d99e65703f0076e4812653aab85fca0f0\"\n ]\n}" + } + ] + }, + { + "name": "clique_getSignersAtHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignersAtHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists signers for the specified block.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result: array of data` - List of 20-byte addresses of signers." + }, + "response": [ + { + "name": "clique_getSignersAtHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignersAtHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"0xb279182d99e65703f0076e4812653aab85fca0f0\"\n ]\n}" + } + ] + }, + { + "name": "clique_proposals", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_proposals\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns\n[current proposals](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/Clique#adding-and-removing-signers).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`:_object_ - Map of account addresses to corresponding boolean values indicating the\nproposal for each account.\n\nIf the boolean value is `true`, the proposal is to add a signer. If `false`, the proposal is to\nremove a signer." + }, + "response": [ + { + "name": "clique_proposals", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_proposals\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"0x42eb768f2244c8811c63729a21a3569731535f07\": false,\n \"0x12eb759f2222d7711c63729a45c3585731521d01\": true\n }\n}" + } + ] + }, + { + "name": "clique_propose", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_propose\",\n \"params\": [\n \"0x12eb759f2222d7711c63729a45c3585731521d01\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Propose to [add or remove a signer with the specified address].\n\n#### Parameters\n\n`data` - 20-byte address.\n\n`boolean` - `true` to propose adding signer or `false` to propose removing signer.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "clique_propose", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_propose\",\n \"params\": [\n \"0x12eb759f2222d7711c63729a45c3585731521d01\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> Note\n>\n> The `CLIQUE` API methods are not enabled by default for JSON-RPC.\n>\n> To enable the `CLIQUE` API methods use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "DEBUG", + "item": [ + { + "name": "debug_accountRange", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_accountRange\",\n \"params\": [\n \"12345\",\n 0,\n \"0\",\n 5\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "[Retesteth](https://github.com/ethereum/retesteth/wiki/Retesteth-Overview) uses\n`debug_accountRange` to implement debugging.\n\nReturns the accounts for a specified block.\n\n#### Parameters\n\n`blockHashOrNumber` : `data` - Block hash or number.\n\n`txIndex` : `integer` - Transaction index from which to start.\n\n`address` : `data` - Address hash from which to start.\n\n`limit` : `integer` - Maximum number of account entries to return.\n\n#### Returns\n\n`result`:`object` - Account details:\n\n* `addressMap`:`object` - List of address hashes and account addresses.\n* `nextKey`:`data` - Hash of the next address if any addresses remain in the state, otherwise\n zero.\n" + }, + "response": [ + { + "name": "debug_accountRange", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_accountRange\",\n \"params\": [\n \"12345\",\n 0,\n \"0\",\n 5\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"addressMap\": {\n \"0x005e5...86960\": \"0x0000000000000000000000000000000000000000\",\n \"0x021fe...6ffe3\": \"0x0000000000000000000000000000000000000000\",\n \"0x028e6...ab776\": \"0x0000000000000000000000000000000000000000\",\n \"0x02cb5...bc4d8\": \"0x0000000000000000000000000000000000000000\",\n \"0x03089...23fd5\": \"0x0000000000000000000000000000000000000000\"\n },\n \"nextKey\": \"0x04242954a5cb9748d3f66bcd4583fd3830287aa585bebd9dd06fa6625976be49\"\n }\n}" + } + ] + }, + { + "name": "debug_metrics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_metrics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns metrics providing information on the internal operation of Besu.\n\nThe available metrics might change over time. The JVM metrics might vary based on the JVM\nimplementation used.\n\nThe metric types are:\n\n* Timer\n* Counter\n* Gauge.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`:`object`" + }, + "response": [ + { + "name": "debug_metrics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_metrics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"jvm\": {\n \"memory_bytes_init\": {\n \"heap\": 268435456,\n \"nonheap\": 2555904\n },\n \"threads_current\": 41,\n \"memory_bytes_used\": {\n \"heap\": 696923976,\n \"nonheap\": 63633456\n },\n \"memory_pool_bytes_used\": {\n \"PS Eden Space\": 669119360,\n \"Code Cache\": 19689024,\n \"Compressed Class Space\": 4871144,\n \"PS Survivor Space\": 2716320,\n \"PS Old Gen\": 25088296,\n \"Metaspace\": 39073288\n },\n \"other properties...\":\"values...\"\n },\n \"process\": {\n \"open_fds\": 546,\n \"cpu_seconds_total\": 67.148992,\n \"start_time_seconds\": 1543897699.589,\n \"max_fds\": 10240\n },\n \"rpc\": {\n \"request_time\": {\n \"debug_metrics\": {\n \"bucket\": {\n \"+Inf\": 2,\n \"0.01\": 1,\n \"0.075\": 2,\n \"0.75\": 2,\n \"0.005\": 1,\n \"0.025\": 2,\n \"0.1\": 2,\n \"1.0\": 2,\n \"0.05\": 2,\n \"10.0\": 2,\n \"0.25\": 2,\n \"0.5\": 2,\n \"5.0\": 2,\n \"2.5\": 2,\n \"7.5\": 2\n },\n \"count\": 2,\n \"sum\": 0.015925392\n }\n }\n },\n \"blockchain\": {\n \"difficulty_total\": 3533501,\n \"announcedBlock_ingest\": {\n \"bucket\": {\n \"+Inf\": 0,\n \"0.01\": 0,\n \"0.075\": 0,\n \"0.75\": 0,\n \"0.005\": 0,\n \"0.025\": 0,\n \"0.1\": 0,\n \"1.0\": 0,\n \"0.05\": 0,\n \"10.0\": 0,\n \"0.25\": 0,\n \"0.5\": 0,\n \"5.0\": 0,\n \"2.5\": 0,\n \"7.5\": 0\n },\n \"count\": 0,\n \"sum\": 0\n },\n \"height\": 1908793\n },\n \"peers\": {\n \"disconnected_total\": {\n \"remote\": {\n \"SUBPROTOCOL_TRIGGERED\": 5\n },\n \"local\": {\n \"TCP_SUBSYSTEM_ERROR\": 1,\n \"SUBPROTOCOL_TRIGGERED\": 2,\n \"USELESS_PEER\": 3\n }\n },\n \"peer_count_current\": 2,\n \"connected_total\": 10\n }\n }\n}" + } + ] + }, + { + "name": "debug_storageRangeAt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_storageRangeAt\",\n \"params\": [\n \"0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c\",\n 0,\n \"0x0e0d2c8f7794e82164f11798276a188147fbd415\",\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n 1\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "[Remix](https://remix.ethereum.org/) uses `debug_storageRangeAt` to implement debugging. Use the\n_Debugger_ tab in Remix instead of calling `debug_storageRangeAt` directly.\n\nReturns the contract storage for the specified range.\n\n#### Parameters\n\n`blockHash` : `data` - Block hash.\n\n`txIndex` : `integer` - Transaction index from which to start.\n\n`address` : `data` - Contract address.\n\n`startKey` : `hash` - Start key.\n\n`limit` : `integer` - Number of storage entries to return.\n\n#### Returns\n\n`result`:`object` - [Range object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#range-object).\n" + }, + "response": [ + { + "name": "debug_storageRangeAt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_storageRangeAt\",\n \"params\": [\n \"0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c\",\n 0,\n \"0x0e0d2c8f7794e82164f11798276a188147fbd415\",\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n 1\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"storage\": {\n \"0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563\": {\n \"key\": null,\n \"value\": \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n }\n },\n \"nextKey\": \"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6\"\n }\n}" + } + ] + }, + { + "name": "debug_traceBlock", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlock\",\n \"params\": [\n \"0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`Block` : `data` - RLP of the block.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`object` - [Trace object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object).\n" + }, + "response": [ + { + "name": "debug_traceBlock", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlock\",\n \"params\": [\n \"0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": null\n }\n ]\n }\n}" + } + ] + }, + { + "name": "debug_traceBlockByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByHash\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`block hash` : `data` - Block hash.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`array of objects` - [Trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object)." + }, + "response": [ + { + "name": "debug_traceBlockByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByHash\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": {},\n \"reason\": null\n }\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "debug_traceBlockByNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByNumber\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`array of objects` - [Trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object)." + }, + "response": [ + { + "name": "debug_traceBlockByNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByNumber\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": null,\n \"reason\": null\n }\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "debug_traceTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceTransaction\",\n \"params\": [\n \"0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e\",\n {\n \"disableStorage\": true\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "[Remix](https://remix.ethereum.org/) uses `debug_traceTransaction` to implement debugging. Use the\n_Debugger_ tab in Remix instead of calling `debug_traceTransaction` directly.\n\nReruns the transaction with the same state as when the transaction executed.\n\n#### Parameters\n\n`transactionHash` : `data` - Transaction hash.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`object` - [Trace object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object).\n" + }, + "response": [ + { + "name": "debug_traceTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceTransaction\",\n \"params\": [\n \"0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e\",\n {\n \"disableStorage\": true\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": null\n }\n ]\n }\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `DEBUG` API methods are not enabled by default for JSON-RPC. To enable the `DEBUG` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options.\n\nThe DEBUG API is a more verbose alternative to the TRACE API whose main purpose is compatibility with tools such as [Remix](https://remix.ethereum.org/). We recommend using the TRACE API for production use over the DEBUG API." + }, + { + "name": "EEA", + "item": [ + { + "name": "eea_sendRawTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eea_sendRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Distributes the\n[private transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions),\ngenerates the [privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing)\nand submits it to the transaction pool, and returns the transaction hash of the\n[privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing).\n\nThe signed transaction passed as an input parameter includes the `privateFrom`,\n[`privateFor` or `privacyGroupId`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions#eea-compliant-or-besu-extended-privacy),\nand `restriction` fields.\n\nThe `gas` and `gasPrice` are used by the [privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing)\nnot the private transaction itself.\n\nTo avoid exposing your private key, create signed transactions offline and send the signed\ntransaction data using `eea_sendRawTransaction`.\n\n> **Important**\n>\n> For production systems requiring private transactions, use a network with a consensus mechanism\n> supporting transaction finality to make sure the private state does not become inconsistent\n> with the chain. For example, [IBFT 2.0](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT)\n> provides the required finality.\n>\n> Using private transactions with [pruning](https://besu.hyperledger.org/en/stable/Concepts/Pruning) or\n> [fast sync](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#sync-mode) is not supported.\n> \n> Besu does not implement\n> [`eea_sendTransaction`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management).\n> \n> [EthSigner](https://docs.ethsigner.consensys.net/en/latest/) provides transaction signing and\n>implements [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction).\n\n#### Parameters\n\n`data` - Signed RLP-encoded private transaction. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n#### Returns\n\n`result` : `data` - 32-byte transaction hash of the\n[Privacy Marker Transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing).\n\n> **Tip**\n>\n> If creating a contract, use [priv_getTransactionReceipt](#priv_gettransactionreceipt) to\n> retrieve the contract address after the transaction is finalized." + }, + "response": [ + { + "name": "eea_sendRawTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eea_sendRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"result\": \"0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331\"\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `EEA` API methods are not enabled by default for JSON-RPC. To enable the `EEA` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "ETH", + "item": [ + { + "name": "eth_accounts", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_accounts\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a list of account addresses a client owns.\n\n> **note**\n> \n> This method returns an empty object because Besu [doesn't support key management](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management) inside the client.\n> \n> To provide access to your key store and and then sign transactions, use [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`Array of data` : List of 20-byte account addresses owned by the client.\n" + }, + "response": [ + { + "name": "eth_accounts", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_accounts\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": []\n}" + } + ] + }, + { + "name": "eth_blockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_blockNumber\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the index corresponding to the block number of the current chain head.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *QUANTITY* - Hexadecimal integer representing the index corresponding to the block\nnumber of the current chain head.\n" + }, + "response": [ + { + "name": "eth_blockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_blockNumber\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": \"0x2377\"\n}" + } + ] + }, + { + "name": "eth_call", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_call\",\n \"params\": [\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Invokes a contract function locally and does not change the state of the blockchain.\n\nYou can interact with contracts using `eth_sendRawTransaction` or `eth_call`.\n\n#### Parameters\n\n*OBJECT* - [Transaction call object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object).\n\n*QUANTITY|TAG* - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` - `data` - Return value of the executed contract.\n" + }, + "response": [ + { + "name": "eth_call", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_call\",\n \"params\": [\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x\"\n}" + } + ] + }, + { + "name": "eth_chainId", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_chainId\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the [chain ID](https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *quantity* - Chain ID, in hexadecimal." + }, + "response": [ + { + "name": "eth_chainId", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_chainId\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": \"0x7e2\"\n}" + } + ] + }, + { + "name": "eth_coinbase", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_coinbase\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the client coinbase address. The coinbase address is the account to pay mining rewards to.\n\nTo set a coinbase address, start Besu with the `--miner-coinbase` option set to a valid Ethereum\naccount address. You can get the Ethereum account address from a client such as MetaMask or\nEtherscan. For example:\n\n**Example**\n\n```bash\nbesu --miner-coinbase=\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\" --rpc-http-enabled\n```\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *data* - Coinbase address." + }, + "response": [ + { + "name": "eth_coinbase", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_coinbase\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"\n}" + } + ] + }, + { + "name": "eth_estimateGas", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_estimateGas\",\n \"params\": [\n {\n \"from\": \"0x687422eea2cb73b5d3e242ba5456b782919afc85\",\n \"to\": \"0xdd37f65db31c107f773e82a4f85c693058fef7a9\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an estimate of the gas required for a transaction to complete. The estimation process\ndoes not use gas and the transaction is not added to the blockchain. The resulting estimate can be\ngreater than the amount of gas the transaction ends up using, for reasons including EVM mechanics\nand node performance.\n\nThe `eth_estimateGas` call does not send a transaction. You must call\n[`eth_sendRawTransaction`](#eth_sendrawtransaction) to execute the transaction.\n\n#### Parameters\n\nThe transaction call object parameters are the same as those for [`eth_call`](#eth_call) except for the\n[`strict` parameter](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object). If `strict` is set to `true`, the sender\naccount balance is checked for value transfer and transaction fees. The default for `strict` is `false`.\n\nFor `eth_estimateGas`, all fields are optional because setting a gas limit\nis irrelevant to the estimation process (unlike transactions, in which gas limits apply).\n\n`object` - [Transaction call object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object).\n\n#### Returns\n\n`result` : `quantity` - Amount of gas used." + }, + "response": [ + { + "name": "eth_estimateGas", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_estimateGas\",\n \"params\": [\n {\n \"from\": \"0x687422eea2cb73b5d3e242ba5456b782919afc85\",\n \"to\": \"0xdd37f65db31c107f773e82a4f85c693058fef7a9\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x5208\"\n}" + } + ] + }, + { + "name": "eth_gasPrice", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_gasPrice\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a percentile gas unit price for the most recent blocks, in Wei. By default,\nthe last 100 blocks are examined and the 50th percentile gas unit price (that is, the median value)\nis returned.\n\nIf there are no blocks, the value for [`--min-gas-price`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#min-gas-price) is returned.\nThe value returned is restricted to values between [`--min-gas-price`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#min-gas-price)\nand [`--api-gas-price-max`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-max). By default, 1000 Wei and\n500GWei.\n\nUse the [`--api-gas-price-blocks`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-blocks), [`--api-gas-price-percentile`](CLI/CLI-Syntax#api-gas-price-percentile)\n, and [`--api-gas-price-max`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-max) command line\noptions to configure the `eth_gasPrice` default values.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `quantity` - Percentile gas unit price for the most recent blocks, in Wei, as a hexadecimal value." + }, + "response": [ + { + "name": "eth_gasPrice", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_gasPrice\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x3e8\"\n}" + } + ] + }, + { + "name": "eth_getBalance", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBalance\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the account balance of the specified address.\n\n#### Parameters\n\n`DATA` - 20-byte account address from which to retrieve the balance.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Current balance, in wei, as a hexadecimal value." + }, + "response": [ + { + "name": "eth_getBalance", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBalance\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x1cfe56f3795885980000\"\n}" + } + ] + }, + { + "name": "eth_getBlockByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByHash\",\n \"params\": [\n \"0xaf5526fcb88b2f0d163c9a78ee678bf95b20115dc3d4e2b7b1f5fc4a308724a0\",\n false\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns information about the block by hash.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a block.\n\n`Boolean` - If `true`, returns the full [transaction objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object);\nif `false`, returns the transaction hashes.\n\n#### Returns\n\n`result` : *OBJECT* - [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object) , or `null` when there is no block." + }, + "response": [ + { + "name": "eth_getBlockByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByHash\",\n \"params\": [\n \"0xaf5526fcb88b2f0d163c9a78ee678bf95b20115dc3d4e2b7b1f5fc4a308724a0\",\n false\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": {\n \"number\": \"0x68b3\",\n \"hash\": \"0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c\",\n \"mixHash\": \"0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d\",\n \"parentHash\": \"0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d\",\n \"nonce\": \"0x378da40ff335b070\",\n \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n \"logsBloom\": \"0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000\",\n \"transactionsRoot\": \"0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126\",\n \"stateRoot\": \"0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233\",\n \"receiptsRoot\": \"0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a\",\n \"miner\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"difficulty\": \"0x66e619a\",\n \"totalDifficulty\": \"0x1e875d746ae\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"size\": \"0x334\",\n \"gasLimit\": \"0x47e7c4\",\n \"gasUsed\": \"0x37993\",\n \"timestamp\": \"0x5835c54d\",\n \"uncles\": [],\n \"transactions\": [\n \"0xa0807e117a8dd124ab949f460f08c36c72b710188f01609595223b325e58e0fc\",\n \"0xeae6d797af50cb62a596ec3939114d63967c374fa57de9bc0f4e2b576ed6639d\"\n ]\n }\n}" + } + ] + }, + { + "name": "eth_getBlockByNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByNumber\",\n \"params\": [\n \"0xF\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns information about a block by block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`Boolean` - If `true`, returns the full [transaction objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object);\nif `false`, returns only the hashes of the transactions.\n\n#### Returns\n\n`result` : *OBJECT* - [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object) , or `null` when there is no\nblock." + }, + "response": [ + { + "name": "eth_getBlockByNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByNumber\",\n \"params\": [\n \"0xF\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"number\": \"0x68b3\",\n \"hash\": \"0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c\",\n \"mixHash\": \"0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d\",\n \"parentHash\": \"0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d\",\n \"nonce\": \"0x378da40ff335b070\",\n \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n \"logsBloom\": \"0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000\",\n \"transactionsRoot\": \"0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126\",\n \"stateRoot\": \"0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233\",\n \"receiptsRoot\": \"0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a\",\n \"miner\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"difficulty\": \"0x66e619a\",\n \"totalDifficulty\": \"0x1e875d746ae\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"size\": \"0x334\",\n \"gasLimit\": \"0x47e7c4\",\n \"gasUsed\": \"0x37993\",\n \"timestamp\": \"0x5835c54d\",\n \"uncles\": [],\n \"transactions\": []\n }\n}" + } + ] + }, + { + "name": "eth_getBlockTransactionCountByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of transactions in the block matching the given block hash.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result` : `quantity` - Integer representing the number of transactions in the specified block." + }, + "response": [ + { + "name": "eth_getBlockTransactionCountByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "eth_getBlockTransactionCountByNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByNumber\",\n \"params\": [\n \"0xe8\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of transactions in a block matching the specified block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of transactions in the specified block." + }, + "response": [ + { + "name": "eth_getBlockTransactionCountByNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByNumber\",\n \"params\": [\n \"0xe8\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": \"0x8\"\n}" + } + ] + }, + { + "name": "eth_getCode", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getCode\",\n \"params\": [\n \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the code of the smart contract at the specified address. Besu stores compiled smart\ncontract code as a hexadecimal value.\n\n#### Parameters\n\n`DATA` - 20-byte contract address.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *DATA* - Code stored at the specified address." + }, + "response": [ + { + "name": "eth_getCode", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getCode\",\n \"params\": [\n \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029\"\n}" + } + ] + }, + { + "name": "eth_getFilterChanges", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Polls the specified filter and returns an array of changes that have occurred since the last poll.\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`result` : `Array of Object` - If nothing changed since the last poll, an empty list. Otherwise:\n\n* For filters created with `eth_newBlockFilter`, returns block hashes.\n* For filters created with `eth_newPendingTransactionFilter`, returns transaction hashes.\n* For filters created with `eth_newFilter`, returns [log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "filter created with eth_newPendingTransactionFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x1e977049b6db09362da09491bee3949d9362080ce3f4fc19721196d508580d46\",\n \"0xa3abc4b9a4e497fd58dc59cdff52e9bb5609136bcd499e760798aa92802769be\"\n ]\n}" + }, + { + "name": "Filter created with eth_newFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x233\",\n \"blockHash\": \"0xfc139f5e2edee9e9c888d8df9a2d2226133a9bd87c88ccbd9c930d3d4c9f9ef5\",\n \"transactionHash\": \"0x66e7a140c8fa27fe98fde923defea7562c3ca2d6bb89798aabec65782c08f63d\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x42699a7612a82f1d9c36148af9c77354759b210b\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000004\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x238\",\n \"blockHash\": \"0x98b0ec0f9fea0018a644959accbe69cd046a8582e89402e1ab0ada91cad644ed\",\n \"transactionHash\": \"0xdb17aa1c2ce609132f599155d384c0bc5334c988a6c368056d7e167e23eee058\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x42699a7612a82f1d9c36148af9c77354759b210b\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000007\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n }\n ]\n}" + }, + { + "name": "Filter created with eth_newBlockFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0xda2bfe44bf85394f0d6aa702b5af89ae50ae22c0928c18b8903d9269abe17e0b\",\n \"0x88cd3a37306db1306f01f7a0e5b25a9df52719ad2f87b0f88ee0e6753ed4a812\",\n \"0x4d4c731fe129ff32b425e6060d433d3fde278b565bbd1fd624d5a804a34f8786\"\n ]\n}" + } + ] + }, + { + "name": "eth_getFilterLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterLogs\",\n \"params\": [\n \"0x5ace5de3985749b6a1b2b0d3f3e1fb69\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for the specified filter.\n\nLeave the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\ncommand line option at the default value of `true` to improve log retrieval performance.\n\n> **note**\n\n `eth_getFilterLogs` is only used for filters created with `eth_newFilter`. To specify a filter\n object and get logs without creating a filter, use `eth_getLogs` .\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "eth_getFilterLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterLogs\",\n \"params\": [\n \"0x5ace5de3985749b6a1b2b0d3f3e1fb69\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb3\",\n \"blockHash\": \"0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998\",\n \"transactionHash\": \"0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000003\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb6\",\n \"blockHash\": \"0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc\",\n \"transactionHash\": \"0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000005\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "eth_getLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getLogs\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) matching a specified filter object.\n\nLeave the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\ncommand line option at the default value of `true` to improve log retrieval performance.\n\n> **Attention**\n>\n> Using `eth_getLogs` to get the logs from a large range of blocks, especially an entire chain from its genesis block, can cause Besu to hang and never return a response. We recommend splitting one large query into multiple ones for better performance.\n\n#### Parameters\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "eth_getLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getLogs\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb3\",\n \"blockHash\": \"0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998\",\n \"transactionHash\": \"0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000003\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb6\",\n \"blockHash\": \"0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc\",\n \"transactionHash\": \"0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000005\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "eth_getMinerDataByBlockHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockHash\",\n \"params\": [\n \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns miner data for the specified block.\n\n#### Parameters\n\n`data` - 32 byte block hash.\n\n#### Returns\n\n`result`: `object` - [Miner data](https://besu.hyperledger.org/en/stable/Reference/API-Objects#miner-data-object)." + }, + "response": [ + { + "name": "eth_getMinerDataByBlockHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockHash\",\n \"params\": [\n \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"netBlockReward\": \"0x47c6f3739f3da800\",\n \"staticBlockReward\": \"0x4563918244f40000\",\n \"transactionFee\": \"0x38456548220800\",\n \"uncleInclusionReward\": \"0x22b1c8c1227a000\",\n \"uncleRewards\": [\n {\n \"hash\": \"0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974\",\n \"coinbase\": \"0x0c062b329265c965deef1eede55183b3acb8f611\"\n }\n ],\n \"coinbase\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"difficulty\": \"0x7348c20\",\n \"totalDifficulty\": \"0xa57bcfdd96\"\n }\n}" + } + ] + }, + { + "name": "eth_getMinerDataByBlockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockNumber\",\n \"params\": [\n \"0x7689D2\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns miner data for the specified block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result`: `object` - [Miner data](https://besu.hyperledger.org/en/stable/Reference/API-Objects#miner-data-object)." + }, + "response": [ + { + "name": "eth_getMinerDataByBlockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockHash\",\n \"params\": [\n \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"netBlockReward\": \"0x47c6f3739f3da800\",\n \"staticBlockReward\": \"0x4563918244f40000\",\n \"transactionFee\": \"0x38456548220800\",\n \"uncleInclusionReward\": \"0x22b1c8c1227a000\",\n \"uncleRewards\": [\n {\n \"hash\": \"0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974\",\n \"coinbase\": \"0x0c062b329265c965deef1eede55183b3acb8f611\"\n }\n ],\n \"coinbase\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"difficulty\": \"0x7348c20\",\n \"totalDifficulty\": \"0xa57bcfdd96\"\n }\n}" + } + ] + }, + { + "name": "eth_getProof", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"params\": [\n \"0a8156e7ee392d885d10eaa86afd0e323afdcd95\",\n [\n \"0x0000000000000000000000000000000000000000000000000000000000000347\"\n ],\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the account and storage values of the specified account, including the Merkle proof.\n\nThe API allows IoT devices or mobile apps which are unable to run light clients to verify responses\nfrom untrusted sources, by using a trusted block hash.\n\n#### Parameters\n\n`DATA` - 20-byte address of the account or contract.\n\n`ARRAY` - Array of 32-byte storage keys to generate proofs for.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result`: *Object* - Account details:\n\n* `balance`:`Quantity` - Account balance.\n* `codeHash`:`Data, 32-byte` - Hash of the account code.\n* `nonce`:`Quantity` - Number of transactions sent from the account.\n* `storageHash`:`Data, 32-byte` - SHA3 of the `storageRoot`.\n* `accountProof`:`Array` - RLP-encoded Merkle tree nodes, starting with the `stateRoot`.\n* `storageProof`:`Array`- Storage entries. Each entry is an object that displays:\n * `key`:`Quantity` - Storage key.\n * `value`:`Quantity` - Storage value.\n * `proof`:`Array` - RLP-encoded Merkle tree nodes, starting with the `storageHash`." + }, + "response": [ + { + "name": "eth_getProof", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"params\": [\n \"0a8156e7ee392d885d10eaa86afd0e323afdcd95\",\n [\n \"0x0000000000000000000000000000000000000000000000000000000000000347\"\n ],\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"accountProof\": [\n \"0xf90211a0...608d898380\",\n \"0xf90211a0...ec33f19580\",\n \"0xf901d1a0...9e55584480\",\n \"0xf8718080...18e5777142\"\n ],\n \"address\": \"0x0a8156e7ee392d885d10eaa86afd0e323afdcd95\",\n \"balance\": \"0x0\",\n \"codeHash\": \"0x2b6975dcaf69f9bb9a3b30bb6a37b305ce440250bf0dd2f23338cb18e5777142\",\n \"nonce\": \"0x5f\",\n \"storageHash\": \"0x917688de43091589aa58c1dfd315105bc9de4478b9ba7471616a4d8a43d46203\",\n \"storageProof\": [\n {\n \"key\": \"0x0000000000000000000000000000000000000000000000000000000000000347\",\n \"value\": \"0x0\",\n \"proof\": [\n \"0xf90211a0...5176779280\",\n \"0xf901f1a0...c208d86580\",\n \"0xf8d180a0...1ce6808080\"\n ]\n }\n ]\n }\n}" + } + ] + }, + { + "name": "eth_getStorageAt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getStorageAt\",\n \"params\": [\n \"0x3B3F3E\",\n \"0x0\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the value of a storage position at a specified address.\n\n#### Parameters\n\n`DATA` - A 20-byte storage address.\n\n`QUANTITY` - Integer index of the storage position.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *DATA* - The value at the specified storage position." + }, + "response": [ + { + "name": "eth_getStorageAt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getStorageAt\",\n \"params\": [\n \"0x3B3F3E\",\n \"0x0\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n}" + } + ] + }, + { + "name": "eth_getTransactionByBlockHashAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockHashAndIndex\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\",\n \"0x1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns transaction information for the specified block hash and transaction index position.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a block.\n\n`QUANTITY` - Integer representing the transaction index position.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." + }, + "response": [ + { + "name": "eth_getTransactionByBlockHashAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockHashAndIndex\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\",\n \"0x1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"blockHash\": \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\",\n \"blockNumber\": \"0x1442e\",\n \"from\": \"0x70c9217d814985faef62b124420f8dfbddd96433\",\n \"gas\": \"0x3d090\",\n \"gasPrice\": \"0x57148a6be\",\n \"hash\": \"0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6\",\n \"input\": \"0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000\",\n \"nonce\": \"0x2cb2\",\n \"to\": \"0xcfdc98ec7f01dab1b67b36373524ce0208dc3953\",\n \"transactionIndex\": \"0x2\",\n \"value\": \"0x0\",\n \"v\": \"0x2a\",\n \"r\": \"0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a\",\n \"s\": \"0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484\"\n }\n}" + } + ] + }, + { + "name": "eth_getTransactionByBlockNumberAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockNumberAndIndex\",\n \"params\": [\n \"latest\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns transaction information for the specified block number and transaction index position.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`QUANTITY` - The transaction index position.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." + }, + "response": [ + { + "name": "eth_getTransactionByBlockNumberAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockNumberAndIndex\",\n \"params\": [\n \"latest\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"blockHash\": \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\",\n \"blockNumber\": \"0x1442e\",\n \"from\": \"0x70c9217d814985faef62b124420f8dfbddd96433\",\n \"gas\": \"0x3d090\",\n \"gasPrice\": \"0x57148a6be\",\n \"hash\": \"0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6\",\n \"input\": \"0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000\",\n \"nonce\": \"0x2cb2\",\n \"to\": \"0xcfdc98ec7f01dab1b67b36373524ce0208dc3953\",\n \"transactionIndex\": \"0x2\",\n \"value\": \"0x0\",\n \"v\": \"0x2a\",\n \"r\": \"0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a\",\n \"s\": \"0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484\"\n }\n}" + } + ] + }, + { + "name": "eth_getTransactionByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByHash\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns transaction information for the specified transaction hash.\n\n#### Parameters\n\n`DATA` - 32-byte transaction hash.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." + }, + "response": [ + { + "name": "eth_getTransactionByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByHash\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": {\n \"blockHash\": \"0x510efccf44a192e6e34bcb439a1947e24b86244280762cbb006858c237093fda\",\n \"blockNumber\": \"0x422\",\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\": \"0x5208\",\n \"gasPrice\": \"0x3b9aca00\",\n \"hash\": \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\",\n \"input\": \"0x\",\n \"nonce\": \"0x1\",\n \"to\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n \"transactionIndex\": \"0x0\",\n \"value\": \"0x4e1003b28d9280000\",\n \"v\": \"0xfe7\",\n \"r\": \"0x84caf09aefbd5e539295acc67217563438a4efb224879b6855f56857fa2037d3\",\n \"s\": \"0x5e863be3829812c81439f0ae9d8ecb832b531d651fb234c848d1bf45e62be8b9\"\n }\n}" + } + ] + }, + { + "name": "eth_getTransactionCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionCount\",\n \"params\": [\n \"0x9d8f8572f345e1ae53db1dFA4a7fce49B467bD7f\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of transactions sent from a specified address. Use the `pending` tag to get the\nnext account nonce not used by any pending transactions.\n\n#### Parameters\n\n`data` - 20-byte account address.\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *quantity* - Integer representing the number of transactions sent from the specified\naddress." + }, + "response": [ + { + "name": "eth_getTransactionCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionCount\",\n \"params\": [\n \"0x9d8f8572f345e1ae53db1dFA4a7fce49B467bD7f\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "eth_getTransactionReceipt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionReceipt\",\n \"params\": [\n \"0x96c6830efd87a70020d4d1647c93402d747c05ecf6beeb068dee621f8d13d8d1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the receipt of a transaction by transaction hash. Receipts for pending transactions are not\navailable.\n\nIf you enabled [revert reason](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Revert-Reason), the receipt includes\navailable revert reasons in the response.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a transaction.\n\n#### Returns\n\n`Object` - [Transaction receipt object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-receipt-object), or `null` when\nthere is no receipt." + }, + "response": [ + { + "name": "eth_getTransactionReceipt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionReceipt\",\n \"params\": [\n \"0x96c6830efd87a70020d4d1647c93402d747c05ecf6beeb068dee621f8d13d8d1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"blockHash\": \"0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a\",\n \"blockNumber\": \"0x50\",\n \"contractAddress\": null,\n \"cumulativeGasUsed\": \"0x5208\",\n \"from\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n \"gasUsed\": \"0x5208\",\n \"logs\": [],\n \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n \"status\": \"0x1\",\n \"to\": \"0xf17f52151ebef6c7334fad080c5704d77216b732\",\n \"transactionHash\": \"0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3\",\n \"transactionIndex\": \"0x0\"\n }\n}" + } + ] + }, + { + "name": "eth_getUncleByBlockHashAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockHashAndIndex\",\n \"params\": [\n \"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns uncle specified by block hash and index.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n`quantity` - Index of the uncle.\n\n#### Returns\n\n`result` : [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object)\n\n> **note**\n>\n> Uncles do not contain individual transactions." + }, + "response": [ + { + "name": "eth_getUncleByBlockHashAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockHashAndIndex\",\n \"params\": [\n \"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"difficulty\": \"0x76b123df93230\",\n \"extraData\": \"0x50505945206e616e6f706f6f6c2e6f7267\",\n \"gasLimit\": \"0x7a121d\",\n \"gasUsed\": \"0x7a0175\",\n \"hash\": \"0xc20189c0b1a4a23116ab3b177e929137f6e826f17fc4c2e880e7258c620e9817\",\n \"logsBloom\": \"0x890086c024487ca422be846a201a10e41bc2882902312116c1119609482031e9c000e2a708004a10281024028020c505727a12570c4810121c59024490b040894406a1c23c37a0094810921da3923600c71c03044b40924280038d07ab91964a008084264a01641380798840805a284cce201a8026045451002500113a00de441001320805ca2840037000111640d090442c11116d2112948084240242340400236ce81502063401dcc214b9105194d050884721c1208800b20501a4201400276004142f118e60808284506979a86e050820101c170c185e2310005205a82a2100382422104182090184800c02489e033440218142140045801c024cc1818485\",\n \"miner\": \"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5\",\n \"mixHash\": \"0xf557cc827e058862aa3ea1bd6088fb8766f70c0eac4117c56cf85b7911f82a14\",\n \"nonce\": \"0xd320b48904347cdd\",\n \"number\": \"0x768964\",\n \"parentHash\": \"0x98d752708b3677df8f439c4529f999b94663d5494dbfc08909656db3c90f6255\",\n \"receiptsRoot\": \"0x0f838f0ceb73368e7fc8d713a7761e5be31e3b4beafe1a6875a7f275f82da45b\",\n \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n \"size\": \"0x21a\",\n \"stateRoot\": \"0xa0c7d4fca79810c89c517eff8dadb9c6d6f4bcc27c2edfb301301e1cf7dec642\",\n \"timestamp\": \"0x5cdcbba6\",\n \"totalDifficulty\": \"0x229ad33cabd4c40d23d\",\n \"transactionsRoot\": \"0x866e38e91d01ef0387b8e07ccf35cd910224271ccf2b7477b8c8439e8b70f365\",\n \"uncles\": []\n }\n}" + } + ] + }, + { + "name": "eth_getUncleByBlockNumberAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockNumberAndIndex\",\n \"params\": [\n \"0x7689D2\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns uncle specified by block number and index.\n\n#### Parameters\n\n`quantity|tag` - Index of the block, or one of the string tags `latest`, `earliest`, or `pending`,\nas described in [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`quantity` - Index of the uncle.\n\n#### Returns\n\n`result` : [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object)\n\n> **note**\n>\n> Uncles do not contain individual transactions." + }, + "response": [ + { + "name": "eth_getUncleByBlockNumberAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockNumberAndIndex\",\n \"params\": [\n \"0x7689D2\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"difficulty\": \"0x77daec467bf93\",\n \"extraData\": \"0x50505945206e616e6f706f6f6c2e6f7267\",\n \"gasLimit\": \"0x7a121d\",\n \"gasUsed\": \"0x7a0f7b\",\n \"hash\": \"0x42d83ae9c0743f4b1f9c61ff7ea8b164c1bab3627decd49233760680be006ecf\",\n \"logsBloom\": \"0x888200800000340120220008640200500408006100038400100581c000080240080a0014e8002010080004088040004022402a000c18010001400100002a041141a0610a0052900600041018c0002a0003090020404c00206010010513d00020005380124e08050480710000000108401012b0901c1424006000083a10a8c1040100a0440081050210124400040044304070004001100000012600806008061d0320800000b40042160600002480000000800000c0002100200940801c000820800048024904710000400640490026000a44300309000286088010c2300060003011380006400200812009144042204810209020410a84000410520c08802941\",\n \"miner\": \"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5\",\n \"mixHash\": \"0xf977fcdb52868be410b75ef2becc35cc312f13ab0a6ce400ecd9d445f66fa3f2\",\n \"nonce\": \"0x628b28403bf1e3d3\",\n \"number\": \"0x7689d0\",\n \"parentHash\": \"0xb32cfdfbf4adb05d30f02fcc6fe039cc6666402142954051c1a1cb9cc91aa11e\",\n \"receiptsRoot\": \"0x9c7c8361d1a24ea2841432234c81974a9920d3eba2b2b1c496b5f925a95cb4ac\",\n \"sha3Uncles\": \"0x7d972aa1b182b7e93f1db043f03fbdbfac6874fe7e67e162141bcc0aefa6336b\",\n \"size\": \"0x21a\",\n \"stateRoot\": \"0x74e97b77813146344d75acb5a52a006cc6dfaca678a10fb8a484a8443e919272\",\n \"timestamp\": \"0x5cdcc0a7\",\n \"totalDifficulty\": \"0x229b0583b4bd2698ca0\",\n \"transactionsRoot\": \"0x1d21626afddf05e5866de66ca3fcd98f1caf5357eba0cc6ec675606e116a891b\",\n \"uncles\": []\n }\n}" + } + ] + }, + { + "name": "eth_getUncleCountByBlockHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of uncles in a block from a block matching the given block hash.\n\n#### Parameters\n\n`DATA` - 32-byte block hash.\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of uncles in the specified block." + }, + "response": [ + { + "name": "eth_getUncleCountByBlockHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x0\"\n}" + } + ] + }, + { + "name": "eth_getUncleCountByBlockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockNumber\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of uncles in a block matching the specified block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing either the index of the block within the blockchain, or one\nof the string tags `latest`, `earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of uncles in the specified block." + }, + "response": [ + { + "name": "eth_getUncleCountByBlockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockNumber\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "eth_getWork", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getWork\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the hash of the current block, the seed hash, and the required target boundary condition.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : Array with the following fields:\n\n* `DATA`, 32 Bytes - Hash of the current block header (pow-hash).\n* `DATA`, 32 Bytes - The seed hash used for the DAG.\n* `DATA`, 32 Bytes - The required target boundary condition: 2^256 / difficulty.\n* `QUANTITY` - Hexadecimal integer representing the current block number." + }, + "response": [ + { + "name": "eth_getWork", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getWork\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0xce5e32ca59cb86799a1879e90150b2c3b882852173e59865e9e79abb67a9d636\",\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n \"0x00a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3\",\n \"0x42\"\n ]\n}" + } + ] + }, + { + "name": "eth_hashrate", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_hashrate\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of hashes per second with which the node is mining.\n\nWhen the stratum server is enabled, this method returns the cumulative hashrate of all sealers\nreporting their hashrate.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `quantity` - Number of hashes per second.\n" + }, + "response": [ + { + "name": "eth_hashrate", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_hashrate\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x12b\"\n}" + } + ] + }, + { + "name": "eth_mining", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_mining\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Whether the client is actively mining new blocks. Besu pauses mining while the client synchronizes\nwith the network regardless of command settings or methods called.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` (*BOOLEAN*) - `true` if the client is actively mining new blocks, otherwise `false`." + }, + "response": [ + { + "name": "eth_mining", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_mining\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": true\n}" + } + ] + }, + { + "name": "eth_newBlockFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newBlockFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a filter to retrieve new block hashes. To poll for new blocks, use\n[`eth_getFilterChanges`](#eth_getfilterchanges).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`data` - Filter ID." + }, + "response": [ + { + "name": "eth_newBlockFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newBlockFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x9d78b6780f844228b96ecc65a320a825\"\n}" + } + ] + }, + { + "name": "eth_newFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newFilter\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a [log filter](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs). To poll for logs associated with the\ncreated filter, use [`eth_getFilterChanges`](#eth_getfilterchanges). To get all logs associated with\nthe filter, use [`eth_getFilterLogs`](#eth_getfilterlogs).\n\n#### Parameters\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n> **note**\n>\n> `fromBlock` and `toBlock` in the filter options object default to `latest`.\n\n#### Returns\n\n`data` - Filter ID." + }, + "response": [ + { + "name": "eth_newFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newFilter\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1ddf0c00989044e9b41cc0ae40272df3\"\n}" + } + ] + }, + { + "name": "eth_newPendingTransactionFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newPendingTransactionFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a filter to retrieve new pending transactions hashes. To poll for new pending transactions,\nuse [`eth_getFilterChanges`](#eth_getfilterchanges).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`data` - Filter ID." + }, + "response": [ + { + "name": "eth_newPendingTransactionFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newPendingTransactionFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x443d6a77c4964707a8554c92f7e4debd\"\n}" + } + ] + }, + { + "name": "eth_protocolVersion", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_protocolVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns current Ethereum protocol version.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *quantity* - Ethereum protocol version." + }, + "response": [ + { + "name": "eth_protocolVersion", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_protocolVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x3f\"\n}" + } + ] + }, + { + "name": "eth_sendRawTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_sendRawTransaction\",\n \"params\": [\n \"0xf86a018203e882520894f17f52151ebef6c7334fad080c5704d77216b732896c6b935b8bbd400000801ba093129415f03b4794fd1512e79ee7f097e4271f66721020f8407aac92179893a5a0451b875d89721ec98be55201092980b0a87bb1c48507fccb86da713596b2a09e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Sends a [signed transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Transactions).\nA transaction can send ether, deploy a contract, or interact with a contract.\nSet the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-tx-feecap) CLI option.\n\nYou can interact with contracts using [`eth_sendRawTransaction` or `eth_call`].\n\nTo avoid exposing your private key, create signed transactions offline and send the signed\ntransaction data using `eth_sendRawTransaction`.\n\n> **important**\n>\n> Besu does not implement [`eth_sendTransaction`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management).\n>\n> [EthSigner](https://docs.ethsigner.consensys.net/) provides transaction signing and implements\n> [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction).\n\n#### Parameters\n\n`data` - Signed transaction serialized to hexadecimal format. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n> **note**\n>\n> [Creating and Sending Transactions](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Transactions) includes examples of creating signed transactions using the [web3.js](https://github.com/ethereum/web3.js/) library.\n\n#### Returns\n\n`result` : `data` - 32-byte transaction hash." + }, + "response": [ + { + "name": "eth_sendRawTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendRawTransaction\",\"params\" :[\"0xf85f808203e8832dc6c08080914f785b6f626a656374204f626a6563745d1ba004193142058b4fe6802677a939e76f93e7fa30e91835a911e206f9855330929ca055ce11a262c804a168c8a801e55a68b3d578a4b52b9dfbed98c4aa47f88a0adf\"], \"id\":1}" + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Length", + "value": "118", + "name": "Content-Length", + "description": "The length of the response body in octets (8-bit bytes)" + }, + { + "key": "Content-Type", + "value": "application/json", + "name": "Content-Type", + "description": "The mime type of this content" + } + ], + "cookie": [], + "body": "{\n \"jsonrpc\" : \"2.0\",\n \"id\" : 1,\n \"result\" : \"0xac182cc23bb94696217aa17ca15bd466106af9ba7ea7420aae24ff37338d6e3b\"\n}" + } + ] + }, + { + "name": "eth_submitHashrate", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitHashrate\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000500000\",\n \"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Submits the mining hashrate.\n\nUsed by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer).\n\n#### Parameters\n\n* DATA, 32 Bytes - Hexadecimal string representation of the hash rate.\n* DATA, 32 Bytes - Random hexadecimal ID identifying the client.\n\n#### Returns\n\n`result: Boolean`, `true` if submission is successful, otherwise `false`." + }, + "response": [ + { + "name": "eth_submitHashrate", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitHashrate\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000500000\",\n \"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "eth_submitWork", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitWork\",\n \"params\": [\n \"0x0000000000000001\",\n \"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n \"0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Submits a Proof of Work (Ethash) solution.\n\nUsed by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer).\n\n#### Parameters\n\n* DATA, 8 Bytes - Retrieved nonce.\n* DATA, 32 Bytes - Hash of the block header (PoW-hash).\n* DATA, 32 Bytes - Mix digest.\n\n#### Returns\n\n`result: Boolean`, `true` if the provided solution is valid, otherwise `false`." + }, + "response": [ + { + "name": "eth_submitHashrate", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitHashrate\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000500000\",\n \"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"result\": true\n}" + } + ] + }, + { + "name": "eth_syncing", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_syncing\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an object with data about the synchronization status, or `false` if not synchronizing.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *Object|Boolean* - Object with synchronization status data or `false` if not\nsynchronizing:\n\n* `startingBlock` : *quantity* - Index of the highest block on the blockchain when the network\n synchronization starts.\n* `currentBlock` : *quantity* - Index of the latest block (also known as the best block) for the\n current node. This is the same index that [`eth_blockNumber`](#eth_blocknumber) returns.\n* `highestBlock`: *quantity* - Index of the highest known block in the peer network (that is, the\n highest block so far discovered among peer nodes). This is the same value as `currentBlock` if\n the current node has no peers.\n* `pulledStates`: *quantity* - If fast synchronizing, the number of state entries fetched so far,\n or `null` if this is not known or not relevant. If full synchronizing or fully synchronized, this\n field is not returned.\n* `knownStates`: *quantity* - If fast synchronizing, the number of states the node knows of so\n far, or `null` if this is not known or not relevant. If full synchronizing or fully synchronized,\n this field is not returned." + }, + "response": [ + { + "name": "eth_syncing", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_syncing\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": {\n \"startingBlock\": \"0x0\",\n \"currentBlock\": \"0x1518\",\n \"highestBlock\": \"0x9567a3\",\n \"pulledStates\": \"0x203ca\",\n \"knownStates\": \"0x200636\"\n }\n}" + } + ] + }, + { + "name": "eth_uninstallFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_uninstallFilter\",\n \"params\": [\n \"0x70355a0b574b437eaa19fe95adfedc0a\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Uninstalls a filter with the specified ID. When a filter is no longer required, call this method.\n\nFilters time out when not requested by [`eth_getFilterChanges`](#eth_getfilterchanges) or [`eth_getFilterLogs`](#eth_getfilterlogs) for 10\nminutes.\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`." + }, + "response": [ + { + "name": "eth_uninstallFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_uninstallFilter\",\n \"params\": [\n \"0x70355a0b574b437eaa19fe95adfedc0a\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> Methods with an equivalent [GraphQL](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/GraphQL) query include a GraphQL\n request and result in the method example. The parameter and result descriptions apply to the\n JSON-RPC requests. The GraphQL specification is defined in the [schema](https://github.com/hyperledger/besu/blob/master/ethereum/api/src/main/resources/schema.graphqls)." + }, + { + "name": "IBFT", + "item": [ + { + "name": "ibft_discardValidatorVote", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_discardValidatorVote\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Discards a proposal to [add or remove a validator] with the specified address.\n\n#### Parameters\n\n`data` - 20-byte address of proposed validator.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "ibft_discardValidatorVote", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_discardValidatorVote\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "ibft_getPendingVotes", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getPendingVotes\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns [votes](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT#adding-and-removing-validators)\ncast in the current [epoch](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT#genesis-file).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`: `object` - Map of account addresses to corresponding boolean values indicating the vote\nfor each account.\n\nIf the boolean value is `true`, the vote is to add a validator. If `false`, the proposal is to\nremove a validator." + }, + "response": [ + { + "name": "ibft_getPendingVotes", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getPendingVotes\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"0xef1bfb6a12794615c9b0b5a21e6741f01e570185\": true,\n \"0x42d4287eac8078828cf5f3486cfe601a275a49a5\": true\n }\n}" + } + ] + }, + { + "name": "ibft_getSignerMetrics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides validator metrics for the specified range:\n\n* Number of blocks from each validator.\n* Block number of the last block proposed by each validator (if any proposed in the specified\n range).\n* All validators present in the last block of the range.\n\n#### Parameters\n\n`fromBlockNumber` - Integer representing a block number or the string tag `earliest` as described\nin [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`toBlockNumber` - Integer representing a block number or one of the string tags `latest` or\n`pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter)\n\nIf you specify:\n\n* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less\n than 100 blocks.\n* Only the first parameter, the call provides metrics for all blocks from the block specified to\n the latest block.\n\n#### Returns\n\n`result`: _object_ - List of validator objects\n\n> **Note**\n>\n> The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`." + }, + "response": [ + { + "name": "ibft_getSignerMetrics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"address\": \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x61\"\n },\n {\n \"address\": \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x63\"\n },\n {\n \"address\": \"0xb279182d99e65703f0076e4812653aab85fca0f0\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x62\"\n }\n ]\n}" + } + ] + }, + { + "name": "ibft_getValidatorsByBlockHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists the validators defined in the specified block.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result: array of data` - List of validator addresses." + }, + "response": [ + { + "name": "ibft_getValidatorsByBlockHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42d4287eac8078828cf5f3486cfe601a275a49a5\",\n \"0xb1b2bc9582d2901afdc579f528a35ca41403fa85\",\n \"0xef1bfb6a12794615c9b0b5a21e6741f01e570185\"\n ]\n}" + } + ] + }, + { + "name": "ibft_getValidatorsByBlockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockNumber\",\n \"params\": [\n \"0x09\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists the validators defined in the specified block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result: array of data` - List of validator addresses." + }, + "response": [ + { + "name": "ibft_getValidatorsByBlockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockNumber\",\n \"params\": [\n \"0x09\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42d4287eac8078828cf5f3486cfe601a275a49a5\",\n \"0xb1b2bc9582d2901afdc579f528a35ca41403fa85\",\n \"0xef1bfb6a12794615c9b0b5a21e6741f01e570185\"\n ]\n}" + } + ] + }, + { + "name": "ibft_proposeValidatorVote", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_proposeValidatorVote\",\n \"params\": [\n \"42d4287eac8078828cf5f3486cfe601a275a49a5\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Propose to [add or remove a validator] with the specified address.\n\n#### Parameters\n\n`data` - Account address\n\n`boolean` - `true` to propose adding validator or `false` to propose removing validator.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "ibft_proposeValidatorVote", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_proposeValidatorVote\",\n \"params\": [\n \"42d4287eac8078828cf5f3486cfe601a275a49a5\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `IBFT` API methods are not enabled by default for JSON-RPC. To enable the `IBFT` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "MINER", + "item": [ + { + "name": "miner_start", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_start\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Starts the mining process. To start mining, you must first specify a miner coinbase using the\n[`--miner-coinbase`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#miner-coinbase) command line option.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `boolean` - `true` if mining starts, or if the node was already mining." + }, + "response": [ + { + "name": "miner_start", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_start\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "miner_stop", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_stop\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Stops the mining process on the client.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `boolean` - `true` if mining stops, or if the node was not mining.\n" + }, + "response": [ + { + "name": "miner_stop", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_stop\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `MINER` API methods are not enabled by default for JSON-RPC. To enable the `MINER` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "Miscellaneous", + "item": [ + { + "name": "rpc_modules", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"rpc_modules\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists [enabled APIs](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#api-methods-enabled-by-default)\nand the version of each.\n\n#### Parameters\n\nNone\n\n#### Returns\n\nEnabled APIs." + }, + "response": [ + { + "name": "rpc_modules", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"rpc_modules\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"web3\": \"1.0\",\n \"eth\": \"1.0\",\n \"net\": \"1.0\"\n }\n}" + } + ] + } + ] + }, + { + "name": "NET", + "item": [ + { + "name": "net_version", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_version\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the [network ID](https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - Current network ID.\n\n| Network ID | Chain | Network | Description\n|------------|-------|---------|-------------------------------|\n| `1` | ETH | Mainnet | Main Ethereum network |\n| `3` | ETH | Ropsten | PoW test network |\n| `4` | ETH | Rinkeby | PoA test network using Clique |\n| `5` | ETH | Goerli | PoA test network using Clique |\n| `2018` | ETH | Dev | PoW development network |\n| `1` | ETC | Classic | Main Ethereum Classic network |\n| `6` | ETC | Kotti | PoA test network using Clique |\n| `7` | ETC | Mordor | PoW test network |\n\n> **note**\n>\n> For almost all networks network ID and chain ID are the same.\nThe only networks in the table above with different network and chain IDs are\nClassic with a chain ID of `61` and Mordor with a chain ID of `63`." + }, + "response": [ + { + "name": "net_version", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_version\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"3\"\n}" + } + ] + }, + { + "name": "net_listening", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_listening\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Whether the client is actively listening for network connections.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` (*BOOLEAN*) - `true` if the client is actively listening for network connections;\notherwise `false`." + }, + "response": [ + { + "name": "net_listening", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_listening\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": true\n}" + } + ] + }, + { + "name": "net_peerCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_peerCount\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of peers currently connected to the client.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *integer* - Number of connected peers in hexadecimal." + }, + "response": [ + { + "name": "net_peerCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_peerCount\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://127.0.0.1:8545", + "protocol": "http", + "host": ["127", "0", "0", "1"], + "port": "8545" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x5\"\n}" + } + ] + }, + { + "name": "net_enode", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_enode\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the [enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of the node." + }, + "response": [ + { + "name": "net_enode", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_enode\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"enode://6a63160d0ccef5e4986d270937c6c8d60a9a4d3b25471cda960900d037c61988ea14da67f69dbfb3497c465d0de1f001bb95598f74b68a39a5156a608c42fa1b@127.0.0.1:30303\"\n}" + } + ] + }, + { + "name": "net_services", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_services\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns enabled services (for example, `jsonrpc`) and the host and port for each service.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *objects* - Enabled services." + }, + "response": [ + { + "name": "net_services", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_services\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"jsonrpc\": {\n \"host\": \"127.0.0.1\",\n \"port\": \"8545\"\n },\n \"p2p\": {\n \"host\": \"127.0.0.1\",\n \"port\": \"30303\"\n },\n \"metrics\": {\n \"host\": \"127.0.0.1\",\n \"port\": \"9545\"\n }\n }\n}" + } + ] + } + ] + }, + { + "name": "PERM (permissioning)", + "item": [ + { + "name": "perm_addAccountsToAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addAccountsToAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Adds accounts (participants) to the\n[accounts permission list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\n`list of strings` - List of account addresses.\n\n> **Note**\n>\n> The parameters list contains a list which is why the account addresses are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to add accounts already on the\nallowlist or including invalid account addresses.\n" + }, + "response": [ + { + "name": "perm_addAccountsToAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addAccountsToAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_addNodesToAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addNodesToAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Adds nodes to the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\n`list of strings` - List of [enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url).\n\n> **Note**\n>\n> The parameters list contains a list which is why the enode URLs are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to add nodes already on the allowlist or\nincluding invalid enode URLs." + }, + "response": [ + { + "name": "perm_addNodesToAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addNodesToAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_getAccountsAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getAccountsAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists accounts (participants) in the\n[accounts permissions list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result: list` - Accounts (participants) in the accounts allowlist." + }, + "response": [ + { + "name": "perm_getAccountsAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getAccountsAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x0000000000000000000000000000000000000009\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462033\"\n ]\n}" + } + ] + }, + { + "name": "perm_getNodesAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getNodesAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists nodes in the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result: list` - [Enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of nodes in the nodes allowlist." + }, + "response": [ + { + "name": "perm_getNodesAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getNodesAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n}" + } + ] + }, + { + "name": "perm_reloadPermissionsFromFile", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_reloadPermissionsFromFile\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Reloads the accounts and nodes allowlists from the [permissions configuration file].\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - `Success`, or `error` if the permissions configuration file is not valid." + }, + "response": [ + { + "name": "perm_reloadPermissionsFromFile", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_reloadPermissionsFromFile\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_removeAccountsFromAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeAccountsFromAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Removes accounts (participants) from the\n[accounts permissions list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\n`list of strings` - List of account addresses.\n\n> **Note**\n>\n> The parameters list contains a list which is why the account addresses are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to remove accounts not on the allowlist\nor including invalid account addresses." + }, + "response": [ + { + "name": "perm_removeAccountsFromAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeAccountsFromAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_removeNodesFromAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeNodesFromAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Removes nodes from the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\n`list of strings` - List of [enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url)\n\n> **Note**\n>\n> The parameters list contains a list which is why the enode URLs are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to remove nodes not on the allowlist\nor including invalid enode URLs." + }, + "response": [ + { + "name": "perm_removeNodesFromAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeNodesFromAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + } + ], + "description": "Use the permissioning API methods for [local](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning)\npermissioning only.\n\n> **Note**\n>\n>The `PERM` API methods are not enabled by default for JSON-RPC. To enable the `PERM` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) CLI options." + }, + { + "name": "PLUGINS", + "item": [ + { + "name": "plugins_reloadPluginConfig", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"plugins_reloadPluginConfig\",\n \"params\": [\n \"tech.pegasys.plus.plugin.kafka.KafkaPlugin\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": null, + "description": "Reloads specified plugin configuration.\n\n#### Parameters\n\n`string` - Plugin\n\n#### Returns\n\n`string` - `Success`" + }, + "response": [ + { + "name": "plugins_reloadPluginConfig", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"plugins_reloadPluginConfig\",\n \"params\": [\n \"tech.pegasys.plus.plugin.kafka.KafkaPlugin\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": null + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `PLUGINS` API methods are not enabled by default for JSON-RPC. To enable the `PLUGINS` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "PRIV", + "item": [ + { + "name": "priv_call", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_call\",\n \"params\": [\n \"tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=\",\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"data\": \"0x3fa4f245\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "response": [ + { + "name": "priv_call", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_call\",\n \"params\": [\n \"tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=\",\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"data\": \"0x3fa4f245\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n}" + } + ] + }, + { + "name": "priv_createPrivacyGroup", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_createPrivacyGroup\",\n \"params\": [\n {\n \"addresses\": [\n \"sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=\",\n \"quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=\"\n ],\n \"name\": \"Group A\",\n \"description\": \"Description Group A\"\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a group of nodes, specified by their [Tessera](https://docs.tessera.consensys.net/) public key.\n\n#### Parameters\n\n`Object` - Request options:\n\n* `addresses`: `array of data` - Array of nodes, specified by\n [Tessera](https://docs.tessera.consensys.net/) public keys.\n* `name`: `string` - Privacy group name. Optional.\n* `description`: `string` - Privacy group description. Optional.\n\n#### Returns\n\nPrivacy group ID" + }, + "response": [ + { + "name": "priv_createPrivacyGroup", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_createPrivacyGroup\",\n \"params\": [\n {\n \"addresses\": [\n \"sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=\",\n \"quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=\"\n ],\n \"name\": \"Group A\",\n \"description\": \"Description Group A\"\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n}" + } + ] + }, + { + "name": "priv_deletePrivacyGroup", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_deletePrivacyGroup\",\n \"params\": [\n \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Deletes the specified privacy group.\n\n#### Parameters\n\n`data` - Privacy group ID\n\n#### Returns\n\nPrivacy group ID that was deleted." + }, + "response": [ + { + "name": "priv_deletePrivacyGroup", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_deletePrivacyGroup\",\n \"params\": [\n \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n}" + } + ] + }, + { + "name": "priv_distributeRawTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_distributeRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Distributes a signed, RLP encoded\n[private transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions).\n\n> **tip**\n\n If you want to sign the Privacy Marker Transaction outside of Besu,\n use [`priv_distributeRawTransaction`](https://besu.hyperledger.org/en/stable//HowTo/Send-Transactions/Creating-Sending-Private-Transactions#priv_distributerawtransaction)\n instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction).\n\n#### Parameters\n\n`data` - Signed RLP-encoded private transaction. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n#### Returns\n\n`result` : `data` - 32-byte enclave key. The enclave key is a pointer to the private transaction in\n[Tessera](https://docs.tessera.consensys.net/)." + }, + "response": [ + { + "name": "priv_distributeRawTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_distributeRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b\"\n}" + } + ] + }, + { + "name": "priv_findPrivacyGroup", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_findPrivacyGroup\",\n \"params\": [\n [\n \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a list of privacy groups containing only the listed members. For example, if the listed\nmembers are A and B, a privacy group containing A, B, and C is not returned.\n\n#### Parameters\n\n`array of data` - Members specified by [Tessera](https://docs.tessera.consensys.net/) public keys.\n\n#### Returns\n\nPrivacy groups containing only the specified members. Privacy groups are\n[EEA-compliant](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups#enterprise-ethereum-alliance-privacy)\nor [Besu-extended](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups#besu-extended-privacy) with types:\n\n* `LEGACY` for EEA-compliant groups.\n* `PANTHEON` for Besu-extended groups." + }, + "response": [ + { + "name": "priv_findPrivacyGroup", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_findPrivacyGroup\",\n \"params\": [\n [\n \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"privacyGroupId\": \"GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=\",\n \"name\": \"Group B\",\n \"description\": \"Description of Group B\",\n \"type\": \"PANTHEON\",\n \"members\": [\n \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getCode", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getCode\",\n \"params\": [\n \"1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=\",\n \"0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the code of the private smart contract at the specified address. Compiled smart contract code\nis stored as a hexadecimal value.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - 20-byte contract address.\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`, `earliest`,\nor `pending`, as described in [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : `data` - Code stored at the specified address." + }, + "response": [ + { + "name": "priv_getCode", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getCode\",\n \"params\": [\n \"1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=\",\n \"0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029\"\n}" + } + ] + }, + { + "name": "priv_getEeaTransactionCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getEeaTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=\",\n [\n \"KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=\",\n \"eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the private transaction count for the specified account and\n[group of sender and recipients].\n\n> **Important**\n\n> If sending more than one transaction to be mined in the same block (that is, you are not\n> waiting for the transaction receipt), you must calculate the private transaction nonce outside\n> Besu instead of using `priv_getEeaTransactionCount`.\n\n#### Parameters\n\n`data` - Account address.\n\n`data` - Base64 encoded Tessera address of the sender.\n\n`array of data` - Base64 encoded Tessera addresses of recipients.\n\n#### Returns\n\n`quantity` - Integer representing the number of private transactions sent from the address to the\nspecified group of sender and recipients.\n" + }, + "response": [ + { + "name": "priv_getEeaTransactionCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getEeaTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=\",\n [\n \"KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=\",\n \"eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "priv_getFilterChanges", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterChanges\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Polls the specified filter for a private contract and returns an array of changes that have occurred\nsince the last poll.\n\nFilters for private contracts can only be created by [`priv_newFilter`](#priv_newfilter) so unlike\n[`eth_getFilterChanges`](#eth_getfilterchanges), `priv_getFilterChanges` always returns an array\nof log objects or an empty list.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object). If nothing has changed since the last poll, an\nempty list." + }, + "response": [ + { + "name": "priv_getFilterChanges", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterChanges\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x4d0\",\n \"blockHash\": \"0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb\",\n \"transactionHash\": \"0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x991cc548c154b2953cc48c02f782e1314097dfbb\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000002\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getFilterLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterLogs\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for the specified filter for a private\ncontract.\n\nFor private contracts, `priv_getFilterLogs` is the same as [`eth_getFilterLogs`](#eth_getfilterlogs)\nfor public contracts except there is no [automatic log bloom caching](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\nfor private contracts.\n\n> **Note**\n>\n> `priv_getFilterLogs` is only used for filters created with [`priv_newFilter`](#priv_newfilter).\n> To specify a filter object and get logs without creating a filter, use [`priv_getLogs`](#priv_getlogs).\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "priv_getFilterLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterLogs\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x493\",\n \"blockHash\": \"0xd9cb3a852e1e02c95f035a2e32d57f82c10cab61faa3e8f5c010adf979bb4786\",\n \"transactionHash\": \"0x78866dc51fdf189d8cca74f6a8fe54f172348fbd2163bbe80fa8b106cfc7deb4\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x991cc548c154b2953cc48c02f782e1314097dfbb\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x4d0\",\n \"blockHash\": \"0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb\",\n \"transactionHash\": \"0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x991cc548c154b2953cc48c02f782e1314097dfbb\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000002\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getLogs\",\n \"params\": [\n \"vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x630c507ff633312087dc33c513b66276abcd2fc3\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) matching a specified filter object.\n\nFor private contracts, `priv_getLogs` is the same as [`eth_getLogs`](#eth_getlogs) for public contracts\nexcept there is no [automatic log bloom caching](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\nfor private contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "priv_getLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getLogs\",\n \"params\": [\n \"vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x630c507ff633312087dc33c513b66276abcd2fc3\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x342\",\n \"blockHash\": \"0xf5954f068fa2f2f7741281e8c753a8e92047e27ab3c4971836d2c89fab86d92b\",\n \"transactionHash\": \"0xa9ba5cffde9d4ad8997c5c4352d5d49eeea0e9def8a4ea69991b8837c49d4e4f\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x630c507ff633312087dc33c513b66276abcd2fc3\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x383\",\n \"blockHash\": \"0x91b73a47d53e3a88d62ed091a89a4be7557ad91b552e7ff7d86bf78977d5d45d\",\n \"transactionHash\": \"0xc2a185faf00e87434e55b7f70cc4c38be354c2128b4b96b5f5def0b54a2173ec\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x630c507ff633312087dc33c513b66276abcd2fc3\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000002\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getPrivacyPrecompileAddress", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivacyPrecompileAddress\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the address of the\n[privacy precompiled contract](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing). The address\nis derived and based on the value of the [`privacy-onchain-groups-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#privacy-onchain-groups-enabled)\noption.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `data` - Address of the privacy precompile." + }, + "response": [ + { + "name": "priv_getPrivacyPrecompileAddress", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivacyPrecompileAddress\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x000000000000000000000000000000000000007e\"\n}" + } + ] + }, + { + "name": "priv_getPrivateTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivateTransaction\",\n \"params\": [\n \"0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the private transaction if you are a participant, otherwise, `null`.\n\n#### Parameters\n\n`data` - Transaction hash returned by [`eea_sendRawTransaction`](#eea_sendrawtransaction) or\n[`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction).\n\n#### Returns\n\nObject - [Private transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#private-transaction-object), or `null` if not\na participant in the private transaction." + }, + "response": [ + { + "name": "priv_getPrivateTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivateTransaction\",\n \"params\": [\n \"0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\": \"0x2dc6c0\",\n \"gasPrice\": \"0x0\",\n \"hash\": \"0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498\",\n \"input\": \"0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610221806100606000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f2451461005c5780636057361d1461008757806367e404ce146100b4575b600080fd5b34801561006857600080fd5b5061007161010b565b6040518082815260200191505060405180910390f35b34801561009357600080fd5b506100b260048036038101908080359060200190929190505050610115565b005b3480156100c057600080fd5b506100c96101cb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600254905090565b7fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f53382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18060028190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050905600a165627a7a723058208efaf938851fb2d235f8bf9a9685f149129a30fe0f4b20a6c1885dc02f639eba0029\",\n \"nonce\": \"0x0\",\n \"to\": null,\n \"value\": \"0x0\",\n \"v\": \"0xfe8\",\n \"r\": \"0x654a6a9663ca70bb13e27cca14b3777cc92da184e19a151cdeef2ccbbd5c6405\",\n \"s\": \"0x5dd4667b020c8a5af7ae28d4c3126f8dcb1187f49dcf0de9d7a39b1651892eef\",\n \"privateFrom\": \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"privateFor\": [\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ],\n \"restriction\": \"restricted\"\n }\n}" + } + ] + }, + { + "name": "priv_getTransactionCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the private transaction count for specified account and privacy group.\n\n> **important**\n\n> If sending more than one transaction to be mined in the same block (that is, you are not waiting for the transaction receipt), you must calculate the private transaction nonce outside Besu instead of using `priv_getTransactionCount`.\n\n#### Parameters\n\n`data` - Account address.\n\n`data` - Privacy group ID.\n\n#### Returns\n\n`quantity` - Integer representing the number of private transactions sent from the address to the\nspecified privacy group." + }, + "response": [ + { + "name": "priv_getTransactionCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "priv_getTransactionReceipt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionReceipt\",\n \"params\": [\n \"0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns information about the private transaction after mining the transaction. Receipts for\npending transactions are not available.\n\n#### Parameters\n\n`data` - 32-byte hash of a transaction.\n\n#### Returns\n\n`Object` - [Private Transaction receipt object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#private-transaction-receipt-object),\nor `null` if no receipt found." + }, + "response": [ + { + "name": "priv_getTransactionReceipt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionReceipt\",\n \"params\": [\n \"0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"contractAddress\": \"0x493b76031593402e24e16faa81f677b58e2d53f3\",\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"output\": \"0x6080604052600436106049576000357c010000000000000000000000000000000000000000000\\n 0000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b3480156059\\n 57600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b\\n 50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b8060008190555050560\\n 0a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029\",\n \"commitmentHash\": \"0x79b9e6b0856db398ad7dc208f15b1d38c0c0b0c5f99e4a443a2c5a85510e96a5\",\n \"transactionHash\": \"0x36219e92b5f53d4150aa9ef7d2d793118cced523de6724100da5b534e3ceb4b8\",\n \"privateFrom\": \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"privacyGroupId\": \"cD636RZlcqVSpoxT/ExbkWQfBO7kPAZO0QlWHErNSL8=\",\n \"status\": \"0x1\",\n \"logs\": []\n }\n}" + } + ] + }, + { + "name": "priv_newFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_newFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x991cc548c154b2953cc48c02f782e1314097dfbb\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a [log filter](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for a private contract. To poll for logs associated with the\ncreated filter, use [`priv_getFilterChanges`](#priv_getfilterchanges). To get all logs associated with\nthe filter, use [`priv_getFilterLogs`](#priv_getfilterlogs).\n\nFor private contracts, `priv_newFilter` is the same as [`eth_newFilter`](#eth_newfilter)\nfor public contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n> **Note**\n>\n> `fromBlock` and `toBlock` in the filter options object default to `latest`." + }, + "response": [ + { + "name": "priv_newFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_newFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x991cc548c154b2953cc48c02f782e1314097dfbb\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x4a35b92809d73f4f53a2355d62125442\"\n}" + } + ] + }, + { + "name": "priv_uninstallFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_uninstallFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Uninstalls a filter for a private contract with the specified ID. When a filter is no longer required,\ncall this method.\n\nFilters time out when not requested by [`priv_getFilterChanges`](#priv_getfilterchanges) or [`priv_getFilterLogs`](#priv_getfilterlogs) for 10\nminutes.\n\nFor private contracts, `priv_uninstallFilter` is the same as [`eth_uninstallFilter`](#eth_uninstallfilter)\nfor public contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`." + }, + "response": [ + { + "name": "priv_uninstallFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_uninstallFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `PRIV` API methods are not enabled by default for JSON-RPC. To enable the `PRIV` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "TRACE", + "item": [ + { + "name": "trace_replayBlockTransactions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"trace_replayBlockTransactions\",\n \"params\": [\n \"0x12\",\n [\n \"trace\",\n \"vmTrace\",\n \"stateDiff\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides transaction processing tracing per block.\n\n> **important**\n\n Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n requested block must be within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained)\n (by default, 1024).\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`array of strings` - Tracing options are\n[`trace`, `vmTrace`, and `stateDiff`](Trace-Types). Specify any\ncombination of the three options including none of them.\n\n#### Returns\n\n`result` - Array of [transaction trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-trace-object) containing\none object per transaction, in transaction execution order." + }, + "response": [ + { + "name": "trace_replayBlockTransactions", + "originalRequest": { + "method": "POST", + "header": [], + "url": null + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\":[\n {\n \"output\":\"0x\",\n \"vmTrace\":{\n \"code\":\"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851\",\n \"ops\":[\n {\n \"cost\":3,\n \"ex\":{\n \"mem\":null,\n \"push\":[\n \"0x8\"\n ],\n \"store\":null,\n \"used\":16756175\n },\n \"pc\":72,\n \"sub\":null\n },\n {\"other properties...\":\"values...\"}\n ]\n },\n \"trace\":[\n {\n \"action\":{\n \"callType\":\"call\",\n \"from\":\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\":\"0xffadea\",\n \"input\":\"0x\",\n \"to\":\"0x0100000000000000000000000000000000000000\",\n \"value\":\"0x0\"\n },\n \"result\":{\n \"gasUsed\":\"0x1e\",\n \"output\":\"0x\"\n },\n \"subtraces\":0,\n \"traceAddress\":[\n ],\n \"type\":\"call\"\n }\n ],\n \"stateDiff\":{\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\":{\n \"balance\":{\n \"*\":{\n \"from\":\"0xffffffffffffffffffffffffffffffffc3e12a20b\",\n \"to\":\"0xffffffffffffffffffffffffffffffffc3dc5f091\"\n }\n },\n \"code\":\"=\",\n \"nonce\":{\n \"*\":{\n \"from\":\"0x14\",\n \"to\":\"0x15\"\n }\n },\n \"storage\":{\n }\n }\n },\n \"transactionHash\":\"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd\",\n },\n {\"other properties...\":\"values...\"}\n ]\n}" + } + ] + }, + { + "name": "trace_block", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"trace_block\",\n \"params\": [\n \"0x6\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides transaction processing of [type `trace`](Trace-Types#trace) for the specified block.\n\n> **Important**\n>\n> Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n> requested block must be within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained) (by default, 1024).\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` - Array of [calls to other contracts](Trace-Types#trace) containing\none object per call, in transaction execution order." + }, + "response": [ + { + "name": "trace_block", + "originalRequest": { + "method": "POST", + "header": [], + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "trace_transaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"trace_transaction\",\n \"params\": [\n \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides transaction processing of [type `trace`](Trace-Types#trace) for the specified transaction.\n\n> **Important**\n>\n> Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n> requested transaction must be contained in a block within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained) (by default, 1024).\n\n#### Parameters\n\n`data` : Transaction hash\n\n#### Returns\n\n`result` - Array of [calls to other contracts](Trace-Types#trace) containing\none object per call, in the order called by the transaction.\n" + }, + "response": [ + { + "name": "trace_transaction", + "originalRequest": { + "method": "POST", + "header": [], + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"result\": [\n {\n \"action\": {\n \"creationMethod\": \"create\",\n \"from\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n \"gas\": \"0xff2e26\",\n \"init\": \"0x60006000600060006000732c2b9c9a4a25e24b174f26114e8926a9f2128fe45af2600060006000600060007300a00000000000000000000000000000000000005af2\",\n \"value\": \"0x0\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": {\n \"address\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"code\": \"0x\",\n \"gasUsed\": \"0x1c39\"\n },\n \"subtraces\": 2,\n \"traceAddress\": [],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"create\"\n },\n {\n \"action\": {\n \"callType\": \"callcode\",\n \"from\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"gas\": \"0xfb2ea9\",\n \"input\": \"0x\",\n \"to\": \"0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4\",\n \"value\": \"0x0\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": {\n \"gasUsed\": \"0x138e\",\n \"output\": \"0x\"\n },\n \"subtraces\": 1,\n \"traceAddress\": [\n 0\n ],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"call\"\n },\n {\n \"action\": {\n \"address\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"balance\": \"0x0\",\n \"refundAddress\": \"0x0000000000000000000000000000000000000000\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": null,\n \"subtraces\": 0,\n \"traceAddress\": [\n 0,\n 0\n ],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"suicide\"\n },\n {\n \"action\": {\n \"callType\": \"callcode\",\n \"from\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"gas\": \"0xfb18a5\",\n \"input\": \"0x\",\n \"to\": \"0x00a0000000000000000000000000000000000000\",\n \"value\": \"0x0\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": {\n \"gasUsed\": \"0x30b\",\n \"output\": \"0x\"\n },\n \"subtraces\": 0,\n \"traceAddress\": [\n 1\n ],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"call\"\n }\n ],\n \"id\": 1\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `TRACE` API methods are not enabled by default for JSON-RPC. To enable the `TRACE` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options.\n\nThe TRACE API is a more concise alternative to the DEBUG API." + }, + { + "name": "TXPOOL", + "item": [ + { + "name": "txpool_besuPendingTransactions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuPendingTransactions\",\n \"params\": [\n 2,\n {\n \"from\": {\n \"eq\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"\n },\n \"gas\": {\n \"lt\": \"0x5209\"\n },\n \"nonce\": {\n \"gt\": \"0x1\"\n }\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists pending transactions that match the supplied filter conditions.\n\n#### Parameters\n\n* `QUANTITY` - Integer representing the maximum number of results to return.\n* Object of fields used to create the filter condition.\n\nEach field in the object corresponds to a field name containing an operator, and a value for the\noperator. A field name can only be specified once, and can only contain one operator.\nFor example, you cannot query transactions with a gas price between 8 and 9 Gwei by using both the\n`gt` and `lt` operator in the same field name instance.\n\nAll filters must be satisfied for a transaction to be returned.\n\n| Field name | Value | Value type | Supported operators |\n|--------------|-------------------------------------------|:---------------------:|---------------------|\n| **from** | Address of the sender. | *Data*, 20 bytes | `eq` |\n| **to** | Address of the receiver, or `\"contract_creation\"`.| *Data*, 20 bytes |`eq`, `action`|\n| **gas** | Gas provided by the sender. | *Quantity* | `eq`, `gt`, `lt` |\n| **gasPrice** | Gas price, in wei, provided by the sender.| *Quantity* | `eq`, `gt`, `lt` |\n| **value** | Value transferred, in wei. | *Quantity* | `eq`, `gt`, `lt` |\n| **nonce** | Number of transactions made by the sender.| *Quantity* | `eq`, `gt`, `lt` |\n|\n\nSupported operators:\n\n* `eq` (Equal to)\n* `lt` (Less than)\n* `gt` (Greater than)\n* `action`\n\n> **Note**\n>\n> The only supported `action` is `\"contract_creation\"`.\n\n#### Returns\n\n`result` - Array of objects with [details of the pending transaction](https://besu.hyperledger.org/en/stable/Reference/API-Objects#pending-transaction-object)." + }, + "response": [ + { + "name": "txpool_besuPendingTransactions", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuPendingTransactions\",\n \"params\": [\n 2,\n {\n \"from\": {\n \"eq\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"\n },\n \"gas\": {\n \"lt\": \"0x5209\"\n },\n \"nonce\": {\n \"gt\": \"0x1\"\n }\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\": \"0x5208\",\n \"gasPrice\": \"0xab5d04c00\",\n \"hash\": \"0xb7b2f4306c1c228ec94043da73b582594007091a7dfe024b1f8d6d772284e54b\",\n \"input\": \"0x\",\n \"nonce\": \"0x2\",\n \"to\": \"0xf8be4ebda7f62d79a665294ec1263bfdb59aabf2\",\n \"value\": \"0x0\",\n \"v\": \"0xfe8\",\n \"r\": \"0x5beb711e652c6cf0a589d3cea904eefc4f45ce4372652288701d08cc4412086d\",\n \"s\": \"0x3af14a56e63aa5fb7dcb444a89708363a9d2c1eba1f777c67690288415080ded\"\n }\n ]\n}" + } + ] + }, + { + "name": "txpool_besuStatistics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuStatistics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists statistics about the node transaction pool.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - Transaction pool statistics:\n\n* `maxSize` - Maximum number of transactions kept in the transaction pool. Use the\n [`--tx-pool-max-size`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#tx-pool-max-size) option to configure the maximum size.\n* `localCount` - Number of transactions submitted directly to this node.\n* `remoteCount` - Number of transactions received from remote nodes." + }, + "response": [ + { + "name": "txpool_besuStatistics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuStatistics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"maxSize\": 4096,\n \"localCount\": 1,\n \"remoteCount\": 0\n }\n}" + } + ] + }, + { + "name": "txpool_besuTransactions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuTransactions\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists transactions in the node transaction pool.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - List of transactions." + }, + "response": [ + { + "name": "txpool_besuTransactions", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuTransactions\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"hash\": \"0x8a66830098be4006a3f63a03b6e9b67aa721e04bd6b46d420b8f1937689fb4f1\",\n \"isReceivedFromLocalSource\": true,\n \"addedToPoolAt\": \"2019-03-21T01:35:50.911Z\"\n },\n {\n \"hash\": \"0x41ee803c3987ceb5bcea0fad7a76a8106a2a6dd654409007d9931032ea54579b\",\n \"isReceivedFromLocalSource\": true,\n \"addedToPoolAt\": \"2019-03-21T01:36:00.374Z\"\n }\n ]\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `TXPOOL` API methods are not enabled by default for JSON-RPC. To enable the `TXPOOL` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "WEB3", + "item": [ + { + "name": "web3_clientVersion", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the current client version.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - Current client version." + }, + "response": [ + { + "name": "web3_clientVersion", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"besu/\"\n}" + } + ] + }, + { + "name": "web3_sha3", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_sha3\",\n \"params\": [\n \"0x68656c6c6f20776f726c00\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a [SHA3](https://en.wikipedia.org/wiki/SHA-3) hash of the specified data. The result value\nis a [Keccak-256](https://keccak.team/keccak.html) hash, not the standardized SHA3-256.\n\n#### Parameters\n\n`DATA` - Data to convert to a SHA3 hash.\n\n#### Returns\n\n`result` (*DATA*) - SHA3 result of the input data." + }, + "response": [ + { + "name": "web3_sha3", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_sha3\",\n \"params\": [\n \"0x68656c6c6f20776f726c00\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x5e39a0a66544c0668bde22d61c47a8710000ece931f13b84d3b2feb44ec96d3f\"\n}" + } + ] + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [""] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [""] + } + } + ] +} diff --git a/versioned_docs/version-23.4.1/global/postman.md b/versioned_docs/version-23.4.1/global/postman.md new file mode 100644 index 00000000000..a9afe58649b --- /dev/null +++ b/versioned_docs/version-23.4.1/global/postman.md @@ -0,0 +1,15 @@ +:::info Besu JSON-RPC APIs documentation in Postman format + +View the [Besu JSON-RPC APIs documentation](https://www.postman.com/hyperledger/workspace/hyperledger-besu/collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8) in the Postman format and obtain example requests in multiple coding languages. + +#### Run in Postman + +Click the following button to fork the collection and run requests directly on your local network. + +[![Run in Postman](https://run.pstmn.io/button.svg)](https://god.gw.postman.com/run-collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8?action=collection%2Ffork&collection-url=entityId%3D11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8%26entityType%3Dcollection%26workspaceId%3Dc4b60b6f-9f15-42d0-8327-7ebabca6f0fd#?env%5BBesu%20node%20on%20local%20host%5D=W3sia2V5IjoicnBjLWh0dHAtaG9zdCIsInZhbHVlIjoibG9jYWxob3N0IiwiZW5hYmxlZCI6ZmFsc2V9LHsia2V5IjoicnBjLWh0dHAtcG9ydCIsInZhbHVlIjoiODU0NSIsImVuYWJsZWQiOmZhbHNlfV0=). + +#### Download collection + +Alternatively you can [download the JSON collection file](../assets/postman/postman_collection.json). + +::: diff --git a/versioned_docs/version-23.4.1/global/test_accounts.md b/versioned_docs/version-23.4.1/global/test_accounts.md new file mode 100644 index 00000000000..ae819b23ed3 --- /dev/null +++ b/versioned_docs/version-23.4.1/global/test_accounts.md @@ -0,0 +1,51 @@ +:::danger **Do not use the test accounts on Ethereum Mainnet or any production network.** + +The following accounts are test accounts and their private keys are publicly visible in this documentation and in publicly available source code. + +They are not secure and everyone can use them. + +**Using test accounts on Ethereum Mainnet and production networks can lead to loss of funds and identity fraud.** + +In this documentation, we only provide test accounts for ease of testing and learning purposes; never use them for other purposes. + +**Always secure your Ethereum Mainnet and any production account properly.** + +See for instance [MyCrypto "Protecting Yourself and Your Funds" guide](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds). + +::: + +:::info "Test Account 1 (address `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`)" + +Private key to copy : + +```text +0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63 +``` + +Initial balance : 200 Eth _(200000000000000000000 Wei)_ + +::: + +:::info "Test Account 2 (address `0x627306090abaB3A6e1400e9345bC60c78a8BEf57`)" + +Private key to copy : + +```text +0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 +``` + +Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ + +::: + +:::info "Test Account 3 (address `0xf17f52151EbEF6C7334FAD080c5704D77216b732`)" + +Private key to copy : + +```text +0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f +``` + +Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/_category_.json b/versioned_docs/version-23.4.1/private-networks/_category_.json new file mode 100644 index 00000000000..865a111a8b4 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Private networks", + "position": 1 +} diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/_category_.json b/versioned_docs/version-23.4.1/private-networks/concepts/_category_.json new file mode 100644 index 00000000000..d373a29254a --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Concepts", + "position": 4 +} diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/index.md b/versioned_docs/version-23.4.1/private-networks/concepts/index.md new file mode 100644 index 00000000000..efffe0e3a05 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/index.md @@ -0,0 +1,22 @@ +--- +title: Concepts +description: private networks concepts overview +sidebar_position: 3 +tags: + - private networks +--- + +# Concepts + +This section provides background information and context about private network features. + +The following features are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: + +- Transactions: + - [Transaction types](../../public-networks/concepts/transactions/types.md) + - [Transaction pool](../../public-networks/concepts/transactions/pool.md) + - [Transaction validation](../../public-networks/concepts/transactions/validation.md) +- [Network ID and chain ID](../../public-networks/concepts/network-and-chain-id.md) +- [Events and logs](../../public-networks/concepts/events-and-logs.md) +- [Genesis file](../../public-networks/concepts/genesis-file.md) +- [Node keys](../../public-networks/concepts/node-keys.md) diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/_category_.json b/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/_category_.json new file mode 100644 index 00000000000..7299170da97 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Permissioning", + "position": 3 +} diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/index.md b/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/index.md new file mode 100644 index 00000000000..ad3678f68fd --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/index.md @@ -0,0 +1,65 @@ +--- +title: Permissioning +sidebar_position: 1 +description: Besu permissioning feature +tags: + - private networks +--- + +# Permissioning + +A permissioned network enables node permissioning and account permissioning, allowing only specified nodes and accounts to access the network. + +:::caution Permissioning is not privacy + +In peer-to-peer networks, node permissioning enforces rules on nodes you control. + +Permissioning requires a distributed network of trust across the network where participants agree to follow the rules. One bad actor can decide not to follow the rules. Nodes can take action to prevent the bad actor adding to the chain but they cannot prevent the bad actor from allowing access to the chain. + +Besu also implements [privacy](../privacy/index.md). + +::: + +## Node permissioning + +Use node permissioning to restrict access to known participants only. + +![Node Permissioning](../../../assets/images/node-permissioning-bad-actor.png) + +## Account permissioning + +Use account permissioning to: + +- Enforce onboarding or identity requirements. +- Suspend accounts. +- Restrict the actions an account can perform. + +![Account Permissioning](../../../assets/images/enterprise-ethereum-account-permissioning.png) + +## Specify permissioning + +You can specify permissioning [locally](#local) or [onchain](#onchain). + +### Local + +[Local permissioning](../../how-to/use-permissioning/local.md) works at the node level. Each node in the network has a [permissions configuration file]. + +Local permissioning affects your node but not the rest of the network. Use local permissioning to restrict use of your node (that is, the resources under your control). For example, customers able to access your node. + +Local permissioning does not require coordination with the rest of the network and you can act immediately to protect your node. Your rules are not enforced in blocks produced by other nodes. + +### Onchain + +[Onchain permissioning](onchain.md) works through a smart contract on the network. Specifying permissioning onchain enables all nodes to read and update permissioning configuration from one location. + +Onchain permissioning requires coordination to update the rules. The network might not be able to act immediately (for example, the smart contract might enforce a minimum of number of votes before changing permissioning rules). + +When you update onchain permissioning, the update applies across the network and new blocks abide by the updated rules. For example, blocked accounts can no longer add transactions to the chain. + +The following diagram illustrates applying local and onchain permissioning rules. + +![Permissioning Flow](../../../assets/images/PermissioningFlow.png) + + + +[permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/onchain.md b/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/onchain.md new file mode 100644 index 00000000000..908a3418f9b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/onchain.md @@ -0,0 +1,73 @@ +--- +title: Onchain permissioning +description: Onchain permissioning +sidebar_position: 1 +tags: + - private networks +--- + +# Onchain permissioning + +Onchain [permissioning](index.md) uses smart contracts to store and administer the node, account, and admin allowlists. Using onchain permissioning enables all nodes to read the allowlists from a single source, the blockchain. + +:::danger + +When using onchain account permissioning, a node checks permissions when importing blocks. Meaning, a node only imports blocks in which all transactions are from authorized senders. If you disable onchain account permissioning and your node accepts blocks without enforcing this rule, your node cannot re-synchronize with other nodes that enforce onchain account permissioning rules (your node goes into forked state). + +::: + +:::note + +Custom smart contracts and dapps can be implemented to work with onchain permissioning. + +::: + +## Permissioning contracts + +:::caution + +The permissioning contract has multiple interfaces, and each interface maps to a specific version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). Ensure that you [specify the permissioning contract interface] being used when starting Besu. + +::: + +### Allowlists + +Permissioning implements three allowlists: + +- Accounts, which can submit transactions to the network. +- Nodes, which can join the network. +- Admins, which are accounts able to update the accounts and nodes allowlists. + +:::caution Using account permissioning and privacy + +Account permissioning is incompatible with [random key signing](../../how-to/use-privacy/sign-pmts.md) for [privacy marker transactions](../privacy/private-transactions/processing.md). + +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: + +:::tip + +If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) and search for messages containing `Node permissioning` to identify the issue. + +Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been correctly configured for all nodes with the externally accessible address. + +If you change your network configuration, you may need to update the node allowlist. + +::: + +## Bootnodes + +When a node joins the network, the node connects to the [bootnodes](../../how-to/configure/bootnodes.md) until it synchronizes to the chain head, regardless of node permissions. After synchronization, the Account Rules and Node Rules smart contracts apply the permissioning rules. + +If a synchronized node loses all peer connections (that is, it has zero peers), it reconnects to the bootnodes to rediscover peers. + +:::info + +All bootnodes must be on the nodes allowlist. + +::: + + + +[specify the permissioning contract interface]: ../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/plugin.md b/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/plugin.md new file mode 100644 index 00000000000..a4f62031d8b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/permissioning/plugin.md @@ -0,0 +1,53 @@ +--- +title: Permissioning plugin +description: Plugin based permissioning +sidebar_position: 2 +tags: + - private networks +--- + +# Permissioning plugin + +You can define complex [permissioning](index.md) solutions by building a plugin that extends Hyperledger Besu functionality. + +The plugin API provides a `PermissioningService` interface that currently supports connection permissioning and message permissioning. + +## Connection permissioning + +Use connection permissioning when deciding whether to restrict node access to known participants only. + +## Message permissioning + +Use message permissioning to propagate different types of devP2P messages to particular nodes. For example, this can be used to prevent pending transactions from being forwarded to other nodes. + +## Register your plugin + +To enable permissioning in your plugin, implement the `PermissioningService` interface and register your providers. + +```java +@AutoService(BesuPlugin.class) +public class TestPermissioningPlugin implements BesuPlugin { + PermissioningService service; + + @Override + public void register(final BesuContext context) { + service = context.getService(PermissioningService.class).get(); + } + + @Override + public void start() { + service.registerNodePermissioningProvider((sourceEnode, destinationEnode) -> { + // perform logic for node permissioning + return true; + }); + + service.registerNodeMessagePermissioningProvider((destinationEnode, code) -> { + // perform logic for message permissioning + return true; + }); + } + + @Override + public void stop() {} +} +``` diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/pki.md b/versioned_docs/version-23.4.1/private-networks/concepts/pki.md new file mode 100644 index 00000000000..97cec02eab0 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/pki.md @@ -0,0 +1,45 @@ +--- +title: Public key infrastructure +sidebar_position: 5 +description: Public key infrastructure +tags: + - private networks +--- + +# Public key infrastructure + +:::warning + +Public key infrastructure (PKI) support is an early access feature, and functionality and options may be updated between releases. + +::: + +Hyperledger Besu's public key infrastructure allows you to use certificates issued by a trusted authority to manage node and account identities in the following ways: + +- Node permissioning - Only authorized nodes can connect to other nodes in the network using TLS for the P2P communication. +- Block proposal permissioning - Only blocks proposed by authorized validators are accepted. + +Supported keystore and truststore formats used to store the certificates include PKCS11, PKCS12, and JKS. + +## Node permissioning + +Allow TLS communication between nodes by using certificates issued by a trusted authority to connect to other authorized nodes in the network. + +When receiving connection requests, the incoming connection must be from another authorized node. Similarly, when connecting to a node the initiator ensures that the remote node is authorized to participate in the network. + +[Configure TLS for the P2P communication using the Besu command line options](../how-to/configure/tls/p2p.md). + +## Block proposal permissioning + +:::caution + +Only private networks using the [QBFT consensus protocol] support block proposal permissioning. + +::: + +Use certificates issued by a trusted authority to ensure only authorized validator nodes can propose new blocks in the network. The block hash is signed by the validator private certificate and included in the header of the proposed block as a [CMS (Cryptographic Message Syntax)]. This is used by other validators to verify that the proposer is authorized to create a block in the network. + +[Configure block proposal permissioning using the Besu command line options](../how-to/configure/block-proposal-permissioning.md). + +[QBFT consensus protocol]: ../how-to/configure/consensus/qbft.md +[CMS (Cryptographic Message Syntax)]: https://en.wikipedia.org/wiki/Cryptographic_Message_Syntax diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/plugins.md b/versioned_docs/version-23.4.1/private-networks/concepts/plugins.md new file mode 100644 index 00000000000..70ee78f7ca4 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/plugins.md @@ -0,0 +1,55 @@ +--- +title: Plugins +sidebar_position: 6 +description: Plugins overview +tags: + - private networks +--- + +# Plugins + +You can extend Hyperledger Besu functionality by building Java plugins or using existing open source Besu plugins. Use the Plugin API to take data from any Besu network, public or permissioned, and feed it into an application or system. + +For example, create a plugin to add more monitoring functionality or stream event data to a third-party application. The API exposes data about the following components: + +- Blocks +- Balances +- Transactions +- Smart contracts +- Execution results +- Logs +- Syncing state. + +![Besu plugin API](../../assets/images/Hyperledger-Besu-Plugin-API.png) + +The plugin API provides access to [interfaces](../reference/plugin-api-interfaces.md) allowing you to build the plugin. + +:::info + +View the [plugin API webinar](https://youtu.be/78sa2WuA1rg) for an example of how to build a plugin. + +For more information about the available interfaces, see the [Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). + +::: + +## Install plugins + +To allow Besu to access and use the plugin, copy the plugin (`.jar`) to the `plugins` directory. + +:::caution + +If not already present, you must create the `plugins` directory one directory level below (`../`) the `besu` executable. + +::: + +Each plugin in the directory has the following lifecycle events: + +- **Register** - Executed when Besu starts. Besu checks plugin compatibility and registers plugins. +- **Start** - Plugins start after being successfully registered. +- **Stop** - Besu stops plugins. + +:::note + +The order in which Besu calls plugins during lifecycle events is not guaranteed. + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/poa.md b/versioned_docs/version-23.4.1/private-networks/concepts/poa.md new file mode 100644 index 00000000000..40d07a75c53 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/poa.md @@ -0,0 +1,69 @@ +--- +title: Proof of authority consensus +sidebar_position: 1 +description: Besu proof of authority consensus protocols comparison +tags: + - private networks +--- + +# Proof of authority consensus + +Besu implements the QBFT, IBFT 2.0, and Clique proof of authority (PoA) [consensus protocols](../how-to/configure/consensus/index.md). PoA consensus protocols work when participants know each other and there is a level of trust between them. For example, in a permissioned consortium network. + +PoA consensus protocols have faster block times and a much greater transaction throughput than the Ethash proof of work consensus protocol used on the Ethereum Mainnet. + +In QBFT, IBFT 2.0, or Clique, a group of nodes in the network act as validators (QBFT and IBFT 2.0) or signers (Clique). The existing nodes in the signer/validator pool vote to add nodes to or remove nodes from the pool. + +:::note + +For the rest of this page, the term validator is used to refer to signers and validators. + +::: + +## Properties + +Properties to consider when comparing QBFT, IBFT 2.0, and Clique are: + +- Immediate finality. +- Minimum number of validators. +- Liveness. +- Speed. + +### Immediate finality + +QBFT and IBFT 2.0 have immediate finality; there are no forks and all valid blocks get included in the main chain. + +Clique does not have immediate finality. Implementations using Clique must be aware of forks and chain reorganizations occurring. + +### Minimum number of validators + +To be Byzantine fault tolerant, QBFT and IBFT 2.0 require a minimum of four validators. + +Clique can operate with a single validator but operating with a single validator offers no redundancy if the validator fails. + +:::tip + +Byzantine fault tolerant is the ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +::: + +### Liveness + +Clique is more fault tolerant than QBFT and IBFT 2.0. Clique tolerates up to half of the validators failing. QBFT and IBFT 2.0 networks require greater than or equal to two-thirds of validators to be operating to create blocks. For example, an QBFT and IBFT 2.0 network of: + +- Four to five validators tolerates one unresponsive validator. +- Six to eight validators tolerates two unresponsive validators. + +Networks with three or less validators can produce blocks but do not guarantee finality when operating in adversarial environments. + +:::caution + +We recommend using QBFT or IBFT 2.0 networks with at least four nodes in production environments. + +::: + +### Speed + +Reaching consensus and adding blocks is faster in Clique networks. For Clique, the probability of a fork increases as the number of validators increases. + +For QBFT and IBFT 2.0, the time to add new blocks increases as the number of validators increases. diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/privacy/_category_.json b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/_category_.json new file mode 100644 index 00000000000..e1382c18fd5 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Privacy", + "position": 2 +} diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/privacy/flexible-privacy.md b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/flexible-privacy.md new file mode 100644 index 00000000000..ea40eca8c52 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/flexible-privacy.md @@ -0,0 +1,81 @@ +--- +title: Flexible privacy groups +sidebar_position: 3 +description: Flexible privacy groups +--- + +# Flexible privacy groups + +Flexible [privacy groups](privacy-groups.md) use smart contracts to store and maintain the group membership. You can [add and remove members to and from flexible privacy groups](../../how-to/use-privacy/flexible.md). + +:::tip + +Because group membership for flexible privacy groups is stored in a smart contract, flexible privacy groups are also known as onchain privacy groups. + +::: + +:::danger + +Flexible privacy groups are an early access feature. Don't use in production networks. + +The flexible privacy group interfaces might change between releases. There might not be an upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy group functionality in future versions. + +We don't recommended creating flexible privacy groups in a chain with existing [offchain privacy groups](privacy-groups.md). + +::: + +## Group management contracts + +The privacy group management contract bytecode is hard-coded into Besu and when you create a privacy group, the contract bytecode is part of the genesis state of the privacy group. + +:::caution + +All members of a flexible privacy group must be using the same version of Besu. If using different versions, the private state within the privacy group may become inconsistent. + +::: + +In the default implementation of the group management contract, the signer of the private transaction that creates the privacy group is also the owner of the group. Only the owner can add and remove participants, and upgrade the management contract. + +The owner is identified by the signing key. Transactions to add and remove participants, or upgrade the management contract, must be signed by the same key that signed the group creation transaction. + +## Flexible privacy group IDs + +When creating a flexible privacy group, generate the privacy group ID for the group outside of Besu and pass the ID as a parameter. + +The [web3js-quorum library](../../how-to/use-privacy/flexible.md) generates a unique privacy group ID and passes the ID to Besu when creating a privacy group. + +:::caution + +When generating a privacy group ID, you must ensure the ID is unique across all network participants. If you create a privacy group with an existing privacy group ID, the existing privacy group is overwritten. + +To ensure unique privacy group IDs, we recommend using 256-bit SecureRandom. + +::: + +## Multi-tenancy + +When using [multi-tenancy](multi-tenancy.md) with flexible privacy groups, each user provides a JSON Web Token (JWT) which allows Besu to check that the user has access to functionality and data associated with a privacy group. + +Using multi-tenancy with flexible privacy groups is more complex than with [offchain privacy groups](privacy-groups.md) because users may be added and removed from flexible privacy groups. When a user is added to a privacy group, they get access to all existing data in the privacy group. After being removed from a privacy group, a user retains access to already existing data in the privacy group, up to the block containing the [privacy marker transaction (PMT)](private-transactions/processing.md) that removed them (the removal block). A removed user doesn't have access to data in the privacy group that happens after they were removed. + +In particular, when multi-tenancy is enabled and a user requests access to a privacy group they were once a member of but later removed from, Besu allows the user access to the following functionality and data associated with the privacy group: + +- Private transactions using `priv_getTransaction` and private transaction receipts using [`priv_getTransactionReceipt`](../../../public-networks/reference/api/index.md#priv_gettransactionreceipt) from blocks up to (and including) the removal block. + + :::note + + A removed group member may have access to some private transactions after the removal PMT in the same block. + + ::: + +- Using [`priv_call`](../../../public-networks/reference/api/index.md#priv_call) on blocks up to (and including) the removal block. + +- Private logs using [`priv_getLogs`](../../../public-networks/reference/api/index.md#priv_getlogs) for blocks up to (and including) the removal block. When the `toBlock` is greater than the removal block, `priv_getLogs` still returns logs up to the removal block. + + :::note + + When a user is removed from a privacy group, any log filters they've created are also removed and can't be accessed. A user can only create and access filters for a privacy group they are currently a member of. + + ::: + +All other [`PRIV` API methods](../../../public-networks/reference/api/index.md#priv-methods) fail for the removed group member. diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/privacy/index.md b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/index.md new file mode 100644 index 00000000000..0888bbe40e3 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/index.md @@ -0,0 +1,71 @@ +--- +title: Privacy +sidebar_position: 1 +description: Privacy +--- + +# Privacy + +In Besu, privacy refers to the ability to keep transactions private between the involved participants. Other participants cannot access the transaction content or list of participants. + +:::danger + +For production environments requiring private transactions: + +- We recommend using a network with a consensus mechanism supporting transaction finality. For example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md). +- Tessera must be [highly available and run in a separate instance to Besu]. + +Using private transactions with [pruning] or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. + +::: + +## Private transaction manager + +Besu uses a private transaction manager, [Tessera](https://docs.tessera.consensys.net/), to implement privacy. Each Besu node that sends or receives [private transactions](private-transactions/index.md) requires an associated Tessera node. + +

+ +![Tessera Nodes](../../../assets/images/TesseraNodes.png) + +

+ +Private transactions pass from the Besu node to the associated Tessera node. The Tessera node encrypts and directly distributes (that is, point-to-point) the private transaction to the Tessera nodes participating in the transaction. + +By default, each participant in a privacy-enabled network uses its own Besu and Tessera node. [Multi-tenancy](multi-tenancy.md) allows more than one participant to use the same Besu and Tessera node. + +:::tip + +Private Transaction Managers are also known as Enclaves. + +::: + +## Privacy-enabled networks + +When enabling privacy in a [private network](../../get-started/system-requirements.md), there's an assumed level of trust among the node operators, since all are members of the private network. + +:::caution + +Inefficient contracts deployed accidentally or deliberately can cause performance issues in privacy-enabled networks because gas isn't required in private transactions. + +::: + +In contrast, gas is required in Ethereum Mainnet and public testnets because they are trustless environments. + +Privacy-enabled networks should have a mechanism to establish trust offchain. Node operators should be informed on: + +- Guidelines for use, responsibilities, and good behavior. +- Smart contract security, so contracts deployed on the network use resources efficiently. +- Consequences for malicious activity. + +Privacy-enabled networks should run development and test environments that closely resemble production, so contracts can be tested, and potential issues can be found before they're deployed in production. + +## Reorg-compatible privacy + +In v1.4, using private transactions in a network using a consensus mechanism where forks occur (that is, PoW algorithms or Clique) is an early access feature. + +Do not use private transactions in production environments using consensus mechanisms where forks occur. + + + +[highly available and run in a separate instance to Besu]: ../../how-to/use-privacy/tessera.md +[pruning]: ../../../public-networks/concepts/data-storage-formats.md#pruning diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/privacy/multi-tenancy.md b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/multi-tenancy.md new file mode 100644 index 00000000000..d04b9606eb8 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/multi-tenancy.md @@ -0,0 +1,33 @@ +--- +title: Multi-tenancy +sidebar_position: 4 +description: Multi-tenancy +--- + +# Multi-tenancy + +By default, each participant in a privacy network uses its own Besu and Tessera node. + +Multi-tenancy allows multiple participants to use the same Besu and Tessera node. Each participant is a _tenant_, and the operator is the _owner_ of the Besu and Tessera node. + +:::info + +The operator is responsible for [configuring multi-tenancy](../../tutorials/privacy/multi-tenancy.md), and has access to all tenant data. + +::: + +![Multi-tenancy](../../../assets/images/Multi-tenancy.png) + +:::tip + +Ensure the multi-tenant Tessera node client API is configured to allow access only by the multi-tenant Besu node. Access to your data is secured through Besu using multi-tenancy mode. + +If not configured to allow access only by the multi-tenant Besu node, other Tessera clients, including other Besu nodes, might be able to access tenant data. + +To secure access, you can [configure TLS between Besu and Tessera](../../how-to/configure/tls/client-and-server.md) with the [`WHITELIST`](https://docs.tessera.consensys.net/en/stable/HowTo/Configure/TLS/#whitelist) trust mode. + +::: + +Multi-tenancy validates that tenants have permission to use the specified HTTP or WebSocket JSON-RPC requests, and the tenant has access to the requested privacy data. Private data is isolated and each tenant uses a JSON Web Token (JWT) for authentication. + +You can [create the JWT either externally or internally](../../../public-networks/how-to/use-besu-api/authenticate.md). diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/privacy/plugin.md b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/plugin.md new file mode 100644 index 00000000000..fbc34fb440f --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/plugin.md @@ -0,0 +1,111 @@ +--- +title: Privacy plugin +description: Privacy plugin +sidebar_position: 5 +--- + +# Privacy plugin + +You can define your own strategy for private transactions by building a plugin that extends Hyperledger Besu functionality. + +The plugin can take many forms, but it must provide Besu with a private transaction when required. + +:::danger + +The privacy plugin is an early access feature and plugin interfaces are subject to change between releases. + +::: + +## Configuration + +Enable the privacy plugin by starting Besu and including the `--Xprivacy-plugin-enabled` command line option. The registered plugin must implement the `PrivacyPluginPayloadProvider` interface. + +## Use the payload provider interface + +The privacy plugin must define the [privacy marker transaction (PMT)] payload. Use the payload to retrieve the contents of the private transaction which could be a link to a location in an enclave, or an encrypted form of the private payload itself. + +Besu doesn't need to know how the private transaction is distributed, it just needs to know what the private transaction for the PMT is. + +### Send transactions + +When submitting a private transaction using [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction), the signed transaction must be sent to `0x000000000000000000000000000000000000007a` to indicate which [privacy precompiled contract](private-transactions/processing.md) is being used. + +The transaction flow is as follows: + +1. The JSON-RPC endpoint passes the private transaction to the private transaction manager (for example Tessera). +2. The private transaction manager sends the private transaction to the privacy plugin. +3. The plugin decides what data to store onchain in the payload, for example the encrypted and serialized private transaction. +4. The plugin returns what needs to be stored in the payload for the PMT. +5. The private transaction handler creates a PMT for the private transaction, and propagates the PMT using devP2P in the same way as a public Ethereum transaction. + +### Mine transactions + +The process of mining transactions happens in reverse to sending transactions. + +1. The Mainnet transaction processor processes the PMT in the same way as any other public transaction. On nodes containing the [privacy precompile contract](../../../public-networks/reference/api/index.md#priv_getprivacyprecompileaddress) specified in the `to` attribute of the PMT, the Mainnet transaction processor passes the PMT to the privacy precompile contract. + + :::note + + Nodes receiving the PMT that do not contain the specified privacy precompile contract will ignore the PMT. + + ::: + +1. The privacy precompile contract queries the plugin for the private transaction using the PMT. +1. The privacy precompile contract passes the private transaction to the private transaction manager. The privacy group ID specifies the private world state to use. +1. The private transaction manager executes the transaction. The private transaction manager can read and write to the private world state, and read from the public world state. + +## Transaction factory + +An additional extension is available to help you define how PMTs are signed. Currently, Besu supports fixed or random key signing for PMTs. + +The extension allows you to use a more dynamic approach, for example different keys for different groups. + +Your plugin needs to register the `PrivateMarkerTransactionFactory` interface which is called before submitting a PMT to the transaction pool. The responsibility then lies with the plugin to sign and serialize the PMT. + +[privacy marker transaction (PMT)]: ../../how-to/use-privacy/access-private-transactions.md + +## Register your plugin + +To enable Besu to use your privacy plugin, you must implement the `PrivacyPluginService` interface and you must call `setPayloadProvider`. + +```java + +@AutoService(BesuPlugin.class) +public class TestPrivacyPlugin implements BesuPlugin { + + private PrivacyPluginService service; + + @Override + public void register(BesuContext context) { + service = context.getService(PrivacyPluginService.class).get(); + } + + @Override + public void start() { + service.setPayloadProvider(new PrivacyPluginPayloadProvider() { + @Override + public Bytes generateMarkerPayload(PrivateTransaction privateTransaction, String privacyUserId) { + // perform logic to serialize the payload of the marker transaction + // in this example we are serialising the private transaction using rlp https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/ + return org.hyperledger.besu.ethereum.privacy.PrivateTransaction.serialize(privateTransaction).encoded(); + } + + @Override + public Optional getPrivateTransactionFromPayload(Transaction transaction) { + // perform logic to deserialize payload from the marker transaction + + final BytesValueRLPInput bytesValueRLPInput = + new BytesValueRLPInput(transaction.getPayload(), false); + + return Optional.of(org.hyperledger.besu.ethereum.privacy.PrivateTransaction.readFrom(bytesValueRLPInput)); + } + }); + } + + @Override + public void stop() { + + } +} + +``` diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/privacy/privacy-groups.md b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/privacy-groups.md new file mode 100644 index 00000000000..8521efe7810 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/privacy-groups.md @@ -0,0 +1,77 @@ +--- +title: Privacy groups +sidebar_position: 2 +description: Privacy groups +--- + +# Privacy groups + +A privacy group is a group of nodes identified by a unique privacy group ID by Tessera. Tessera stores each private transaction with the privacy group ID. + +The Besu nodes maintain the public world state for the blockchain and a private state for each privacy group. The private states contain data that is not shared in the globally replicated world state. + +:::caution + +The privacy group implementations described below are offchain privacy groups and cannot have their group membership updated. + +[Flexible privacy groups are an early access feature](flexible-privacy.md). + +::: + +## Privacy types + +Besu implements two types of privacy: + +- Enterprise Ethereum Alliance (EEA) privacy, where private transactions include `privateFor` as the recipient. +- Besu-extended privacy, where private transactions include `privacyGroupId` as the recipient. + +Both privacy types create privacy groups and store private transactions with their privacy group in Tessera. + +

+ +![Privacy Groups](../../../assets/images/PrivacyGroups.png) + +

+ +:::note + +For clarity, the Tessera nodes are not shown in the previous diagram. To send private transactions, each Besu node must have an associated Tessera node. + +::: + +### Access between states + +A contract in a privacy group: + +- Can read or write to a contract in the same privacy group. +- Can read from the public state including public contracts. +- Cannot access contracts from a different privacy group. + +A public contract cannot access a private contract. + +### Enterprise Ethereum Alliance privacy + +In the privacy implementation complying with the [EEA Client Specification](https://entethalliance.org/technical-documents/) the group of nodes specified by `privateFrom` and `privateFor` form a privacy group with a unique privacy group ID provided by Tessera. + +The previous diagram illustrates two privacy groups enabling: + +- A, B, and C to send transactions that are private from D. +- A, C, and D to send transactions that are private from B. + +Using EEA-compliant privacy, to send private transactions between A, B, and C, A initializes a contract in a private transaction with B and C specified as the `privateFor` and A specified as the `privateFrom`. Initializing the contract creates a privacy group consisting of A, B, and C. For the ABC private state to remain consistent, A, B, and C must be included on transactions (as either `privateFrom` or `privateFor`) even if they are between only two of the three parties. + +To send private transactions between A, C, and D, C initializes a different contract in a private transaction with A and D specified as the `privateFor` and C specified as the `privateFrom`. Initializing the contract creates a privacy group consisting of A, C, and D. For the ACD private state to remain consistent, A, C, and D must be included on transactions (as either `privateFrom` or `privateFor`) even if they are between only two of the three parties. + +### Besu-extended privacy + +The Besu-extended privacy implementation creates a privacy group using [`priv_createPrivacyGroup`](../../../public-networks/reference/api/index.md#priv_createprivacygroup) with private transactions sent to the privacy group ID. + +Using the same privacy groups as in the previous example. + +Using Besu-extended privacy, to send private transactions between A, B, and C, A creates a privacy group consisting of A, B, and C. The privacy group ID is specified when sending private transactions and A, B, and C are recipients of all private transactions sent to the privacy group. + +To send private transactions between A, C, and D, A creates a privacy group consisting of A, C, and D. The privacy group ID of this group is specified when sending private transactions with A, C, and D as recipients. + +## Multi-tenancy + +When using [multi-tenancy](multi-tenancy.md) with privacy groups, each user provides a JSON Web Token (JWT) which allows Besu to check that the user has access to functionality and data associated with a privacy group. diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/privacy/private-transactions/_category_.json b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/private-transactions/_category_.json new file mode 100644 index 00000000000..465b0be5572 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/private-transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Private transactions", + "position": 1 +} diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/privacy/private-transactions/index.md b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/private-transactions/index.md new file mode 100644 index 00000000000..c149089080d --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/private-transactions/index.md @@ -0,0 +1,98 @@ +--- +description: Private transaction overview +--- + +# Private transactions + +Private transactions have the same parameters as public Ethereum transactions, with the following additions: + +- `privateFrom` - The Tessera public key of the transaction sender. +- One of the following: + - `privateFor` - The Tessera public keys of the transaction recipients. + - `privacyGroupId` - [The privacy group to receive the transaction](../privacy-groups.md). +- `restriction` - Whether the private transaction is `restricted` or `unrestricted`: + + - `restricted` - Only the nodes participating in the transaction receive and store the payload of the private transaction. + - `unrestricted` - All nodes in the network receive the payload of the private transaction, but only the nodes participating in the transaction can read the transaction. + + :::info + + Besu implements `restricted` private transactions only. + + ::: + +The `gas` and `gasPrice` are used by the [privacy marker transaction (PMT)](processing.md), not the private transaction itself. + +:::info + +Because gas isn't required in private transactions, inefficient contracts deployed accidentally or deliberately can cause performance issues in privacy-enabled networks. Ensure your network has a mechanism to [establish trust offchain](../index.md#privacy-enabled-networks). + +::: + +You can [create and send private transactions](../../../how-to/send-transactions/private-transactions.md). + +## Besu and Tessera keys + +Besu and Tessera nodes both have public/private key pairs identifying them. A Besu node sending a private transaction to a Tessera node signs the transaction with the Besu node private key. The `privateFrom` and `privateFor` parameters specified in the RLP-encoded transaction string for [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) are the public keys of the Tessera nodes sending and receiving the transaction. + +:::info + +The mapping of Besu node addresses to Tessera node public keys is offchain. That is, the sender of a private transaction must know the Tessera node public key of the recipient. + +::: + +## Nonces + +A nonce is the number of previous transactions made by the sender. + +[Private transaction processing](processing.md) involves two transactions: the private transaction distributed to involved participants, and the privacy marker transaction (PMT) included on the public blockchain. Each of these transactions has its own nonce. Since the PMT is a public transaction, the PMT nonce is the public nonce for the account. + +### Private transaction nonce + +Besu maintains separate private states for each [privacy group](../privacy-groups.md). The private transaction nonce for an account is specific to the privacy group. That is, the nonce for account A for privacy group ABC is different to the nonce for account A for privacy group AB. + +### Private nonce validation + +Unlike public transactions, private transactions are not submitted to the [transaction pool](../../../../public-networks/concepts/transactions/pool.md). The private transaction is distributed directly to the participants in the transaction, and the PMT is submitted to the transaction pool. + +Unlike [public transaction nonces](../../../../public-networks/concepts/transactions/validation.md), private transaction nonces aren't validated when the private transaction is submitted. If a private transaction has an incorrect nonce, the PMT is still valid and is added to a block. However, in this scenario, the private transaction execution fails when [processing the PMT](processing.md) for the private transaction with the incorrect nonce. + +The following private transaction flow illustrates when nonce validation occurs: + +1. Submit a private transaction with a [nonce value](#private-transaction-nonce). +1. The private transaction is distributed to all participants in the privacy group. +1. The PMT is created and submitted to the transaction pool with a nonce of `0` if using one-time accounts. If using a specific account with [`--privacy-marker-transaction-signing-key-file`](../../../reference/cli/options.md#privacy-marker-transaction-signing-key-file), the public nonce for that account is obtained and used for the PMT. +1. The PMT is mined and included in the block. +1. After the block containing the PMT is imported, and the PMT is processed, the private transaction is retrieved from the private transaction manager and executed. + + If the private transaction was submitted with a correct nonce in step 1, the nonce is validated as correct. If an incorrect nonce was submitted, the private transaction execution fails. + +### Private nonce management + +In Besu, you call [`eth_getTransactionCount`](../../../../public-networks/reference/api/index.md#eth_gettransactioncount) to get a nonce, then use that nonce with [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) to send a private transaction. + +However, when you send multiple transactions in row, if a subsequent call to `getTransactionCount` happens before a previous transaction is processed, you can get the same nonce again. + +You can manage private nonces in multiple ways: + +- Let Besu handle it. You just need to wait long enough between calls to `sendRawTransaction` for the transactions to process. The current window is around 1.5 seconds, depending on block time. + + Public transactions deal with this issue, but the window is shorter, since you can use the transaction pool to take into account pending transactions (by using `eth_getTransactionCount("pending")`). + + For private transactions, the window is longer because private transactions aren't submitted to the transaction pool. You must wait until the private transaction's corresponding PMT is included in a block. + +- Manage the nonce yourself, by keeping track of and providing the nonce at each call. We recommend this if you're [sending many transactions that are independent of each other](../../../how-to/send-transactions/concurrent-private-transactions.md). + + :::note + + You can use [`priv_getTransactionCount`](../../../reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for an account for the specified privacy group or participants. + + ::: + +- Use [Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) for nonce management. We recommend this for enterprise use. + +:::tip + +The [web3js-quorum library includes an example](https://github.com/ConsenSys/web3js-quorum/blob/9a0f9eb1b91a4a0d93801f77782b509ae2e7314c/example/concurrentPrivateTransactions/concurrentPrivateTransactions.js) of nonce management when [sending concurrent private transactions](../../../how-to/send-transactions/concurrent-private-transactions.md). The example calculates the correct nonces for the private transactions and PMTs outside of Besu. + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/concepts/privacy/private-transactions/processing.md b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/private-transactions/processing.md new file mode 100644 index 00000000000..196f2b9e7e0 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/concepts/privacy/private-transactions/processing.md @@ -0,0 +1,72 @@ +--- +title: Private transaction processing +sidebar_position: 1 +description: Private transaction processing +--- + +# Private transaction processing + +Processing [private transactions](index.md) involves the following: + +- **Precompiled contract**: A smart contract compiled from the source language to EVM bytecode and stored by an Ethereum node for later execution. + +- **Privacy marker transaction (PMT)**: A public Ethereum transaction with a payload of the enclave key. The enclave key is a pointer to the private transaction in Tessera. The `to` attribute of the PMT is the [address of the privacy precompiled contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress). + + The PMT is [signed with a random key or the key specified on the command line]. + +Private transaction processing is illustrated and described in the following diagram. + +![Processing Private Transactions](../../../../assets/images/PrivateTransactionProcessing.png) + +1. Submit a private transaction using [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). The signed transaction includes transaction parameters specific to private transactions, including: + + - `privateFor` or `privacyGroupId`, which specifies the list of recipients. + - `privateFrom`, which specifies the sender. + - `restriction`, which specifies the transaction is restricted to the transaction participants. + +1. The JSON-RPC endpoint passes the private transaction to the Private Transaction Handler. + +1. The Private Transaction Handler sends the private transaction to Tessera. + +1. Tessera distributes the private transaction directly (that is, point-to-point) to the Tessera nodes specified in `privateFor` or belonging to the privacy group identified by `privacyGroupId`. All recipient Tessera nodes store the transaction. Tessera associates the stored transaction with the transaction hash and privacy group ID. + +1. Tessera returns the transaction hash to the Private Transaction Handler. + +1. The Private Transaction Handler creates a PMT for the private transaction. The Private Transaction Handler propagates the PMT using devP2P in the same way as any other public Ethereum transaction. + + :::tip + + If you want to sign the PMT outside of Besu, use [`priv_distributeRawTransaction`](../../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). + + ::: + +1. Besu mines the PMT into a block and the PMT is distributed to all Ethereum nodes in the network. + +1. The Mainnet Transaction Processor processes the PMT in the same way as any other public transaction. On nodes containing the [privacy precompile contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress) specified in the `to` attribute of the PMT, the Mainnet Transaction Processor passes the PMT to the privacy precompile contract. + + :::note + + Nodes receiving the PMT that don't contain the privacy precompile contract ignore the PMT. + + ::: + +1. The privacy precompile contract queries Tessera for the private transaction and privacy group ID using the transaction hash. + +1. The privacy precompile contract passes the private transaction to the Private Transaction Processor. The privacy group ID specifies the private world state to use. + +1. The Private Transaction Processor executes the transaction. The Private Transaction Processor can read and write to the private world state, and read from the public world state. + +:::danger Recommendations + +- We recommend using a network with a consensus mechanism supporting transaction finality. For example, [IBFT 2.0](../../../how-to/configure/consensus/ibft.md). +- Tessera must be [highly available and run in a separate instance to Besu](../../../how-to/use-privacy/tessera.md). + +Using private transactions with [pruning] or [fast sync](../../../../public-networks/reference/cli/options.md#sync-mode) is not supported. + +::: + + + +[signed with a random key or the key specified on the command line]: ../../../how-to/use-privacy/sign-pmts.md +[highly available and run in a separate instance to Besu]: ../../../how-to/use-privacy/tessera.md +[pruning]: ../../../../public-networks/concepts/data-storage-formats.md#pruning diff --git a/versioned_docs/version-23.4.1/private-networks/get-started/_category_.json b/versioned_docs/version-23.4.1/private-networks/get-started/_category_.json new file mode 100644 index 00000000000..3b3ed44eda6 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/get-started/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Get started", + "position": 2, + "collapsed": false, + "link": { + "type": "generated-index", + "slug": "/private-networks/get-started" + } +} diff --git a/versioned_docs/version-23.4.1/private-networks/get-started/install/_category_.json b/versioned_docs/version-23.4.1/private-networks/get-started/install/_category_.json new file mode 100644 index 00000000000..043580c1474 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/get-started/install/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Install Besu", + "position": 2 +} diff --git a/versioned_docs/version-23.4.1/private-networks/get-started/install/binary-distribution.md b/versioned_docs/version-23.4.1/private-networks/get-started/install/binary-distribution.md new file mode 100644 index 00000000000..74dcba7e6f4 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/get-started/install/binary-distribution.md @@ -0,0 +1,94 @@ +--- +title: Install binary distribution +description: Install or upgrade Hyperledger Besu from binary distribution +sidebar_position: 3 +tags: + - private networks +--- + +# Install binary distribution + +## MacOS with Homebrew + +### Prerequisites + +- [Homebrew](https://brew.sh/) +- Java JDK + +:::caution + +Hyperledger Besu supports: + +- MacOS High Sierra 10.13 or later versions. +- Java 17+. You can install Java using `brew install openjdk`. Alternatively, you can manually install the [Java JDK](https://www.oracle.com/java/technologies/downloads). + +::: + +### Install (or upgrade) using Homebrew + +To install Besu using Homebrew: + +```bash +brew tap hyperledger/besu +brew install hyperledger/besu/besu +``` + +To upgrade an existing Besu installation using Homebrew: + +```bash +brew upgrade hyperledger/besu/besu +``` + +:::note + +If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. + +::: + +:::note + +When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command `brew tap --repair`. + +::: + +To display the Besu version and confirm installation: + +```bash +besu --version +``` + +To display Besu command line help: + +```bash +besu --help +``` + +## Linux / Unix + +### Prerequisites + +- [Java JDK 17+](https://www.oracle.com/java/technologies/downloads/) + +:::note Linux open file limit + +If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the maximum number of open files allowed using `ulimit`. If the open files limit is not high enough, a `Too many open files` RocksDB exception occurs. + +::: + +:::tip + +We recommend installing [jemalloc](https://jemalloc.net/) to reduce memory usage. If using Ubuntu, you can install it with the command: `apt install libjemalloc-dev`. + +::: + +### Install from packaged binaries + +Download the Besu [packaged binaries](https://github.com/hyperledger/besu/releases). + +Unpack the downloaded files and change into the `besu-` directory. + +Display Besu command line help to confirm installation: + +```bash +bin/besu --help +``` diff --git a/versioned_docs/version-23.4.1/private-networks/get-started/install/index.md b/versioned_docs/version-23.4.1/private-networks/get-started/install/index.md new file mode 100644 index 00000000000..5c6fb933f52 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/get-started/install/index.md @@ -0,0 +1,28 @@ +--- +title: Installation options +description: Options for getting started with Hyperledger Besu +sidebar_position: 1 +tags: + - private networks +--- + +# Installation options + +Get started with the [Developer Quickstart](../../../private-networks/tutorials/quickstart.md). Use the quickstart to rapidly generate local blockchain networks. + +You can also install the following: + +- [Docker image](run-docker-image.md) +- [Binaries](binary-distribution.md) + +## Build from source + +If you want to use the latest development version of Hyperledger Besu or a specific commit, build from source. Otherwise, use the [binary] or [Docker image] for more stable versions. + +View the [Hyperledger Wiki] for instructions to install Hyperledger Besu from source. + + + +[Hyperledger Wiki]: https://wiki.hyperledger.org/display/BESU/Building+from+source +[binary]: binary-distribution.md +[Docker image]: run-docker-image.md diff --git a/versioned_docs/version-23.4.1/private-networks/get-started/install/run-docker-image.md b/versioned_docs/version-23.4.1/private-networks/get-started/install/run-docker-image.md new file mode 100644 index 00000000000..bc84eefbb97 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/get-started/install/run-docker-image.md @@ -0,0 +1,109 @@ +--- +title: Run Besu from Docker image +description: Run Hyperledger Besu using the official docker image +sidebar_position: 2 +tags: + - private networks +--- + +# Run Besu from a Docker image + +Hyperledger Besu provides a Docker image to run a Besu node in a Docker container. + +Use this Docker image to run a single Besu node without installing Besu. + +## Prerequisites + +- [Docker](https://docs.docker.com/install/) + +- MacOS or Linux + + :::caution + + The Docker image does not run on Windows. + + ::: + +## Expose ports + +Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need to expose the ports to use the default ports or the ports specified using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port), [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port), [`--rpc-ws-port`](../../../public-networks/reference/cli/options.md#rpc-ws-port), [`--metrics-port`](../../../public-networks/reference/cli/options.md#metrics-port), [`--graphql-http-port`](../../../public-networks/reference/cli/options.md#graphql-http-port), and [`--metrics-push-port`](../../../public-networks/reference/cli/options.md#metrics-push-port) options. + +To run Besu exposing local ports for access: + +```bash +docker run -p :8545 -p :8546 -p :30303 hyperledger/besu:latest --rpc-http-enabled --rpc-ws-enabled +``` + +:::note + +The examples on this page expose TCP ports only. To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: + +```bash +docker run -p :/udp +``` + +See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). + +::: + +To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: + +```bash +docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled +``` + +## Start Besu + +:::danger + +Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default data path interferes with the operation of Besu and prevents Besu from safely launching. + +To run a node that maintains the node state (key and database), [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) must be set to a location other than `/opt/besu` and a storage volume mounted at that location. + +When running in a Docker container, [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) must be set to `DOCKER` or `AUTO` (default). Don't set [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) to `NONE` or `UPNP`. + +::: + +You can specify [Besu environment variables](../../../public-networks/reference/cli/options.md#specify-options) with the Docker image instead of the command line options. + +```bash +docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest +``` + +:::caution "Unsupported address type exception" + +When running Besu from a Docker image, you might get the following exception: + +```bash +Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. +``` + +This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, preventing outbound communication. IPv6 is disabled by default in Docker. + +[Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound IPv6 traffic and allow connection with IPv6 peers. + +::: + +### Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes with WebSocket enabled: + +```bash +docker run -p 8546:8546 --mount type=bind,source=/,target=/var/lib/besu hyperledger/besu:latest --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-ws-enabled --network=dev --data-path=/var/lib/besu +``` + +## Stop Besu and clean up resources + +When done running nodes, you can shut down the node container without deleting resources or you can delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the container and volume names. + +To stop a container: + +```bash +docker stop +``` + +To delete a container: + +```bash +docker rm +``` diff --git a/versioned_docs/version-23.4.1/private-networks/get-started/start-node.md b/versioned_docs/version-23.4.1/private-networks/get-started/start-node.md new file mode 100644 index 00000000000..4d7162a5927 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/get-started/start-node.md @@ -0,0 +1,106 @@ +--- +title: Start Besu +description: Start Besu on a private Ethereum network. +sidebar_position: 3 +tags: + - private networks +--- + +# Start Besu + +Use the [`besu`](../reference/cli/options.md) command with the required command line options to start a node. + +## Prerequisites + +[Besu installed](install/binary-distribution.md) + +## Local block data + +When connecting to a network other than the network previously connected to, you must either delete the local block data or use the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option to specify a different data directory. + +To delete the local block data, delete the `database` directory in the `besu/build/distribution/besu-` directory. + +## Genesis configuration + +To define a genesis configuration, create a [genesis file](../../public-networks/concepts/genesis-file.md) (for example, `genesis.json`) and specify the file using the [`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) option. + +When you specify [`--network=dev`](../../public-networks/reference/cli/options.md#network), Besu uses the development mode genesis configuration with a fixed low difficulty. A node started with [`--network=dev`](../../public-networks/reference/cli/options.md#network) has an empty bootnodes list by default. + +Predefined genesis configurations for named networks are in the [Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). + +## Confirm node is running + +If you started Besu with the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option, use [cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to confirm the node is running. + +- `eth_chainId` returns the chain ID of the network. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 + ``` + +- `eth_syncing` returns the starting, current, and highest block. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 + ``` + + For example, after connecting to Mainnet, `eth_syncing` will return something similar to: + + ```json + { + "jsonrpc": "2.0", + "id": 1, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x2d0", + "highestBlock": "0x66c0" + } + } + ``` + +## Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes: + +```bash +besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir +``` + +You can also use the following [configuration file](../../public-networks/how-to/configuration-file.md) on the command line to start a node with the same options as above: + +```toml +network="dev" +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +rpc-http-cors-origins=["all"] +host-allowlist=["*"] +rpc-ws-enabled=true +rpc-http-enabled=true +data-path="/tmp/tmpdata-path" +``` + +:::caution + +The following settings are a security risk in production environments: + +- Enabling the HTTP JSON-RPC service ([`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled)) and setting [`--rpc-http-host`](../../public-networks/reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the RPC connection on your node to any remote connection. +- Setting [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) to `"*"` allows JSON-RPC API access from any host. +- Setting [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) to `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. + +::: + +## Run a node on a private network + +To run a node on your private network specifying a genesis file and data directory: + +```bash +besu --genesis-file=/genesis.json --data-path= --rpc-http-enabled --bootnodes= +``` + +Where `` is the path to the directory to save the chain data to. Ensure you configure a peer discovery method, such as [bootnodes](../how-to/configure/bootnodes.md). + +:::note + +You might need to set [`--tx-pool-limit-by-account-percentage`](../../public-networks/reference/cli/options.md#tx-pool-limit-by-account-percentage) to 1. The default value is suitable for Mainnet, but may cause issues on private networks. + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/get-started/system-requirements.md b/versioned_docs/version-23.4.1/private-networks/get-started/system-requirements.md new file mode 100644 index 00000000000..18666307ee7 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/get-started/system-requirements.md @@ -0,0 +1,52 @@ +--- +title: System requirements +description: Ensure you meet the system requirements to sync and run Besu. +sidebar_position: 1 +tags: + - private networks +--- + +# System requirements + +Private network system requirements depend on many factors, including: + +- Size of the world state for the network. +- Number of transactions submitted to the network. +- [Block gas limit](../../public-networks/reference/genesis-items.md#genesis-block-parameters). +- Number and complexity of [JSON-RPC](../../public-networks/how-to/use-besu-api/json-rpc.md), [PubSub](../../public-networks/how-to/use-besu-api/rpc-pubsub.md), or [GraphQL](../../public-networks/how-to/use-besu-api/graphql.md) queries handled by the node. + +Participation in private networks is typically restricted in some way, so the volume of traffic is much lower than on Mainnet, resulting in lower system requirements. + +## Determining system requirements + +To determine system requirements, check CPU and disk space requirements using [Prometheus](../../public-networks/how-to/monitor/metrics.md). Grafana provides a [sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. + +## Java Virtual Machine size + +Depending on your environment and network setup, the minimum Java Virtual Machine (JVM) memory requirement for private networks is 4 GB. + +JVM memory requirements are highest when syncing, but will reduce after the node is synchronized to the chain head. Monitor your system to determine your actual JVM memory needs. + +## VM requirements + +If you set up your own VM locally using a VM manager such as [VirtualBox](https://www.oracle.com/virtualization/virtualbox/): + +- Ensure you enable Intel Virtualization Technology (VTx) and Virtualization Technology for Directed I/O (VT-d) in the BIOS settings. +- On Windows, you might need to disable Hyper-V in the Windows Feature list. + +We recommend you create a VM with the following attributes: + +- Memory size: Set to 6 GB (recommended) +- Create a virtual hard disk with at least 10 GB (20 GB recommended) +- Virtual hard disk file type: VDI (if you need to share it with other apps, use VHD) +- (Optional) You can create a shared directory to copy block files or genesis files from the host computer to the VM. For details on how to create a shared directory, see "Share Folders" in the [Oracle VirtualBox documentation]. + +## Disk type + +Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). Read-only nodes can use a lower performance setup. + +You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). For higher performance in production settings, we recommend upgrading to [NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). + + + +[Oracle VirtualBox documentation]: https://docs.oracle.com/en/virtualization/virtualbox/6.1/user/ diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/_category_.json b/versioned_docs/version-23.4.1/private-networks/how-to/_category_.json new file mode 100644 index 00000000000..ba43c43036f --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "How to", + "position": 3 +} diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/backup.md b/versioned_docs/version-23.4.1/private-networks/how-to/backup.md new file mode 100644 index 00000000000..d81cca0621c --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/backup.md @@ -0,0 +1,51 @@ +--- +title: Backup and restore +description: Backing up and restoring Besu +sidebar_position: 7 +tags: + - private networks +--- + +# Backup and restore Besu + +In a decentralized blockchain, data replicates between nodes so it's not lost. But backing up configuration and data ensures a smoother recovery from corrupted data or other failures. + +## Genesis file + +The genesis file for a network must be accessible on every node. We recommend storing the genesis file under source control. + +## Data backups + +If installed locally, the default data location is the Besu installation directory. + +We recommend mounting a [separate volume to store data](../get-started/install/run-docker-image.md). Use the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) command line option to pass the path to Besu. + +The default data location is the Besu installation directory, or `/opt/besu/database` if using the [Besu Docker image](../get-started/install/run-docker-image.md). + +Having some data reduces the time to synchronize a new node. You can perform periodic backups of the data directory and send the data to your preferred backup mechanism. For example, `cron` job and `rsync`, archives to the cloud such as s3, or `tar.gz` archives. + +## Data restores + +To restore data: + +1. If the node is running, stop the node. +1. If required, move the data directory to another location for analysis. +1. Restore the data from your last known good backup to the same directory. +1. Ensure user permissions are valid so you can read from and write to the data directory. +1. Restart the node. + +## Corrupted data + +If log messages signify a corrupt database, the cleanest way to recover is: + +1. Stop the node. +1. Restore the data from a [previous backup](#data-backups). +1. Restart the node. + +## Find peers after restarting + +The process for finding peers after restarting is the same as for [finding peers after upgrading and restarting]. + + + +[finding peers after upgrading and restarting]: ../../public-networks/how-to/upgrade-node.md#find-peers-on-restarting diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/_category_.json b/versioned_docs/version-23.4.1/private-networks/how-to/configure/_category_.json new file mode 100644 index 00000000000..49e1f9da31b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure", + "position": 1 +} diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/block-proposal-permissioning.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/block-proposal-permissioning.md new file mode 100644 index 00000000000..c164fadeddd --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/block-proposal-permissioning.md @@ -0,0 +1,292 @@ +--- +title: Block proposal permissioning +description: Block proposal permissioning +sidebar_position: 7 +tags: + - private networks +--- + +# Block proposal permissioning + +:::info + +Only private networks using the [QBFT consensus protocol] support block proposal permissioning. + +Block proposal permissioning is an early access feature, and functionality and options may be updated between releases. + +::: + +You can configure [block proposal permissioning](../../concepts/pki.md#block-proposal-permissioning) to ensure only authorized validator nodes can propose blocks in the network. + +Use certificates issued by a trusted authority to ensure validators are authorized to propose blocks. + +## Configure block proposal permissioning + +**Prerequisites**: + +- A configured network. For example, [see steps 1 to 5 in the QBFT tutorial](../../tutorials/qbft.md). +- A keystore containing the certificate and key for each network node. +- A truststore containing all the trusted certificates for the network. + +Start Besu and include the following command line options on the required nodes: + +```bash +besu --Xpki-block-creation-enabled=true \ +--Xpki-block-creation-keystore-type="pkcs12" \ +--Xpki-block-creation-keystore-file="keystore" \ +--Xpki-block-creation-keystore-password-file="keystore.password" \ +--Xpki-block-creation-crl-file="crl2.pem" \ +--Xpki-block-creation-keystore-certificate-alias="validator" \ +--Xpki-block-creation-truststore-type="pkcs12" \ +--Xpki-block-creation-truststore-file="truststore" \ +--Xpki-block-creation-truststore-password-file="truststore.password" +``` + +In the command line: + +- Enable block proposal permissioning using [`--Xpki-block-creation-enabled=true`](#xpki-block-creation-enabled). +- Specify the keystore type and keystore file using [`Xpki-block-creation-keystore-type`](#xpki-block-creation-keystore-type) and [`--Xpki-block-creation-keystore-file`](#xpki-block-creation-keystore-file). +- Specify the text file containing the password to unlock the keystore file using [`Xpki-block-creation-keystore-password-file`](#xpki-block-creation-keystore-password-file). +- Specify the optional [certificate revocation list (CRL)] file using [`Xpki-block-creation-crl-file`](#xpki-block-creation-crl-file). +- Specify the alias of the certificate to be included in blocks proposed by this validator using [`Xpki-block-creation-keystore-certificate-alias`](#xpki-block-creation-keystore-certificate-alias). +- Specify the truststore type and truststore file using [`Xpki-block-creation-truststore-type`](#xpki-block-creation-truststore-type) and [`Xpki-block-creation-truststore-file`](#xpki-block-creation-truststore-file). +- Specify the text file containing the password to unlock the truststore file using [`Xpki-block-creation-truststore-password-file`](#xpki-block-creation-truststore-password-file). + +## Command line options + +### `Xpki-block-creation-crl-file` + + + +# Syntax + +```bash +--Xpki-block-creation-crl-file= +``` + +# Example + +```bash +--Xpki-block-creation-crl-file=/home/cert/cert.crl.pem +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_CRL_FILE=/home/cert/cert.crl.pem +``` + + + +Path to the optional certificate revocation list (CRL) file. + +### `Xpki-block-creation-enabled` + + + +# Syntax + +```bash +--Xpki-block-creation-enabled[=] +``` + +# Example + +```bash +--Xpki-block-creation-enabled=true +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_ENABLED=true +``` + + + +Enable PKI integration. The default is `false`. + +### `Xpki-block-creation-keystore-certificate-alias` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-certificate-alias= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-certificate-alias=validatorA +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_CERTIFICATE_ALIAS=validatorA +``` + + + +Alias of the certificate to be included in the blocks proposed by this validator. The default is `validator`. + +### `Xpki-block-creation-keystore-file` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-file= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-file=/home/cert/keystore.jks +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_FILE=/home/cert/keystore.jks +``` + + + +Keystore file containing the key and certificate for PKI block creation. + +### `Xpki-block-creation-keystore-password-file` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-password-file= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_PASSWORD-FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the keystore file. + +### `Xpki-block-creation-keystore-type` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-type= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-type=JKS +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_TYPE=JKS +``` + + + +PKI keystore type. Valid options are `JKS` and `PKCS12`. The default is `JKS`. + +### `Xpki-block-creation-truststore-file` + + + +# Syntax + +```bash +--Xpki-block-creation-truststore-file= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-file=/home/cert/truststore.jks +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_FILE=/home/cert/truststore.jks +``` + + + +Truststore containing the trusted certificates for PKI block creation. + +### `Xpki-block-creation-truststore-password-file` + + + +# Syntax + +```bash +--Xpki-block-creation-truststore-password-file= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the truststore file. + +### `Xpki-block-creation-truststore-type` + + + +# Syntax + +```bash +--Xpki-block-creation-truststore-type= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-type=JKS +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_TYPE=JKS +``` + + + +PKI truststore type. Valid options are `JKS` and `PKCS12`. The default is `JKS`. + +[QBFT consensus protocol]: ./consensus/qbft.md +[certificate revocation list (CRL)]: https://www.securew2.com/blog/certificate-revocation-crl-explained diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/bootnodes.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/bootnodes.md new file mode 100644 index 00000000000..11787681a04 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/bootnodes.md @@ -0,0 +1,71 @@ +--- +title: Bootnodes +description: Configuring bootnodes +sidebar_position: 3 +tags: + - private networks +--- + +# Configure bootnodes + +You can use bootnodes to initially discover peers. Bootnodes are regular nodes used to discover other nodes. + +In private networks for development or testing purposes, specify at least one bootnode. + +In production networks, [configure two or more nodes as bootnodes](#configure-bootnodes-in-a-production-network). + +:::tip + +Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, you can use only bootnodes, only static nodes, or both bootnodes and static nodes. + +To find peers, configure one or more bootnodes. To configure a specific set of peer connections, use [static nodes](../../../public-networks/how-to/connect/static-nodes.md). + +::: + +:::note Mainnet and public testnets + +For Mainnet and the Sepolia and Goerli testnets, Hyperledger Besu has an internal list of enode URLs and uses this list automatically when you specify the [`--network`](../../../public-networks/reference/cli/options.md#network) option. + +::: + +## Specify a bootnode + +To start a node, specify a bootnode [enode](../../../public-networks/concepts/node-keys.md) for P2P discovery, using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. + +```bash +besu --genesis-file=privateNetworkGenesis.json --data-path=nodeDataPath --bootnodes=enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb99bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303 +``` + +The default host and port advertised to other peers for P2P discovery is `127.0.0.1:30303`. To specify a different host or port, use the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) and [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) options. + +By default, peer discovery listens on all available network interfaces. If the device Besu is running on must bind to a specific network interface, specify the interface using the [`--p2p-interface`](../../../public-networks/reference/cli/options.md#p2p-interface) option. + +## Configure bootnodes in a production network + +A network must have at least one operating bootnode. To allow for continuity in the event of failure, configure two or more bootnodes in a production network. + +We don't recommend putting bootnodes behind a load balancer because the [enode](../../../public-networks/concepts/node-keys.md#enode-url) relates to the node public key, IP address, and discovery ports. Any changes to a bootnode enode prevents other nodes from being able to establish a connection with the bootnode. This is why we recommend putting more bootnodes on the network itself. + +To ensure a bootnode enode doesn't change when recovering from a complete bootnode failure: + +1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) before starting the bootnode. +1. When creating bootnodes in the cloud (for example, AWS and Azure), attempt to assign a static IP address to them. If your network is: + + - Publicly accessible, assign an elastic IP. + - Internal only, specify a private IP address when you create the instance and record this IP address. + +We recommend storing the bootnode configuration under source control. + +To allow for failure, specify all bootnodes on the command line (even to the bootnodes themselves). + +:::tip + +Having each bootnode list the other bootnodes increases the speed of discovery. Nodes ignore their own enode in the bootnodes list so it isn't required to specify different bootnode lists to the bootnodes themselves. + +::: + +## Add and remove bootnodes + +Adding new bootnodes is a similar process to creating bootnodes. After creating the bootnodes and adding them to the network, update the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) command line option for each node to include the new bootnodes. + +When adding bootnodes, you don't need to restart running nodes. By updating the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option, the next time you restart the nodes (for example, when [upgrading](../../../public-networks/how-to/upgrade-node.md)), the nodes connect to the new bootnodes. diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/_category_.json b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/_category_.json new file mode 100644 index 00000000000..bc0d5770af5 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Consensus", + "position": 1 +} diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/add-validators-without-voting.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/add-validators-without-voting.md new file mode 100644 index 00000000000..70d875e33a0 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/add-validators-without-voting.md @@ -0,0 +1,309 @@ +--- +title: Add and remove validators without voting +description: How to add or remove validators without voting +sidebar_position: 5 +tags: + - private networks +--- + +# Add and remove validators without voting + +[QBFT](qbft.md) or [IBFT 2.0](ibft.md) network conditions might not allow voting to change validators. For example, if a majority of the current validators are no longer participating in the network, a vote to add or remove validators won't be successful. You can bypass voting and specify new validators using a transition in the genesis file. + +:::caution + +- In most cases, add or remove validators [by voting or smart contract for QBFT](qbft.md#add-and-remove-validators); or [by voting for IBFT 2.0](ibft.md#add-and-remove-validators). Use transitions only when voting isn't possible. Using transitions requires coordinating a rolling update of all the nodes in order to pick up the configuration at the correct block height. Using transitions also leaves the validator overrides permanently in your genesis configuration. +- Transitions are a Besu-specific feature. If you run a mixed-client QBFT network, you can't use transitions to change the validators. + +::: + +To add or remove validators without voting: + +1. In the genesis file, add the `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - ` ... ` are strings representing the account addresses of the validators after ``. + + + + # QBFT syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": , + "validators": [ + , + ... + + ] + } + ] + } + }, + ... + } + ``` + + # QBFT example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": 25, + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` + + # IBFT 2.0 syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": , + "validators": [ + , + ... + + ] + } + ] + } + }, + ... + } + ``` + + # IBFT 2.0 example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": 25, + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` + + + +2. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. +3. To verify the changes after the transition block, call [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber) or [`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + +:::caution + +Don't specify a transition block in the past. + +Specifying a transition block in the past can result in unexpected behavior, such as causing the network to fork. + +::: + +## Override smart contract validators + +When using [QBFT contract validator selection](qbft.md#add-and-remove-validators-using-a-smart-contract), if network conditions require it, you can bypass the smart contract and specify new validators in the genesis file. For example, you lose quorum for your current list of contract validators, and you can't perform a transaction to vote more in. + +This requires temporarily [switching to block header validator selection mode](qbft.md#swap-validator-management-methods). + +To bypass the smart contract and specify new validators: + +1. In the genesis file, add a `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - `` is the validator selection mode to switch to. In this case we'll switch to the `blockheader` mode temporarily. + - ` ... ` are strings representing the account addresses of the validators after ``. These validators only need to be sufficient to progress the chain and allow a new contract to be deployed. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": , + "validatorselectionmode": , + "validators": [ + , + ... + + ] + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. +1. Deploy a new contract to the blockchain containing the desired list of validators. +1. In the genesis file, add another `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - `` is the validator selection mode to switch to. In this case we'll switch to `contract` mode. + - `` is the address of the new smart contract. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + “validatorcontractaddress”: “0x0000000000000000000000000000000000007777” + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + }, + { + "block": , + "validatorselectionmode": , + "validatorcontractaddress": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + }, + { + "block": 2755, + "validatorselectionmode": "contract", + "validatorcontractaddress": "0x0000000000000000000000000000000000009999" + } + ] + } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/clique.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/clique.md new file mode 100644 index 00000000000..6bf2aecf81f --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/clique.md @@ -0,0 +1,158 @@ +--- +title: Clique +description: Hyperledger Besu Clique Proof-of-Authority (PoA) consensus protocol implementation +sidebar_position: 4 +path: blob/master/config/src/main/resources/ +source: rinkeby.json +tags: + - private networks +--- + +# Configure Clique consensus + +Besu implements the [Clique](https://eips.ethereum.org/EIPS/eip-225) proof of authority (PoA) [consensus protocol](index.md). Private networks can use Clique. + +:::danger + +Clique is not suitable for production environments. Use only in development environments. + +::: + +In Clique networks, approved accounts, known as signers, validate transactions and blocks. Signers take turns to create the next block. Existing signers propose and vote to [add or remove signers](#add-and-remove-signers). + +You can [create a private network using Clique](../../../tutorials/clique.md). + +## Genesis file + +To use Clique in a private network, Besu requires a Clique [genesis file](../../../../public-networks/concepts/genesis-file.md). + +A Clique genesis file defines properties specific to Clique. + +```json title="Example Clique genesis file" +{ + "config": { + "chainId": 1981, + "berlinBlock": 0, + "clique": { + "blockperiodseconds": 15, + "epochlength": 30000 + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "extraData": "0x000000000000000000000000000000000000000000000000000000000000000001a54556254bfa3db2daa7673435ec63649925c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x1fffffffffffff", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "timestamp": "0x5c51a607", + "alloc": {}, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +The properties specific to Clique are: + +- `blockperiodseconds` - The block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `extraData` - [Extra data](#extra-data) including the initial signers. + +### Extra data + +The `extraData` property consists of: + +- 0x prefix. +- 32 bytes of vanity data. +- A list of initial signer addresses (at least one initial signer is required). 20 bytes for each signer. +- 65 bytes for the proposer signature. In the genesis block there is no initial proposer, so the proposer signature is all zeros. + +### One initial signer + +![One Initial Signer](../../../../assets/images/CliqueOneIntialSigner.png) + +### Two initial signers + +![Two Initial Signers](../../../../assets/images/CliqueTwoIntialSigners.png) + +### Post-Merge configuration + +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. + +| Field | Constant value | Comment | +| --- | --- | --- | +| **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | +| **`difficulty`** | `0` | Replaced with `prevrandao` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | + +Additionally, [`extraData`](#extra-data) is limited to 32 bytes of vanity data after The Merge. + +## Connect to a Clique network + +To start a node on a Clique private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. + +## Add and remove signers + +Existing signers propose and vote to add or remove validators using the Clique JSON-RPC API methods. Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). + +The Clique API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `CLIQUE`. + +The methods to add or remove signers are: + +- [`clique_propose`](../../../reference/api/index.md#clique_propose). +- [`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). +- [`clique_discard`](../../../reference/api/index.md#clique_discard). + +To view signer metrics for a specified block range, call [`clique_getSignerMetrics`](../../../reference/api/index.md#clique_getsignermetrics). + +### Add a signer + +To propose adding a signer to a Clique network, call [`clique_propose`](../../../reference/api/index.md#clique_propose), specifying the address of the proposed signer and `true`. A majority of signers must execute the call. + +```bash title="JSON-RPC clique_propose request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` + +When the signer creates the next block, the signer adds a vote to the block for the proposed signer. + +When more than 50% of the existing signers propose adding the signer, with their votes distributed in blocks, the signer can begin signing blocks. + +To return a list of signers and confirm the addition of a proposed signer, call [`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). + +```bash title="JSON-RPC clique_getSigners request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' +``` + +To discard your proposal after confirming the addition of a signer, call [`clique_discard`](../../../reference/api/index.md#clique_discard) specifying the address of the proposed signer. + +```bash title="JSON-RPC clique_discard request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` + +### Remove a signer + +The process for removing a signer from a Clique network is the same as [adding a signer](#add-a-signer), except you specify `false` as the second parameter of [`clique_propose`](../../../reference/api/index.md#clique_propose). + +### Epoch transition + +At each epoch transition, Clique discards all pending votes collected from received blocks. Existing proposals remain in effect and signers re-add their vote the next time they create a block. + +Define the number of blocks between epoch transitions in the [Clique genesis file](#genesis-file). + +## Limitations + +In Clique, blocks created by in-turn validators are published immediately. Out-of-turn validators create blocks that are published after a short delay. In-turn blocks have a higher difficulty than out-of-turn blocks, which allows small forks to resolve to the chain with more in-turn blocks. + +However, when the out-of-turn delay is shorter than the block propagation delay, out-of-turn blocks may be published before in-turn blocks. This may cause large, irresolvable forks in a network. + +:::tip + +We recommend using a more updated consensus protocol such as [IBFT 2.0](ibft.md) or [QBFT](qbft.md). + +::: + + + +\*[vanity data]: Signers can include anything they like as vanity data. diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/ibft.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/ibft.md new file mode 100644 index 00000000000..de26b5a2a2b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/ibft.md @@ -0,0 +1,501 @@ +--- +title: IBFT 2.0 +description: Hyperledger Besu IBFT 2.0 proof of authority (PoA) consensus protocol implementation +sidebar_position: 3 +tags: + - private networks +--- + +# Configure IBFT 2.0 consensus + +Besu implements the IBFT 2.0 proof of authority (PoA) [consensus protocol](index.md). IBFT 2.0 is supported for existing private networks, but [QBFT](qbft.md) is the recommended enterprise-grade consensus protocol for private networks. + +In IBFT 2.0 networks, approved accounts, known as validators, validate transactions and blocks. Validators take turns to create the next block. Before inserting the block onto the chain, a super-majority (greater than or equal to 2/3) of validators must first sign the block. + +Existing validators propose and vote to [add or remove validators](#add-and-remove-validators). + +You can [create a private network using IBFT](../../../tutorials/ibft/index.md). + +:::danger + +Configure your network to ensure you never lose more than 1/3 of your validators. If more than 1/3 of validators stop participating, new blocks are no longer created, and the network stalls. It may take significant time to recover once nodes are restarted. + +::: + +:::tip + +You can use a plugin to securely store a validator's key using the [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. + +::: + +## Genesis file + +To use IBFT 2.0, Besu requires an IBFT 2.0 [genesis file](../../../../public-networks/concepts/genesis-file.md). The genesis file defines properties specific to IBFT 2.0. + +```json title="Example IBFT 2.0 genesis file" +{ + "config": { + "chainId": 1981, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "blockreward": "5000000000000000", + "miningbeneficiary": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d594c2ab482b506de561668e07f04547232a72897daf808400000000c0", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "alloc": {} +} +``` + +The properties specific to IBFT 2.0 are: + +- `blockperiodseconds` - The minimum block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. +- `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all nodes on the network must use the identical value. +- `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator that proposes the block. If set, then all nodes on the network must use the same beneficiary. +- `extraData` - RLP encoded [extra data](#extra-data). + +:::caution + +We don't recommend changing `epochlength` in a running network. Changing the `epochlength` after genesis can result in illegal blocks. + +::: + +:::caution Invalid block header error + +When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. The imported chain makes new blocks faster than the genesis file allows and Besu rejects them with this error. This error most often occurs when importing chains from older versions of Besu. + +Decrease the `blockperiodseconds` in the new IBFT 2.0 genesis file to a lower value that satisfies the block header validation. + +::: + +If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. + +After you update the new genesis file, if the imported chain has a `blockperiodseconds` value set lower than you prefer, you can adjust it by [configuring the block time on an existing IBFT 2.0 network](#configure-block-time-on-an-existing-network). + +The properties with specific values in the IBFT 2.0 genesis files are: + +- `nonce` - `0x0` +- `difficulty` - `0x1` +- `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul block identification + +To start a node on an IBFT 2.0 private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. + +### Extra data + +The `extraData` property is an RLP encoding of: + +- 32 bytes of vanity data. +- A list of validator addresses. +- Any validator votes. No vote is included in the genesis block. +- The round the block was created on. The round in the genesis block is 0. +- A list of seals of the validators (signed block hashes). No seals are included in the genesis block. + +In the genesis block, the important information in the extra data is the list of validators. All other details have empty values. Formally, `extraData` in the genesis block contains `RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. + +:::info + +RLP encoding is a space-efficient object serialization scheme used in Ethereum. + +::: + +#### Generate extra data + +To generate the `extraData` RLP string for inclusion in the genesis file, use the [`rlp encode`](../../../../public-networks/reference/cli/subcommands.md#rlp) Besu subcommand. + +```bash title="Example" +besu rlp encode --from=toEncode.json +``` + +Where the `toEncode.json` file contains a list of the initial validators, in ascending order. To write the validator address and copy it to the `toEncode.json` file, use the [`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu subcommand. For example: + +```json title="One initial validator in toEncode.json file" +["9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb"] +``` + +Copy the RLP encoded data to the `extraData` property in the genesis file. + +### Block time + +When the protocol receives a new chain head, the block time (`blockperiodseconds`) and round timeout (`requesttimeoutseconds`) timers start. When `blockperiodseconds` expires, the protocol proposes a new block. + +If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with the block time and timeout timers reset. The timeout period for the new round is two times `requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a block. + +Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round then starts, resetting the block time and round timeout timers. When `blockperiodseconds` expires, the protocol proposes the next new block. + +:::danger + +If more than 1/3 of validators stop participating, new blocks can no longer be created and `requesttimeoutseconds` doubles with each round change. The quickest method to resume block production is to restart all validators, which resets `requesttimeoutseconds` to its genesis value. + +::: + +Once `blockperiodseconds` is over, the time from proposing a block to adding the block is small (usually around one second) even in networks with geographically dispersed validators. + +An internal network run by ConsenSys had four geographically dispersed validators in Sweden, Sydney, and two in North Virginia. With a `blockperiodseconds` of 5 and a `requesttimeoutseconds` of 10, the testnet consistently created blocks with a five second block time. + +#### Tune block timeout + +To tune the block timeout for your network deployment: + +1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times `blockperiodseconds`. +1. Reduce `requesttimeoutseconds` until you start to see round changes occurring. +1. Increase `requesttimeoutseconds` to the value where round changes are no longer occurring. + +:::tip + +View [`TRACE` logs](../../../../public-networks/reference/api/index.md#trace-methods) to see round change log messages. + +::: + +Use a [transition](#transitions) to update the `blockperiodseconds` in an existing network. + +### Optional configuration options + +Optional configuration options in the genesis file are: + +- `messageQueueLimit` - In large networks with limited resources, increasing the message queue limit might help with message activity surges. The default is 1000. +- `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate message limit might reduce the number of retransmissions. A value of two to three times the number of validators is usually enough. The default is 100. +- `futureMessagesLimit` - The future messages buffer holds messages for a future chain height. For large networks, increasing the future messages limit might be useful. The default is 1000. +- `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering messages in the future messages buffer. The default is 10. + +### Post-Merge configuration + +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. + +| Field | Constant value | Comment | +| --- | --- | --- | +| **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | +| **`difficulty`** | `0` | Replaced with `prevrandao` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | + +Additionally, [`extraData`](#extra-data) is limited to 32 bytes of vanity data after The Merge. + +## Add and remove validators + +Existing validators propose and vote to add or remove validators using the IBFT 2.0 JSON-RPC API methods. Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). + +The IBFT 2.0 API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `IBFT`. + +The methods to add or remove validators are: + +- [`ibft_getPendingVotes`](../../../reference/api/index.md#ibft_getpendingvotes). +- [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). +- [`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote). + +To view validator metrics for a specified block range, use [`ibft_getSignerMetrics`](../../../../public-networks/reference/api/index.md#ibft_getsignermetrics). + +:::note + +If network conditions render it impossible to add and remove validators by voting, you can [add and remove validators without voting](add-validators-without-voting.md). + +::: + +### Add a validator + +To propose adding a validator to an IBFT 2.0 network, call [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the proposed validator and `true`. A majority of validators must execute the call. + +```bash title="JSON-RPC ibft_proposeValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` + +When the validator proposes the next block, the protocol inserts one proposal received from [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote) into the block. If blocks include all proposals, subsequent blocks proposed by the validator will not contain a vote. + +When more than 50% of the existing validators have published a matching proposal, the protocol adds the proposed validator to the validator pool and the validator can begin validating blocks. + +To return a list of validators and confirm the addition of a proposed validator, use [`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber). + +```bash title="JSON-RPC ibft_getValidatorsByBlockNumber request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' +``` + +To discard your proposal after confirming the addition of a validator, call [`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote), specifying the address of the proposed validator. + +```bash title="JSON-RPC ibft_discardValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` + +### Remove a validator + +The process for removing a validator from an IBFT 2.0 network is the same as [adding a validator](#add-a-validator) except you specify `false` as the second parameter of [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). + +### Epoch transition + +At each epoch transition, IBFT 2.0 discards all pending votes collected from received blocks. Existing proposals remain in effect and validators re-add their vote the next time they create a block. + +An epoch transition occurs every `epochLength` blocks. Define `epochlength` in the [IBFT 2.0 genesis file](#genesis-file). + +### Minimum number of validators + +IBFT 2.0 requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the ability for a blockchain network to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +### Maximum number of validators + +As the number of validators increase, the message complexity increases, which can decrease performance. In [network tests](https://wiki.hyperledger.org/display/BESU/Maximum+Validator+count+for+an+IBFT2+Network), IBFT 2.0 handles up to 30 validators with no loss of performance. + +Non-validator nodes don't affect performance and don't count towards the maximum limit. + +## Transitions + +The `transitions` genesis configuration item allows you to specify a future block number at which to change IBFT 2.0 network configuration in an existing network. For example, you can update the [block time](#configure-block-time-on-an-existing-network-deployment), [block reward](#configure-block-rewards-on-an-existing-network-deployment), or [mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). + +:::caution + +Do not specify a transition block in the past. Specifying a transition block in the past could result in unexpected behavior, such as causing the network to fork. + +::: + +### Configure block time on an existing network deployment + +To update an existing network with a new `blockperiodseconds`: + +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockperiodseconds`. + - `` is the updated value for `blockperiodseconds`. + + + + # Syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": , + "blockperiodseconds": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": 1240, + "blockperiodseconds": 4 + } + ] + } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. +1. To verify the changes after the transition block, call [`ibft_getValidatorsByBlockNumber`](../../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + +### Configure block rewards on an existing network deployment + +To update an existing network with a new `blockreward`: + +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockreward`. + - `` is the updated value for `blockreward`. + + + + # Syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "ibft2": [ + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "ibft2": [ + { + "block": 10, + "blockreward": "6000000000000000" + }, + { + "block": 15, + "blockreward": "75000000000000000" + }, + { + "block": 20, + "blockreward": "0" + } + ] + } + }, + ... + } + ``` + + + + :::note + + You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. + + ::: + +1. Restart all nodes in the network using the updated genesis file. + +### Configure the mining beneficiary on an existing network deployment + +To update an existing network with a new mining beneficiary: + +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `miningbeneficiary`. + - `` is the updated 20-byte address for `miningbeneficiary`. Starting at ``, block rewards go to this address. + + + + # Syntax + + ```bash + { + "config": { + "chainId": 999, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 1, + "epochlength": 30000, + "requesttimeoutseconds": 5, + "blockreward": "5000000000000000000", + "miningbeneficiary": "0x0000000000000000000000000000000000000001" + }, + "transitions": { + "ibft2": [ + { + "block": , + "miningbeneficiary": + }, + { + "block": , + "miningbeneficiary": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + "chainId": 999, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 1, + "epochlength": 30000, + "requesttimeoutseconds": 5, + "blockreward": "5000000000000000000", + "miningbeneficiary": "0x0000000000000000000000000000000000000001" + }, + "transitions": { + "ibft2": [ + { + "block": 10000, + "miningbeneficiary": "", + }, + { + "block": 20000, + "miningbeneficiary": "0x0000000000000000000000000000000000000002", + } + ] + } + }, + ... + } + ``` + + + + :::note + + Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the block producer rather than a global override address. + + ::: + +1. Restart all nodes in the network using the updated genesis file. + + + +_[vanity data]: Validators can include anything they like as vanity data. _[RLP]: Recursive Length Prefix + +``` + +``` diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/index.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/index.md new file mode 100644 index 00000000000..8ea4813a032 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/index.md @@ -0,0 +1,81 @@ +--- +title: Consensus protocols +description: Besu consensus protocols +sidebar_position: 1 +tags: + - private networks +--- + +# Consensus protocols + +Besu supports the following consensus protocols: + +- [QBFT](qbft.md) (proof of authority) - The recommended enterprise-grade consensus protocol for private networks. +- [IBFT 2.0](ibft.md) (proof of authority) - Supported for existing private networks. +- [Clique](clique.md) (proof of authority) - Not recommended for production use. +- [Proof of stake](../../../../public-networks/concepts/proof-of-stake/index.md) - Used on Ethereum Mainnet and public testnets. +- [Ethash](https://ethereum.org/en/developers/docs/consensus-mechanisms/pow/) (proof of work) - Can be used in [small development networks](../../../tutorials/ethash.md). + +See a [comparison of the proof of authority consensus protocols](../../../concepts/poa.md). + +The `config` property in the genesis file specifies the consensus protocol for a chain. + + + +# Ethash + +```json +{ + "config": { + ... + "ethash": { + ... + } + }, + ... +} +``` + +# Clique + +```json +{ + "config": { + ... + "clique": { + ... + } + }, + ... +} +``` + +# IBFT 2.0 + +```json +{ + "config": { + ... + "ibft2": { + ... + } + }, + ... +} +``` + +# QBFT + +```json +{ + "config": { + ... + "qbft": { + ... + } + }, + ... +} +``` + + diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/qbft.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/qbft.md new file mode 100644 index 00000000000..727f2662887 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/consensus/qbft.md @@ -0,0 +1,695 @@ +--- +title: QBFT +description: Hyperledger Besu QBFT proof of authority (PoA) consensus protocol implementation +sidebar_position: 2 +tags: + - private networks +--- + +# Configure QBFT consensus + +Hyperledger Besu implements the QBFT proof of authority (PoA) [consensus protocol](index.md). QBFT is the recommended enterprise-grade consensus protocol for private networks. + +In QBFT networks, approved accounts, known as validators, validate transactions and blocks. Validators take turns to create the next block. Before inserting the block onto the chain, a super-majority (greater than or equal to 2/3) of validators must first sign the block. + +Existing validators propose and vote to [add or remove validators](#add-and-remove-validators). + +You can [create a private network using QBFT](../../../tutorials/qbft.md). + +:::caution + +Configure your network to ensure you never lose more than 1/3 your validators. If more than 1/3 of validators stop participating, new blocks are no longer created, and the network stalls. It may take significant time to recover once nodes are restarted. + +::: + +:::tip + +You can use a plugin to securely store a validator's key using the [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. + +::: + +## Genesis file + +To use QBFT, define a [genesis file](../../../../public-networks/concepts/genesis-file.md) that contains the QBFT properties. + +The genesis file differs depending on the [validator management method](#add-and-remove-validators) you intend to use. + +:::note + +You can use a [transitions](#transitions) to change the `blockperiodseconds` or validator management method of the network at a later time. + +::: + + + +# Block header validator selection + +```json +{ + "config": { + "chainid": 1337, + "berlinBlock": 0, + "qbft": { + "epochlength": 30000, + "blockperiodseconds": 5, + "requesttimeoutseconds": 10 + } + }, + "nonce": "0x0", + "timestamp": "0x5b3d92d7", + "extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549464a702e6263b7297a96638cac6ae65e6541f4169943923390ad55e90c237593b3b0e401f3b08a0318594aefdb9a738c9f433e5b6b212a6d62f6370c2f69294c7eeb9a4e00ce683cf93039b212648e01c6c6b78c080c0", + "gasLimit": "0x29b92700", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "64d9be4177f418bcf4e56adad85f33e3a64efe22": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +# Contract validator selection + +```json +{ + "config": { + "chainid": 1337, + "berlinBlock": 0, + "qbft": { + "epochlength": 30000, + "blockperiodseconds": 5, + "requesttimeoutseconds": 10, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + } + }, + "nonce": "0x0", + "timestamp": "0x5b3d92d7", + "extraData": "0xe5a00000000000000000000000000000000000000000000000000000000000000000c0c080c0", + "gasLimit": "0x29b92700", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "64d9be4177f418bcf4e56adad85f33e3a64efe22": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "0x0000000000000000000000000000000000007777": { + "comment": "validator smart contract", + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100a5576000357c0100000000000000000000000000000000000000000000000000000000900480639692ea25116100785780639692ea2514610113578063b4ec9ac114610126578063b7ab4db514610139578063c76f24371461014e57600080fd5b80631c5a9d9c146100aa578063508adcfc146100bf57806351b42b00146100db5780635dc43899146100e3575b600080fd5b6100bd6100b8366004611399565b610161565b005b6100c860035481565b6040519081526020015b60405180910390f35b6100bd6104aa565b6100f66100f1366004611399565b61074e565b6040805193845260208401929092521515908201526060016100d2565b6100bd610121366004611399565b610bbd565b6100bd610134366004611399565b610deb565b6101416110a3565b6040516100d291906113c9565b6100bd61015c366004611399565b611105565b3360009081526001602052604090205460ff1661019c5760405160e560020a62461bcd02815260040161019390611416565b60405180910390fd5b600160a060020a03811661021b5760405160e560020a62461bcd02815260206004820152602860248201527f63616e6e6f742061637469766174652076616c696461746f722077697468206160448201527f64647265737320300000000000000000000000000000000000000000000000006064820152608401610193565b60005b6000548110156102b7576000818154811061023b5761023b611505565b600091825260209091200154600160a060020a03838116911614156102a55760405160e560020a62461bcd02815260206004820152601b60248201527f76616c696461746f7220697320616c72656164792061637469766500000000006044820152606401610193565b806102af816114b8565b91505061021e565b33600090815260016020526040902054610100900460ff16156103345733600090815260016020526040812054815484929162010000900460ff1690811061030157610301611505565b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550610432565b600054610100116103b05760405160e560020a62461bcd02815260206004820152602e60248201527f6e756d626572206f662076616c696461746f72732063616e6e6f74206265206c60448201527f6172676572207468616e203235360000000000000000000000000000000000006064820152608401610193565b3360009081526001602081905260408220805461ff001981166101009081178355845460ff16620100000262ffff001990921691909117179055815490810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563018054600160a060020a038416600160a060020a03199091161790555b600160a060020a0382166000818152600260205260408082208054600160a060020a03191633908117909155915490519192917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f9161049e916001909182521515602082015260400190565b60405180910390a35050565b3360009081526001602052604090205460ff166104dc5760405160e560020a62461bcd02815260040161019390611416565b6000546001106105315760405160e560020a62461bcd02815260206004820181905260248201527f63616e6e6f742064656163746976617465206c6173742076616c696461746f726044820152606401610193565b33600090815260016020526040902054610100900460ff166105be5760405160e560020a62461bcd02815260206004820152602860248201527f73656e64657220646f6573206e6f74206861766520616e20616374697665207660448201527f616c696461746f720000000000000000000000000000000000000000000000006064820152608401610193565b336000908152600160205260408120805461ff0019169081905581546201000090910460ff1691908190839081106105f8576105f8611505565b60009182526020822001548154600160a060020a03909116925081906106209060019061148a565b8154811061063057610630611505565b60009182526020822001548154600160a060020a03909116925082919060ff861690811061066057610660611505565b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055838316825260028152604080832054909316825260019052908120805462ff000019166201000060ff8716021790558054806106c6576106c66114ec565b6000828152602080822060001990840181018054600160a060020a03199081169091559301909355600160a060020a03851680825260028452604080832080549094169093558154835190815293840191909152339290917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f910160405180910390a3505050565b336000908152600160205260408120548190819060ff166107845760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a03851660009081526004602052604090205481101561082357600160a060020a038516600090815260046020526040812080546001929190849081106107d6576107d6611505565b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610811578361080d816114b8565b9450505b8061081b816114b8565b915050610787565b5060026003546108339190611465565b831115610b8657600160a060020a038416600090815260046020526040812061085b9161135f565b600160a060020a03841660009081526001602052604090205460ff1615610ab0576003805490600061088c836114a1565b9091555050600160a060020a038416600090815260016020526040902054610100900460ff1615610a89576000546001106109325760405160e560020a62461bcd02815260206004820152603860248201527f63616e6e6f742072656d6f766520616c6c6f776564206163636f756e7420776960448201527f7468206c617374206163746976652076616c696461746f7200000000000000006064820152608401610193565b600160a060020a03841660009081526001602052604081205481546201000090910460ff169160029181908490811061096d5761096d611505565b6000918252602080832090910154600160a060020a0316835282019290925260400181208054600160a060020a0319169055805481906109af9060019061148a565b815481106109bf576109bf611505565b60009182526020822001548154600160a060020a03909116925082919060ff85169081106109ef576109ef611505565b600091825260208220018054600160a060020a031916600160a060020a039390931692909217909155805480610a2757610a276114ec565b6000828152602080822083016000199081018054600160a060020a0319169055909201909255600160a060020a0392831682526002815260408083205490931682526001905220805460ff909216620100000262ff0000199092169190911790555b600160a060020a0384166000908152600160205260409020805462ffffff19169055610b32565b60038054906000610ac0836114b8565b909155505060408051606081018252600180825260006020808401828152848601838152600160a060020a038b16845293909152939020915182549351915160ff16620100000262ff0000199215156101000261ff00199215159290921661ffff199095169490941717169190911790555b600160a060020a03841660008181526001602090815260409182902054915160ff909216151582527f94154efdb7741591680558a88682943a481f1a468cb81f46fe7f8cead2e40519910160405180910390a25b826002600354610b969190611465565b610ba190600161144d565b6002600354610bb09190611465565b9196909550931192915050565b3360009081526001602052604090205460ff16610bef5760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a038216600090815260046020526040902054811015610d4b57600160a060020a0382166000908152600460205260409020805433919083908110610c3f57610c3f611505565b600091825260209091200154600160a060020a03161415610d3957600160a060020a03821660009081526004602052604090208054610c809060019061148a565b81548110610c9057610c90611505565b6000918252602080832090910154600160a060020a03858116845260049092526040909220805491909216919083908110610ccd57610ccd611505565b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559184168152600490915260409020805480610d1257610d126114ec565b60008281526020902081016000199081018054600160a060020a0319169055019055610d4b565b80610d43816114b8565b915050610bf2565b50600160a060020a0381166000818152600460205260409020546003543392917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba91610d9990600290611465565b610da490600161144d565b600160a060020a0386166000908152600160208181526040928390205483519586529085019390935260ff909216159083015260608201526080015b60405180910390a350565b3360009081526001602052604090205460ff16610e1d5760405160e560020a62461bcd02815260040161019390611416565b600160a060020a038116610e765760405160e560020a62461bcd02815260206004820152601f60248201527f6163636f756e7420746f2062652061646465642063616e6e6f742062652030006044820152606401610193565b600160a060020a03811660009081526001602081905260409091205460ff16151514610f0d5760405160e560020a62461bcd02815260206004820152602a60248201527f6163636f756e7420746f2072656d6f7665206973206e6f74206f6e207468652060448201527f616c6c6f77206c697374000000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a038216600090815260046020526040902054811015610ffb57600160a060020a0382166000908152600460205260409020805433919083908110610f5d57610f5d611505565b600091825260209091200154600160a060020a03161415610fe95760405160e560020a62461bcd02815260206004820152602a60248201527f73656e6465722068617320616c726561647920766f74656420746f2072656d6f60448201527f7665206163636f756e74000000000000000000000000000000000000000000006064820152608401610193565b80610ff3816114b8565b915050610f10565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061107490600290611465565b61107f90600161144d565b60408051928352602083019190915260009082018190526060820152608001610de0565b606060008054806020026020016040519081016040528092919081815260200182805480156110fb57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116110dd575b5050505050905090565b3360009081526001602052604090205460ff166111375760405160e560020a62461bcd02815260040161019390611416565b600160a060020a03811660009081526001602052604090205460ff16156111c95760405160e560020a62461bcd02815260206004820152602b60248201527f6163636f756e7420746f2061646420697320616c7265616479206f6e2074686560448201527f20616c6c6f77206c6973740000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a0382166000908152600460205260409020548110156112b757600160a060020a038216600090815260046020526040902080543391908390811061121957611219611505565b600091825260209091200154600160a060020a031614156112a55760405160e560020a62461bcd02815260206004820152602760248201527f73656e6465722068617320616c726561647920766f74656420746f206164642060448201527f6163636f756e74000000000000000000000000000000000000000000000000006064820152608401610193565b806112af816114b8565b9150506111cc565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061133090600290611465565b61133b90600161144d565b60408051928352602083019190915260019082015260006060820152608001610de0565b508054600082559060005260206000209081019061137d9190611380565b50565b5b808211156113955760008155600101611381565b5090565b6000602082840312156113ab57600080fd5b8135600160a060020a03811681146113c257600080fd5b9392505050565b6020808252825182820181905260009190848201906040850190845b8181101561140a578351600160a060020a0316835292840192918401916001016113e5565b50909695505050505050565b6020808252601f908201527f73656e646572206973206e6f74206f6e2074686520616c6c6f77206c69737400604082015260600190565b60008219821115611460576114606114d3565b500190565b6000826114855760e060020a634e487b7102600052601260045260246000fd5b500490565b60008282101561149c5761149c6114d3565b500390565b6000816114b0576114b06114d3565b506000190190565b60006000198214156114cc576114cc6114d3565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052603160045260246000fd5b60e060020a634e487b7102600052603260045260246000fdfea26469706673582212200c3e9c07521b155532c0de1605aae52f4ae953670f0afb0f30d320580b93213d64736f6c63430008070033", + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000000000000000000000000000000000000002", + "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": "0000000000000000000000009a6d82ef3912d5ab60473124bccd2f2a640769d7", + "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564": "00000000000000000000000065463bf6268e5cc409b6501ec846487b935a1446", + "aedead2c33b41c31b4afd2246c6bf5131c209d4b0ca6c2247778ac7be7443a00": "0000000000000000000000000000000000000000000000000000000000000101", + "33784757d5da236467d27a7c5b0cc5aa9026ca3b79e29106a67a5e93c292a523": "0000000000000000000000000000000000000000000000000000000000010101", + "35aba1eb0bbe741ac01e5b6ce584bc042b1a0b7d115eb8f7dd02a1a1de2fd14d": "000000000000000000000000fe3b557e8fb62b89f4916b721be55ceb828dbd73", + "0d9217f0a1f7c602fd67052d20171ff73b156d1b87ea258cb6a5d94f71298158": "000000000000000000000000627306090abab3a6e1400e9345bc60c78a8bef57", + "0000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000000000000000000000000000000000000000002" + }, + "version": "0x01" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + + + +The QBFT properties are: + +- `blockperiodseconds` - The minimum block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. +- `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all nodes on the network must use the identical value. +- `validatorcontractaddress` - Address of the validator smart contract. Required only if using a contract validator selection. The address must be identical to the address in the `alloc` section. This option can also be used in the [transitions](#transitions) configuration item if swapping [validator management methods](#add-and-remove-validators) in an existing network. +- `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator that proposes the block. If set, then all nodes on the network must use the same beneficiary. +- [`extraData`](#extra-data) - RLP encoded [extra data](#extra-data). + +:::caution + +We don't recommend changing `epochlength` in a running network. Changing the `epochlength` after genesis can result in illegal blocks. + +::: + +:::caution Invalid block header error + +When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. The imported chain makes new blocks faster than the genesis file allows and Besu rejects them with this error. This error most often occurs when importing chains from older versions of Besu. + +Decrease the `blockperiodseconds` in the new QBFT genesis file to a lower value that satisfies the block header validation. + +If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. + +After you update the new genesis file, if the imported chain has a `blockperiodseconds` value set lower than you prefer, you can adjust it by [configuring the block time on an existing QBFT network](#configure-block-time-on-an-existing-network). + +::: + +The properties with specific values in the QBFT genesis files are: + +- `difficulty` - `0x1` +- `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul block identification + +To start a node on a QBFT private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. + +### Extra data + +The `extraData` property is an RLP encoding of: + +- 32 bytes of vanity data. +- If using: + - [Block header validator selection](#add-and-remove-validators-using-block-headers), a list of validator addresses. + - [Contract validator selection](#add-and-remove-validators-using-a-smart-contract), no validators. +- Any validator votes. No vote is included in the genesis block. +- The round the block was created on. The round in the genesis block is 0. +- A list of seals of the validators (signed block hashes). No seals are included in the genesis block. + +When using block header validator selection, the important information in the genesis block extra data is the list of validators. All other details have empty values in the genesis block. + +:::info + +When using contract validator selection to manage validators, the list of validators is configured in the `alloc` property's `storage` section. View the example smart contract for more information on how to generate the `storage` section. + +::: + +Formally, `extraData` in the genesis block contains: + +- If using block header validator selection: `RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. +- If using contract validator selection: `RLP([32 bytes Vanity, 0 Validators, No Vote, Round=Int(0), 0 Seals])`. + +:::info + +RLP encoding is a space-efficient object serialization scheme used in Ethereum. + +::: + +#### Generate extra data + +To generate the `extraData` RLP string for inclusion in the genesis file, use the [`rlp encode`](../../../reference/cli/subcommands.md#rlp) Besu subcommand. + +```bash title="Example" +besu rlp encode --from=toEncode.json --type=QBFT_EXTRA_DATA +``` + +Where the `toEncode.json` file contains a list of the initial validators, in ascending order. To write the validator address and copy it to the `toEncode.json` file, use the [`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu subcommand. For example: + +```json title="Initial validators in toEncode.json file" +[ + "0x4592c8e45706cc08b8f44b11e43cba0cfc5892cb", + "0x06e23768a0f59cf365e18c2e0c89e151bcdedc70", + "0xc5327f96ee02d7bcbc1bf1236b8c15148971e1de", + "0xab5e7f4061c605820d3744227eed91ff8e2c8908" +] +``` + +Copy the RLP encoded data to the `extraData` property in the genesis file. + +```bash title="RLP encoded data" +0xf87aa00000000000000000000000000000000000000000000000000000000000000000f854944592c8e45706cc08b8f44b11e43cba0cfc5892cb9406e23768a0f59cf365e18c2e0c89e151bcdedc7094c5327f96ee02d7bcbc1bf1236b8c15148971e1de94ab5e7f4061c605820d3744227eed91ff8e2c8908c080c0 +``` + +When you start the network, the four nodes previously specified in `toEncode.json` are the validators for the network. + +### Block time + +When the protocol receives a new chain head, the block time (`blockperiodseconds`) timer starts. When `blockperiodseconds` expires, the round timeout (`requesttimeoutseconds`) timer starts and the protocol proposes a new block. + +If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with the block time and timeout timers reset. The timeout period for the new round is two times `requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a block. + +Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round then starts, resetting the block time and round timeout timers. When `blockperiodseconds` expires, the protocol proposes the next new block. + +:::danger + +If more than 1/3 of validators stop participating, new blocks can no longer be created and `requesttimeoutseconds` doubles with each round change. The quickest method to resume block production is to restart all validators, which resets `requesttimeoutseconds` to its genesis value. + +::: + +Once `blockperiodseconds` is over, the time from proposing a block to adding the block is small (usually around one second) even in networks with geographically dispersed validators. + +#### Tune block timeout + +To tune the block timeout for your network deployment: + +1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times `blockperiodseconds`. +1. Reduce `requesttimeoutseconds` until you start to see round changes occurring. +1. Increase `requesttimeoutseconds` to the value where round changes are no longer occurring. + +:::tip + +View [`TRACE` logs](../../../../public-networks/reference/api/index.md#admin_changeloglevel) to see round change log messages. + +::: + +Use a [transition](#transitions) to update the `blockperiodseconds` in an existing network. + +### Optional configuration options + +Optional configuration options in the genesis file are: + +- `messageQueueLimit` - In large networks with limited resources, increasing the message queue limit might help with message activity surges. The default is 1000. +- `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate message limit might reduce the number of retransmissions. A value of two to three times the number of validators is usually enough. The default is 100. +- `futureMessagesLimit` - The future messages buffer holds messages for a future chain height. For large networks, increasing the future messages limit might be useful. The default is 1000. +- `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering messages in the future messages buffer. The default is 10. + +### Post-Merge configuration + +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. + +| Field | Constant value | Comment | +| --- | --- | --- | +| **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | +| **`difficulty`** | `0` | Replaced with `prevrandao` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | + +Additionally, [`extraData`](#extra-data) is limited to the 32 bytes of vanity data after The Merge. + +## Add and remove validators + +QBFT provides two methods to manage validators: + +- [Block header validator selection](#add-and-remove-validators-using-block-headers) - Existing validators propose and vote to add or remove validators using the QBFT JSON-RPC API methods. + +- [Contract validator selection](#add-and-remove-validators-using-a-smart-contract) - Use a smart contract to specify the validators used to propose and validate blocks. + +You can use [transitions](#transitions) to swap between block header validator selection and contract validator selection in an existing network. + +For block header validator selection, initial validators are configured in the genesis file's [`extraData`](#extra-data) property, whereas the initial validators when using the contract validator selection method are configured in the genesis file's `storage` section. + +### Add and remove validators using block headers + +Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSockets interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). + +The QBFT API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `QBFT`. + +The methods to add or remove validators are: + +- [`qbft_getPendingVotes`](../../../reference/api/index.md#qbft_getpendingvotes). +- [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). +- [`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote). + +To view validator metrics for a specified block range, use [`qbft_getSignerMetrics`](../../../reference/api/index.md#qbft_getsignermetrics). + +:::note + +If network conditions render it impossible to add and remove validators by voting, you can [add and remove validators without voting](add-validators-without-voting.md). + +::: + +#### Add a validator + +To propose adding a validator, call [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote), specifying the address of the proposed validator and `true`. A majority of validators must execute the call. + +```bash title="JSON-RPC qbft_proposeValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` + +When the validator proposes the next block, the protocol inserts one proposal received from [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote) into the block. If blocks include all proposals, subsequent blocks proposed by the validator will not contain a vote. + +When more than 50% of the existing validators have published a matching proposal, the protocol adds the proposed validator to the validator pool and the validator can begin validating blocks. + +To return a list of validators and confirm the addition of a proposed validator, use [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber). + +```bash title="JSON-RPC qbft_getValidatorsByBlockNumber request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' +``` + +To discard your proposal after confirming the addition of a validator, call [`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote), specifying the address of the proposed validator. + +```bash title="JSON-RPC qbft_discardValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` + +#### Remove a validator + +The process for removing a validator is the same as adding a validator except you specify `false` as the second parameter of [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). + +#### Epoch transition + +At each epoch transition, QBFT discards all pending votes collected from received blocks. Existing proposals remain in effect and validators re-add their vote the next time they create a block. + +An epoch transition occurs every `epochLength` blocks. Define `epochlength` in the QBFT genesis file. + +### Add and remove validators using a smart contract + +Users can create their own smart contracts to add or remove validators based on their organizational requirements. View the [example smart contract](https://github.com/ConsenSys/validator-smart-contracts) for more information on how to create and deploy the smart contract. + +You can pre-deploy the validator smart contract in a new QBFT network by specifying the contract details in the [genesis file](qbft.md#genesis-file). For existing QBFT networks you need to compile and deploy the contract using a transaction, then obtain the contract address from the receipt and use that in a [transition](#swap-validator-management-methods). + +:::info + +You can't use the JSON-RPC methods to add or remove validators when using a smart contract to manage nodes. + +You must interact with the contract functions using transactions. + +::: + +:::note + +If network conditions render it impossible to add and remove validators using a smart contract, you can [override smart contract validators](add-validators-without-voting.md#override-smart-contract-validators). + +::: + +### Minimum number of validators + +QBFT requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the ability for a blockchain network to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +## Transitions + +The `transitions` genesis configuration item allows you to specify a future block number at which to change QBFT network configuration in an existing network. For example, you can update the [block time](#configure-block-time-on-an-existing-network), [block reward](#configure-block-rewards-on-an-existing-network-deployment), [validator management method](#swap-validator-management-methods), or [mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). + +:::caution + +Do not specify a transition block in the past. Specifying a transition block in the past could result in unexpected behavior, such as causing the network to fork. + +::: + +### Configure block time on an existing network + +To update an existing network with a new `blockperiodseconds`: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockperiodseconds`. + - `` is the updated value for `blockperiodseconds`. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": , + "blockperiodseconds": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": 1240, + "blockperiodseconds": 4 + } + ] + } + }, + ... + } + ``` + + + +3. Restart all nodes in the network using the updated genesis file. +4. To verify the changes after the transition block, call [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + +### Configure block rewards on an existing network deployment + +To update an existing network with a new `blockreward`: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockreward`. + - `` is the updated value for `blockreward`. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "qbft": [ + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "qbft": [ + { + "block": 10, + "blockreward": "6000000000000000" + }, + { + "block": 15, + "blockreward": "75000000000000000" + }, + { + "block": 20, + "blockreward": "0" + } + ] + } + }, + ... + } + ``` + + + + :::note + + You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. + + ::: + +3. Restart all nodes in the network using the updated genesis file. + +### Swap validator management methods + +To swap between block header validator selection and contract validator selection methods in an existing network: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change the validator selection method. + - `` is the validator selection mode to switch to. Valid options are `contract` and `blockheader`. + - `` is the smart contract address, if switching to the contract validator selection method. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": , + "validatorselectionmode": , + "validatorcontractaddress": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": 102885, + "validatorselectionmode": "contract", + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + } + ] + } + }, + ... + } + ``` + + + +3. Restart all nodes in the network using the updated genesis file. + +### Configure the mining beneficiary on an existing network deployment + +To update an existing network with a new mining beneficiary: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `miningbeneficiary`. + - `` is the updated 20-byte address for `miningbeneficiary`. Starting at ``, block rewards go to this address. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": , + "miningbeneficiary": + }, + { + "block": , + "miningbeneficiary": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": 10000, + "miningbeneficiary": "0x0000000000000000000000000000000000000002", + }, + { + "block": 20000, + "miningbeneficiary": "", + } + ] + } + }, + ... + } + ``` + + + + :::note + + Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the block producer rather than a global override address. + + ::: + +3. Restart all nodes in the network using the updated genesis file. + + + +_[vanity data]: Validators can include anything they like as vanity data. _[RLP]: Recursive Length Prefix + +[GoQuorum]: https://consensys.net/docs/goquorum/en/stable/ +[View the example smart contract]: https://github.com/ConsenSys/validator-smart-contracts diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/contracts.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/contracts.md new file mode 100644 index 00000000000..a38c58e3894 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/contracts.md @@ -0,0 +1,39 @@ +--- +title: Pre-deploy a contract +description: Pre-deploying contracts in the genesis file +sidebar_position: 5 +tags: + - private networks +--- + +# Pre-deploy contracts in the genesis file + +To pre-deploy contracts when starting Besu, specify the contract code in the [genesis file](../../../public-networks/concepts/genesis-file.md). + +:::tip Contract code in the genesis file + +```json +{ + ... + "alloc": { + "0x0ffd23af8eebc60b3cfdeed6f814988757237314": { + "balance": "0x100000000000000000000000000000000000000000000000000", + "code": "0x6080604052600436106043576000357c010000000000000000000000000000000000000000000000000000000090048063010fc84214604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b80600081905550807f04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce360405160405180910390a25056fea165627a7a7230582038cb7ea327af8f73feabcfbff64498f1e74831e67f7c75286760d3845c6747c70029", + "storage": { + "7aa07e0c924147697605046b7c2c32645b7bbfb41e0ac5d0a84ac93cbb759798": "0000000000000000000000000000000000000000000000000000000000000001", + "cea2b0602db61f92b76ec4402875cc38eedc9fc425cb1b697fc2265d50fc20fb": "0000000000000000000000000000000000000000000000000000000000000001", + } + } + }, + ... +} +``` + +::: + +The contract code in the genesis file defines the: + +- Address. +- Balance. +- Bytecode. +- Key value pairs for contract storage. diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/curves.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/curves.md new file mode 100644 index 00000000000..72edb764a18 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/curves.md @@ -0,0 +1,41 @@ +--- +title: Alternative elliptic curves +description: Using alternative elliptic curves in Besu +sidebar_position: 8 +tags: + - private networks +--- + +# Configure alternative elliptic curves + +:::caution + +Configuring alternative elliptic curves is an early access feature. + +::: + +By default, Besu uses the Ethereum standard `secp256k1` elliptic curve (EC). However, when running nodes in a private network, it is possible to configure an alternative elliptic curve. + +The configuration for what elliptic curve Besu will use is done in the network configuration section of genesis file, using the [`ecCurve`](../../../public-networks/reference/genesis-items.md#Configuration_Items) key: + +```bash +{ + "genesis": { + "config": { + "ecCurve": "secp256k1", + [...] + }, + [...] +} +``` + +:::danger Important + +All nodes in the network **MUST** use the same elliptic curve. Nodes with different EC configuration from the network won't be able to send messages to other nodes or verify transactions and blocks. + +::: + +Besu supports the following elliptic curves: + +- `secp256k1` (Ethereum default) +- `secp256r1` diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/free-gas.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/free-gas.md new file mode 100644 index 00000000000..950ab0f1db6 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/free-gas.md @@ -0,0 +1,136 @@ +--- +title: Free gas network +description: Configuring free gas networks +sidebar_position: 2 +tags: + - private networks +--- + +# Configure free gas networks + +Transactions use computational resources so have an associated cost. Gas is the cost unit and the gas price is the price per gas unit. The transaction cost is the gas used \* gas price. + +In public networks, the account submitting the transaction pays the transaction cost, in Ether. The miner (or validator in PoA networks) that includes the transaction in a block receives transaction cost. + +In many private networks, network participants run the validators and do not require gas as an incentive. Networks that don't require gas as an incentive usually configure the gas price to be zero (that is, free gas). Some private networks might allocate Ether and use a non-zero gas price to limit resource use. + +:::tip + +We use the term _free gas network_ to refer to a network with a gas price of zero. A network with a gas price of zero is also known as a _zero gas network_ or _no gas network_. + +::: + +:::note + +Some pre-crafted transactions require the deployment account to have gas available. For example, the transaction that creates the smart contract in [EIP-1820](https://eips.ethereum.org/EIPS/eip-1820). + +::: + +In a free gas network, transactions still use gas but the gas price is zero, meaning the transaction cost is zero. Transaction cost = gas used \* 0 (the gas price). + +## Configure free gas in Besu + +When gas is free, limiting block and contract sizes is less important. In free gas networks, we increase the block size limit and set the contract size limit to the maximum value. + +### 1. Set the block size + +If you want to remove gas from consideration and don't mind blocks potentially taking longer to create, in the genesis file set the block size limit (measured in gas) to the maximum accepted by Truffle (`0x1fffffffffffff`). In the genesis file, specify `gasLimit` following the `config` key. + +```json +{ + "config": { + .... + }, + ... + "gasLimit": "0x1fffffffffffff", + .... +} +``` + +If you are more concerned about blocks arriving on time and don't have expensive individual transactions, set `gasLimit` to a value closer to the amount of gas your validators can process in the configured block time. + +### 2. Set the contract size + +In the `config` section of the genesis file, set the contract size limit to the maximum supported size (in bytes). + +```json +( + "config": { + ... + "contractSizeLimit": 2147483647, + ... + } + ... +} +``` + +### 3. Start Besu with a minimum gas price of zero + +When starting nodes, set the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) to zero. + + + +# Command Line + +```bash +--min-gas-price=0 +``` + +# Configuration File + +```bash +min-gas-price=0 +``` + + + +# Command Line + +:::danger Important + +In a free gas network, ensure the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) is set to zero for every node. Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. You can query a node's gas configuration using [`eth_gasPrice`](../../../public-networks/reference/api/index.md#eth_gasprice). + +::: + +### 4. Enable zero base fee if using London fork or later + +If your network is configured to use the `londonBlock` or a later hard fork, then you must also enable the `zeroBaseFee` configuration. You must set this on all your nodes. Once it is set, future blocks produced by that node will set a `baseFee` of 0. This is required because the London hard fork (EIP-1559) introduced a non-zero `baseFee` into the block which normally means transactions require gas. + +```json +{ + "config": { + "londonBlock": 0, + "zeroBaseFee": true, + ... + }, + ... +} +``` + +## Configure free gas in Truffle + +If using Truffle to develop on your free gas network, you also need to configure free gas in Truffle. + +Like setting block and contract size limits to their maximum values for Besu, set the transaction gas limit in Truffle to the maximum possible. + +:::info + +Besu does not support private key management. To use Besu with Truffle, you must configure a [Truffle wallet](../../../public-networks/how-to/develop/truffle.md). + +::: + +### Update `truffle-config.js` + +Update the `truffle-config.js` file: + +1. Set the gas price to zero. + + ```js + gasPrice: 0; + ``` + +1. Set the gas limit for a transaction (that is, contract creation) to be the block gas limit - 1. + + ```js + gas: "0x1ffffffffffffe"; + ``` diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/tls/_category_.json b/versioned_docs/version-23.4.1/private-networks/how-to/configure/tls/_category_.json new file mode 100644 index 00000000000..dbda63e2b5b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/tls/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "TLS", + "position": 6 +} diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/tls/client-and-server.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/tls/client-and-server.md new file mode 100644 index 00000000000..5ee1722415d --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/tls/client-and-server.md @@ -0,0 +1,119 @@ +--- +title: Client and server TLS +sidebar_position: 1 +tags: + - private networks +--- + +# Configure client and server TLS + +Hyperledger Besu supports TLS for client and server communication. For example, you can configure TLS for communication between [EthSigner](https://docs.ethsigner.consensys.net/en/latest/Concepts/TLS/) and Besu, and Besu and [Tessera](https://docs.tessera.consensys.net/HowTo/Configure/TLS/). + +The following diagram displays an example client and server TLS configuration. + +![Besu client and server TLS](../../../../assets/images/Besu_TLS.png) + +Configure TLS communication from the command line. + +## Prerequisites + +- Besu's password-protected PKCS12 keystore +- File containing the keystore password + +## Configure client TLS + +Allow clients (for example a dapp, curl, or EthSigner) to send and receive secure HTTP JSON-RPCs. + +**Client prerequisites**: + +- [Configure the client for TLS] +- Client's PKCS12 keystore information + +### Create the known clients file + +The known clients file allows clients with self-signed certificates or non-public certificates to connect to Besu. + +Create a file (in this example, `knownClients`) that lists one or more trusted clients. Use the format` ` where: + +- `` is the Common Name specified in the client certificate. +- `` is the SHA-256 fingerprint of the client certificate. + +```bash title="Example" +ethsigner 8E:E0:85:9F:FC:2E:2F:21:31:46:0B:82:4C:A6:88:AB:30:34:9A:C6:EA:4F:04:31:ED:0F:69:A7:B5:C2:2F:A7 +curl FC:18:BF:39:45:45:9A:15:46:76:A6:E7:C3:94:64:B8:34:84:A3:8E:B8:EA:67:DC:61:C0:29:E6:38:B8:B7:99 +``` + +You can use [`openssl`](https://www.openssl.org/) or [`keytool`](https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html) to display the SHA256 fingerprint. + +``` +keytool -list -v -keystore -storetype PKCS12 -storepass `. +``` + +### Start Besu + +```bash +besu --rpc-http-enabled --rpc-http-tls-enabled --rpc-http-tls-client-auth-enabled --rpc-http-tls-keystore-file=/Users/me/my_node/keystore.pfx --rpc-http-tls-keystore-password-file=/Users/me/my_node/keystorePassword --rpc-http-tls-known-clients-file=/Users/me/my_node/knownClients --rpc-http-tls-cipher-suite=TLS_AES_256_GCM_SHA384 --rpc-http-tls-protocol=TLSv1.3,TLSv1.2 +``` + +The command line: + +- Enables the HTTP JSON-RPC service using the [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables TLS for the HTTP JSON-RPC service using the [`--rpc-http-tls-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-enabled) option. +- Enables TLS client authentication using the [`--rpc-http-tls-client-auth-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-client-auth-enabled) option. +- Specifies the keystore using the [`--rpc-http-tls-keystore-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-file) option. +- Specifies the file that contains the password to decrypt the keystore using the [`--rpc-http-tls-keystore-password-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-password-file) option. +- [Specifies the clients](#create-the-known-clients-file) allowed to connect to Besu using the [`--rpc-http-tls-known-clients-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-known-clients-file) option. +- specifies the Java cipher suites using the [`--rpc-http-tls-cipher-suite`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-cipher-suite) option. +- specifies the TLS protocol version using the [`--rpc-http-tls-protocol`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-protocol) option. + +:::note + +Set [`--rpc-http-tls-ca-clients-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-ca-clients-enabled) to `true` to allow access to clients with signed and trusted root CAs. + +::: + +## Configure server TLS + +Allow Besu to securely communicate with the server (Tessera). + +**Server prerequisites**: + +- [Configure the server to allow TLS communication] +- Server's certificate information + +### Create the known servers file + +Create a file (in this example, `knownServers`) that lists one or more trusted servers. The file contents use the format `: ` where: + +- `` is the server hostname +- `` is the port used for communication +- `` is the SHA-256 fingerprint of the server's certificate. + +```bash title="Example" +localhost:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC +127.0.0.1:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC +``` + +:::note + +If you are unsure whether requests use the hostname or an IP address, configure both in the file. + +::: + +### Start Besu + +```bash +besu --privacy-tls-enabled --privacy-tls-keystore-file=/Users/me/my_node/keystore.pfx --privacy-tls-keystore-password-file=/Users/me/my_node/keystorePassword --privacy-tls-known-enclave-file=/Users/me/my_node/knownServers +``` + +The command line: + +- Enables TLS with the server using the [`--privacy-tls-enabled`](../../../reference/cli/options.md#privacy-tls-enabled) option. +- Specifies the keystore using the [`--privacy-tls-keystore-file`](../../../reference/cli/options.md#privacy-tls-keystore-file) option. +- Specifies the file that contains the password to decrypt the keystore using the [`--privacy-tls-keystore-password-file`](../../../reference/cli/options.md#privacy-tls-keystore-password-file) option. +- Specifies the trusted servers using the [`--privacy-tls-known-enclave-file`](../../../reference/cli/options.md#privacy-tls-known-enclave-file) option. + + + +[Configure the client for TLS]: https://docs.ethsigner.consensys.net/en/latest/HowTo/Configure-TLS/#server-tls-connection +[Configure the server to allow TLS communication]: https://docs.tessera.consensys.net/HowTo/Configure/TLS/ diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/tls/p2p.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/tls/p2p.md new file mode 100644 index 00000000000..3121d25c520 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/tls/p2p.md @@ -0,0 +1,261 @@ +--- +title: Peer-to-peer TLS +sidebar_position: 2 +description: Configure P2P TLS communication +tags: + - private networks +--- + +# Configure P2P TLS + +You can configure TLS to secure the P2P communication between nodes by ensuring only authorized nodes can communicate with each other. Use certificates issued by a trusted authority to connect authorized nodes in the network. + +:::caution + +P2P TLS is an early access feature, and functionality and options may be updated between releases. + +::: + +Besu supports PKCS11, PKCS12, and JKS keystore and truststore types for P2P TLS. + +## Configure P2P TLS + +**Prerequisites**: + +- A configured network. For example, [see steps 1 to 5 in the QBFT tutorial](../../../tutorials/qbft.md). +- Each node requires a keystore that contains the node's certificate and key. +- A truststore containing all the trusted certificates for the network. + +Start Besu and include the following command line options on the required nodes: + +```bash +besu --Xp2p-tls-enabled=true \ +--Xp2p-tls-keystore-type="PKCS12" \ +--Xp2p-tls-keystore-file="keystore" \ +--Xp2p-tls-keystore-password-file="keystore.password" \ +--Xp2p-tls-crl-file="crl2.pem" \ +--Xp2p-tls-truststore-type="JKS" \ +--Xp2p-tls-truststore-file="truststore.jks" \ +--Xp2p-tls-truststore-password-file="truststore_password.txt" +``` + +In the command line: + +- Enable TLS for P2P communication using [`--Xp2p-tls-enabled=true`](#xp2p-tls-enabled). +- Specify the keystore type and keystore file using [`--Xp2p-tls-keystore-type`](#xp2p-tls-keystore-type) and [`--Xp2p-tls-keystore-file`](#xp2p-tls-keystore-file). +- Specify the text file containing the password to unlock the keystore file using [`--Xp2p-tls-keystore-password-file`](#xp2p-tls-keystore-password-file). +- Specify the optional [certificate revocation list (CRL)] file using [`--Xp2p-tls-crl-file`](#xp2p-tls-crl-file). +- Specify the truststore type and truststore file using [`--Xp2p-tls-truststore-type`](#xp2p-tls-truststore-type) and [`--Xp2p-tls-truststore-file`](#xp2p-tls-truststore-file). +- Specify the text file containing the password to unlock the truststore file using [`--Xp2p-tls-truststore-password-file`](#xp2p-tls-keystore-password-file). + +## Command line options + +### `Xp2p-tls-crl-file` + + + +# Syntax + +```bash +--Xp2p-tls-crl-file= +``` + +# Example + +```bash +--Xp2p-tls-crl-file=/home/cert/cert.crl.pem +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_CRL_FILE=/home/cert/cert.crl.pem +``` + + + +Path to the optional certificate revocation list (CRL) file. + +### `Xp2p-tls-enabled` + + + +# Syntax + +```bash +--Xp2p-tls-enabled[=] +``` + +# Example + +```bash +--Xp2p-tls-enabled=true +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_ENABLED=true +``` + + + +Enable TLS for P2P communication. The default is `false`. + +### `Xp2p-tls-keystore-file` + + + +# Syntax + +```bash +--Xp2p-tls-keystore-file= +``` + +# Example + +```bash +--Xp2p-tls-keystore-file=/home/cert/keystore.jks +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_KEYSTORE_FILE=/home/cert/keystore.jks +``` + + + +Keystore file containing the key and certificate to allow TLS for P2P communication. + +### `Xp2p-tls-keystore-password-file` + + + +# Syntax + +```bash +--Xp2p-tls-keystore-password-file= +``` + +# Example + +```bash +--Xp2p-tls-keystore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_KEYSTORE_PASSWORD_FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the keystore file. + +### `Xp2p-tls-keystore-type` + + + +# Syntax + +```bash +--Xp2p-tls-keystore-type= +``` + +# Example + +```bash +--Xp2p-tls-keystore-type=JKS +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_KEYSTORE_TYPE=JKS +``` + + + +Keystore type that allows TLS for P2P communication. Valid options are `JKS`, `PKCS11`, and `PKCS12`. The default is `JKS`. + +### `Xp2p-tls-truststore-file` + + + +# Syntax + +```bash +--Xp2p-tls-truststore-file= +``` + +# Example + +```bash +--Xp2p-tls-truststore-file=/home/cert/truststore.jks +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_TRUSTSTORE_FILE=/home/cert/truststore.jks +``` + + + +Truststore containing the trusted certificates that allows TLS for P2P communication. + +### `Xp2p-tls-truststore-password-file` + + + +# Syntax + +```bash +--Xp2p-tls-truststore-password-file= +``` + +# Example + +```bash +--Xp2p-tls-truststore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the truststore file. + +### `Xp2p-tls-truststore-type` + + + +# Syntax + +```bash +--Xp2p-tls-truststore-type= +``` + +# Example + +```bash +--Xp2p-tls-truststore-type=JKS +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_TRUSTSTORE_TYPE=JKS +``` + + + +Truststore type. Valid options are `JKS`, `PKCS11`, and `PKCS12`. The default is `JKS`. + +[certificate revocation list (CRL)]: https://www.securew2.com/blog/certificate-revocation-crl-explained diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/configure/validators.md b/versioned_docs/version-23.4.1/private-networks/how-to/configure/validators.md new file mode 100644 index 00000000000..0a5be8501e4 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/configure/validators.md @@ -0,0 +1,40 @@ +--- +title: Validators +description: Configuring validators in production networks +sidebar_position: 4 +tags: + - private networks +--- + +# Configure validators in a production network + +As when [configuring bootnodes](bootnodes.md): + +1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) before starting the validator. +1. When creating validators in the cloud (for example, AWS or Azure), attempt to assign static IP addresses to them. If your network is: + + - Publicly accessible, assign an elastic IP address. + - Internal only, specify a private IP address when you create the instance and record this IP address. + +We recommend storing validator configuration under source control. + +## Number of validators required + +Ensure you configure enough validators to allow for redundancy. IBFT 2.0 tolerates `f = (n-1)/3` faulty validators, where: + +- `f` is the number of faulty validators +- `n` is the number of validators. + +## Adding and removing validators + +You can [vote validators in or out of the validator pool]. + +## Validators as bootnodes + +Validators can also be bootnodes. Other than the [usual configuration for bootnodes](bootnodes.md), you do not need to specify any extra configuration when a validator is also a bootnode. + +If you remove a validator that is also a bootnode, ensure there are enough remaining bootnodes on the network. + + + +[vote validators in or out of the validator pool]: consensus/ibft.md#add-and-remove-validators diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/deploy/_category_.json b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/_category_.json new file mode 100644 index 00000000000..5befebd2362 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy for production", + "position": 6 +} diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/deploy/ansible.md b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/ansible.md new file mode 100644 index 00000000000..c8b9b82d5c1 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/ansible.md @@ -0,0 +1,19 @@ +--- +sidebar_position: 2 +title: Use Ansible +description: Deploying Hyperledger Besu with Ansible role on Galaxy +tags: + - private networks +--- + +# Deploy Besu with Ansible + +To deploy Besu using Ansible, use the [Hyperledger Besu role](https://galaxy.ansible.com/consensys/hyperledger_besu) published on Galaxy. + +For more information, see the "Read Me" button on the [Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). + +:::tip + +We strongly recommend automating network creation. Automating makes updates easier and ensures your configuration is synchronized across the network. + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/deploy/cloud.md b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/cloud.md new file mode 100644 index 00000000000..d3d6b36a97c --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/cloud.md @@ -0,0 +1,16 @@ +--- +title: Deploy to the cloud +sidebar_position: 1 +description: Deploying Besu to the cloud +tags: + - private networks +--- + +# Deploy Besu to the cloud + +When deploying Besu to the cloud: + +- Ensure you have enough spread across Availability Zones (AZs) and Regions, especially for bootnodes and validators. +- If your network is a multi-region network, consider using VPC Peering to reduce latency. +- Where required, use VPNs to connect to your on premise systems, or single private chains. +- If deploying to Kubernetes, please refer to the [tutorial](../../tutorials/kubernetes/index.md). diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/deploy/ethstats.md b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/ethstats.md new file mode 100644 index 00000000000..a8a48610cc7 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/ethstats.md @@ -0,0 +1,55 @@ +--- +sidebar_position: 4 +title: Use Ethstats network monitor +description: Ethstats network monitor +tags: + - private networks +--- + +# Connect to Ethstats network monitor + +Connect to [Ethstats](https://ethstats.dev) to display real time and historical [statistics](#statistics) about the network and nodes. You can connect to the Ethstats dashboard by [connecting to a client and server](#connect-through-a-client-and-server) or by [connecting through the command line](#connect-through-the-command-line). + +## Components + +Ethstats consists of: + +- A [server](https://github.com/goerli/ethstats-server), which consumes node data received from the client. +- A [client](https://github.com/goerli/ethstats-client), which extracts data from the node and sends it to the server. +- A [dashboard](https://github.com/goerli/ethstats-client#available-dashboards), which displays statistics. + +## Statistics + +Statistics displayed by Ethstats include: + +- Nodes in the network. Metrics for nodes include: + - Information about the last received block such as block number, block hash, transaction count, uncle count, block time, and propagation time. + - Connected peers, whether the node is mining, hash rate, latency, and uptime. +- Charts for block time, block difficulty, block gas limit, block uncles, block transactions, block gas used, block propagation histogram, and top miners. +- IP-based geolocation overview. +- Node logs, which display the data sent by a node. +- Block history, which provides the ability to go back in time and playback the block propagation through the nodes. + +## Connect through a client and server + +Refer to the external [Ethstats client](https://github.com/goerli/ethstats-client) and [Ethstats server](https://github.com/goerli/ethstats-server) documentation for installing those components and connecting to a dashboard. + +## Connect through the command line + +You can use command line options to connect a node directly to a [dashboard](https://github.com/goerli/ethstats-client#available-dashboards), without using a client. + +Start a node using the [`--ethstats`](../../../public-networks/reference/cli/options.md#ethstats) option to specify the Ethstats server URL. You can specify a contact email to send to the server using [`--ethstats-contact`](../../../public-networks/reference/cli/options.md#ethstats-contact). + +```bash +besu --ethstats=Dev-Node-1:secret@127.0.0.1:3001 --ethstats-contact=contact@mail.com +``` + +:::note + +A server must be specified by `--ethstats` in order to use `--ethstats-contact`. + +::: + +Open the selected dashboard website. Find your node under the list of nodes to see the statistics for the node and the network. + +![dashboard](../../../assets/images/dashboard.png) diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/deploy/kubernetes.md b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/kubernetes.md new file mode 100644 index 00000000000..fe1a95bec41 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/deploy/kubernetes.md @@ -0,0 +1,13 @@ +--- +sidebar_position: 3 +title: Use Kubernetes +description: Deploying Hyperledger Besu with Kubernetes +tags: + - private networks +--- + +# Deploy Besu with Kubernetes + +Use the [reference implementations](https://github.com/ConsenSys/quorum-kubernetes) to install private networks using Kubernetes (K8s). The repository has full support for cloud providers like AWS, Azure, GCP, and IBM, and has production setups that use of identities and cloud-native secret storage services like Azure KeyVault and AWS Secrets Manager. + +Refer to the [tutorial](../../tutorials/kubernetes/index.md) and familiarize yourself with the reference implementations, and customize them to your requirements. diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/index.md b/versioned_docs/version-23.4.1/private-networks/how-to/index.md new file mode 100644 index 00000000000..ae5ae0ada06 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/index.md @@ -0,0 +1,37 @@ +--- +description: Private networks how to overview +tags: + - private networks +--- + +# How to + +This section provides instructional content for private network features. + +The following features are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: + +- Configure and manage: + - [Use a configuration file](../../public-networks/how-to/configuration-file.md) + - [Configure high availability](../../public-networks/how-to/configure-ha/index.md) + - [Configure mining](../../public-networks/how-to/use-pow/mining.md) +- [Use the Besu API](../../public-networks/how-to/use-besu-api/index.md): + - [Use JSON-RPC over HTTP, WS, and IPC](../../public-networks/how-to/use-besu-api/json-rpc.md) + - [Use RPC Pub/Sub over WS](../../public-networks/how-to/use-besu-api/rpc-pubsub.md) + - [Use GraphQL over HTTP](../../public-networks/how-to/use-besu-api/graphql.md) + - [Authenticate JSON-RPC requests](../../public-networks/how-to/use-besu-api/authenticate.md) + - [Access logs using JSON-RPC API](../../public-networks/how-to/use-besu-api/access-logs.md) +- Find and connect to peers: + - [Configure static nodes](../../public-networks/how-to/connect/static-nodes.md) + - [Configure ports](../../public-networks/how-to/connect/configure-ports.md) + - [Manage peers](../../public-networks/how-to/connect/manage-peers.md) + - [Specify NAT method](../../public-networks/how-to/connect/specify-nat.md) +- [Configure the Java Virtual Machine](../../public-networks/how-to/configure-jvm/index.md) + - [Pass JVM options](../../public-networks/how-to/configure-jvm/pass-jvm-options.md) + - [Manage JVM memory](../../public-networks/how-to/configure-jvm/manage-memory.md) + - [Use Java Flight Recorder](../../public-networks/how-to/configure-jvm/java-flight-recorder.md) +- Develop dapps: + - [Use Truffle](../../public-networks/how-to/develop/truffle.md) + - [Use client libraries](../../public-networks/how-to/develop/client-libraries.md) +- Troubleshoot: + - [Use EVM tool](../../public-networks/how-to/troubleshoot/evm-tool.md) + - [Trace transactions](../../public-networks/how-to/troubleshoot/trace-transactions.md) diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/monitor/_category_.json b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/_category_.json new file mode 100644 index 00000000000..8e8c27af9a7 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Monitor nodes", + "position": 3 +} diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/monitor/elastic-stack.md b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/elastic-stack.md new file mode 100644 index 00000000000..b74dd929dfd --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/elastic-stack.md @@ -0,0 +1,35 @@ +--- +title: Use Elastic Stack +sidebar_position: 3 +description: Using Elastic Stack (ELK) with Hyperledger Besu +tags: + - private networks +--- + +# Use Elastic Stack + +[Elastic Stack] (ELK) is an open-source log management platform that is available when using the [Developer Quickstart](../../tutorials/quickstart.md). + +The [Filebeat] configuration ingests logs and the [Metricbeat] configuration collects metrics from the nodes at regular defined intervals and outputs them to Redis for storage. Redis provides a highly available mechanism enabling storage by any of the Elastic Beats and pulled by Logstash as required. + +The [pipeline configuration] defines the JSON format used for Besu logs and automatically picks up any new log fields. + +:::note + +The pipeline configuration must match the your log format. If using the default log format, you can use the [grok plugin](https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html) to extract the log fields. + +::: + +To see the Besu Quickstart network logs in Kibana: + +1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting ELK monitoring. +1. Open the [`Kibana logs address`](http://localhost:5601/app/kibana#/discover) listed by the sample networks `list.sh` script. The logs display in Kibana. + + ![Kibana](../../../assets/images/KibanaQuickstart.png) + + + +[Filebeat]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/filebeat/filebeat.yml +[Metricbeat]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/metricbeat/metricbeat.yml +[pipeline configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/logstash/pipeline/20_besu.conf +[Elastic Stack]: https://www.elastic.co/what-is/elk-stack diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/monitor/index.md b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/index.md new file mode 100644 index 00000000000..8dae03bb8ee --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/index.md @@ -0,0 +1,20 @@ +--- +description: Monitoring using metrics and logging +tags: + - private networks +--- + +# Monitoring + +Use monitoring to identify node and network issues. In private networks, you can [configure metrics and logging](../../../public-networks/how-to/monitor/index.md) as in public networks. + +You can also use the following monitoring tools in private networks: + +- [Loki](loki.md) +- [Elastic Stack](elastic-stack.md) +- [Quorum Hibernate](quorum-hibernate.md) +- [Splunk](splunk.md) +- [OpenTelemetry](opentelemetry.md) +- [Sirato Explorer](sirato-explorer.md) + +For an overview of monitoring Hyperledger Besu, view [this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/monitor/loki.md b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/loki.md new file mode 100644 index 00000000000..eabe6f0667b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/loki.md @@ -0,0 +1,37 @@ +--- +title: Use Grafana Loki +sidebar_position: 2 +description: Using Grafana Loki log management platform with Hyperledger Besu +tags: + - private networks +--- + +# Grafana Loki + +[Grafana Loki] is an open-source log management platform that is available when using the [Developer Quickstart](../../tutorials/quickstart.md). + +The [Promtail configuration] ingests logs at regular defined intervals and outputs them to [Loki] for storage. + +The `pipeline configuration` in Promtail defines pipeline stages that can collate logs natively or using the JSON format. + +:::note + +If using the pipeline regex stage in `Promtail`, configuration must match your log format. + +::: + +To view the GoQuorum Quickstart network logs in Loki: + +1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting Loki monitoring. +2. Open the [`Grafana Loki address`](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=&from=now-15m&to=now) listed by the sample networks `list.sh` script. + + The logs display in Loki. + + ![Loki logs](../../../assets/images/grafana_loki.png) + + + +[Promtail configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/promtail/promtail.yml +[pipeline configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/promtail/promtail.yml +[Loki]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/loki/loki.yml +[Grafana Loki]: https://grafana.com/oss/loki/ diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/monitor/opentelemetry.md b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/opentelemetry.md new file mode 100644 index 00000000000..185b61da3d5 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/opentelemetry.md @@ -0,0 +1,176 @@ +--- +title: Use OpenTelemetry +sidebar_position: 6 +description: Collect Besu information with the OpenTelemetry Collector +tags: + - private networks +--- + +# Use OpenTelemetry + +You can use the OpenTelemetry monitoring and tracing service to gather node metrics and traces. To enable OpenTelemetry to access Hyperledger Besu, use the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) and [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. Use [Splunk](https://splunk.com) to visualize the collected data. A [Besu Sync example](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu-sync) is available. + +:::tip + +Use OpenTelemetry to monitor the sync time of your Besu node and show where time is spent internally and over the JSON-RPC interface. + +[This office hours recording](https://wiki.hyperledger.org/display/BESU/2021-01-19+Office+Hours+Notes) shows examples of monitoring Hyperledger Besu. + +::: + +## Install OpenTelemetry Collector + +Download and install the [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases). + +:::tip + +You can also install exporters that send system metrics to OpenTelemetry to monitor non-Besu-specific items such as disk and CPU usage. The OpenTelemetry Collector can connect to additional applications, and may be deployed in Kubernetes environments as a daemonset. + +::: + +## Setting up and running OpenTelemetry with Besu + +1. Configure OpenTelemetry to accept data from Besu. For example, use the following configuration for your `otel-collector-config.yml` file, and send data to Splunk and Splunk APM: + + ```yml title="otel-collector-config.yml" + receivers: + otlp: + protocols: + grpc: + http: + + exporters: + splunk_hec/traces: + # Splunk HTTP Event Collector token. + token: "11111111-1111-1111-1111-1111111111113" + # URL to a Splunk instance to send data to. + endpoint: "https://:8088/services/collector" + # Optional Splunk source: https://docs.splunk.com/Splexicon:Source + source: "besu:traces" + # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype + sourcetype: "otlp" + # Splunk index, optional name of the Splunk index targeted. + index: "traces" + # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. + max_connections: 20 + # Whether to disable gzip compression over HTTP. Defaults to false. + disable_compression: false + # HTTP timeout when sending data. Defaults to 10s. + timeout: 10s + # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. + # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. + insecure_skip_verify: true + splunk_hec/metrics: + # Splunk HTTP Event Collector token. + token: "11111111-1111-1111-1111-1111111111113" + # URL to a Splunk instance to send data to. + endpoint: "https://:8088/services/collector" + # Optional Splunk source: https://docs.splunk.com/Splexicon:Source + source: "besu:metrics" + # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype + sourcetype: "prometheus" + # Splunk index, optional name of the Splunk index targeted. + index: "metrics" + # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. + max_connections: 20 + # Whether to disable gzip compression over HTTP. Defaults to false. + disable_compression: false + # HTTP timeout when sending data. Defaults to 10s. + timeout: 10s + # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. + # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. + insecure_skip_verify: true + # Traces + sapm: + access_token: "${SPLUNK_ACCESS_TOKEN}" + endpoint: "https://ingest.${SPLUNK_REALM}.signalfx.com/v2/trace" + # Metrics + Events + signalfx: + access_token: "${SPLUNK_ACCESS_TOKEN}" + realm: "${SPLUNK_REALM}" + + processors: + batch: + + extensions: + health_check: + pprof: + zpages: + + service: + extensions: [pprof, zpages, health_check] + pipelines: + traces: + receivers: [otlp] + exporters: [splunk_hec/traces, sapm] + processors: [batch] + metrics: + receivers: [otlp] + exporters: [splunk_hec/metrics, signalfx] + processors: [batch] + ``` + + It is easiest to run the OpenTelemetry collector with Docker with the following command: + + + + # Syntax + + ```bash + docker run -d \ + -v ./otel-collector-config.yml:/etc/otel/config.yaml \ + -e SPLUNK_ACCESS_TOKEN= \ + -e SPLUNK_REALM= \ + -p 4317:4317 \ + otel/opentelemetry-collector-contrib:latest + ``` + + # Example + + ```bash + docker run -d \ + -v ./otel-collector-config.yml:/etc/otel/config.yaml \ + -e SPLUNK_ACCESS_TOKEN=abcdefg654 \ + -e SPLUNK_REALM=us1 \ + -p 4317:4317 \ + otel/opentelemetry-collector-contrib:latest + ``` + + + + You can also refer to this [Docker-compose example](https://github.com/splunk/splunk-connect-for-ethereum/blob/989dc2ccae7d8235bf3ce2a83a18cf0cd1713294/examples/besu-sync/full-sync/docker-compose.yaml). + +2. Start Besu with the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) and [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. For example, run the following command to start a single node: + + + + # Syntax + + ```bash + OTEL_EXPORTER_OTLP_ENDPOINT=https://: besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry + ``` + + # Example + + ```bash + OTEL_EXPORTER_OTLP_ENDPOINT=https://localhost:4317 besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry + ``` + + + + The [OpenTelemetry SDK](https://github.com/open-telemetry/opentelemetry-specification/blob/8f7cdb73618a0b3afa9532b8f8103d719e352781/specification/sdk-environment-variables.md) mandates how to configure the OpenTelemetry gRPC client, so data flows to the collector from Besu. + + You can use the following environment variables: + + | Name | Description | Required | + | --- | --- | --- | + | OTEL_EXPORTER_OTLP_ENDPOINT | OpenTelemetry Collector endpoint, of the form `https://host:port`. The default value is `https://localhost:4317` | Yes | + | OTEL_EXPORTER_OTLP_INSECURE | Whether to allow insecure connections for OpenTelemetry data. False by default. | No | + + + +[Monitoring Besu synchronization to chain with Splunk]: https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu-sync + + + +\*[APM]: Application Performance Monitoring diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/monitor/quorum-hibernate.md b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/quorum-hibernate.md new file mode 100644 index 00000000000..2d6b6139db0 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/quorum-hibernate.md @@ -0,0 +1,20 @@ +--- +title: Use Quorum Hibernate +sidebar_position: 4 +description: Use Quorum Hibernate with Hyperledger Besu +tags: + - private networks +--- + +# Use Quorum Hibernate + +[Quorum Hibernate] is a proxy that monitors a node's API traffic and hibernates the node when inactive. This reduces infrastructure costs by ensuring only nodes receiving API requests or nodes required to establish consensus are running. + +Quorum Hibernate wakes up hibernating nodes: + +- When a new transaction or API request is received. +- To allow it to periodically sync with the network. + + + +[Quorum Hibernate]: https://github.com/ConsenSys/quorum-hibernate diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/monitor/sirato-explorer.md b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/sirato-explorer.md new file mode 100644 index 00000000000..0b197267531 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/sirato-explorer.md @@ -0,0 +1,125 @@ +--- +title: Use Sirato Explorer +sidebar_position: 7 +description: Use Sirato Explorer on a privacy-enabled Besu network +tags: + - private networks +--- + +# Use Sirato Blockchain Explorer + +[Sirato Blockchain Explorer](https://www.web3labs.com/sirato) supports public and private EVM networks. This page describes how to use the free version of Sirato with its built-in support for [privacy-enabled](../../concepts/privacy/index.md) Besu networks created using the [Developer Quickstart](../../tutorials/quickstart.md). + +Sirato provides an overview of the entire network, including block information, contract metadata, transaction searches, and [more](https://medium.com/web3labs/epirus-ethereum-saas-blockchain-explorer-d5d961717d15). + +:::note + +You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, in order to allow access for Besu [privacy API methods](../../reference/api/index.md#priv-methods). In production networks, you must [secure access](../../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. + +::: + +## Prerequisites + +[Docker and Docker Compose](https://docs.docker.com/compose/install/) installed. + +## Start Sirato + +Clone the [Sirato GitHub repository](https://github.com/web3labs/sirato-free): + +```bash +git clone https://github.com/web3labs/sirato-free +``` + +The repository contains Docker Compose scripts to allow Sirato to start with a Developer Quickstart test network. + +From the Sirato directory, run the following script: + + + +# Command + +```bash +./start_sirato_besu.sh +``` + +# Result + +```bash +************************************* +Sirator Explorer for Besu +************************************* +Starting explorer +-------------------- +[+] Running 5/5 + â ŋ Container docker-compose-mongodb-1 Started 3.3s + â ŋ Container docker-compose-api-1 Started 4.1s + â ŋ Container docker-compose-ingestion-1 Started 4.2s + â ŋ Container docker-compose-web-1 Started 4.4s + â ŋ Container docker-compose-nginx-1 Started 5.0s +---------------------------------- +Services +---------------------------------- +Sirato explorer HTTP endpoint : http://localhost:260012 +Sirato is connected to node : http://rpcnode:8545 +``` + + + +Open `http://localhost/` on your browser. You’ll see the new initialization page while it boots up. This may take 5–10 minutes for the all services to start and the ingestion sync to complete. + +![`Sirato-dashboard`](../../../assets/images/sirato-loading.png) + +## Use Sirato + +The **Dashboard** page provides an aggregated view of network activities. + +![`Epirus-dashboard`](../../../assets/images/sirato-dashboard.png) + +The **Network** page provides an overview of the network status and connected peers. This page is disabled by default, and is only visible if you set `DISPLAY_NETWOR_TAB=enabled` using the following command: + +```bash +NODE_ENDPOINT=http://member1besu:8545 DISPLAY_NETWORK_TAB=enabled docker-compose -f docker-compose.yml -f sirato-extensions/docker-compose-quorum-dev-quickstart.yml up +``` + +![Sirato network](../../../assets/images/sirato-network.png) + +The **Blocks** page shows a real-time view of the finalized blocks. + +![Sirato blocks](../../../assets/images/sirato-blocks.png) + +You can view a given block details by selecting a block hash or number. + +![Sirato block details](../../../assets/images/sirato-block-details.png) + +The **Transactions** page shows a paginated view of new and historical transactions. + +![Sirato transactions](../../../assets/images/sirato-transactions.png) + +## Stop Sirato + +To stop all the services from running, run the following script: + + + +# Command + +```bash +./stop.sh +``` + +# Result + +```bash +************************************* +Sirator Explorer for Besu +************************************* +Stopping explorer +[+] Running 5/5 + â ŋ Container docker-compose-nginx-1 Stopped 0.5s + â ŋ Container docker-compose-ingestion-1 Stopped 4.0s + â ŋ Container docker-compose-web-1 Stopped 10.3s + â ŋ Container docker-compose-api-1 Stopped 2.9s + â ŋ Container docker-compose-mongodb-1 Stopped +``` + + diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/monitor/splunk.md b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/splunk.md new file mode 100644 index 00000000000..2b749536740 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/monitor/splunk.md @@ -0,0 +1,192 @@ +--- +title: Use Splunk +sidebar_position: 5 +description: Send Hyperledger Besu logs to Splunk +tags: + - private networks +--- + +# Use Splunk + +[Splunk](https://splunkbase.splunk.com/app/4866/) is a third-party monitoring solution compatible with Besu. A Splunk server can receive Besu logs and enable complex search, visualization, and analysis. + +Splunk can aggregate multiple logs in one place and run complex queries without being connected to the machine running Besu to read the standard output. + +Options for running Splunk and Besu are: + +- [Use Splunk](#use-splunk) + - [Developer Quickstart with Splunk](#developer-quickstart-with-splunk) + - [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose) + - [Requirements](#requirements) + - [Steps](#steps) + - [Use Splunk Enterprise as a Docker container](#use-splunk-enterprise-as-a-docker-container) + - [Prerequisites](#prerequisites) + - [Steps](#steps-1) + - [Run a Splunk Enterprise instance](#run-a-splunk-enterprise-instance) + - [Prerequisites](#prerequisites-1) + - [Steps](#steps-2) + - [Splunk options reference](#splunk-options-reference) + +## Developer Quickstart with Splunk + +To view the Quickstart network logs in Splunk: + +1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting Splunk monitoring. +1. Open the [Splunk UI](http://localhost:8000). + +## Splunk Connect for Ethereum Docker Compose + +To run a development Besu node and connect it to Splunk Enterprise, use the Splunk Connect for Ethereum demonstration Docker Compose environment provided by Splunk. + +### Requirements + +- [Git](https://git-scm.com/) +- [Docker and Docker-compose](https://docs.docker.com/compose/install/) + +:::info + +A Splunk license is not required to use the Splunk Connect for Ethereum demonstration. + +::: + +### Steps + +1. Clone the Splunk Connect for Ethereum repository: + + ```bash + git clone https://github.com/splunk/splunk-connect-for-ethereum.git + cd splunk-connect-for-ethereum + ``` + +1. Start the demonstration environment by following the Splunk Connect for Ethereum repository [README](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu). + + :::note + + Splunk enterprise takes some time to start. + + Run `docker ps` and wait for the `STATUS` of the 3 containers to be `Up [number] seconds (healthy)`. + + ``` + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 127600dd1173 splunkdlt/ethlogger:latest "ethlogger" 53 seconds ago Up 51 seconds (healthy) ethlogger + 88dfcee683c4 splunk/splunk:latest "/sbin/entrypoint.shâ€Ļ" 53 seconds ago Up 52 seconds (healthy) 8065/tcp, 8088-8089/tcp, 8191/tcp, 9887/tcp, 9997/tcp, 0.0.0.0:18000->8000/tcp splunk + 111b0c6d6072 hyperledger/besu:1.4.4 "besu" 53 seconds ago Up 52 seconds (healthy) 8545-8547/tcp, 30303/tcp besu + ``` + + ::: + +## Use Splunk Enterprise as a Docker container + +### Prerequisites + +- [Docker](https://docs.docker.com/compose/install/) +- [Besu 1.4.4](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/CHANGELOG.md#144) or later [installed](../../get-started/install/binary-distribution.md) + +:::info + +A Splunk license is not required to use the trial version of the Splunk Docker image. The image is not suitable for production use and has [restrictions on daily log volume](https://www.splunk.com/). + +::: + +:::note + +If running [Besu as a Docker container](../../get-started/install/run-docker-image.md), consider using [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose) or [Kubernetes](../deploy/kubernetes.md) instead of the Splunk Enterprise trial container. + +::: + +### Steps + +1. Start the Splunk Enterprise container: + + ```bash + docker run \ + -e SPLUNK_START_ARGS=--accept-license \ + -e SPLUNK_HEC_TOKEN=11111111-1111-1111-1111-1111111111113 \ + -e SPLUNK_PASSWORD=changeme \ + --rm \ + -p8080:8000 -p8088:8088 \ + -d \ + --name splunk-demo \ + splunk/splunk:latest + ``` + + Once the service is started, connect on [`http://localhost:8080/`](http://localhost:8080/) and login as the `admin` user with a password of `changeme`. + + :::tip + + To follow the logs of the Splunk container: + + ```bash + docker logs -f splunk-demo + ``` + + ::: + +2. Create the Besu index: + + 1. In the Splunk Web interface, navigate to the [index list in the settings](http://localhost:8080/en-US/manager/search/data/indexes). + 2. [Create an event index] with an Index Name of `besu`. + 3. Leave other fields with the default values. + 4. Save the `besu` index. + +3. Run Besu. To start a Besu node running in development mode, run the following command: + + ```bash + LOGGER=Splunk \ + SPLUNK_URL=https://localhost:8088 \ + SPLUNK_TOKEN=11111111-1111-1111-1111-1111111111113 \ + SPLUNK_SKIPTLSVERIFY=true \ + besu \ + --network=dev \ + --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 \ + --miner-enabled \ + --logging=trace + ``` + + The environment variables specified send the Besu logs to Splunk. Only `LOGGER`, `SPLUNK_URL`, `SPLUNK_TOKEN` and `SPLUNK_SKIPTLSVERIFY` are required in this example. The complete list of options is in the [Splunk options reference table](#splunk-options-reference). + +4. In the Splunk Web interface, navigate to the [search page](http://localhost:8080/en-US/app/search/search). Type `index="besu"` in the search field. Log events sent by Besu are displayed. + + Congratulations! You can now play with the search and other Splunk features to explore your Besu logs. + + ![Splunk search page](../../../assets/images/splunk-ui.png) + +5. Stop Besu with ++ctrl+c++. Stop the Splunk container with `docker stop splunk-demo`. + +## Run a Splunk Enterprise instance + +### Prerequisites + +- [Splunk Enterprise license](https://www.splunk.com/) +- [Besu 1.4.4](https://github.com/hyperledger/besu/blob/master/CHANGELOG.md#144) or later [installed](../../get-started/install/binary-distribution.md) + +### Steps + +1. Follow the steps in the [Splunk Enterprise documentation](https://docs.splunk.com/Documentation/Splunk/8.0.4/Installation) to download, install, and run Splunk Enterprise. + +1. After logging into the Splunk Enterprise Web interface, navigate to the settings to: + + 1. [Create an HTTP Event Collector](https://docs.splunk.com/Documentation/Splunk/8.0.4/Data/UsetheHTTPEventCollector). + 1. [Create an event index] named `besu`. + +1. Run Besu as in step 3 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). Set the `SPLUNK_URL` value to match the HTTP Event Collector address and port. + + You can display logs and use the search engine as in step 4 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). + +## Splunk options reference + +| Name | Description | Required | +| --- | --- | --- | +| LOGGER | Set to `Splunk` to activate sending logs to Splunk. | Yes | +| HOST | Current host. If in a Docker environment, the default value is the docker container ID. Otherwise, the default value is `localhost`. | No | +| SPLUNK_URL | URL of the Splunk HTTP Event Collector. For example, use `https://localhost:8088` | Yes | +| SPLUNK_TOKEN | Authentication token, usually of the form `11111111-1111-1111-1111-111111111111` | Yes | +| SPLUNK_INDEX | [Index](https://docs.splunk.com/Splexicon:Index) to store logs. Defaults to `besu` | No | +| SPLUNK_SOURCE | [Source of the logs](https://docs.splunk.com/Splexicon:Source). Defaults to `besu` | No | +| SPLUNK_SOURCETYPE | [Source type of the logs](https://docs.splunk.com/Splexicon:Sourcetype). Defaults to `besu` | No | +| SPLUNK_BATCH_SIZE_BYTES | Size of a log batch in bytes. Defaults to `65536` | No | +| SPLUNK_BATCH_SIZE_COUNT | Size of a log batch in number of events. Defaults to `1000` | No | +| SPLUNK_BATCH_INTERVAL | Interval at which to send log batches. Defaults to `500` | No | +| SPLUNK_SKIPTLSVERIFY | Whether to check the Splunk instance TLS certificate when sending data. Defaults to `false` | No | + +[Create an event index]: https://docs.splunk.com/Documentation/Splunk/8.0.4/Indexer/Setupmultipleindexes#Create_events_indexes diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/_category_.json b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/_category_.json new file mode 100644 index 00000000000..a663c5c6ed7 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create and send transactions", + "position": 2 +} diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/concurrent-private-transactions.md b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/concurrent-private-transactions.md new file mode 100644 index 00000000000..a1fb71eb48a --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/concurrent-private-transactions.md @@ -0,0 +1,37 @@ +--- +title: Send concurrent private transactions +description: Creating and sending concurrent private transactions with Hyperledger Besu +sidebar_position: 2 +tags: + - private networks +--- + +# Send concurrent private transactions + +Private transaction processing involves two transactions, the private transaction and the [privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md). The private transaction and the PMT each have their own [nonce](../../concepts/privacy/private-transactions/index.md#nonces). + +If your private transaction rate requires sending private transactions without waiting for the previous private transaction to be mined, using [`eth_getTransactionCount`](../../../public-networks/reference/api/index.md#eth_gettransactioncount) and [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) may result in [incorrect nonces](../../concepts/privacy/private-transactions/index.md#private-nonce-management). + +In this case, use [`priv_distributeRawTransaction`](private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +:::note + +You can use [`priv_getTransactionCount`](../../reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for an account for the specified privacy group or participants. + +::: + +Send the corresponding PMT using [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), specifying the public PMT nonce. This method allows you to create and send the PMT yourself rather than [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) handling the PMT. + +:::caution + +When using `priv_distributeRawTransaction` to distribute transactions with consecutive nonces for the same account, the corresponding PMTs must use one account with the nonces in the same order as the private transactions. + +This is to ensure that the private transactions are executed in the correct order. + +::: + +:::info + +The [web3js-quorum library](https://github.com/ConsenSys/web3js-quorum/tree/master/example/concurrentPrivateTransactions) includes an example of how to send concurrent private transactions. The example uses [offchain privacy groups](../../concepts/privacy/privacy-groups.md). Use [`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress) to get the precompile address to specify in the `to` field when creating the PMT. + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/index.md b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/index.md new file mode 100644 index 00000000000..3f9920a3d31 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/index.md @@ -0,0 +1,16 @@ +--- +title: Create and send transactions +description: private networks send transactions overview +tags: + - private networks +--- + +# Create and send transactions + +In private networks, you can create and [send regular transactions](../../../public-networks/how-to/send-transactions.md) as in public networks. + +You can also: + +- [Send private transactions](private-transactions.md). +- [Send concurrent private transactions](concurrent-private-transactions.md). +- [Include revert reason in transactions](revert-reason.md). diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/private-transactions.md b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/private-transactions.md new file mode 100644 index 00000000000..cdeb49aec37 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/private-transactions.md @@ -0,0 +1,142 @@ +--- +title: Create and send private transactions +description: Creating and sending private transactions with Hyperledger Besu +sidebar_position: 1 +tags: + - private networks +--- + +# Create and send private transactions + +Create and send [private transactions](../../concepts/privacy/index.md) using: + +- [web3js-quorum client library](../use-privacy/web3js-quorum.md) or [web3j client library](https://github.com/web3j/web3j) +- [`eea_sendTransaction` with EthSigner](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction) +- [`eea_sendRawTransaction`](#eea_sendrawtransaction) +- [`priv_distributeRawTransaction`](#priv_distributerawtransaction). + +All private transaction participants must be online for a private transaction to be successfully distributed. If any participants are offline when submitting the private transaction, the transaction is not attempted and you must resubmit the transaction. + +The `gas` and `gasPrice` specified when sending a private transaction are used by the [privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md), not the private transaction itself. + +:::note + +Private transactions either deploy contracts or call contract functions. Ether transfer transactions cannot be private. + +::: + +## eea_sendRawTransaction + +[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) distributes the private transaction to the participating nodes, and signs and submits the PMT, as described in [Private transaction processing](../../concepts/privacy/private-transactions/processing.md). + +:::note + +If [sending concurrent transactions](concurrent-private-transactions.md), you must use [`priv_distributeRawTransaction`](#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +::: + +## priv_distributeRawTransaction + +Use [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction) when sending [concurrent private transactions](concurrent-private-transactions.md). + +[`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) distributes the private transaction to the participating nodes but does not sign and submit the PMT. That is, it performs steps 1 to 5 of [private transaction processing](../../concepts/privacy/private-transactions/processing.md). + +If using [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction), use the value returned by [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction), which is the enclave key to the private transaction in [Tessera](https://docs.tessera.consensys.net/), in the `data` field of a call to [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction). Use the value returned by [`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress), which is the address of the [privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md), in the `to` field of the call. + +By using the [public Ethereum transaction](../../how-to/send-transactions/index.md), [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), you are signing and submitting the PMT yourself instead of having it signed by the Besu node, giving you greater control over the PMT. + +:::warning + +If the PMT is not sent after distributing the private transaction, the distributed private transaction is not executed and the private states are not updated. + +::: + +```json title="Distribute private transaction using priv_distributeRawTransaction" +{ + "jsonrpc": "2.0", + "method": "priv_distributeRawTransaction", + "params": [ + "0xf90198808203e8832dc6c08080b8fb608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c003600291ba05393543d483654fd01d9ee818cddfc7527dd6e13e6ef7b45a61e2ca13ffb6b70a0452338873862803ffe04056aea98cd0e3417ff971dcb384e54fce8ca1756a665a09de8260dc3763f8383a6a9ffe96909d36cd3ff4c346e3846a6467c50feaf0119e1a0839f41993789227ec721c9eaf1541683287fa436ef6edd9ec8fd088bad1a0c3c8a72657374726963746564" + ], + "id": 1 +} +``` + +```json title="Enclave key to the private transaction in Tessera returned by priv_distributeRawTransaction" +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" +} +``` + +Send the enclave key in the `data` field, and the [privacy precompile address](../../reference/api/index.md#priv_getprivacyprecompileaddress) in the `to` field of `eth_sendRawTransaction`: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_sendRawTransaction", + "params": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "to": "0x000000000000000000000000000000000000007e", + "data": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b", + "gas": "0x2E1800", + "gasPrice": "0x9184e72a000" + } + ], + "id": 1 +} +``` + +## EEA-compliant or Besu-extended privacy + +To create an [EEA-compliant private transaction], specify `privateFor` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +To create a [Besu-extended private transaction], specify a `privacyGroupId` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +## Unsigned and unencoded private transactions + +The [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) parameter is a signed RLP-encoded private transaction. Shown below are examples of unsigned and unencoded private transactions to create a contract. + +```json title="Unencoded and unsigned EEA-compliant private transaction" +{ + "to": null, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x7600", + "gasPrice": "0x0", + "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "nonce": "0x0", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privateFor": [ + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=", + "6fg8q5rWMBoAT2oIiU3tYJbk4b7oAr7dxaaVY7TeM3U=" + ], + "restriction": "restricted" +} +``` + +```json title="Unencoded and unsigned Besu-extended private transaction" +{ + "to": null, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x7600", + "gasPrice": "0x0", + "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "nonce": "0x0", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privacyGroupId": "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=", + "restriction": "restricted" +} +``` + +:::tip + +The `example` directory in the [web3js-quorum client library](../use-privacy/web3js-quorum.md) contains examples of signing and encoding private transactions. + +::: + + + +[EEA-compliant private transaction]: ../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy +[Besu-extended private transaction]: ../../concepts/privacy/privacy-groups.md#besu-extended-privacy diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/revert-reason.md b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/revert-reason.md new file mode 100644 index 00000000000..b501e3a09dc --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/send-transactions/revert-reason.md @@ -0,0 +1,140 @@ +--- +title: Include revert reason +description: Including revert reason in transactions with Hyperledger Besu +sidebar_position: 3 +tags: + - private networks +--- + +# Revert reason + +In smart contracts, the [`revert`](https://docs.soliditylang.org/en/v0.8.12/control-structures.html#revert) operation triggers an exception to flag an error and revert the current call. The EVM passes back to the client an optional string message containing information about the error. + +```sol +pragma solidity ^0.8.4; + +contract VendingMachine { + address owner; + constructor() { + owner = msg.sender; + } + error Unauthorized(); + function buy(uint amount) public payable { + if (amount > msg.value / 2 ether) + revert("Not enough Ether provided."); + // Alternative way to do it: + require( + amount <= msg.value / 2 ether, + "Not enough Ether provided." + ); + // Perform the purchase. + } + function withdraw() public { + if (msg.sender != owner) + revert Unauthorized(); + + payable(msg.sender).transfer(address(this).balance); + } +} +``` + +## Enable revert reason + +Use the [`--revert-reason-enabled`](../../../public-networks/reference/cli/options.md#revert-reason-enabled) command line option to include the revert reason in the transaction receipt, [`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) error, [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) error, and [`trace`](../../../public-networks/reference/trace-types.md#trace) response in Hyperledger Besu. + +:::caution + +Enabling revert reason may use a significant amount of memory. We do not recommend enabling revert reason when connected to public Ethereum networks. + +::: + +## Where the revert reason is included + +With revert reason enabled, the transaction receipt returned by [`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt) includes the revert reason as an ABI-encoded string. + +:::info + +The revert reason is not included in the transactions receipt's root hash. Not including the revert reason in the transactions receipt's root hash means the revert reason is only available to nodes that execute the transaction when importing the block. That is, the revert reason is not available if using fast synchronization ([`--sync-mode=FAST`](../../../public-networks/reference/cli/options.md#sync-mode)). + +::: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": null, + "cumulativeGasUsed": "0x5208", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gasUsed": "0x5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", + "transactionIndex": "0x0", + "revertReason": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" + } +} +``` + +The error returned by [`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) and [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) includes the revert reason as an ABI-encoded string in the `data` field. + +```json title="Exampleof `eth_estimateGas`and`eth_call` error" { "jsonrpc": "2.0", "id": 3, "error": { "code": -32000, "message": "Execution reverted", "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" } } + +```` + +The list items in the [`trace`](../../../public-networks/reference/trace-types.md#trace) response returned by [`trace_replayBlockTransactions`](../../../public-networks/reference/api/index.md#trace_replayblocktransactions), [`trace_block`](../../../public-networks/reference/api/index.md#trace_block), and [`trace_transaction`](../../../public-networks/reference/api/index.md#trace_transaction) include the revert reason as an ABI-encoded string. + +```json title="Example of `trace` response list item" +{ + "jsonrpc": "2.0", + "id": 415, + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffadea", + "input": "0x", + "to": "0x0110000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x220bc13dc4f1ed38dcca927a5be15eca16497d279f4c40d7b8fe9704eadf1464", + "blockNumber": 18, + "error": "Reverted", + "revertReason": "0x7d88c1856cc95352", + "subtraces": 0, + "traceAddress": [], + "transactionHash": "0xc388baa0e55e6b73e850b22dc7e9853700f6b995fd55d95dd6ccd5a13d63c566", + "transactionPosition": 1, + "type": "call" + } + ] +} +```` + +## Revert reason format + +As described in the [Solidity documentation], the revert reason is an ABI-encoded string consisting of: + +```bash +0x08c379a0 // Function selector for Error(string) +0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset +0x000000000000000000000000000000000000000000000000000000000000001a // String length +0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data +``` + +```bash title="Example of revert reason string for 'Not enough Ether provided' " +"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" +``` + +## Dapp support + +Client libraries, such as web3j, do not support extracting the revert reason from the transaction receipt. To extract the revert reason your dapp must interact directly with Besu using a custom JSON -> Object converter. + + + +[Solidity documentation]: https://docs.soliditylang.org/en/v0.8.12/control-structures.html#revert diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/upgrade.md b/versioned_docs/version-23.4.1/private-networks/how-to/upgrade.md new file mode 100644 index 00000000000..9d985eeb6e4 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/upgrade.md @@ -0,0 +1,44 @@ +--- +title: Upgrade +description: Upgrading protocol versions +sidebar_position: 8 +tags: + - private networks +--- + +# Network and protocol upgrades + +:::info + +Node upgrades upgrade your Besu client to a later version. In private networks, you can [upgrade your node](../../public-networks/how-to/upgrade-node.md) as in public networks. + +::: + +Network upgrades are the mechanism for upgrading the Ethereum protocol. Protocol upgrades occur during the network upgrades. + +For Ethereum Mainnet and public testnets, the milestone block definitions are included in Besu. Upgrading your Besu client applies the network upgrade. + +For private networks, all network participants must agree on the protocol upgrades and coordinate the network upgrades. The genesis file specifies the milestone block at which to apply the protocol upgrade. + +## Upgrade the protocol + +To upgrade the protocol in a private network: + +1. Review included EIPs for breaking changes. A [meta EIP](https://eips.ethereum.org/meta) for each protocol upgrade lists included EIPs. For example, [Istanbul](https://eips.ethereum.org/EIPS/eip-1679). +1. Network participants agree on the block number at which to upgrade. +1. For each node in the network: + 1. Add the [milestone block number](../../public-networks/reference/genesis-items.md#milestone-blocks) to the genesis file. + 1. Restart the node before reaching milestone block. + +:::caution + +To avoid a forked network, all network participants must update their genesis file to include the agreed on milestone block and restart their node before reaching the milestone block. + +::: + +:::tip + +- For compatibility with future protocol upgrades, don't hardcode any gas price assumptions. +- Implementing upgradeable contracts enables contracts to be upgraded if a protocol upgrade does include breaking changes. + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-permissioning/_category_.json b/versioned_docs/version-23.4.1/private-networks/how-to/use-permissioning/_category_.json new file mode 100644 index 00000000000..cbca3cfba02 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use permissioning", + "position": 5 +} diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-permissioning/local.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-permissioning/local.md new file mode 100644 index 00000000000..c1269a66d9e --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-permissioning/local.md @@ -0,0 +1,191 @@ +--- +title: Use local permissioning +sidebar_position: 1 +description: Hyperledger Besu local permissioning +tags: + - private networks +--- + +# Use local permissioning + +[Local permissioning](../../concepts/permissioning/index.md#local) supports node and account allowlisting. + +## Node allowlisting + +You can allow access to specified nodes in the [permissions configuration file](#permissions-configuration-file). With node allowlisting enabled, communication is only between nodes in the allowlist. + +:::info + +Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option to enable domain name support. + +If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can connect to a container after being restarted, even if the IP address of the container changes. + +::: + +:::info Nodes allowlist in the permissions configuration file + +`nodes-allowlist=["enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.168.0.9:4567","enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.169.0.9:4568"]` + +::: + +Node allowlisting is at the node level. That is, each node in the network has a [permissions configuration file](#permissions-configuration-file) file in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +Local permissioning doesn't check that the node using the permissions configuration file is listed in the allowlist, it only checks that the remote end of the connection is in the allowlist. Use [onchain permissioning] if you need to check both ends of the connection. + +### Specify bootnodes in the allowlist + +The nodes permissions list must include the [bootnodes](../configure/bootnodes.md) or Hyperledger Besu doesn't start with node permissions enabled. + +If you start Besu with specified bootnodes and have node permissioning enabled: + +```bash +--bootnodes="enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305" +``` + +The `nodes-allowlist` in the [permissions configuration file](#permissions-configuration-file) must contain the specified bootnodes. + +:::tip + +If your node has two different IP addresses for ingress and egress (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. + +::: + +### Enable node allowlisting + +To enable node allowlisting, specify the [`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) option when starting Besu. + +The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +### Update the node allowlist + +To update the nodes allowlist while the node is running, use the following JSON-RPC API methods: + +- [perm_addNodesToAllowlist](../../reference/api/index.md#perm_addnodestoallowlist) +- [perm_removeNodesFromAllowlist](../../reference/api/index.md#perm_removenodesfromallowlist) + +You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly and then update the allowlist using the [`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) method. + +Updates to the permissions configuration file persist across node restarts. + +### View the node allowlist + +To view the nodes allowlist, use the [perm_getNodesAllowlist](../../reference/api/index.md#perm_getnodesallowlist) method. + +:::note + +Each node has a [permissions configuration file](#permissions-configuration-file), which means nodes can have different nodes allowlists. This means nodes might be participating in the network that are not on the allowlist of other nodes in the network. We recommend each node in the network has the same nodes allowlist. + +::: + +```bash Example of different node allowlists + +Node 1 Allowlist = [Node 2, Node 3] + +Node 2 Allowlist = [Node 3, Node 5] + +Node 5 is participating in the same network as Node 1 even though Node 1 does not have Node 5 +on their allowlist. +``` + +## Account allowlisting + +You can specify accounts in the accounts allowlist in the [permissions configuration file](#permissions-configuration-file). A node with account permissioning accepts transactions only from accounts in the accounts allowlist. + +:::info Accounts allowlist in the permissions configuration file + +`accounts-allowlist=["0x0000000000000000000000000000000000000009"]` + +::: + +Account allowlisting is at the node level. That is, each node in the network has a [permissions configuration file](#permissions-configuration-file) in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +:::caution Using account permissioning and privacy + +Account permissioning is incompatible with [random key signing](../use-privacy/sign-pmts.md) for [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md). + +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: + +Transaction validation against the accounts allowlist occurs at the following points: + +- Submitted by JSON-RPC API method [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) +- Received via propagation from another node +- Added to a block by a mining node + +After adding transactions to a block, the transactions are not validated against the allowlist when received by another node. That is, a node can synchronize and add blocks containing transactions from accounts that are not on the accounts allowlist of that node. + +The following diagram illustrates applying local and onchain permissioning rules. + +![Permissioning Flow](../../../assets/images/PermissioningFlow.png) + +```bash title="Example of different account allowlists" + +Node 1 Allowlist = [Account A, Account B] + +Node 2 Allowlist = [Account B, Account C] + +Mining Node Allowlist = [Account A, Account B] + +Account A submits a transaction on Node 1. Node 1 validates and propagates the transaction. The +Mining Node receives the transaction, validates it is from an account in the Mining Node +accounts allowlist, and includes the transaction in the block. Node 2 receives and adds +the block created by the Mining Node. + +Node 2 now has a transaction in the blockchain from Account A, which is not on the accounts +allowlist for Node 2. + +``` + +:::note + +Each node has a [permissions configuration file](#permissions-configuration-file) which means nodes in the network can have different accounts allowlists. This means a transaction can be successfully submitted by Node A from an account in the Node A allowlist but rejected by Node B to which it's propagated if the account is not in the Node B allowlist. We recommend each node in the network has the same accounts allowlist. + +::: + +### Enable account allowlisting + +To enable account allowlisting, specify the [`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled) option when starting Besu. + +The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +### Update the account allowlist + +To update the accounts allowlist when the node is running, use the JSON-RPC API methods: + +- [`perm_addAccountsToAllowlist`](../../reference/api/index.md#perm_addaccountstoallowlist) +- [`perm_removeAccountsFromAllowlist`](../../reference/api/index.md#perm_removeaccountsfromallowlist). + +You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly and use the [`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) method to update the allowlists. + +Updates to the permissions configuration file persist across node restarts. + +### View the account allowlist + +To view the accounts allowlist, use the [`perm_getAccountsAllowlist`](../../reference/api/index.md#perm_getaccountsallowlist) method. + +## Permissions configuration file + +The permissions configuration file contains the nodes and accounts allowlists. If the [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options are not specified, the name of the permissions configuration file must be [`permissions_config.toml`](#permissions-configuration-file) and must be in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +You can specify the accounts and nodes allowlists in the same file or in separate files for accounts and nodes. + +To specify a permissions configuration file (or separate files for accounts and nodes) in any location, use the [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options. + +:::note + +The [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options are not used when running Besu from the [Docker image](../../get-started/install/run-docker-image.md). Use a bind mount to [specify a permissions configuration file with Docker]. + +::: + +```toml title="Sample permissions configuration file" +accounts-allowlist=["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"] + +nodes-allowlist=["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305"] +``` + + + +[specify a permissions configuration file with Docker]: ../../get-started/install/run-docker-image.md +[support domain names]: ../../../public-networks/concepts/node-keys.md#domain-name-support +[onchain permissioning]: ../../concepts/permissioning/onchain.md diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-permissioning/onchain.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-permissioning/onchain.md new file mode 100644 index 00000000000..4b177026a20 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-permissioning/onchain.md @@ -0,0 +1,60 @@ +--- +title: Use onchain permissioning +sidebar_position: 2 +description: Use onchain permissioning allowlists +tags: + - private networks +--- + +# Use onchain permissioning + +This page contains some extra info if you're using [onchain permissioning](../../concepts/permissioning/onchain.md). + +:::tip + +If your node has two different IP addresses for ingress and egress (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. + +::: + +:::important + +Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option to enable domain name support. + +If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can connect to a container after being restarted, even if the IP address of the container changes. + +::: + +:::tip + +If you add a running node, the node does not attempt to reconnect to the bootnode and synchronize until peer discovery restarts. To add an allowlisted node as a peer without waiting for peer discovery to restart, use [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer). + +If you add the node to the allowlist before starting the node, using `admin_addPeer` is not required because peer discovery is run on node startup. + +::: + +:::tip + +If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) and search for messages containing `Node permissioning` to identify the issue. + +Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been correctly configured for all nodes with the externally accessible address. + +If you change your network configuration, you may need to update the node allowlist. + +::: + +## Specify the permissioning contract interface version + +Use the [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version) command line option to specify the version of the [permissioning contract interface](../../concepts/permissioning/onchain.md#permissioning-contracts). The default is 1. + +Specify the contract interface version that maps to the version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/) the contract interface implements. + +| | EEA Client Specification | Contract interface | +| :------ | :----------------------- | :----------------- | +| Version | 5 | 1 | +| Version | 6 | 2 | + +The permissioning contracts in the [`ConsenSys/permissioning-smart-contracts`](https://github.com/ConsenSys/permissioning-smart-contracts) repository implement the version 2 contract interface. + +[support domain names]: ../../../public-networks/concepts/node-keys.md#domain-name-support +[projects release page]: https://github.com/ConsenSys/permissioning-smart-contracts/releases/latest +[onchain permissioning tutorial]: ../../tutorials/permissioning/onchain.md diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/_category_.json b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/_category_.json new file mode 100644 index 00000000000..f2a1d4ca864 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use privacy", + "position": 4 +} diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/access-private-transactions.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/access-private-transactions.md new file mode 100644 index 00000000000..611f57269a3 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/access-private-transactions.md @@ -0,0 +1,33 @@ +--- +title: Access private and privacy marker transactions +description: Methods for accessing and managing private transactions and privacy groups in Hyperledger Besu +sidebar_position: 6 +tags: + - private networks +--- + +# Access private and privacy marker transactions + +A Hyperledger Besu private transaction creates a [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) and the private transaction itself. + +## Transaction receipts + +With the transaction hash returned when submitting the private transaction, to get the transaction receipt for the: + +- Private transaction, use [`priv_getTransactionReceipt`](../../reference/api/index.md#priv_gettransactionreceipt). +- Privacy marker transaction, use [`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt). + +The transaction receipt includes a `status` indicating if the transaction failed (`0x0`), succeeded (`0x1`), or was invalid (`0x2`). + +:::note Private transaction failure example + +To deploy a private contract, you submit a transaction using [`eea_sendRawTransaction`](../send-transactions/private-transactions.md). If contract deployment fails because of insufficient gas, the privacy marker transaction receipt has a status of success and the private transaction receipt has a status of failure. + +::: + +## Transactions + +With the transaction hash returned when submitting the private transaction, to get the: + +- Private transaction, use [`priv_getPrivateTransaction`](../../reference/api/index.md#priv_getprivatetransaction). +- Privacy marker transaction, use [`eth_getTransactionByHash`](../../../public-networks/reference/api/index.md#eth_gettransactionbyhash). diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/besu-extended.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/besu-extended.md new file mode 100644 index 00000000000..40c1c7d365e --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/besu-extended.md @@ -0,0 +1,40 @@ +--- +title: Use Besu-extended privacy +description: Hyperledger Besu-extended privacy +sidebar_position: 2 +tags: + - private networks +--- + +# Use Besu-extended privacy + +Hyperledger Besu provides an extended implementation of privacy allowing you to [create a privacy group for a set of participants](../../concepts/privacy/privacy-groups.md). You must specify the privacy group ID when sending private transactions. + +To enable the [`PRIV` API methods](../../reference/api/index.md#priv-methods), use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. + +To create the privacy group containing the recipients of a private transaction, use [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup). + +To create an EEA-compliant private transaction, specify `privacyGroupId` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +## Privacy group type + +Privacy groups created using [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) have a `BESU` privacy group type when returned by [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", + "name": "Group B", + "description": "Description of Group B", + "type": "BESU", + "members": [ + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" + ] + } + ] +} +``` diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/eea-compliant.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/eea-compliant.md new file mode 100644 index 00000000000..300c0b987fd --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/eea-compliant.md @@ -0,0 +1,38 @@ +--- +title: Use EEA-compliant privacy +description: Hyperledger Besu JSON-RPC methods to use for EEA-compliant privacy +sidebar_position: 1 +tags: + - private networks +--- + +# Use EEA-compliant privacy + +When using Hyperledger Besu [EEA-compliant privacy](../../concepts/privacy/privacy-groups.md), the group of nodes specified by `privateFrom` and `privateFor` form a privacy group, to which Tessera assigns a unique privacy group ID. + +To enable the [`EEA` API methods](../../reference/api/index.md#eea-methods), use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. + +To create an EEA-compliant private transaction, specify `privateFor` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +## Privacy group type + +Privacy groups created when specifying `privateFrom` and `privateFor` have a `LEGACY` privacy group type when returned by [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "68/Cq0mVjB8FbXDLE1tbDRAvD/srluIok137uFOaClM=", + "name": "legacy", + "description": "Privacy groups to support the creation of groups by privateFor and privateFrom", + "type": "LEGACY", + "members": [ + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=", + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=" + ] + } + ] +} +``` diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/flexible.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/flexible.md new file mode 100644 index 00000000000..abf1892732b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/flexible.md @@ -0,0 +1,62 @@ +--- +title: Use flexible privacy groups +description: Use flexible privacy groups +sidebar_position: 5 +tags: + - private networks +--- + +# Use flexible privacy groups + +Use the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) to create and update membership of [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). + +:::tip + +Because group membership for flexible privacy groups is stored in a smart contract, flexible privacy groups are also known as onchain privacy groups. + +::: + +:::info + +[Flexible privacy groups](../../concepts/privacy/flexible-privacy.md) are an early access feature. Don't use in production networks. + +The flexible privacy group interfaces may change between releases. There might not be an upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy group functionality in future versions. + +We don't recommend creating flexible privacy groups in a chain with existing [offchain privacy groups](../../concepts/privacy/privacy-groups.md). + +::: + +## Enable flexible privacy groups + +Use the [`--privacy-flexible-groups-enabled`](../../reference/cli/options.md#privacy-flexible-groups-enabled) command line option to enable [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). When flexible privacy groups are enabled, the [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup), [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup), and [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) methods for [offchain privacy groups](../../concepts/privacy/privacy-groups.md) are disabled. + +## Simple flexible privacy group example + +To create and find a [flexible privacy group](../../concepts/privacy/flexible-privacy.md) using the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum): + +1. Update the `example/keys.js` file to match your network configuration. + +1. Run: + + ```bash + cd example/onchainPrivacy + node simpleExample.js + ``` + + This script creates the flexible privacy group with two members. `findPrivacyGroup` finds and displays the created privacy group. + +:::tip + +The Tessera logs for Tessera 1 and Tessera 2 display `PrivacyGroupNotFound` errors. This is expected behavior because private transactions check offchain and onchain to find the privacy group for a private transaction. + +::: + +## Add and remove members + +To add and remove members from a [flexible privacy group](../../concepts/privacy/flexible-privacy.md), use the `addTo` and `removeFrom` methods in the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) client library. + +:::note + +When adding a member, Besu pushes all existing group transactions to the new member and processes them. If there are a large number of existing transactions, adding the member may take some time. + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/performance-best-practices.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/performance-best-practices.md new file mode 100644 index 00000000000..5559d610189 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/performance-best-practices.md @@ -0,0 +1,61 @@ +--- +title: Performance best practices +description: Performance best practices +sidebar_position: 10 +tags: + - private networks +--- + +# Performance best practices + +This document collects deployment and usage tips to help you achieve high performance for private transactions. If transaction throughput or latency is not meeting your expectations, please consider the following before raising an issue. + +## General performance + +Private transactions use the same facilities as public ones. General Besu performance tunings apply. Specific approaches are out of scope of this document, except for the following, which strongly impacts performance: + +### Use fast, local, solid state storage + +Running EVM transactions creates a lot of random reads that are executed sequentially. The Besu data folder for high throughput nodes should be located on the fastest possible storage media. + +- Prefer [NVMe](https://cloud.google.com/compute/docs/disks/local-ssd#performance) attached SLC flash or Intel Optane. +- Avoid network attached SSDs or cloud storage with limited input/output operations per second. +- Do not use spinning disks under any circumstances. + +## Private transaction performance + +### Use concurrent submission + +When submitting a private transaction using [web3js-quorum](https://github.com/ConsenSys/web3js-quorum), the submit call will only return once the privacy marker transaction has been included in a block. This limits the throughput to at most one private transaction per block when submitting from a single thread. To increase throughput, use web3js-quorum from multiple concurrent threads or processes. + +### Co-locate Besu and Tessera + +Besu has to talk to its local Tessera node frequently while handling a block. While we do not recommend running them on the same node, minimizing the latency between Besu and Tessera will improve block processing times. Besu and Tessera should not be hosted in geographically distributed locations. + +### Optimize worst-case latency between Tessera nodes + +When distributing a new private transaction between Tessera nodes, the overall throughput is determined by the slowest Tessera nodes. Try to minimize network latency between Tessera nodes and do not mix different machine types when hosting Tessera. + +### Use stateful nonce management + +Management of public and private nonces in web3js-quorum is stateless: before a transaction is sent, web3js-quorum has to query for those nonces. This is increasing latency, the node's load, and is a source of fragility due to nonce collision when multiple senders try to use the same account concurrently. + +For performance and reliability it is advantageous to manage nonces in a stateful manner on the client side instead of querying them for every transaction. If custom code for this is not an option, [Orchestrate](https://consensys.net/codefi/orchestrate/) can be used. + +### Use random senders for privacy marker transactions + +To avoid public nonce management, privacy marker transactions can be sent using a [random account per transaction](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#privacy-marker-transaction-signing-key-file). This option is only available for zero gas networks. + +### Avoid queuing transactions in Tessera + +When Tessera is overloaded with transactions, the performance breaks down catastrophically due to unbounded growth of the request queue. Avoid sending more transactions to Tessera than it can handle. Sudden jumps in submission latency and submission failure rate should be answered with a load reduction on the client side, for example using a back-off scheme. + +Please note that this is not Tessera specific but a general issue in distributed systems. It just happens that if queueing discipline is not maintained, Tessera tends to be the first component to fail. + +### Limit the group size to reduce communication overhead + +Smaller groups need fewer communication for transaction propagation. If reducing the number of Tessera nodes involved in a transaction is an option, it will lead to slightly better tail latencies. Multi-tenancy Tessera can be used to have large groups with a small number of Tessera nodes (possibly only one). + +### Limit group membership changes and make them quick + +Groups are locked (prevented from executing transactions) during membership changes. Try to minimize the number of times the membership changes. When possible, spread load across multiple groups to always have some groups available while others are locked. Consider batching group membership changes if possible. Note however that this does not work with the default management contract, yet. diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/privacy-groups.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/privacy-groups.md new file mode 100644 index 00000000000..1b3f0fadf23 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/privacy-groups.md @@ -0,0 +1,21 @@ +--- +title: Create and manage privacy groups +description: Create and manage privacy groups with Hyperledger Besu +sidebar_position: 4 +tags: + - private networks +--- + +# Create and manage privacy groups + +Hyperledger Besu-extended privacy provides JSON-RPC API methods for creating and managing privacy groups: + +- [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) +- [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) +- [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). + +:::tip + +You can find and delete [EEA-compliant privacy groups](../../concepts/privacy/privacy-groups.md) using [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) and [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/sign-pmts.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/sign-pmts.md new file mode 100644 index 00000000000..7ad0029f5d1 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/sign-pmts.md @@ -0,0 +1,39 @@ +--- +title: Sign privacy marker transactions +description: How to sign a privacy marker transaction with Hyperledger Besu +sidebar_position: 7 +tags: + - private networks +--- + +# Sign privacy marker transactions + +You can sign privacy marker transactions (PMTs) with either a random key or a specified key. To sign privacy marker transactions with a specified private key, use [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) when starting Hyperledger Besu. + +:::note + +The private key file can be the same file used by [`--node-private-key-file`](#node-private-key-file), or a different key file to identify who signed the privacy marker transaction. + +::: + +In networks where you pay gas, you must specify a key and the associated account must contain adequate funds. + +In [free gas networks](../configure/free-gas.md), to provide further anonymity by signing each privacy marker transaction with a different random key, exclude the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option when starting Besu. + +:::caution "Using account permissioning and privacy" + +You can't use [account permissioning] with random key signing. + +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: + +:::note + +Besu signs privacy marker transactions during the [private transaction process](../../concepts/privacy/private-transactions/processing.md). + +::: + + + +[account permissioning]: ../../concepts/permissioning/index.md#account-permissioning diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/tessera.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/tessera.md new file mode 100644 index 00000000000..02754f3fe8f --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/tessera.md @@ -0,0 +1,41 @@ +--- +title: Run Tessera with Besu +description: Running ConsenSys Quorum Tessera with Hyperledger Besu +sidebar_position: 3 +tags: + - private networks +--- + +# Run Tessera with Besu + +To enable [privacy functionality](../../concepts/privacy/index.md) in production systems, [Tessera](https://docs.tessera.consensys.net/) must be [highly available](#high-availability) and [run in a separate instance](#separate-instances) to Hyperledger Besu. + +![Besu-Tessera-High-Availability](../../../assets/images/Besu-Tessera-High-Availability.png) + +:::note + +You can also configure Besu for high availability using load balancers. + +::: + +## High availability + +Privacy requires you to [configure Tessera for high availability]. Besu also requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode) to be enabled in Tessera. + +To successfully distribute a private transaction, all private transaction participants must be online. If any participants are offline when submitting the private transaction, the transaction is not attempted and you need to resubmit the transaction. + +If a Tessera node is unavailable when Besu attempts to process a privacy marker transaction, the Besu node stops processing all new blocks until Tessera is available. The Besu node continually attempts to process the privacy marker transaction until Tessera is available again. + +:::caution + +If Tessera becomes available but has lost data, Besu resumes processing blocks and the private states in the Besu nodes might become inconsistent. + +::: + +## Separate instances + +For production systems, we recommend running Besu and Tessera in separate instances. If running Besu and Tessera in the same instance, restrict the amount of memory used by each JVM to ensure each has enough memory. + + + +[configure Tessera for high availability]: https://consensys.net/docs/goquorum//en/stable/configure-and-manage/configure/high-availability/ diff --git a/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/web3js-quorum.md b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/web3js-quorum.md new file mode 100644 index 00000000000..5e96ec51a9e --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/how-to/use-privacy/web3js-quorum.md @@ -0,0 +1,88 @@ +--- +title: Use the web3js-quorum library +description: web3js-quorum client library +sidebar_position: 9 +tags: + - private networks +--- + +# Use the web3js-quorum client library + +[web3js-quorum](https://github.com/ConsenSys/web3js-quorum) is an Ethereum JavaScript library extending [web3.js](https://github.com/ethereum/web3.js/) that adds support for Besu-specific JSON-RPC APIs and features. Use the library to create and send RLP-encoded transactions using JSON-RPC. + +:::caution important +web3js-quorum supports JSON-RPC over HTTP only. +::: + +:::note + +web3js-quorum includes all [quorum.js](https://github.com/ConsenSys/quorum.js) and [web3js-eea](https://github.com/ConsenSys/web3js-eea) features. + +If migrating to web3js-quorum, update your JavaScript code as indicated in the following examples. + +[Read the migration guide for more information about updating your code.](https://consensys.github.io/web3js-quorum/latest/tutorial-Migrate%20from%20web3js-eea.html) + +::: + +## Prerequisites + +- [Node.js (version > 10)](https://nodejs.org/en/download/) +- [The web3 library must be installed in your project](https://github.com/ChainSafe/web3.js#installation) + +## Add web3js-quorum to project + +```bash +npm install web3js-quorum +``` + +## Initialize the web3js-quorum client + +Initialize your client where: + +- `` is the JSON-RPC HTTP endpoint of your Hyperledger Besu node. Specified by the [`--rpc-http-host`](../../../public-networks/reference/cli/options.md#rpc-http-host) and [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) command line options. + + + +# Syntax + +```js +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); +const web3 = new Web3Quorum(new Web3("")); +``` + +# Example + +```js +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); +const web3 = new Web3Quorum(new Web3("http://localhost:8545")); +``` + + + +:::note + +When migrating from web3js-eea to web3js-quorum, use `Web3Quorum`. The constructor doesn't require the chain ID anymore. Chain ID is automatically retrieved from the chain using the specified JSON-RPC HTTP endpoint. + +::: + +## Deploy a contract with `generateAndSendRawTransaction` + +To deploy a private contract, you need the contract binary. You can use [Solidity](https://solidity.readthedocs.io/en/develop/using-the-compiler.html) to get the contract binary. + +```js title="Deploying a contract with 'web3.priv.generateAndSendRawTransaction'" +const contractOptions = { + data: `0x123`, // contract binary + privateFrom: "tesseraNode1PublicKey", + privateFor: ["tesseraNode3PublicKey"], + privateKey: "besuNode1PrivateKey", +}; +return web3.priv.generateAndSendRawTransaction(contractOptions); +``` + +`web3.priv.generateAndSendRawTransaction(contractOptions)` returns the transaction hash. To get the private transaction receipt, use `web3.priv.waitForTransactionReceipt(txHash)`. + +## web3js-quorum methods + +For more information about the web3js-quorum methods, see the [web3js-quorum reference documentation](https://consensys.github.io/web3js-quorum/latest/index.html). diff --git a/versioned_docs/version-23.4.1/private-networks/index.md b/versioned_docs/version-23.4.1/private-networks/index.md new file mode 100644 index 00000000000..377c1af8e90 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/index.md @@ -0,0 +1,30 @@ +--- +title: Private networks +sidebar_position: 1 +sidebar_label: Introduction +id: index +description: Private networks overview +tags: + - private networks +--- + +# Hyperledger Besu for private networks + +You can use Besu to develop enterprise applications requiring secure, high-performance transaction processing in a private network. + +A private network is a network not connected to Ethereum Mainnet or an Ethereum testnet. Private networks typically use a different [chain ID](../public-networks/concepts/network-and-chain-id.md) and proof of authority consensus ([QBFT](how-to/configure/consensus/qbft.md), [IBFT 2.0](how-to/configure/consensus/ibft.md), or [Clique](how-to/configure/consensus/clique.md)). + +You can also [create a local development network](tutorials/ethash.md) using proof of work (Ethash). + +Besu supports enterprise features including [privacy](concepts/privacy/index.md) and [permissioning](concepts/permissioning/index.md). + +Get started with the [Developer Quickstart](tutorials/quickstart.md) to rapidly generate local blockchain networks. + +## Architecture + +The following diagram outlines the high-level architecture of Besu for private networks. + +![Private architecture](../assets/images/private-architecture.jpeg) + +If you have any questions about Besu for private networks, ask on the **besu** channel on +[Hyperledger Discord](https://discord.gg/hyperledger). diff --git a/versioned_docs/version-23.4.1/private-networks/reference/_category_.json b/versioned_docs/version-23.4.1/private-networks/reference/_category_.json new file mode 100644 index 00000000000..3ce2f2b757b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Reference", + "position": 6 +} diff --git a/versioned_docs/version-23.4.1/private-networks/reference/accounts-for-testing.md b/versioned_docs/version-23.4.1/private-networks/reference/accounts-for-testing.md new file mode 100644 index 00000000000..f32a1dbf8a1 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/accounts-for-testing.md @@ -0,0 +1,27 @@ +--- +title: Accounts for testing +sidebar_position: 3 +description: Ethereum accounts used for Hyperledger Besu testing only on private networks +tags: + - private networks +--- + +import TestAccounts from '../../global/test_accounts.md'; + +# Accounts for testing + +You can use existing accounts for testing by including them in the genesis file for a private network. Hyperledger Besu also provides predefined accounts for use in development mode. + +## Development mode + +When you start Besu with the [`--network=dev`](../../public-networks/reference/cli/options.md#network) command line option, Besu uses the `dev.json` genesis file by default. + +The `dev.json` genesis file defines the following accounts used for testing. + + + +## Genesis file + +To use existing test accounts, specify the accounts and balances in a genesis file for your test network. For an example of how to define accounts in the genesis file, see [`dev.json`](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/config/src/main/resources/dev.json). + +To start Besu with the genesis file defining the existing accounts, use the [`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) command line option . diff --git a/versioned_docs/version-23.4.1/private-networks/reference/api/_category_.json b/versioned_docs/version-23.4.1/private-networks/reference/api/_category_.json new file mode 100644 index 00000000000..777d7bb818f --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu API", + "position": 2 +} diff --git a/versioned_docs/version-23.4.1/private-networks/reference/api/index.md b/versioned_docs/version-23.4.1/private-networks/reference/api/index.md new file mode 100644 index 00000000000..4d0b71dd721 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/api/index.md @@ -0,0 +1,2157 @@ +--- +description: Hyperledger Besu private network JSON-RPC API methods reference +tags: + - private networks +--- + +# Private network API methods + +:::warning + +- This reference contains API methods that apply to only private networks. For API methods that apply to both private and public networks, see the [public network API reference](../../../public-networks/reference/api/index.md). +- All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If using the [--rpc-http-host](../../../public-networks/reference/cli/options.md#rpc-http-host) or [--rpc-http-port](../../../public-networks/reference/cli/options.md#rpc-http-port) options, update the endpoint. + +::: + +## `CLIQUE` methods + +The `CLIQUE` API methods provide access to the [Clique](../../how-to/configure/consensus/clique.md) consensus engine. + +:::note + +The `CLIQUE` API methods are not enabled by default for JSON-RPC. To enable the `CLIQUE` API methods use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `clique_discard` + +Discards a proposal to [add or remove a signer with the specified address]. + +#### Parameters + +`address`: _string_ - 20-byte address of proposed signer + +#### Returns + +`result`: _boolean_ - indicates if the proposal is discarded + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `clique_getSigners` + +Lists [signers for the specified block]. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _string_ - list of 20-byte addresses of signers + + + +# curl HTTP request + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' http://127.0.0.1:8545 + ``` + +# wscat WS request + + ```bash + {"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1} + ``` + +# JSON result + + ```json + { + "jsonrpc" : "2.0", + "id" : 1, + "result" : [ "0x42eb768f2244c8811c63729a21a3569731535f06", "0x7ffc57839b00206d1ad20c69a1981b489f772031", "0xb279182d99e65703f0076e4812653aab85fca0f0" ] + } + ``` + + + +### `clique_getSignerMetrics` + +Provides the following validator metrics for the specified range: + +- Number of blocks from each validator + +- Block number of the last block proposed by each validator (if any proposed in the specified range) + +- All validators present in the last block + +#### Parameters + +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +If you specify: + +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. + +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. + +#### Returns + +`result`: _array_ of _objects_ - list of validator objects + +:::note + +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + + +### `clique_getSignersAtHash` + +Lists signers for the specified block. + +#### Parameters + +`hash`: _string_ - 32-byte block hash + +#### Returns + +`result`: _array_ of _string_ - list of 20-byte addresses of signers + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42eb768f2244c8811c63729a21a3569731535f06", + "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "0xb279182d99e65703f0076e4812653aab85fca0f0" + ] +} +``` + + + +### `clique_proposals` + +Returns [current proposals](../../how-to/configure/consensus/clique.md#add-and-remove-signers). + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the proposal for each account (if `true`, the proposal is to add a signer; if `false`, the proposal is to remove a signer.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0x42eb768f2244c8811c63729a21a3569731535f07": false, + "0x12eb759f2222d7711c63729a45c3585731521d01": true + } +} +``` + + + +### `clique_propose` + +Proposes to [add or remove a signer with the specified address]. + +#### Parameters + +- `address`: _string_ - 20-byte address + +- `proposal`: _boolean_ - `true` to propose adding signer or `false` to propose removing signer + +#### Returns + +`result`: _boolean_ - `true` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `EEA` methods + +The `EEA` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and [privacy groups](../../concepts/privacy/privacy-groups.md). + +:::note + +The `EEA` API methods are not enabled by default for JSON-RPC. To enable the `EEA` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `eea_sendRawTransaction` + +Distributes the [private transaction](../../how-to/send-transactions/private-transactions.md), generates the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) and submits it to the transaction pool, and returns the transaction hash of the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md). + +The signed transaction passed as an input parameter includes the `privateFrom`, [`privateFor` or `privacyGroupId`](../../how-to/send-transactions/private-transactions.md#eea-compliant-or-besu-extended-privacy), and `restriction` fields. + +The `gas` and `gasPrice` are used by the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) not the private transaction itself. + +To avoid exposing your private key, create signed transactions offline and send the signed transaction data using `eea_sendRawTransaction`. + +:::important + +For production systems requiring private transactions, use a network with a consensus mechanism supporting transaction finality to make sure the private state does not become inconsistent with the chain. For example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md) and [QBFT](../../how-to/configure/consensus/qbft.md) provide the required finality. + +Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md#pruning) or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. + +Besu doesn't implement [`eea_sendTransaction`](../../how-to/send-transactions/private-transactions.md). + +[EthSigner](https://docs.ethsigner.consensys.net/en/latest/) provides transaction signing and implements [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +::: + +#### Parameters + +`transaction`: _string_ - signed RLP-encoded private transaction + +#### Returns + +`result`: _string_ - 32-byte transaction hash of the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) + +:::tip + +If creating a contract, use [priv_getTransactionReceipt](#priv_gettransactionreceipt) to retrieve the contract address after the transaction is finalized. + +::: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} +``` + +# JSON result + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + + + +## `IBFT` 2.0 methods + +The `IBFT` API methods provide access to the [IBFT 2.0](../../how-to/configure/consensus/ibft.md) consensus engine. + +:::note + +The `IBFT` API methods are not enabled by default for JSON-RPC. To enable the `IBFT` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `ibft_discardValidatorVote` + +Discards a proposal to [add or remove a validator] with the specified address. + +#### Parameters + +`address`: _string_ - 20-byte address of proposed validator + +#### Returns + +`result`: _boolean_ - indicates if the proposal is discarded + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `ibft_getPendingVotes` + +Returns [votes](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) cast in the current [epoch](../../how-to/configure/consensus/ibft.md#genesis-file). + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to remove a validator. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, + "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true + } +} +``` + + + +### `ibft_getSignerMetrics` + +Provides the following validator metrics for the specified range: + +- Number of blocks from each validator + +- Block number of the last block proposed by each validator (if any proposed in the specified range) + +- All validators present in the last block of the range + +#### Parameters + +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest` as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +If you specify: + +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. + +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. + +#### Returns + +`result`: _array_ of _objects_ - list of validator objects + +:::note + +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + + +### `ibft_getValidatorsByBlockHash` + +Lists the validators defined in the specified block. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `ibft_getValidatorsByBlockNumber` + +Lists the validators defined in the specified block. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `ibft_proposeValidatorVote` + +Proposes to [add or remove a validator] with the specified address. + +#### Parameters + +- `address`: _string_ - account address + +- `proposal`: _boolean_ - `true` to propose adding validator or `false` to propose removing validator + +#### Returns + +`result`: _boolean_ - `true` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `PERM` (Permissioning) methods + +The `PERM` API methods provide permissioning functionality. Use these methods for [local permissioning](../../how-to/use-permissioning/local.md) only. + +:::important + +The `PERM` API methods are not enabled by default for JSON-RPC. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) CLI options. + +::: + +### `perm_addAccountsToAllowlist` + +Adds accounts (participants) to the [accounts permission list](../../how-to/use-permissioning/local.md#account-permissioning). + +#### Parameters + +`addresses`: _array_ of _strings_ - list of account addresses + +:::note + +The parameters list contains a list which is why the account addresses are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error` (errors include attempting to add accounts already on the allowlist and including invalid account addresses.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_addNodesToAllowlist` + +Adds nodes to the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +To use domain names in enode URLs, ensure you [enable DNS support](../../../public-networks/concepts/node-keys.md#domain-name-support) to avoid receiving a `request contains an invalid node` error. + +:::warning + +Enode URL domain name support is an early access feature. + +::: + +#### Parameters + +`enodes`: _array_ of _strings_ - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) + +:::note + +The parameters list contains a list which is why the enode URLs are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error`; errors include attempting to add nodes already on the allowlist or including invalid enode URLs. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_getAccountsAllowlist` + +Lists accounts (participants) in the [accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - list of accounts (participants) in the accounts allowlist + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x0000000000000000000000000000000000000009", + "0xb9b81ee349c3807e46bc71aa2632203c5b462033" + ] +} +``` + + + +### `perm_getNodesAllowlist` + +Lists nodes in the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) of nodes in the nodes allowlist + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305", + "enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304" + ] +} +``` + + + +### `perm_reloadPermissionsFromFile` + +Reloads the accounts and nodes allowlists from the [permissions configuration file]. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - `Success`, or `error` if the permissions configuration file is not valid + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_removeAccountsFromAllowlist` + +Removes accounts (participants) from the [accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). + +#### Parameters + +`addresses`: _array_ of _strings_ - list of account addresses + +:::note + +The parameters list contains a list which is why the account addresses are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error` (errors include attempting to remove accounts not on the allowlist and including invalid account addresses.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_removeNodesFromAllowlist` + +Removes nodes from the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +#### Parameters + +`enodes`: _array_ of _strings_ - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) + +:::note + +The parameters list contains a list which is why the enode URLs are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error` (errors include attempting to remove nodes not on the allowlist and including invalid enode URLs.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +## `PRIV` methods + +The `PRIV` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and [privacy groups](../../concepts/privacy/privacy-groups.md). + +:::note + +The `PRIV` API methods are not enabled by default for JSON-RPC. To enable the `PRIV` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `priv_call` + +Invokes a private contract function locally and does not change the privacy group state. + +For private contracts, `priv_call` is the same as [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) for public contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `call`: _object_ - [transaction call object](../../../public-networks/reference/api/objects.md#transaction-call-object) + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _data_ - return value of the executed contract + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x0000000000000000000000000000000000000000000000000000000000000001" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```bash +{ + block { + number + call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { + data + status + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17449, + "call": { + "data": "0x", + "status": 1 + } + } + } +} +``` + + + +### `priv_createPrivacyGroup` + +Creates a group of nodes, specified by their [Tessera](https://docs.tessera.consensys.net/) public key. + +#### Parameters + +`options`: _object_ - request options object with the following fields: + +- `addresses`: _array_ of _strings_ - list of nodes specified by [Tessera](https://docs.tessera.consensys.net/) public keys + +- `name`: _string_ - (optional) privacy group name + +- `description`: _string_ - (optional) privacy group description + +#### Returns + +`result`: _string_ - privacy group ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" +} +``` + + + +### `priv_debugGetStateRoot` + +Returns the state root of the specified privacy group at the specified block. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - 32-byte state root + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" +} +``` + + + +### `priv_deletePrivacyGroup` + +Deletes the specified privacy group. + +#### Parameters + +`privacyGroupId`: _string_ - privacy group ID + +#### Returns + +`result`: _string_ - deleted privacy group ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" +} +``` + + + +### `priv_distributeRawTransaction` + +Distributes a signed, RLP encoded [private transaction](../../how-to/send-transactions/private-transactions.md). + +:::tip + +If you want to sign the [privacy marker transaction](../../how-to/use-privacy/sign-pmts.md) outside of Besu, use [`priv_distributeRawTransaction`](../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction). + +::: + +#### Parameters + +`transaction`: _string_ - signed RLP-encoded private transaction + +#### Returns + +`result`: _string_ - 32-byte enclave key (the enclave key is a pointer to the private transaction in [Tessera](https://docs.tessera.consensys.net/).) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" +} +``` + + + +### `priv_findPrivacyGroup` + +Returns a list of privacy groups containing only the listed members. For example, if the listed members are A and B, a privacy group containing A, B, and C is not returned. + +#### Parameters + +`members`: _array_ of _strings_ - members specified by [Tessera](https://docs.tessera.consensys.net/) public keys + +#### Returns + +`result`: _array_ of _objects_ - privacy group objects containing only the specified members; privacy groups are [EEA-compliant](../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy) or [Besu-extended](../../concepts/privacy/privacy-groups.md#besu-extended-privacy) with types: + +- `LEGACY` for EEA-compliant groups. + +- `PANTHEON` for Besu-extended groups. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", + "name": "Group B", + "description": "Description of Group B", + "type": "PANTHEON", + "members": [ + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" + ] + } + ] +} +``` + + + +### `priv_getCode` + +Returns the code of the private smart contract at the specified address. Compiled smart contract code is stored as a hexadecimal value. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `address`: _string_ - 20-byte contract address + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _data_ - code stored at the specified address + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" +} +``` + + + +### `priv_getEeaTransactionCount` + +Returns the private transaction count for the specified account and [group of sender and recipients]. + +::caution important +If sending more than one transaction to be mined in the same block (that is, you are not +waiting for the transaction receipt), you must calculate the private transaction nonce outside +Besu instead of using `priv_getEeaTransactionCount`. +::: + +#### Parameters + +- `address`: _string_ - account address + +- `sender`: _string_ - base64-encoded Tessera address of the sender + +- `recipients`: _array_ of _strings_ - base64-encoded Tessera addresses of recipients + +#### Returns + +`result`: _string_ - integer representing the number of private transactions sent from the address to the specified group of sender and recipients + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + + + +### `priv_getFilterChanges` + +Polls the specified filter for a private contract and returns an array of changes that have occurred since the last poll. + +Filters for private contracts can only be created by [`priv_newFilter`](#priv_newfilter) so unlike [`eth_getFilterChanges`](../../../public-networks/reference/api/index.md#eth_getfilterchanges), `priv_getFilterChanges` always returns an array of log objects or an empty list. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object), or an empty list if nothing has changed since the last poll + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d0", + "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", + "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + + +### `priv_getFilterLogs` + +Returns an array of [logs](../../../public-networks/concepts/events-and-logs.md) for the specified filter for a private contract. + +For private contracts, `priv_getFilterLogs` is the same as [`eth_getFilterLogs`](../../../public-networks/reference/api/index.md#eth_getfilterlogs) for public contracts except there's no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) for private contracts. + +:::note + +`priv_getFilterLogs` is only used for filters created with [`priv_newFilter`](#priv_newfilter). To specify a filter object and get logs without creating a filter, use [`priv_getLogs`](#priv_getlogs). + +::: + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x493", + "blockHash": "0xd9cb3a852e1e02c95f035a2e32d57f82c10cab61faa3e8f5c010adf979bb4786", + "transactionHash": "0x78866dc51fdf189d8cca74f6a8fe54f172348fbd2163bbe80fa8b106cfc7deb4", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d0", + "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", + "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + + +### `priv_getLogs` + +Returns an array of [logs](../../../public-networks/concepts/events-and-logs.md) matching a specified filter object. + +For private contracts, `priv_getLogs` is the same as [`eth_getLogs`](../../../public-networks/reference/api/index.md#eth_getlogs) for public contracts except there is no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) for private contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterOptions`: _object_ - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x342", + "blockHash": "0xf5954f068fa2f2f7741281e8c753a8e92047e27ab3c4971836d2c89fab86d92b", + "transactionHash": "0xa9ba5cffde9d4ad8997c5c4352d5d49eeea0e9def8a4ea69991b8837c49d4e4f", + "transactionIndex": "0x0", + "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x383", + "blockHash": "0x91b73a47d53e3a88d62ed091a89a4be7557ad91b552e7ff7d86bf78977d5d45d", + "transactionHash": "0xc2a185faf00e87434e55b7f70cc4c38be354c2128b4b96b5f5def0b54a2173ec", + "transactionIndex": "0x0", + "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + + +### `priv_getPrivacyPrecompileAddress` + +Returns the address of the [privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md). The address is derived and based on the value of the [`privacy-flexible-groups-enabled`](../cli/options.md#privacy-flexible-groups-enabled) option. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - address of the privacy precompile + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x000000000000000000000000000000000000007e" +} +``` + + + +### `priv_getPrivateTransaction` + +Returns the private transaction if you are a participant, otherwise, `null`. + +#### Parameters + +`transaction`: _string_ - transaction hash returned by [`eea_sendRawTransaction`](#eea_sendrawtransaction) or [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +#### Returns + +`result`: _object_ - [private transaction object](objects.md#private-transaction-object), or `null` if not a participant in the private transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x2dc6c0", + "gasPrice": "0x0", + "hash": "0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498", + "input": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610221806100606000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f2451461005c5780636057361d1461008757806367e404ce146100b4575b600080fd5b34801561006857600080fd5b5061007161010b565b6040518082815260200191505060405180910390f35b34801561009357600080fd5b506100b260048036038101908080359060200190929190505050610115565b005b3480156100c057600080fd5b506100c96101cb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600254905090565b7fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f53382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18060028190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050905600a165627a7a723058208efaf938851fb2d235f8bf9a9685f149129a30fe0f4b20a6c1885dc02f639eba0029", + "nonce": "0x0", + "to": null, + "value": "0x0", + "v": "0xfe8", + "r": "0x654a6a9663ca70bb13e27cca14b3777cc92da184e19a151cdeef2ccbbd5c6405", + "s": "0x5dd4667b020c8a5af7ae28d4c3126f8dcb1187f49dcf0de9d7a39b1651892eef", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privateFor": ["g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="], + "restriction": "restricted" + } +} +``` + + + +### `priv_getTransactionCount` + +Returns the private transaction count for specified account and privacy group. + +:::important + +If sending more than one transaction to be mined in the same block (that is, you are not waiting for the transaction receipt), you must calculate the private transaction nonce outside Besu instead of using `priv_getTransactionCount`. + +::: + +#### Parameters + +- `address`: _string_ - account address + +- `privacyGroupId`: _string_ - privacy group ID + +#### Returns + +`result`: _string_ - integer representing the number of private transactions sent from the address to the specified privacy group + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + + + +### `priv_getTransactionReceipt` + +Returns information about the private transaction after mining the transaction. Receipts for pending transactions are not available. + +#### Parameters + +`transaction`: _string_ - 32-byte hash of a transaction + +#### Returns + +`result`: _object_ - [private Transaction receipt object](objects.md#private-transaction-receipt-object), or `null` if no receipt found + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": "0x493b76031593402e24e16faa81f677b58e2d53f3", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "logs": [], + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0x36219e92b5f53d4150aa9ef7d2d793118cced523de6724100da5b534e3ceb4b8", + "transactionIndex": "0x0", + "output": "0x6080604052600436106049576000357c010000000000000000000000000000000000000000000 + 0000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b3480156059 + 57600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b + 50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b8060008190555050560 + 0a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "commitmentHash": "0x79b9e6b0856db398ad7dc208f15b1d38c0c0b0c5f99e4a443a2c5a85510e96a5", + "status": "0x1", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privacyGroupId": "cD636RZlcqVSpoxT/ExbkWQfBO7kPAZO0QlWHErNSL8=", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } +} +``` + + + +### `priv_newFilter` + +Creates a [log filter](../../../public-networks/concepts/events-and-logs.md) for a private contract. To poll for logs associated with the created filter, use [`priv_getFilterChanges`](#priv_getfilterchanges). To get all logs associated with the filter, use [`priv_getFilterLogs`](#priv_getfilterlogs). + +For private contracts, `priv_newFilter` is the same as [`eth_newFilter`](../../../public-networks/reference/api/index.md#eth_newfilter) for public contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterOptions`: _object_ - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) + +:::note + +`fromBlock` and `toBlock` in the filter options object default to `latest`. + +::: + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4a35b92809d73f4f53a2355d62125442" +} +``` + + + +### `priv_uninstallFilter` + +Uninstalls a filter for a private contract with the specified ID. When a filter is no longer required, call this method. + +Filters time out when not requested by [`priv_getFilterChanges`](#priv_getfilterchanges) or [`priv_getFilterLogs`](#priv_getfilterlogs) for 10 minutes. + +For private contracts, `priv_uninstallFilter` is the same as [`eth_uninstallFilter`](../../../public-networks/reference/api/index.md#eth_uninstallfilter) for public contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy group ID](../../concepts/privacy/privacy-groups.md) + +- `filterId`: _string_ - filter ID + +#### Returns + +`result`: _boolean_ - indicates if the filter is successfully uninstalled + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `QBFT` methods + +The `QBFT` API methods provide access to the [QBFT](../../how-to/configure/consensus/qbft.md) consensus engine. + +:::note + +The `QBFT` API methods are not enabled by default for JSON-RPC. To enable the `QBFT` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `qbft_discardValidatorVote` + +Discards a proposal to [add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with the specified address. + +#### Parameters + +`address`: _string_ - 20-byte address of proposed validator + +#### Returns + +`result`: _boolean_ - indicates if the proposal is discarded + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `qbft_getPendingVotes` + +Returns [votes](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) cast in the current [epoch](../../how-to/configure/consensus/qbft.md#genesis-file). + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to remove a validator. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, + "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true + } +} +``` + + + +### `qbft_getSignerMetrics` + +Provides the following validator metrics for the specified range: + +- Number of blocks from each validator + +- Block number of the last block proposed by each validator (if any proposed in the specified range) + +- All validators present in the last block of the range + +#### Parameters + +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest` as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +If you specify: + +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. + +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. + +#### Returns + +`result`: _array_ of _objects_ - list of validator objects + +:::note + +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + + +### `qbft_getValidatorsByBlockHash` + +Lists the validators defined in the specified block. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `qbft_getValidatorsByBlockNumber` + +Lists the validators defined in the specified block. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `qbft_proposeValidatorVote` + +Proposes to [add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with the specified address. + +#### Parameters + +- `address`: _string_ - account address + +- `proposal`: _boolean_ - `true` to propose adding validator or `false` to propose removing validator + +#### Returns + +`result`: _boolean_ - `true` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + + + +[add or remove a signer with the specified address]: ../../how-to/configure/consensus/clique.md#add-and-remove-signers +[signers for the specified block]: ../../how-to/configure/consensus/clique.md#adding-and-removing-signers +[add or remove a validator]: ../../how-to/configure/consensus/ibft.md#add-and-remove-validators +[permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file +[group of sender and recipients]: ../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy + +\*[EEA]: Enterprise Ethereum Alliance diff --git a/versioned_docs/version-23.4.1/private-networks/reference/api/objects.md b/versioned_docs/version-23.4.1/private-networks/reference/api/objects.md new file mode 100644 index 00000000000..747a50db098 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/api/objects.md @@ -0,0 +1,59 @@ +--- +title: Private network API objects +sidebar_position: 2 +description: Hyperledger Besu private network API objects reference +tags: + - private networks +--- + +# Private network API objects + +The following objects are parameters for or returned by Besu private network API methods. + +:::warning + +This reference contains API objects that apply to only private networks. For API objects that apply to both private and public networks, see the [public network API objects reference](../../../public-networks/reference/api/objects.md). + +::: + +## Private transaction object + +Returned by [`priv_getPrivateTransaction`](index.md#priv_getprivatetransaction). + +| Key | Type | Value | +| --- | :-: | --- | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | Gas price, in Wei, provided by the sender. | +| `input` | Data | The data to create or invoke a contract. | +| `nonce` | Quantity | Number of transactions made by the sender to the privacy group before this one. | +| `to` | Data, 20 bytes | `null` if a contract creation transaction, otherwise, the contract address. | +| `value` | Quantity | `null` because private transactions cannot transfer Ether. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | +| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | +| `privateFor` | Array of Data, 32 bytes each | [Tessera](https://docs.tessera.consensys.net/) public keys of recipients. Not returned if using `privacyGroupId` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | +| `privacyGroupId` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) privacy group ID of recipients. Not returned if using `privateFor` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | +| `restriction` | String | Must be [`restricted`](../../../private-networks/concepts/privacy/private-transactions/index.md). | + +## Private transaction receipt object + +Returned by [`priv_getTransactionReceipt`](index.md#priv_gettransactionreceipt). + +| Key | Type | Value | +| --- | :-: | --- | +| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | +| `blockNumber` | Quantity | Block number of block containing this transaction. | +| `contractAddress` | Data, 20 bytes | Contract address created if a contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | +| `from` | Data, 20 bytes | Address of the sender. | +| `logs` | Array | Array of [log objects](../../../public-networks/reference/api/objects.md#log-object) generated by this private transaction. | +| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | +| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | +| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | +| `output` | Data | RLP-encoded return value of a contract call if a value returns, otherwise, `null`. | +| `commitmentHash` | Data, 32 bytes | Hash of the privacy marker transaction. | +| `status` | Quantity | Either `0x1` (success) or `0x0` (failure). | +| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | +| `privateFor` or `privacyGroupId` | Array or Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public keys or privacy group ID of the recipients. | +| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | diff --git a/versioned_docs/version-23.4.1/private-networks/reference/cli/_category_.json b/versioned_docs/version-23.4.1/private-networks/reference/cli/_category_.json new file mode 100644 index 00000000000..bec3b04721b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/cli/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu CLI", + "position": 1 +} diff --git a/versioned_docs/version-23.4.1/private-networks/reference/cli/options.md b/versioned_docs/version-23.4.1/private-networks/reference/cli/options.md new file mode 100644 index 00000000000..064549d46f2 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/cli/options.md @@ -0,0 +1,709 @@ +--- +title: Private network options +sidebar_position: 1 +description: Hyperledger Besu private networks CLI reference +tags: + - private networks +--- + +# Private network command line options + +This reference describes the syntax of the Hyperledger Besu private network command line interface (CLI) options. + +:::danger + +This reference contains options that apply to only private networks. For options that apply to both private and public networks, see the [public network options reference](../../../public-networks/reference/cli/options.md). + +::: + +## Specify options + +You can specify Besu options: + +- On the command line. + + ```bash + besu [OPTIONS] [SUBCOMMAND] + ``` + +- As an environment variable. For each command line option, the equivalent environment variable is: + + - Uppercase. + - `_` replaces `-`. + - Has a `BESU_` prefix. + + For example, set `--miner-coinbase` using the `BESU_MINER_COINBASE` environment variable. + +- In a [configuration file](../../../public-networks/how-to/configuration-file.md). + +If you specify an option in more than one place, the order of priority is command line, environment variable, configuration file. + +If using Bash or Z shell, you can view option suggestions by entering `--` and pressing the Tab key twice. + +```bash +besu --Tab+Tab +``` + +:::caution + +Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em hyphens. + +::: + +## Options + +### `permissions-accounts-config-file` + + + +# Syntax + +```bash +--permissions-accounts-config-file= +``` + +# Example + +```bash +--permissions-accounts-config-file=/home/me/me_configFiles/myPermissionsFile +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile +``` + +# Configuration file + +```bash +permissions-accounts-config-file="/home/me/me_configFiles/myPermissionsFile" +``` + + + +The [accounts permissions configuration file]. The default is the `permissions_config.toml` file in the [data directory](../../../public-networks/reference/cli/options.md#data-path). + +:::tip + +`--permissions-accounts-config-file` and [`--permissions-nodes-config-file`](#permissions-nodes-config-file) can use the same file. + +::: + +### `permissions-accounts-config-file-enabled` + + + +# Syntax + +```bash +--permissions-accounts-config-file-enabled[=] +``` + +# Example + +```bash +--permissions-accounts-config-file-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE_ENABLED=true +``` + +# Configuration file + +```bash +permissions-accounts-config-file-enabled=true +``` + + + +Enables or disables file-based account level permissions. The default is `false`. + +### `permissions-accounts-contract-address` + + + +# Syntax + +```bash +--permissions-accounts-contract-address= +``` + +# Example + +```bash +--permissions-accounts-contract-address=xyz +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ADDRESS=xyz +``` + +# Configuration file + +```bash +permissions-accounts-contract-address="xyz" +``` + + + +The contract address for [onchain account permissioning](../../concepts/permissioning/onchain.md). + +### `permissions-accounts-contract-enabled` + + + +# Syntax + +```bash +--permissions-accounts-contract-enabled[=] +``` + +# Example + +```bash +--permissions-accounts-contract-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ENABLED=true +``` + +# Configuration file + +```bash +permissions-accounts-contract-enabled=true +``` + + + +Enables or disables contract-based [onchain account permissioning](../../concepts/permissioning/onchain.md). The default is `false`. + +### `permissions-nodes-config-file` + + + +# Syntax + +```bash +--permissions-nodes-config-file= +``` + +# Example + +```bash +--permissions-nodes-config-file=/home/me/me_configFiles/myPermissionsFile +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile +``` + +# Configuration file + +```bash +permissions-nodes-config-file="/home/me/me_configFiles/myPermissionsFile" +``` + + + +The [nodes permissions configuration file]. The default is the `permissions_config.toml` file in the [data directory](../../../public-networks/reference/cli/options.md#data-path). + +:::tip + +`--permissions-nodes-config-file` and [`--permissions-accounts-config-file`](#permissions-accounts-config-file) can use the same file. + +::: + +### `permissions-nodes-config-file-enabled` + + + +# Syntax + +```bash +--permissions-nodes-config-file-enabled[=] +``` + +# Example + +```bash +--permissions-nodes-config-file-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONFIG_FILE_ENABLED=true +``` + +# Configuration file + +```bash +permissions-nodes-config-file-enabled=true +``` + + + +Enables or disables file-based node level permissions. The default is `false`. + +### `permissions-nodes-contract-address` + + + +# Syntax + +```bash +--permissions-nodes-contract-address= +``` + +# Example + +```bash +--permissions-nodes-contract-address=xyz +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_ADDRESS=xyz +``` + +# Configuration file + +```bash +permissions-nodes-contract-address="xyz" +``` + + + +The contract address for [onchain node permissioning](../../concepts/permissioning/onchain.md). + +### `permissions-nodes-contract-enabled` + + + +# Syntax + +```bash +--permissions-nodes-contract-enabled[=] +``` + +# Example + +```bash +--permissions-nodes-contract-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_ENABLED=true +``` + +# Configuration file + +```bash +permissions-nodes-contract-enabled=true +``` + + + +Enables or disables contract-based [onchain node permissioning](../../concepts/permissioning/onchain.md). The default is `false`. + +### `permissions-nodes-contract-version` + + + +# Syntax + +```bash +--permissions-nodes-contract-version= +``` + +# Example + +```bash +--permissions-nodes-contract-version=2 +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_VERSION=2 +``` + +# Configuration file + +```bash +permissions-nodes-contract-version=2 +``` + + + +Version of the EEA [node permissioning interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version). The default is 1. + +### `privacy-enabled` + + + +# Syntax + +```bash +--privacy-enabled[=] +``` + +# Example + +```bash +--privacy-enabled=false +``` + +# Environment variable + +```bash +BESU_PRIVACY_ENABLED=false +``` + +# Configuration file + +```bash +privacy-enabled=false +``` + + + +Enables or disables [private transactions](../../concepts/privacy/index.md). The default is `false`. + +:::important + +Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md) or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) is not supported. + +::: + +### `privacy-marker-transaction-signing-key-file` + + + +# Syntax + +```bash +--privacy-marker-transaction-signing-key-file= +``` + +# Example + +```bash +--privacy-marker-transaction-signing-key-file=/home/me/me_node/myPrivateKey +``` + +# Environment variable + +```bash +BESU_PRIVACY_MARKER_TRANSACTION_SIGNING_KEY_FILE=/home/me/me_node/myPrivateKey +``` + +# Configuration file + +```bash +privacy-marker-transaction-signing-key-file="/home/me/me_node/myPrivateKey" +``` + + + +`` is the name of the private key file used to [sign privacy marker transactions](../../how-to/use-privacy/sign-pmts.md). + +:::note + +This can be the same file used by [`--node-private-key-file`](../../../public-networks/reference/cli/options.md#node-private-key-file), or a different key file to identify who signed the privacy marker transaction. + +::: + +You must specify this option if you're using: + +- a privacy network where you pay gas. Also, the associated account must contain adequate funds. +- [account permissioning] and privacy. You must include the corresponding public key in the accounts allowlist. + +If you do not specify this option (for example, in a free gas network), Besu signs each transaction with a different randomly generated key. + +### `privacy-multi-tenancy-enabled` + + + +# Syntax + +```bash +--privacy-multi-tenancy-enabled[=] +``` + +# Example + +```bash +--privacy-multi-tenancy-enabled=false +``` + +# Environment variable + +```bash +BESU_PRIVACY_MULTI_TENANCY_ENABLED=false +``` + +# Configuration file + +```bash +privacy-multi-tenancy-enabled=false +``` + + + +Enables or disables [multi-tenancy](../../concepts/privacy/multi-tenancy.md) for private transactions. The default is `false`. + +### `privacy-flexible-groups-enabled` + + + +# Syntax + +```bash +--privacy-flexible-groups-enabled[=] +``` + +# Example + +```bash +--privacy-flexible-groups-enabled=true +``` + +# Environment variable + +```bash +BESU_PRIVACY_FLEXIBLE_GROUPS_ENABLED=true +``` + +# Configuration file + +```bash +privacy-flexible-groups-enabled=true +``` + + + +Enables or disables [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). The default is `false`. + +Deprecated syntax for this option is `--privacy-onchain-groups-enabled`. + +### `privacy-public-key-file` + + + +# Syntax + +```bash +--privacy-public-key-file= +``` + +# Example + +```bash +--privacy-public-key-file=Tessera/nodeKey.pub +``` + +# Environment variable + +```bash +BESU_PRIVACY_PUBLIC_KEY_FILE=Tessera/nodeKey.pub +``` + +# Configuration file + +```bash +privacy-public-key-file="Tessera/nodeKey.pub" +``` + + + +The [public key of the Tessera node](https://docs.tessera.consensys.net/). + +:::important + +You cannot specify `privacy-public-key-file` when [`--privacy-multi-tenancy-enabled`](#privacy-multi-tenancy-enabled) is `true` + +::: + +### `privacy-tls-enabled` + + + +# Syntax + +```bash +--privacy-tls-enabled[=] +``` + +# Example + +```bash +--privacy-tls-enabled=false +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_ENABLED=false +``` + +# Configuration file + +```bash +privacy-tls-enabled=false +``` + + + +Enables or disables [TLS on communication with the private transaction manager]. The default is false. + +### `privacy-tls-keystore-file` + + + +# Syntax + +```bash +--privacy-tls-keystore-file= +``` + +# Example + +```bash +--privacy--keystore-file=/home/me/me_node/key +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_KEYSTORE_FILE=/home/me/me_node/key +``` + +# Configuration file + +```bash +privacy-tls-keystore-file="/home/me/me_node/key" +``` + + + +The keystore file (in PKCS #12 format) containing the private key and the certificate presented during authentication. + +You must specify `privacy-tls-keystore-file` if [`--privacy-tls-enabled`](#privacy-tls-enabled) is `true`. + +### `privacy-tls-keystore-password-file` + + + +# Syntax + +```bash +--privacy-tls-keystore-password-file= +``` + +# Example + +```bash +--privacy-tls-keystore-password-file=/home/me/me_node/password +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password +``` + +# Configuration file + +```bash +privacy-tls-keystore-password-file="/home/me/me_node/password" +``` + + + +The path to the file containing the password to decrypt the keystore. + +### `privacy-tls-known-enclave-file` + + + +# Syntax + +```bash +--privacy-tls-known-enclave-file= +``` + +# Example + +```bash +--privacy-tls-known-enclave-file=/home/me/me_node/knownEnclave +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_KNOWN_ENCLAVE_FILE=/home/me/me_node/knownEnclave +``` + +# Configuration file + +```bash +privacy-tls-known-enclave-file="/home/me/me_node/knownEnclave" +``` + + + +The path to the file containing the hostnames, ports, and SHA256 certificate fingerprints of the [authorized privacy enclave](../../how-to/configure/tls/client-and-server.md#create-the-known-servers-file). + +### `privacy-url` + + + +# Syntax + +```bash +--privacy-url= +``` + +# Example + +```bash +--privacy-url=http://127.0.0.1:8888 +``` + +# Environment variable + +```bash +BESU_PRIVACY_URL=http://127.0.0.1:8888 +``` + +# Configuration file + +```bash +privacy-url="http://127.0.0.1:8888" +``` + + + +The URL on which the [Tessera node](../../tutorials/privacy/index.md#3-create-tessera-configuration-files) is running. + + + +[accounts permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file +[nodes permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file +[account permissioning]: ../../concepts/permissioning/index.md#account-permissioning +[TLS on communication with the private transaction manager]: ../../concepts/privacy/index.md#private-transaction-manager diff --git a/versioned_docs/version-23.4.1/private-networks/reference/cli/subcommands.md b/versioned_docs/version-23.4.1/private-networks/reference/cli/subcommands.md new file mode 100644 index 00000000000..5b8b07c4dbd --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/cli/subcommands.md @@ -0,0 +1,143 @@ +--- +title: Private network subcommands +sidebar_position: 2 +description: Hyperledger Besu command line interface subcommands +tags: + - private networks +--- + +# Private network subcommands + +This reference describes the syntax of the Hyperledger Besu private network command line interface (CLI) subcommands. + +:::danger + +This reference contains subcommands that apply to only private networks. For subcommands that apply to both private and public networks, see the [public network subcommands reference](../../../public-networks/reference/cli/subcommands.md). + +::: + +To start a Besu node using subcommands, run: + +```bash +besu [OPTIONS] [SUBCOMMAND] [SUBCOMMAND OPTIONS] +``` + +If using Bash or Z shell, you can view subcommand suggestions by pressing the Tab key twice. + +```bash +besu Tab+Tab +``` + +## `operator` + +Provides operator actions. + +### `generate-blockchain-config` + + + +# Syntax + +```bash +besu operator generate-blockchain-config --config-file= --to= [--genesis-file-name=] [--private-key-file-name=] [--public-key-file-name=] +``` + +# Example + +```bash +besu operator generate-blockchain-config --config-file=config.json --to=myNetworkFiles +``` + + + +Generates an [IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) or [QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 or QBFT genesis file, except for the `extraData` string. The second is the `blockchain` property defining the number of key pairs to generate. + +## `rlp` + +Provides RLP related actions. + +### `encode` + + + +# Syntax + +```bash +besu rlp encode [--from=] [--to=] [--type=] +``` + +# File example + + ```bash + besu rlp encode --from=ibft_extra_data.json --to=extra_data_for_ibft_genesis.txt --type=IBFT_EXTRA_DATA + ``` + +# Standard input/output example + +```bash +cat extra_data.json | besu rlp encode > rlp.txt +``` + + + +Encodes the RLP hexadecimal string for use in an [IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) or [QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. The default type is `IBFT_EXTRA_DATA`. + +Supported types are: + +- `IBFT_EXTRA_DATA` - The IBFT 2.0 genesis file includes the `IBFT_EXTRA_DATA` type in the [`extraData`](../../how-to/configure/consensus/ibft.md#extra-data) property. + +- `QBFT_EXTRA_DATA` - The QBFT genesis file includes the `QBFT_EXTRA_DATA` type in the [`extraData`](../../how-to/configure/consensus/qbft.md#extra-data) property. + +## IBFT 2.0 extra data + +To generate the RLP encoded `extraData` string, specify a JSON input that is an array of validator addresses in ascending order. + +:::tip JSON Schema for IBFT_EXTRA_DATA + +Use the following JSON Schema to validate that your JSON data is well formed. To validate your JSON content, use an online validation tool, such as [JSON Schema Validator](https://www.jsonschemavalidator.net/). + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://org.hyperledger.besu/cli_rlp_ibft_extra_data.json", + "type": "array", + "definitions": {}, + "title": "IBFT extra data", + "description": "JSON format used as input to generate an IBFT extra data RLP string", + "items": { + "$id": "#/address", + "type": "string", + "title": "Validator address", + "description": "The validator node address", + "default": "", + "examples": [ + "be068f726a13c8d46c44be6ce9d275600e1735a4", + "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" + ], + "pattern": "^([0-9a-f]{40})$" + } +} +``` + +Example IBFT_EXTRA_DATA encoding + + + +# JSON input + +```json +[ + "be068f726a13c8d46c44be6ce9d275600e1735a4", + "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" +] +``` + +# RLP output + +``` +0xf853a00000000000000000000000000000000000000000000000000000000000000000ea94be068f726a13c8d46c44be6ce9d275600e1735a4945ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193808400000000c0 +``` + + diff --git a/versioned_docs/version-23.4.1/private-networks/reference/index.md b/versioned_docs/version-23.4.1/private-networks/reference/index.md new file mode 100644 index 00000000000..079ea80b12b --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/index.md @@ -0,0 +1,23 @@ +--- +description: private networks reference overview +tags: + - private networks +--- + +# Reference + +This section provides reference material for private network features. + +The following features and resources are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: + +- Besu command line: + - [Standard options](../../public-networks/reference/cli/options.md) + - [Standard subcommands](../../public-networks/reference/cli/subcommands.md) +- Besu API: + - [Standard Besu API methods](../../public-networks/reference/api/index.md) + - [Standard Besu API objects](../../public-networks/reference/api/objects.md) +- [Genesis file items](../../public-networks/reference/genesis-items.md) +- [EVM tool options](../../public-networks/reference/evm-tool.md) +- [Transaction trace types](../../public-networks/reference/trace-types.md) +- [Projects using Besu](../../public-networks/reference/projects-using-besu.md) +- [Security disclosure policy](../../public-networks/reference/disclosure.md) diff --git a/versioned_docs/version-23.4.1/private-networks/reference/plugin-api-interfaces.md b/versioned_docs/version-23.4.1/private-networks/reference/plugin-api-interfaces.md new file mode 100644 index 00000000000..54d4beda062 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/reference/plugin-api-interfaces.md @@ -0,0 +1,61 @@ +--- +title: Plugin API interfaces +sidebar_position: 4 +description: Plugin interfaces +tags: + - private networks +--- + +# Plugin API interfaces + +API interfaces in Hyperledger Besu allow users to [build plugins](../concepts/plugins.md) to extend Besu functionality. + +For more information about the available interfaces, see the [Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). + +:::note Javadoc issue + +The plugin API documentation is currently not being updated. We're working on a fix, but in the meantime, some links are temporarily pointing to wiki.hyperledger.org. + +::: + +## Core plugin classes + +The following table lists the interfaces providing core plugin classes. + +| Interface | Description | +| --- | --- | +| [**BesuContext**](https://wiki.hyperledger.org/display/BESU/BesuContext) | Allows plugins to access Besu services. | +| [**BesuPlugin**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/BesuPlugin.html) | Used to manage the plugin lifecycle. | + +## Plugin services + +The following table lists interfaces providing services you can retrieve. + +| Interface | Description | +| --- | --- | +| [**BesuEvents**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuEvents.html) | Allows plugins to attach to events during Besu operation. | +| [**BesuConfiguration**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuConfiguration.html) | Provides file system locations of Besu's storage. | +| [**IbftQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/IbftQueryService.html) | Allows query of the IBFT 2.0 aspects of the blockchain. | +| [**MetricCategoryRegistry**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/metrics/MetricCategoryRegistry.html) | Adds a new metrics category to the CLI. | +| [**MetricsSystem**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/MetricsSystem.html) | Register metrics with the Prometheus endpoint. | +| [**PoaQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/PoaQueryService.html) | Query the current state of Clique and IBFT 2.0 consensus protocols. | +| [**PicoCLIOptions**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/PicoCLIOptions.html) | Adds CLI commands to the Besu command line. | +| [**SecurityModuleService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/SecurityModuleService.html) | Allows plugins to register a security module. | +| [**StorageService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/StorageService.html) | Allows plugins to register as a storage engine. For example, to connect to a hardware security module (HSM). | +| [**PermissioningService**](https://wiki.hyperledger.org/display/BESU/PermissioningService) | Allows for fine grain control of node connection and node messaging permissioning. | +| [**PrivacyPluginService**](https://wiki.hyperledger.org/display/BESU/PrivacyPluginService) | Provides a way to define how [privacy marker transactions] are created, and what private genesis to use. | +| [**RpcEndpointService**](https://wiki.hyperledger.org/display/BESU/RpcEndpointService) | Register custom RPC endpoints. | + +To use the interfaces in your plugin, ensure the [Gradle build file](https://github.com/ConsenSys/PluginsAPIDemo/blob/957628b3c6f533f3c3f405e2a17e369cd1f02c31/build.gradle) contains the `https://hyperledger.jfrog.io/hyperledger/besu-maven` repository and the `plugin-api` dependency. + +:::warning Known issue + +As indicated in [issue #406](https://github.com/hyperledger/besu-docs/issues/406), plugins may need to access the parsed command line during registration, but the command line is not yet initialized at this stage. + +It's in our roadmap to improve lifecycle steps and provide additional visibility for some data. A workaround is to create a supplier during the `register` step and store it in memory. + +The `start` step can be ignored and your plugin module will be instantiated when the command line interface is parsed and available. + +::: + +[privacy marker transactions]: ../concepts/privacy/private-transactions/processing.md diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/_category_.json b/versioned_docs/version-23.4.1/private-networks/tutorials/_category_.json new file mode 100644 index 00000000000..25d3afe68ac --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Tutorials", + "position": 5, + "link": { + "type": "generated-index", + "slug": "private-networks/tutorials" + } +} diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/azure.md b/versioned_docs/version-23.4.1/private-networks/tutorials/azure.md new file mode 100644 index 00000000000..ab62e978fcc --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/azure.md @@ -0,0 +1,98 @@ +--- +title: Deploy using Microsoft Azure +sidebar_position: 10 +description: Deploy a private IBFT 2.0 network using Microsoft Azure. +tags: + - private networks +--- + +# Deploy private network example on Azure + +The [Quorum Dev Quickstart on Azure Marketplace] enables deploying a private IBFT 2.0 network, which includes: + +- A bootnode. +- An RPC node. +- Three regular nodes. +- A block explorer. +- Prometheus and Grafana with the Besu dashboard installed. + +These are deployed on a single Azure VM in minutes. + +Once deployed, you can develop and test applications and connect to the Visual Studio Code (VSCode) plugin using the RPC endpoint `http:///jsonrpc`. + +## Overview + +The following is a high-level overview of the deployed network. + +![Image landing](../../assets/images/sampleNetworks-poa.png) + +## Deploy + +To deploy the private network example on Azure: + +1. Create a Resource Group in the [Azure Portal](https://portal.azure.com). + +1. Go to the [Quorum Dev Quickstart on Azure Marketplace]. + +1. Click **Get It Now** and **Continue**. The Quickstart landing page is displayed. + + ![Image landing](../../assets/images/mp_0_landing.png) + +1. Click **Create**. The **Basics** page is displayed. + + ![Image basics](../../assets/images/mp_1_basics.png) + +1. Enter: + + - Details of the Resource Group you created earlier. + - Basic user credentials to start a VM. + - Prefix for your new VM and any other resources created. + - Region to which you wish to deploy the VM. + +1. Click **Next: Size** and select the size of the VM you want to use. + +1. To start the deployment, click **Review + create** at the bottom left of the page. + + The deployment typically takes 3--5 minutes. The progress of your deployment is displayed. + + When the deployment is complete, the resources created are displayed. + +1. Click **Go to Resource**. Everything created in the deployment is displayed. + +1. Click on the VM name. The VM details such as the IP and DNS name are displayed. Use the IP and DNS name displayed to connect to the VM, either in browser or via RPC calls. + +## Block explorer + +To display the block explorer, open a new tab and enter either the IP of the VM or the DNS name. + +![Image be](../../assets/images/mp_8_block_explorer.png) + +## Metrics + +The deployment includes Prometheus metrics and Grafana with a custom Besu Dashboard installed. To display the dashboard: + +1. Open a new tab and enter the IP or DNS name appended with `/grafana`. For example: `http:///grafana`. + +1. Click on home and select the Besu dashboard. + + ![Grafana screenshot](../../assets/images/mp_9_grafana.png) + +The dashboard provides a visual way to monitor your network and nodes as the chain progresses. Alerting can also be configured. + +## Connect to VM RPC endpoint + +You can connect dapps or develop directly from the IDE by using VSCode and connecting to the VM RPC endpoint. The endpoint is the DNS name appended with `/jsonrpc`: `http:///jsonrpc`. + +## SSH + +You can SSH into the VM to see how everything is set up and working. Use the credentials from step 5 of [deployment](#deploy) and your preferred client: + +```bash +ssh username@ +``` + +To list all containers running, run `docker ps`. Find the complete setup in `/home//besu-quickstart`. + +![Image ssh](../../assets/images/mp_10_ssh.png) + +[Quorum Dev Quickstart on Azure Marketplace]: https://azuremarketplace.microsoft.com/en-us/marketplace/apps/consensys.quorum-dev-quickstart diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/clique.md b/versioned_docs/version-23.4.1/private-networks/tutorials/clique.md new file mode 100644 index 00000000000..5a92e40122f --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/clique.md @@ -0,0 +1,272 @@ +--- +title: Create a Clique network +sidebar_position: 4 +description: Create a private network using the Clique consensus protocol. +tags: + - private networks +--- + +# Create a private network using Clique + +A private network provides a configurable network for testing. This private network uses the [Clique (proof of authority) consensus protocol]. + +:::danger + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +::: + +## Prerequisites + +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using Clique. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. When the node starts, Besu saves the [node key](../../public-networks/concepts/node-keys.md) in this directory. + +Create directories for your private network, each of the three nodes, and a data directory for each node: + +```bash +Clique-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 + ├── data +``` + +### 2. Get the address for Node-1 + +In Clique networks, you must include the address of at least one initial signer in the genesis file. For this Clique network, we'll use Node-1 as the initial signer. This requires obtaining the address for Node-1. + +To get the address for Node-1, in the `Node-1` directory, use the [`public-key export-address`](../../public-networks/reference/cli/subcommands.md#export-address) subcommand to write the node address to the specified file (`node1Address` in this example). + + + +# MacOS + +```bash +besu --data-path=data public-key export-address --to=data/node1Address +``` + +# Windows + +```bash +besu --data-path=data public-key export-address --to=data\node1Address +``` + + + +### 3. Create the genesis file + +The genesis file defines the genesis block of the blockchain (that is, the start of the blockchain). The [Clique genesis file](../how-to/configure/consensus/clique.md#genesis-file) includes the address of Node-1 as the initial signer in the `extraData` field. + +All nodes in a network must use the same genesis file. + +Copy the following genesis definition to a file called `cliqueGenesis.json` and save it in the `Clique-Network` directory: + +```json +{ + "config": { + "chainId": 1337, + "berlinBlock": 0, + "clique": { + "blockperiodseconds": 15, + "epochlength": 30000 + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0xa00000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "timestamp": "0x5c51a607", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +In `extraData`, replace `` with the [address for Node-1](#2-get-the-address-for-node-1), excluding the 0x prefix. + +```json +{ + ... +"extraData":"0x0000000000000000000000000000000000000000000000000000000000000000b9b81ee349c3807e46bc71aa2632203c5b4620340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + ... +} +``` + +:::warning + +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 4. Start the first node as the bootnode + +Start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line enables: + +- The JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option +- The ETH, NET, and CLIQUE APIs using the [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option +- All-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option +- All-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../assets/images/EnodeStartup.png) + +### 5. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + + +The command line specifies: + +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- The data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). + +### 6. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- The bootnode as for [Node-2](#5-start-node-2). +- Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). + +### 7. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 +``` + +The result confirms Node-1 has two peers (Node-2 and Node-3): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x2" +} +``` + +## Next steps + +Look at the logs displayed to confirm Node-1 is producing blocks and Node-2 and Node-3 are importing blocks. + +Use the [Clique API to add] Node-2 or Node-3 as a signer. + +:::note + +To add Node-2 or Node-3 as a signer you need the [node address as when specifying Node-1](#2-get-the-address-for-node-1) as the initial signer. + +::: + +Import accounts to MetaMask and send transactions, as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::info + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the Clique network in the future, start from [4. Start First Node as Bootnode](#4-start-the-first-node-as-the-bootnode). + +::: + + + +[Clique (proof of authority) consensus protocol]: ../how-to/configure/consensus/clique.md +[Clique API to add]: ../how-to/configure/consensus/clique.md#add-and-remove-signers diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/_category_.json b/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/_category_.json new file mode 100644 index 00000000000..3ba8177fcc1 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy a smart contract", + "position": 8 +} diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/index.md b/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/index.md new file mode 100644 index 00000000000..2b7d7f039cc --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/index.md @@ -0,0 +1,275 @@ +--- +title: Deploy a smart contract +sidebar_position: 1 +description: deploying smart contracts +tags: + - private networks +--- + +# Deploy smart contracts to an Ethereum chain + +This tutorial shows you how to deploy smart contracts as transactions to a network. + +## Prerequisites + +This tutorial requires a local blockchain network. You can use the [Developer Quickstart](../quickstart.md) to rapidly generate one. If deploying a private contract, enable privacy on the network (public contracts can also be deployed on privacy-enabled networks). + +## Use `eth_sendSignedTransaction` + +To deploy a smart contract using [`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sendsignedtransaction), use an account's private key to sign and serialize the transaction, and send the API request. + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. + +Using the [`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) smart contract as an example, create a new file called `compile.js` with the following content: + +```js title="compile.js" +const fs = require("fs").promises; +const solc = require("solc"); + +async function main() { + // Load the contract source code + const sourceCode = await fs.readFile("SimpleStorage.sol", "utf8"); + // Compile the source code and retrieve the ABI and bytecode + const { abi, bytecode } = compile(sourceCode, "SimpleStorage"); + // Store the ABI and bytecode into a JSON file + const artifact = JSON.stringify({ abi, bytecode }, null, 2); + await fs.writeFile("SimpleStorage.json", artifact); +} + +function compile(sourceCode, contractName) { + // Create the Solidity Compiler Standard Input and Output JSON + const input = { + language: "Solidity", + sources: { main: { content: sourceCode } }, + settings: { outputSelection: { "*": { "*": ["abi", "evm.bytecode"] } } }, + }; + // Parse the compiler output to retrieve the ABI and bytecode + const output = solc.compile(JSON.stringify(input)); + const artifact = JSON.parse(output).contracts.main[contractName]; + return { + abi: artifact.abi, + bytecode: artifact.evm.bytecode.object, + }; +} + +main().then(() => process.exit(0)); +``` + +Run `compile.js` to get the smart contract's output JSON: + +```bash +node compile.js +``` + +Run `solc` to get the contract's bytecode and ABI: + +```bash +solc SimpleStorage.sol --bin --abi +``` + +Once you have the bytecode and ABI, you can rename the output files to make them easier to use; this tutorial refers to them as `SimpleStorage.bin` and `SimpleStorage.abi`. + +Create a new file named `public_tx.js` to send the transaction (or run the following commands in a JavaScript console). The Developer Quickstart provides an [example of a public transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js). + +```js titl="public_tx.js" +const web3 = new Web3(host); +// use an existing account, or make an account +const privateKey = + "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63"; +const account = web3.eth.accounts.privateKeyToAccount(privateKey); + +// read in the contracts +const contractJsonPath = path.resolve(__dirname, "SimpleStorage.json"); +const contractJson = JSON.parse(fs.readFileSync(contractJsonPath)); +const contractAbi = contractJson.abi; +const contractBinPath = path.resolve(__dirname, "SimpleStorage.bin"); +const contractBin = fs.readFileSync(contractBinPath); +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +// get txnCount for the nonce value +const txnCount = await web3.eth.getTransactionCount(account.address); + +const rawTxOptions = { + nonce: web3.utils.numberToHex(txnCount), + from: account.address, + to: null, //public tx + value: "0x00", + data: "0x" + contractBin + contractInit, // contract binary appended with initialization value + gasPrice: "0x0", //ETH per unit of gas + gasLimit: "0x24A22", //max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const tx = new Tx(rawTxOptions); +console.log("Signing transaction..."); +tx.sign(privateKey); +console.log("Sending transaction..."); +var serializedTx = tx.serialize(); +const pTx = await web3.eth.sendSignedTransaction( + "0x" + serializedTx.toString("hex").toString("hex"), +); +console.log("tx transactionHash: " + pTx.transactionHash); +console.log("tx contractAddress: " + pTx.contractAddress); +``` + +`rawTxOptions` contains the following fields: + +- `nonce` - the number of transactions sent from an address. +- `from` - address of the sending account. For example `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`. +- `to` - address of the receiver. To deploy a contract, set to `null`. +- `gas` - amount of gas provided by the sender for the transaction. +- `gasPrice` - price for each unit of gas the sender is willing to pay. +- `data` - binary of the contract (in this example there's also a constructor initialization value, so we append that to the binary value). +- `value` - amount of Ether/Wei transferred from the sender to the recipient. + +Run the `public_tx.js` to send the transaction: + +```bash +node public_tx.js +``` + +This example code creates the transaction `tx`, signs it with the private key of the account, serializes it, then calls `eth_sendSignedTransaction` to deploy the contract. + +## Use `eth_sendTransaction` + +You can use [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) as an alternative to `eth_sendSignedTransaction`. However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account management separate for stronger security. Configure [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) with your Besu node to make the `eth_sendTransaction` API call. + +An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC node is paired with EthSigner. Refer to the [EthSigner documentation](https://docs.ethsigner.consensys.net/) for configuration details. + +Pass the following parameters to the [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods/#eth_sendtransaction) call to EthSigner; EthSigner then converts the request to an [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) call that Besu uses: + +- `to` - address of the receiver. To deploy a contract, set to `null`. +- `from` - address of the sender account. For example `0x9b790656b9ec0db1936ed84b3bea605873558198`. +- `gas` - amount of gas provided by the sender for the transaction +- `gasPrice` - price for each unit of gas the sender is willing to pay +- `data` - one of the following: + - For contract deployments (this use case) - compiled code of the contract + - For contract interactions - hash of the invoked method signature and encoded parameters (see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html)) + - For simple ether transfers - empty + +```json title="'eth_sendTransaction' parameters" +params: { + "to": null, + "from": "0x9b790656b9ec0db1936ed84b3bea605873558198", + "gas": "0x76c0", + "gasPrice": "0x9184e72a000", + "data": "0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033" +} +``` + +Make the request using `eth_sendTransaction`: + +```bash title="'eth_sendTransaction' curl HTTP request" +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0x9b790656b9ec0db1936ed84b3bea605873558198", "to":null, "gas":"0x7600","gasPrice":"0x9184e72a000", "data":"0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"}], "id":1}' +``` + +## Use `eea_sendRawTransaction` for private contracts with web3js-quorum + +To deploy a private contract to another node or [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. + +The Developer Quickstart provides an [example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. + +Use [`web3.priv.generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) by running the following commands in a JavaScript console, or by including them in a `private_tx.js` file and running `node private_tx.js`: + +```js title="'private_tx.js' using 'web3.priv.generateAndSendRawTransaction'" +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); + +const bytecode = + "608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +const chainId = 1337; +const web3 = new Web3(clientUrl); +const web3quorum = new Web3Quorum(web3, chainId); + +const txOptions = { + data: "0x" + bytecode + contractConstructorInit, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], +}; +console.log("Creating contract..."); +const txHash = await web3quorum.priv.generateAndSendRawTransaction(txOptions); +console.log("Getting contractAddress from txHash: ", txHash); + +const privateTxReceipt = await web3quorum.priv.waitForTransactionReceipt( + txHash, +); +console.log("Private Transaction Receipt: ", privateTxReceipt); +return privateTxReceipt; +``` + +`txOptions` contains the following field: + +- `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append that to the bytecode). + +The deployment process includes creating the client as in the previous examples, but rather than deploying the contract with `to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the contract's address. + +:::note + +This example doesn't use a privacy group and makes a simple node-to-node transaction. To use a privacy group: + +- Create the privacy group using the public keys of the nodes in the group. +- Specify the `privacyGroupId` instead of the `privateFor` option in the txOptions above and then send the transaction. + +The Developer Quickstart provides an [example of a private transaction with a privacy group](https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/besu/smart_contracts/privacy/scripts/private_tx_privacy_group.js). + +::: + +## Use `eea_sendRawTransaction` for private contracts with web3js-eea + +:::warning + +This web3js-eea library will be deprecated on December 31, 2021. Please use the [web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library instead and refer to the previous section. + +::: + +To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. + +The Developer Quickstart provides an [example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. + +Use `eea_sendRawTransaction` by running the following commands in a JavaScript console, or by including them in a `private_tx.js` file and running `node private_tx.js`: + +```js title="'private_tx.js' using 'eea_sendRawTransaction'" +const Web3 = require("web3"); +const EEAClient = require("web3-eea"); + +const bytecode = + "608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +const web3 = new Web3(clientUrl); +const web3eea = new EEAClient(web3, 1337); +const txOptions = { + data: "0x" + bytecode + contractConstructorInit, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], +}; +console.log("Creating contract..."); +const txHash = await web3eea.eea.sendRawTransaction(txOptions); +console.log("Getting contractAddress from txHash: ", txHash); + +const privateTxReceipt = await web3.priv.getTransactionReceipt( + txHash, + fromPublicKey, +); +// console.log("Private Transaction Receipt: ", privateTxReceipt); +return privateTxReceipt; +``` + +`txOptions` contains the following field: + +- `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append that to the bytecode). + +The deployment process includes creating the client as in the previous examples, but rather than deploying the contract with `to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the contract's address. diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/interact.md b/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/interact.md new file mode 100644 index 00000000000..11da4b07e28 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/interact.md @@ -0,0 +1,194 @@ +--- +title: Interact with a deployed contract +sidebar_position: 2 +description: calling smart contracts functions +tags: + - private networks +--- + +# Interact with deployed smart contracts + +You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate local blockchain networks. + +This tutorial shows you how to interact with smart contracts that have been deployed to a network. + +## Prerequisites + +- A network with a deployed smart contract as in the [deploying smart contracts tutorial](index.md) + +## Interact with public contracts + +This tutorial uses the [`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) contract: + +```js +pragma solidity ^0.7.0; + +contract SimpleStorage { + uint public storedData; + + constructor(uint initVal) public { + storedData = initVal; + } + + function set(uint x) public { + storedData = x; + } + + function get() view public returns (uint retVal) { + return storedData; + } +} +``` + +Once the contract is deployed, you can perform a read operation using the `get` function call and a write operation using the `set` function call. This tutorial uses the [web3js](https://www.npmjs.com/package/web3) library to interact with the contract. A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js) of these calls can be found in the [Developer Quickstart]. + +### 1. Perform a read operation + +To perform a read operation, you need the address that the contract was deployed to and the contract's ABI. The contract's ABI can be obtained from compiling the contract; see the [deploying smart contracts tutorial](index.md) for an example. + +Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new instance of the smart contract, then make the `get` function call from the contract's list of methods, which will return the value stored: + +```js +async function getValueAtAddress( + host, + deployedContractAbi, + deployedContractAddress, +) { + const web3 = new Web3(host); + const contractInstance = new web3.eth.Contract( + deployedContractAbi, + deployedContractAddress, + ); + const res = await contractInstance.methods.get().call(); + console.log("Obtained value at deployed contract is: " + res); + return res; +} +``` + +### 2. Perform a write operation + +To perform a write operation, send a transaction to update the stored value. As with the [`get` call](#1-perform-a-read-operation), you need to use the address that the contract was deployed to and the contract's ABI. The account address must correspond to an actual account with some ETH in it to perform the transaction. Because Besu doesn't manage accounts, this address is the address you use in [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) (or equivalent) to manage your accounts. + +Make the `set` call passing in your account address, `value` as the updated value of the contract, and the amount of gas you are willing to spend for the transaction: + +```js +// You need to use the accountAddress details provided to Besu to send/interact with contracts +async function setValueAtAddress( + host, + accountAddress, + value, + deployedContractAbi, + deployedContractAddress, +) { + const web3 = new Web3(host); + const contractInstance = new web3.eth.Contract( + deployedContractAbi, + deployedContractAddress, + ); + const res = await contractInstance.methods + .set(value) + .send({ from: accountAddress, gasPrice: "0xFF", gasLimit: "0x24A22" }); + return res; +} +``` + +### 3. Verify an updated value + +To verify that a value has been updated, perform a `get` call after a `set` update call. + +## Interact with private contracts + +This private contracts example uses the same `SimpleStorage.sol` contract as in the [public contracts example](#interact-with-public-contracts), but it uses the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) method to interact with the contract. Both read and write operations are performed using the `generateAndSendRawTransaction` API call. A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js) can be found in the [Developer Quickstart]. + +### 1. Perform a read operation + +As in the public contracts example, to perform a read operation, you need the address that the contract was deployed to and the contract's ABI. You also need your private and public keys and the recipient's public key. + +Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new instance of the smart contract, extract the signature of function's ABI for the `get` method, and then use this value as the `data` parameter for the `generateAndSendRawTransaction` transaction. + +The keys remain the same for the sender and recipient, and the `to` field is the contract's address. Once you make the request, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the value stored: + +```js +async function getValueAtAddress( + clientUrl, + address, + contractAbi, + fromPrivateKey, + fromPublicKey, + toPublicKey, +) { + const Web3 = require("web3"); + const Web3Quorum = require("web3js-quorum"); + const web3 = new Web3Quorum(new Web3("http://localhost:22000")); + // eslint-disable-next-line no-underscore-dangle + const functionAbi = contract._jsonInterface.find((e) => { + return e.name === "get"; + }); + const functionParams = { + to: address, + data: functionAbi.signature, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], + }; + const transactionHash = await web3quorum.priv.generateAndSendRawTransaction( + functionParams, + ); + // console.log(`Transaction hash: ${transactionHash}`); + const result = await web3quorum.priv.waitForTransactionReceipt( + transactionHash, + ); + console.log( + "" + nodeName + " value from deployed contract is: " + result.output, + ); + return result; +} +``` + +### 2. Perform a write operation + +Performing a write operation is almost the same process as the read operation, except that you encode the new value to the `set` function's ABI, and then append these arguments to the `set` function's ABI and use this as the `data` field: + +```js +async function setValueAtAddress( + clientUrl, + address, + value, + contractAbi, + fromPrivateKey, + fromPublicKey, + toPublicKey, +) { + const Web3 = require("web3"); + const Web3Quorum = require("web3js-quorum"); + const web3 = new Web3Quorum(new Web3("http://localhost:22000")); + // eslint-disable-next-line no-underscore-dangle + const functionAbi = contract._jsonInterface.find((e) => { + return e.name === "set"; + }); + const functionArgs = web3quorum.eth.abi + .encodeParameters(functionAbi.inputs, [value]) + .slice(2); + const functionParams = { + to: address, + data: functionAbi.signature + functionArgs, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], + }; + const transactionHash = await web3quorum.priv.generateAndSendRawTransaction( + functionParams, + ); + console.log(`Transaction hash: ${transactionHash}`); + const result = await web3quorum.priv.waitForTransactionReceipt( + transactionHash, + ); + return result; +} +``` + +### 3. Verify an updated value + +To verify that a value has been updated, perform a `get` call after a `set` update call. + +[Developer Quickstart]: ../quickstart.md diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/transfer-funds.md b/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/transfer-funds.md new file mode 100644 index 00000000000..d2ae16ca8f4 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/contracts/transfer-funds.md @@ -0,0 +1,128 @@ +--- +title: Transfer account funds +sidebar_position: 1 +description: funds transfer transactions +tags: + - private networks +--- + +# Transfer funds between accounts in a transaction + +You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate local blockchain networks. + +This tutorial shows you how to transfer funds (ETH) between accounts in a transaction. + +## Prerequisites + +- A [private network](../quickstart.md) + +## Use `eth_sendSignedTransaction` + +The simplest way to transfer funds between externally-owned accounts is using [`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendsignedtransaction). This example uses `eth_sendSignedTransaction` and one of the [test accounts](../../reference/accounts-for-testing.md) to transfer funds to a newly created account. + +:::danger Do not use the test accounts on Ethereum Mainnet or any production network + +The private key is publicly displayed, which means the account is not secure. + +::: + +Before making the transaction, check the balances of both accounts to verify the funds transfer after the transaction. + +```js +const web3 = new Web3(host); +// Pre-seeded account with 90000 ETH +const privateKeyA = + "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; +const accountA = web3.eth.accounts.privateKeyToAccount(privateKeyA); +var accountABalance = web3.utils.fromWei( + await web3.eth.getBalance(accountA.address), +); +console.log("Account A has balance of: " + accountABalance); + +// Create a new account to transfer ETH to +var accountB = web3.eth.accounts.create(); +var accountBBalance = web3.utils.fromWei( + await web3.eth.getBalance(accountB.address), +); +console.log("Account B has balance of: " + accountBBalance); +``` + +Use the test account address (Account A) for the `from` parameter, the recipient account address (Account B) for the `to` parameter, and the amount of ETH to transfer between accounts for the `value` parameter. Sign the transaction with Account A's private key and send it using `eth_sendSignedTransaction`. + +```js +// Send some ETH from A to B +const rawTxOptions = { + nonce: web3.utils.numberToHex( + await web3.eth.getTransactionCount(accountA.address), + ), + from: accountA.address, + to: accountB.address, + value: "0x100", // Amount of ETH to transfer + gasPrice: "0x0", // ETH per unit of gas + gasLimit: "0x24A22", // Max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const tx = new Tx(rawTxOptions); +console.log("Signing transaction..."); +tx.sign(Buffer.from(accountA.privateKey.substring(2), "hex")); +console.log("Sending transaction..."); +var serializedTx = tx.serialize(); +const pTx = await web3.eth.sendSignedTransaction( + "0x" + serializedTx.toString("hex").toString("hex"), +); +console.log("tx transactionHash: " + pTx.transactionHash); +``` + +Once it completes, you can see the updated balances. + +```js +// After the transaction, there should be some ETH transferred +var accountABalance = await getAccountBalance(host, accountA); +console.log("Account A has an updated balance of: " + accountABalance); +var accountBBalance = await getAccountBalance(host, accountB); +console.log("Account B has an updatedbalance of: " + accountBBalance); +} +``` + +A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/eth_tx.js) can be found in the Developer Quickstart. + +## Use `eth_sendTransaction` + +An alternative to using `eth_sendSignedTransaction` is [`eth_sendTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendtransaction). However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account management separate for stronger security. Instead, Besu uses [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) to make the `eth_sendTransaction` API call. + +An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC node is paired with EthSigner. Refer to the [EthSigner documentation](https://docs.ethsigner.consensys.net/en/stable/) configuration details. + +Use `eth_sendTransaction` similarly to [using `eth_sendSignedTransaction`](#use-eth_sendsignedtransaction) (without the signing step which is done by EthSigner): + +```js +const web3 = new Web3(host); +// Pre-seeded account with 90000 ETH +const privateKeyA = "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; +const accountA = web3.eth.accounts.privateKeyToAccount(privateKeyA); +var accountABalance = web3.utils.fromWei(await web3.eth.getBalance(accountA.address)); +console.log("Account A has balance of: " + accountABalance); + +// Create a new account to transfer ETH to +var accountB = web3.eth.accounts.create(); +var accountBBalance = web3.utils.fromWei(await web3.eth.getBalance(accountB.address)); +console.log("Account B has balance of: " + accountBBalance); + +// Send some ETH from A to B +const txOptions = { + from: accountA.address, + to: accountB.address, + value: "0x100", // Amount of ETH to transfer + gasPrice: "0x0", // ETH per unit of gas + gasLimit: "0x24A22" // Max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const pTx = await web3.eth.sendTransaction(txOptions); +console.log("tx transactionHash: " + pTx.transactionHash); + +// After the transaction, there should be some ETH transferred +var accountABalance = await getAccountBalance(host, accountA); +console.log("Account A has an updated balance of: " + accountABalance); +var accountBBalance = await getAccountBalance(host, accountB); +console.log("Account B has an updatedbalance of: " + accountBBalance); +} +``` diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/ethash.md b/versioned_docs/version-23.4.1/private-networks/tutorials/ethash.md new file mode 100644 index 00000000000..ea464438383 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/ethash.md @@ -0,0 +1,225 @@ +--- +title: Create an Ethash network +sidebar_position: 5 +description: Create a private network using the Ethash consensus protocol. +tags: + - private networks +--- + +# Create a private network using Ethash + +A private network provides a configurable network for testing. By configuring a low difficulty and enabling mining, this allows for fast block creation. + +You can test multi-block and multi-user scenarios on a private network before moving to one of the public testnets. + +:::danger + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +::: + +## Prerequisites + +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using Ethash. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. When the node starts, Besu saves the [node key](../../public-networks/concepts/node-keys.md) in this directory. + +Create directories for your private network, each of the three nodes, and a data directory for each node: + +```bash +Private-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 + ├── data +``` + +### 2. Create a genesis file + +The genesis file defines the genesis block of the blockchain (that is, the start of the blockchain). The genesis file includes entries for configuring the blockchain, such as the mining difficulty and initial accounts and balances. + +All nodes in a network must use the same genesis file. The [network ID](../../public-networks/concepts/network-and-chain-id.md) defaults to the `chainID` in the genesis file. The `fixeddifficulty` enables fast block mining. + +Copy the following genesis definition to a file called `privateNetworkGenesis.json` and save it in the `Private-Network` directory: + +```json +{ + "config": { + "berlinBlock": 0, + "ethash": { + "fixeddifficulty": 1000 + }, + "chainID": 1337 + }, + "nonce": "0x42", + "gasLimit": "0x1000000", + "difficulty": "0x10000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +:::warning + +Don't use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Start the first node as a bootnode + +Start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line enables: + +- Mining and specifies the account to pay mining rewards to using the [`--miner-enabled`](../../public-networks/reference/cli/options.md#miner-enabled) and [`--miner-coinbase`](../../public-networks/reference/cli/options.md#miner-coinbase) options. +- JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- All-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. +- All-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. + +:::info + +The miner coinbase account is one of the accounts defined in the genesis file. + +::: + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../assets/images/EnodeStartup.png) + +### 4. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30304 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30304 +``` + + + +The command line specifies: + +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- A data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A genesis file as for Node-1. + +### 5. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30305 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30305 +``` + + + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery. +- A data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A bootnode and genesis file as for Node-2. + +### 6. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 +``` + +The result confirms Node-1 (the node running the JSON-RPC service) has two peers (Node-2 and Node-3): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x2" +} +``` + +## Next steps + +Import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::info + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: + +Send transactions using `eth_sendRawTransaction` to [send ether or, deploy or invoke contracts](../how-to/send-transactions/index.md). + +Use the [JSON-RPC API](../../public-networks/how-to/use-besu-api/json-rpc.md). + +Start a node with the [`--rpc-ws-enabled`](../../public-networks/reference/cli/options.md#rpc-ws-enabled) option and use the [RPC Pub/Sub API](../../public-networks/how-to/use-besu-api/rpc-pubsub.md). + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the private network in the future, start from [3. Start the first node as a bootnode](#3-start-the-first-node-as-a-bootnode). + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/ibft/_category_.json b/versioned_docs/version-23.4.1/private-networks/tutorials/ibft/_category_.json new file mode 100644 index 00000000000..c90421ed03c --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/ibft/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create an IBFT 2.0 network", + "position": 3 +} diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/ibft/index.md b/versioned_docs/version-23.4.1/private-networks/tutorials/ibft/index.md new file mode 100644 index 00000000000..c93d9fc271c --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/ibft/index.md @@ -0,0 +1,376 @@ +--- +description: Hyperledger Besu private network using the IBFT 2.0 (Proof of Authority) consensus protocol +tags: + - private networks +--- + +# Create a private network using IBFT 2.0 + +A private network provides a configurable network for testing. This private network uses the [IBFT 2.0 (proof of authority) consensus protocol](../../how-to/configure/consensus/ibft.md). + +:::danger + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires 4 validators to be Byzantine fault tolerant. + +::: + +## Prerequisites + +- [Hyperledger Besu](../../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using IBFT 2.0 with four nodes. The four nodes are all validators. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. + +Create directories for your private network, each of the four nodes, and a data directory for each node: + +```bash +IBFT-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +├── Node-3 +│   ├── data +└── Node-4 + ├── data +``` + +### 2. Create a configuration file + +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `IBFT-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the configuration file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +:::warning + +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `IBFT-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```bash +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │   ├── key + │   └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │   ├── key + │   └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │   ├── key + │   └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the IBFT-Network directory + +Copy the `genesis.json` file to the `IBFT-Network` directory. + +### 5. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```bash +IBFT-Network/ +├── genesis.json +├── Node-1 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-2 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-3 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-4 +│ ├── data +│ │    ├── key +│ │    ├── key.pub +``` + +### 6. Start the first node as the bootnode + +In the `Node-1` directory, start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line: + +- Specifies the data directory for Node-1 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- Enables the JSON-RPC API using the [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables the ETH, NET, and IBFT APIs using the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) option. +- Enables all-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist) option. +- Enables all-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) + +### 7. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + + +The command line specifies: + +- The data directory for Node-2 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 8. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + + +The command line specifies: + +- The data directory for Node-3 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 9. Start Node-4 + +Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + + ```bash + besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 + ``` + +# Windows + + ```bash + besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 + ``` + + + +The command line specifies: + +- The data directory for Node-4 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 10. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`ibft_getvalidatorsbyblocknumber`](../../reference/api/index.md#ibft_getvalidatorsbyblocknumber) method and confirm the network has four validators: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' localhost:8545 +``` + +The result displays the four validators: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x1e326b6da177ede2d3eb6d7247bd9f6901d40234", + "0x4aaac297fefe4466ebcb0b23ab90c5f466b11556", + "0xa267ead2e91e1673e0943b925176b51d9cd4f6d2", + "0xe3e680bc0ff485d1d415a384721f19e0db65fea7" + ] +} +``` + +Look at the logs to confirm Besu is producing blocks: + +```bash +2020-12-21 07:22:17.883+10:00 | EthScheduler-Workers-0 | INFO | PersistBlockTask | Imported #1 / 0 tx / 0 om / 0 (0.0%) gas / (0xde088192f27ca376eea969cb7a4a1de445bd923fde0444194c88e630f7705584) in 0.010s. Peers: 4 +2020-12-21 07:22:19.057+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=2, Round=0}, hash=0x2ca2652fa79ae2b3b6aadcfb13d5d362ffd6207c3b5ae47971e04eb9d05deaa9 +2020-12-21 07:22:21.044+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=3, Round=0}, hash=0x5d9a06cd17127712cfae7d1c25f705f302e146f4b64a73de3c814e1b5a3f9a16 +2020-12-21 07:22:23.049+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=4, Round=0}, hash=0x843981375f4cb2bb0f33a09b647ac27da5df2c539d940d8344c907eede57829c +2020-12-21 07:22:25.060+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=5, Round=0}, hash=0x82b2069961d9185f7857cad1123de72d715729e122441335db486ea436834d6e +``` + +:::info + +If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), the network will not start producing blocks. + +The logs for each node should indicate the public key was loaded from the `data/key` directory: + +```bash +2020-12-21 07:16:18.360+10:00 | main | INFO | KeyPairUtil | Loaded public key 0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc from /IBFT-Network/Node-1/data/key +``` + +If the keys were not copied to the correct directory, Besu creates a key when starting up: + +```bash +2020-12-21 07:33:11.458+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /IBFT-Network/Node-1/data/key +``` + +If a new key was created, the validator key specified in the configuration does not match the created key and the node cannot participate in creating blocks. + +::: + +## Next steps + +Use the [IBFT API](../../reference/api/index.md#ibft-20-methods) to remove or add validators. + +:::note + +To add or remove nodes as validators you need the node address. The directory [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the name. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires four validators to be Byzantine fault tolerant. + +::: + +Import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](../quickstart.md#create-a-transaction-using-metamask). + +:::info + +Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). + +::: + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the IBFT 2.0 network in the future, start from [6. Start First Node as Bootnode](#6-start-the-first-node-as-the-bootnode). + +::: + + + +[IBFT 2.0 (proof of authority)consensus protocol]: ../../how-to/configure/consensus/ibft.md + + + +\*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/ibft/validators.md b/versioned_docs/version-23.4.1/private-networks/tutorials/ibft/validators.md new file mode 100644 index 00000000000..1e74b04d01d --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/ibft/validators.md @@ -0,0 +1,125 @@ +--- +title: Add and removing IBFT 2.0 validators +sidebar_position: 1 +description: Adding and removing IBFT 2.0 validators +tags: + - private networks +--- + +# Add and remove IBFT 2.0 validators + +This example walks through [adding and removing an IBFT 2.0 validator](../../how-to/configure/consensus/ibft.md#add-and-remove-validators). + +## Prerequisites + +- [IBFT 2.0 network as configured in the IBFT 2.0 tutorial](index.md) + +## Add a validator + +### 1. Create directories + +Create a working directory and a data directory for the new node that needs to be added: + +```bash +mkdir -p Node-5/data +``` + +### 2. Start the node + +Change into the working directory for the new Node-5 and start the node, specifying the [Node-1 enode URL](index.md#6-start-the-first-node-as-the-bootnode) as the bootnode: + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30307 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8549 +``` + +The command line specifies: + +- The data directory for Node-5 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](index.md#6-start-the-first-node-as-the-bootnode). + +### 3. Copy the address of the node + +Copy the address of the node. You can find the address in the logs when starting the new node: + +```bash +2021-05-28 09:49:00.881+10:00 | main | INFO | DefaultP2PNetwork | Node address 0x90626e6a67445aabf1c0615410d108d4733aa90b +``` + +Or use the [`public-key export-address`](../../../public-networks/reference/cli/subcommands.md#export-address) subcommand: + + + +# Subcommand + +```bash +besu --data-path=IBFT-Network/Node-5/data public-key export-address +``` + +# Output + +```bash +0x90626e6a67445aabf1c0615410d108d4733aa90b +``` + + + +### 4. Propose adding the new validator + +Propose adding the new validator from more than half the number of current validators, using [`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the proposed validator and `true`: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0x90626e6a67445aabf1c0615410d108d4733aa90b", true], "id":1}' http://127.0.0.1:8545 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +Repeat the proposal process for this candidate node from at least two of the other nodes. + +### 5. Verify the addition of the new validator + +Verify that the new validator is now in the list of validators using [`ibft_getValidatorsByBlockNumber`](../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber): + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` + +# JSON result + +```json +[ + "0x189d23d201b03ae1cf9113672df29a5d672aefa3", + "0x2aabbc1bb9bacef60a09764d1a1f4f04a47885c1", + "0x44b07d2c28b8ed8f02b45bd84ac7d9051b3349e6", + "0x4c1ccd426833b9782729a212c857f2f03b7b4c0d", + "0x90626e6a67445aabf1c0615410d108d4733aa90b" +] +``` + + + +The list of validators contains 5 addresses now. + +## Remove a validator + +The process for removing a validator is similar to [adding a validator](#add-a-validator) starting from step 2, except you specify `false` as the second parameter of [`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote). diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/_category_.json b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/_category_.json new file mode 100644 index 00000000000..5a498fa215c --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy using Kubernetes", + "position": 9 +} diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/charts.md b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/charts.md new file mode 100644 index 00000000000..8172d66e5c7 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/charts.md @@ -0,0 +1,504 @@ +--- +title: Deploying Charts +sidebar_position: 3 +description: Deploying Besu Helm Charts for a Kubernetes cluster +tags: + - private networks +--- + +# Deploy charts + +You can deploy Besu Helm charts for a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) + +## Provision with Helm charts + +Helm is a method of packaging a collection of objects into a chart which can then be deployed to the cluster. After you have cloned the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change the directory to `helm` for the rest of this tutorial. + +```bash +cd helm +``` + +Each helm chart has the following key-map values which you will need to set depending on your needs. The `cluster.provider` is used as a key for the various cloud features enabled. Please specify only one cloud provider, not both. At present, the charts have full support for cloud native services in both AWS and Azure. Please note that if you use GCP, IBM etc please set `cluster.provider: local` and set `cluster.cloudNativeServices: false`. + +Please update the `aws` or `azure` map as shown below if you deploy to either cloud provider. + +```bash +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) + reclaimPolicy: Delete # set to either Retain or Delete; note that PVCs and PVs will still exist after a 'helm delete'. Setting to Retain will keep volumes even if PVCs/PVs are deleted in kubernetes. Setting to Delete will remove volumes from EC2 EBS when PVC is deleted + +quorumFlags: + privacy: false + removeKeysOnDelete: false + +aws: + # the aws cli commands uses the name 'quorum-node-secrets-sa' so only change this if you altered the name + serviceAccountName: quorum-node-secrets-sa + # the region you are deploying to + region: ap-southeast-2 + +azure: + # the script/bootstrap.sh uses the name 'quorum-pod-identity' so only change this if you altered the name + identityName: quorum-pod-identity + # the clientId of the user assigned managed identity created in the template + identityClientId: azure-clientId + keyvaultName: azure-keyvault + # the tenant ID of the key vault + tenantId: azure-tenantId + # the subscription ID to use - this needs to be set explictly when using multi tenancy + subscriptionId: azure-subscriptionId +``` + +Setting the `cluster.cloudNativeServices: true`: + +- Stores keys in Azure Key Vault or AWS Secrets Manager. +- Uses Azure Managed Identities or AWS Identity and Access Management for pod identity access. + +:::note + +You can customize any of the charts in this repository to suit your requirements, and make pull requests to extend functionality. + +::: + +### 1. Check that you can connect to the cluster with `kubectl` + +Verify kubectl is connected to cluster using: (use the latest version) + +```bash +kubectl version +``` + +The result looks similar to: + +```bash +Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.1", GitCommit:"86ec240af8cbd1b60bcc4c03c20da9b98005b92e", GitTreeState:"clean", BuildDate:"2021-12-16T11:41:01Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"} +Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"} +``` + +### 2. Create the namespace + +This tutorial isolates groups of resources (for example, StatefulSets and Services) within a single cluster. + +:::note + +The rest of this tutorial uses `besu` as the namespace, but you're free to pick any name when deploying, as long as it's consistent across the [infrastructure scripts](cluster.md) and charts. + +::: + +Run the following in a terminal window: + +```bash +kubectl create namespace besu +``` + +### 3. Deploy the monitoring chart + +This chart deploys Prometheus and Grafana to monitor the metrics of the cluster, nodes and state of the network. + +Update the admin `username` and `password` in the [monitoring values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/monitoring.yml). Configure alerts to the receiver of your choice (for example, email or Slack), then deploy the chart using: + +```bash +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm repo update +helm install monitoring prometheus-community/kube-prometheus-stack --version 34.10.0 --namespace=besu --values ./values/monitoring.yml --wait +kubectl --namespace besu apply -f ./values/monitoring/ +``` + +Metrics are collected via a [ServiceMonitor](https://github.com/prometheus-operator/prometheus-operator/blob/7c77626e5e270a2530e187b185d45eeed8a773bf/Documentation/user-guides/getting-started.md) that scrapes each Besu pod, using given [`annotations`](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) which specify the port and path to use. For example: + +```bash + template: + metadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: 9545 + prometheus.io/path: "/metrics" +``` + +:::warning + +For production use cases, configure Grafana with one of the supported [native auth mechanisms](https://grafana.com/docs/grafana/latest/auth/). + +::: + +![k8s-metrics](../../../assets/images/kubernetes-grafana.png) + +Optionally you can also deploy the [Elastic Stack](https://www.elastic.co/elastic-stack/) to view logs (and metrics). + +```bash +helm repo add elastic https://helm.elastic.co +helm repo update +# if on cloud +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace quorum --values ./values/elasticsearch.yml +# if local - set the replicas to 1 +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace quorum --values ./values/elasticsearch.yml --set replicas=1 --set minimumMasterNodes: 1 +helm install kibana --version 7.17.1 elastic/kibana --namespace quorum --values ./values/kibana.yml +helm install filebeat --version 7.17.1 elastic/filebeat --namespace quorum --values ./values/filebeat.yml +``` + +If you install `filebeat`, please create a `filebeat-*` index pattern in `kibana`. All the logs from the nodes are sent to the `filebeat` index. If you use The Elastic stack for logs and metrics, please deploy `metricbeat` in a similar manner to `filebeat` and create an index pattern in Kibana. + +![k8s-elastic](../../../assets/images/kubernetes-elastic.png) + +To connect to Kibana or Grafana, we also need to deploy an ingress so you can access your monitoring endpoints publicly. We use Nginx as our ingress here, and you are free to configure any ingress per your requirements. + +```bash +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +helm install quorum-monitoring-ingress ingress-nginx/ingress-nginx \ + --namespace quorum \ + --set controller.ingressClassResource.name="monitoring-nginx" \ + --set controller.ingressClassResource.controllerValue="k8s.io/monitoring-ingress-nginx" \ + --set controller.replicaCount=1 \ + --set controller.nodeSelector."kubernetes\.io/os"=linux \ + --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.service.externalTrafficPolicy=Local + +kubectl apply -f ../ingress/ingress-rules-monitoring.yml +``` + +Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard or on the command line `kubectl -n quorum get services quorum-monitoring-ingress-ingress-nginx-controller`. + +:::note + +We refer to the ingress here as `external-nginx` because it deals with monitoring endpoints specifically. We also deploy a second ingress called `network-ingress` which is for the blockchain nodes only in [step 8](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) + +::: + +![`k8s-ingress-external`](../../../assets/images/kubernetes-ingress-ip.png) + +You can view the Besu dashboard by going to: + +```bash +http:///d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s +``` + +You can view the Kibana dashboard (if deployed) by going to: + +```bash +http:///kibana +``` + +### 4. Deploy the genesis chart + +The genesis chart creates the genesis file and keys for the validators. + +:::warning + +It's important to keep the release names of the initial validator pool as per this tutorial, that is `validator-n`, where `n` is the node number. Any validators created after the initial pool can be named to anything you like. + +::: + +The override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) looks like below: + +```bash +--- +quorumFlags: + removeGenesisOnDelete: true + +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false + +aws: + # the aws cli commands uses the name 'quorum-node-secrets-sa' so only change this if you altered the name + serviceAccountName: quorum-node-secrets-sa + # the region you are deploying to + region: ap-southeast-2 + +azure: + # the script/bootstrap.sh uses the name 'quorum-pod-identity' so only change this if you altered the name + identityName: quorum-pod-identity + # the clientId of the user assigned managed identity created in the template + identityClientId: azure-clientId + keyvaultName: azure-keyvault + # the tenant ID of the key vault + tenantId: azure-tenantId + # the subscription ID to use - this needs to be set explictly when using multi tenancy + subscriptionId: azure-subscriptionId + +# the raw Genesis config +# rawGenesisConfig.blockchain.nodes set the number of validators/signers +rawGenesisConfig: + genesis: + config: + chainId: 1337 + algorithm: + consensus: qbft # choose from: ibft | qbft | raft | clique + blockperiodseconds: 10 + epochlength: 30000 + requesttimeoutseconds: 20 + gasLimit: '0x47b760' + difficulty: '0x1' + coinbase: '0x0000000000000000000000000000000000000000' + blockchain: + nodes: + generate: true + count: 4 + accountPassword: 'password' +``` + +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeGenesisOnDelete: true` tells the chart to delete the genesis file when the chart is deleted. If you may wish to retain the genesis on deletion, please set that value to `false`. + +The last config item is `rawGenesisConfig` which has details of the chain you are creating, please edit any of the parameters in there to match your requirements. To set the number of initial validators set the `rawGenesisConfig.blockchain.nodes` to the number that you'd like. We recommend using the Byzantine formula of `N=3F+1` when setting the number of validators. + +One more thing to note is that when `cluster.cloudNativeServices: true` is set, the genesis job will not add the [Quickstart](../quickstart.md) test accounts into the genesis file. + +When you are ready deploy the chart with : + +```bash +cd helm +helm install genesis ./charts/besu-genesis --namespace besu --create-namespace --values ./values/genesis-besu.yml +``` + +Once completed, view the genesis and enodes (the list of static nodes) configuration maps that every Besu node uses, and the validator and bootnode node keys as secrets. + +![k8s-genesis-configmaps](../../../assets/images/kubernetes-genesis-configmaps.png) + +![k8s-genesis-secrets](../../../assets/images/kuberenetes-genesis-secrets.png) + +### 5. Deploy the bootnodes + +This is an optional but recommended step. In a production setup we recommend the use of two ore more bootnodes for best practices. Each Besu node has a map that tells the StatefulSet what to deploy and how to clean up. The default `values.yml` for the StatefulSet define the following flags which are present in all the override values files. + +```bash +--- +quorumFlags: + privacy: false + removeKeysOnDelete: true + isBootnode: true # set this to true if this node is a bootnode + usesBootnodes: true # set this to true if the network you are connecting to use a bootnode/s that are deployed in the cluster + +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false + reclaimPolicy: Delete # set to either Retain or Delete; note that PVCs and PVs will still exist after a 'helm delete'. Setting to Retain will keep volumes even if PVCs/PVs are deleted in kubernetes. Setting to Delete will remove volumes from EC2 EBS when PVC is deleted + +aws: + # the aws cli commands uses the name 'quorum-node-secrets-sa' so only change this if you altered the name + serviceAccountName: quorum-node-secrets-sa + # the region you are deploying to + region: ap-southeast-2 + +azure: + # the script/bootstrap.sh uses the name 'quorum-pod-identity' so only change this if you altered the name + identityName: quorum-pod-identity + # the clientId of the user assigned managed identity created in the template + identityClientId: azure-clientId + keyvaultName: azure-keyvault + # the tenant ID of the key vault + tenantId: azure-tenantId + # the subscription ID to use - this needs to be set explictly when using multi tenancy + subscriptionId: azure-subscriptionId + +node: + besu: + metrics: + serviceMonitorEnabled: true + resources: + cpuLimit: 1 + cpuRequest: 0.1 + memLimit: "2G" + memRequest: "1G" +``` + +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. If you may wish to retain the keys on deletion, please set that value to `false`. + +For the bootnodes only, set the `quorumFlags.isBootnode: true`. When using bootnodes you have to also set `quorumFlags.usesBootnodes: true` to indicate that all nodes on the network will use these bootnodes. + +:::note + +If you use bootnodes, you must set `quorumFlags.usesBootnodes: true` in the override values.yaml for every other node type, that is validators.yaml, txnode.yaml and reader.yaml + +::: + +```bash +helm install bootnode-1 ./charts/besu-node --namespace besu --values ./values/bootnode.yml +helm install bootnode-2 ./charts/besu-node --namespace besu --values ./values/bootnode.yml +``` + +Once complete, you see two StatefulSets, and the two bootnodes discover themselves and peer. Because there are no validators present yet, there are no blocks created, as seen in the following logs. + +![k8s-bootnode-logs](../../../assets/images/kubernetes-bootnode-logs.png) + +### 6. Deploy the validators + +The validators peer with the bootnodes and themselves, and when a majority of the validators have peered, blocks are proposed and created on the chain. + +These are the next set of nodes that we will deploy. The charts use four validators (default) to replicate best practices for a network. The override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/validator.yml) for the StatefulSet looks like below: + +```bash +--- +quorumFlags: + privacy: false + removeKeysOnDelete: false + isBootnode: false # set this to true if this node is a bootnode + usesBootnodes: true # set this to true if the network you are connecting to use a bootnode/s that are deployed in the cluster +``` + +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. If you may wish to retain the keys on deletion, please set that value to `false`. + +:::warning + +Please note that if you delete a majority of the validators, the network will halt. Additionally, if the validator keys are deleted you may not be able to recover as you need a majority of the validators up to vote to add new validators into the pool + +::: + +When using bootnodes (if deployed in the previous step) you have to also set `quorumFlags.usesBootnodes: true` to indicate that all nodes on the network will use these bootnodes. + +For the initial validator pool we set all the node flags to `false` and then deploy. + +```bash +helm install validator-1 ./charts/besu-node --namespace besu --values ./values/validator.yml +helm install validator-2 ./charts/besu-node --namespace besu --values ./values/validator.yml +helm install validator-3 ./charts/besu-node --namespace besu --values ./values/validator.yml +helm install validator-4 ./charts/besu-node --namespace besu --values ./values/validator.yml +``` + +:::warning + +It's important to keep the release names of the validators the same as it is tied to the keys that the genesis chart creates. So we use `validator-1`, `validator-2`, etc. in the following command. + +::: + +Once completed, you may need to give the validators a few minutes to peer and for round changes, depending on when the first validator was spun up, before the logs display blocks being created. + +![k8s-validator-logs](../../../assets/images/kubernetes-validator-logs.png) + +### 7. Add/Remove additional validators to the validator pool + +To add (or remove) more validators to the initial validator pool, you need to deploy a node such as an RPC node (step 8) and then [vote](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) that node in. The vote API call must be made on a majority of the existing pool and the new node will then become a validator. + +Please refer to the [Ingress Section](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) for details on making the API calls from your local machine or equivalent. + +### 8. Deploy RPC or Transaction nodes + +An RPC node is simply a node that can be used to make public transactions or perform read heavy operations such as when connected to a chain explorer like [BlockScout](https://github.com/blockscout/blockscout). + +The RPC override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/reader.yml) for the StatefulSet looks identical to that of the validators above, and will create it's own node keys before the node starts. + +To deploy an RPC node: + +```bash +helm install rpc-1 ./charts/besu-node --namespace besu --values ./values/reader.yml +``` + +A Transaction or Member node in turn is one which has an accompanying Private Transaction Manager, such as Tessera; which allow you to make private transactions between nodes. + +The Transaction override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) for the StatefulSet looks identical to that of the validators above and only has `quorumFlags.privacy: true` to indicate that it is deploying a pair of GoQuorum and Tessera nodes. + +To deploy a Transaction or Member node: + +```bash +helm install member-1 ./charts/besu-node --namespace besu --values ./values/txnode.yml +``` + +Logs for `member-1` resemble the following for Tessera: + +![`k8s-tx-tessera-logs`](../../../assets/images/kubernetes-tx-tessera-logs.png) + +Logs for Besu resemble the following: + +![`k8s-tx-Besu-logs`](../../../assets/images/kubernetes-tx-Besu-logs.png) + +:::note + +In these examples we use `member-1` and `rpc-1` as release names for the deployments. You can pick any release name that you'd like to use in place of those as per your requirements. + +::: + +### 9. Connect to the node from your local machine via an ingress + +In order to view the Grafana dashboards or connect to the nodes to make transactions from your local machine you can deploy an ingress controller with rules. We use the `ingress-nginx` ingress controller which can be deployed as follows: + +```bash +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +helm install quorum-network-ingress ingress-nginx/ingress-nginx \ + --namespace quorum \ + --set controller.ingressClassResource.name="network-nginx" \ + --set controller.ingressClassResource.controllerValue="k8s.io/network-ingress-nginx" \ + --set controller.replicaCount=1 \ + --set controller.nodeSelector."kubernetes\.io/os"=linux \ + --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.service.externalTrafficPolicy=Local +``` + +Use [pre-defined rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) to test functionality, and alter to suit your requirements (for example, restrict access for API calls to trusted CIDR blocks). + +Edit the [rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) file so that the service names match your release name. In the example, we deployed a transaction node with the release name `member-1` so the corresponding service is called `besu-node-member-1`. Once you have settings that match your deployments, deploy the rules as follows: + +```bash +kubectl apply -f ../ingress/ingress-rules-besu.yml +``` + +Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard or on the command line `kubectl -n quorum get services quorum-network-ingress-ingress-nginx-controller`. + +![`k8s-ingress`](../../../assets/images/kubernetes-ingress-ip.png) + +The following is an example RPC call, which confirms that the node running the JSON-RPC service is syncing: + + + +# curl HTTP request + +```bash +curl -v -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http:///rpc +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4e9" +} +``` + + + +### 10. Blockchain explorer + +You can deploy [BlockScout](https://github.com/blockscout/blockscout) to aid with monitoring the blockchain. To do this, update the [BlockScout values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/blockscout-besu.yml) and set the `database` and `secret_key_base` values. + +:::important + +Changes to the database requires changes to both the `database` and the `blockscout` dictionaries. + +::: + +Once completed, deploy the chart using: + +```bash +helm dependency update ./charts/blockscout +helm install blockscout ./charts/blockscout --namespace quorum --values ./values/blockscout-goquorum.yaml +``` + +You can optionally deploy the [Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight blockchain explorer. The Quorum Explorer is not recommended for use in production and is intended for demonstration or Development purposes only. The Explorer can give an overview over the whole network, such as querying each node on the network for node or block information, voting (add/remove) validators from the network, demonstrating a SimpleStorage smart contract with privacy enabled, and sending transactions between wallets as you would do in MetaMask. Please see the [Explorer](quorum-explorer.md) page for details on how to use the application. + +:::warning + +The accounts listed in the file below are for test purposes only and should not be used on a production network. + +::: + +To deploy the application, update the [Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) with details of your nodes and endpoints and then deploy. + +```bash +helm install quorum-explorer ./charts/explorer --namespace besu --values ./values/explorer-besu.yaml +``` + +You will also need deploy the ingress (if not already done in [Monitoring](#3-deploy-the-monitoring-chart) to access the endpoint on `http:///explorer` + +![`k8s-explorer`](../../../assets/images/kubernetes-explorer.png) diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/cluster.md b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/cluster.md new file mode 100644 index 00000000000..ba2772510b6 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/cluster.md @@ -0,0 +1,230 @@ +--- +title: Create a cluster +sidebar_position: 2 +description: Create a cluster for deployment +tags: + - private networks +--- + +# Create a cluster + +You can create a [local](#local-clusters) or [cloud](#cloud-clusters) cluster to deploy a Besu network using Kubernetes. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) +- Install [AWS CLI](https://aws.amazon.com/cli/) and [`eksctl`](https://eksctl.io/) for AWS EKS clusters +- Install [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) for Azure AKS clusters +- Install the cloud-specific CLI + +## Local Clusters + +Use one of several options to create a local cluster. Select one listed below, or another that you're comfortable with. + +### Minikube + +[Minikube](https://minikube.sigs.k8s.io/docs/start/) is one of the most popular options to spin up a local Kubernetes cluster for development. You can [install a version](https://minikube.sigs.k8s.io/docs/start/) based on your architecture. + +:::note + +We recommend at least 2 CPUs and 16GB of RAM. + +::: + +To start the cluster, run the following command: + +```bash +minikube start --cpus 2 --memory 16384 --cni auto +``` + +### kind + +[kind (Kubernetes in Docker)](https://kind.sigs.k8s.io) is a lightweight tool for running local Kubernetes clusters. The [installation](https://kind.sigs.k8s.io/docs/user/quick-start#installation) is similar to [Minikube](#minikube). + +To start the cluster, run the following command: + +```bash +kind create cluster +``` + +### Rancher + +[Rancher](https://github.com/rancher-sandbox/rancher-desktop/) is a lightweight open source desktop application for Mac, Windows, and Linux. It provides Kubernetes and container management, and allows you to choose the version of Kubernetes to run. + +It can build, push, pull, and run container images. Built container images can be run without needing a registry. + +:::note + +The official Docker-CLI is not supported but rather uses [nerdctl](https://github.com/containerd/nerdctl) which is a Docker-CLI compatible tool for containerd, and is automatically installed with Rancher Desktop. + +::: + +:::note + +For Windows, you must [install Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install) to install Rancher Desktop. + +Refer to the [official Rancher Desktop documentation](https://docs.rancherdesktop.io/) for system requirements and installation instructions. + +::: + +## Cloud clusters + +### AWS EKS + +[AWS Elastic Kubernetes Service (AWS EKS)](https://aws.amazon.com/eks/) is one of the most popular platforms to deploy Hyperledger Besu. + +To create a cluster in AWS, you must install the [AWS CLI](https://aws.amazon.com/cli/) and [`eksctl`](https://eksctl.io/). + +The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) comprises the base infrastructure used to build the cluster and other resources in AWS. We also use some native services with the cluster for performance and best practices, these include: + +- [Pod identities](https://github.com/aws/amazon-eks-pod-identity-webhook). +- [Secrets Store CSI drivers](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html). +- Dynamic storage classes backed by AWS EBS. The [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) are fixed sizes and can be updated as you grow via helm updates, and won't need to re-provision the underlying storage class. +- [CNI](https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html) networking mode for EKS. By default, EKS clusters use `kubenet` to create a virtual network and subnet. Nodes get an IP address from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods receive an IP address "hidden" behind the node IP. + + :::note + + This approach reduces the number of IP addresses that you must reserve in your network space for pods, but constrains what can connect to the nodes from outside the cluster (for example, on-premise nodes or those on another cloud provider). + + ::: + +AWS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed directly. The IP addresses must be unique across your network space, and must be planned in advance. Each node has a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses per node are then reserved up front for that node. This approach requires more planning, and can lead to IP address exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. + +:::warning + +EKS clusters must not use 169.254.0.0/16, 172.30.0.0/16, 172.31.0.0/16, or 192.0.2.0/24 for the Kubernetes service address range. + +::: + +To provision the cluster: + +1. Update [cluster.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/aws/templates/cluster.yml) + +2. Deploy the template: + + ```bash + eksctl create cluster -f ./templates/cluster.yml + ``` + +3. Your `.kube/config` should be connected to the cluster automatically, but if not, run the commands below and replace `AWS_REGION` and `CLUSTER_NAME` with details that are specific to your deployment. + + ```bash + aws sts get-caller-identity + aws eks --region AWS_REGION update-kubeconfig --name CLUSTER_NAME + ``` + +4. After the deployment completes, provision the EBS drivers for the volumes. While it is possible to use the in-tree `aws-ebs` driver that's natively supported by Kubernetes, it is no longer being updated and does not support newer EBS features such as the [cheaper and better gp3 volumes](https://stackoverflow.com/questions/68359043/whats-the-difference-between-ebs-csi-aws-com-vs-kubernetes-io-aws-ebs-for-provi). The `cluster.yml` file (from the steps above) that is included in this folder automatically deploys the cluster with the EBS IAM policies, but you need to install the EBS CSI drivers. This can be done through the AWS Management Console for simplicity, or via a CLI command as below. Replace `CLUSTER_NAME`, `AWS_REGION` and `AWS_ACCOUNT` with details that are specific to your deployment. + + ```bash + eksctl create iamserviceaccount --name ebs-csi-controller-sa --namespace kube-system --cluster CLUSTER_NAME --region AWS_REGION --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --approve --role-only --role-name AmazonEKS_EBS_CSI_DriverRole + + eksctl create addon --name aws-ebs-csi-driver --cluster CLUSTER_NAME --region AWS_REGION --service-account-role-arn arn:aws:iam::AWS_ACCOUNT:role/AmazonEKS_EBS_CSI_DriverRole --force + ``` + +5. Once the deployment is completed, provision the Secrets Manager IAM and CSI driver. Use `besu` (or equivalent) for `NAMESPACE` and replace `CLUSTER_NAME`, `AWS_REGION` and `AWS_ACCOUNT` with details that are specific to your deployment. + + ```bash + helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts + helm install --namespace kube-system --create-namespace csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver + kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml + + POLICY_ARN=$(aws --region AWS_REGION --query Policy.Arn --output text iam create-policy --policy-name quorum-node-secrets-mgr-policy --policy-document '{ + "Version": "2012-10-17", + "Statement": [ { + "Effect": "Allow", + "Action": ["secretsmanager:CreateSecret","secretsmanager:UpdateSecret","secretsmanager:DescribeSecret","secretsmanager:GetSecretValue","secretsmanager:PutSecretValue","secretsmanager:ReplicateSecretToRegions","secretsmanager:TagResource"], + "Resource": ["arn:aws:secretsmanager:AWS_REGION:AWS_ACCOUNT:secret:besu-node-*"] + } ] + }') + + # If you have deployed the above policy before, you can acquire its ARN: + POLICY_ARN=$(aws iam list-policies --scope Local \ + --query 'Policies[?PolicyName==`quorum-node-secrets-mgr-policy`].Arn' \ + --output text) + + eksctl create iamserviceaccount --name quorum-node-secrets-sa --namespace NAMESPACE --region=AWS_REGION --cluster CLUSTER_NAME --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts + ``` + + :::warning + + The above command creates a service account called `quorum-node-secrets-sa` and is preconfigured in the helm charts override `values.yml` files, for ease of use. + + ::: + +6. Optionally, deploy the [kubernetes dashboard](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws/templates/k8s-dashboard). + +7. You can now use your cluster and you can deploy [Helm charts](charts.md) to it. + +### Azure Kubernetes Service + +[Azure Kubernetes Service (AKS)](https://azure.microsoft.com/en-us/services/kubernetes-service/) is another popular cloud platform that you can use to deploy Besu. To create a cluster in Azure, you must install the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) and have admin rights on your Azure subscription to enable some preview features on AKS. + +The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) comprises the base infrastructure used to build the cluster and other resources in Azure. We also make use Azure native services and features after the cluster is created. These include: + +- [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity). +- [Secrets Store CSI drivers](https://docs.microsoft.com/en-us/azure/key-vault/general/key-vault-integrate-kubernetes). +- Dynamic storage classes backed by Azure Files. The [volume claims](https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv) are fixed sizes and can be updated as you grow via helm updates, and won't need to re-provision the underlying storage class. +- [CNI](https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni) networking mode for AKS. By default, AKS clusters use `kubenet`, to create a virtual network and subnet. Nodes get an IP address from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods receive an IP address "hidden" behind the node IP. + + :::note + + This approach reduces the number of IP addresses you must reserve in your network space for pods to use, but constrains what can connect to the nodes from outside the cluster (for example, on-premise nodes or other cloud providers). + + ::: + +AKS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed directly. These IP addresses must be unique across your network space, and must be planned in advance. Each node has a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses per node are then reserved up front for that node. This approach requires more planning, and can leads to IP address exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. + +:::warning + +Please do not create more than one AKS cluster in the same subnet. AKS clusters may not use `169.254.0.0/16`, `172.30.0.0/16`, `172.31.0.0/16`, or `192.0.2.0/24` for the Kubernetes service address range. + +::: + +To provision the cluster: + +1. Enable the preview features that allow you to use AKS with CNI, and a managed identity to authenticate and run cluster operations with other services. We also enable [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity) which use the managed identity. This is in preview, so you must enable this feature by registering the `EnablePodIdentityPreview` feature: + + ```bash + az feature register --name EnablePodIdentityPreview --namespace Microsoft.ContainerService + ``` + + This takes a little while and you can check on progress by running: + + ```bash + az feature list --namespace Microsoft.ContainerService -o table + ``` + + Install or update your local Azure CLI with preview features: + + ```bash + az extension add --name aks-preview + az extension update --name aks-preview + ``` + +1. Create a resource group if you don't already have one: + + ```bash + az group create --name BesuGroup --location "East US" + ``` + +1. Deploy the template: + + 1. Navigate to the [Azure portal](https://portal.azure.com), select **+ Create a resource** in the upper left corner. + 1. Search for `Template deployment (deploy using custom templates)` and select **Create**. + 1. Select **Build your own template in the editor**. + 1. Remove the contents (JSON) in the editor and paste in the contents of [`azuredeploy.json`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/arm/azuredeploy.json) + 1. Select **Save**. + 1. Input provisioning parameters in the displayed user interface. + +1. Provision the drivers: + + 1. Run the [bootstrap](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/scripts/bootstrap.sh) script. + 1. Use `besu` for `AKS_NAMESPACE`, and update `AKS_RESOURCE_GROUP`, `AKS_CLUSTER_NAME`, and `AKS_MANAGED_IDENTITY` in the commands below to match your settings and deployed resources from step 3. + + ```bash + ./scripts/bootstrap.sh "AKS_RESOURCE_GROUP" "AKS_CLUSTER_NAME" "AKS_MANAGED_IDENTITY" "AKS_NAMESPACE" + ``` + +1. You can now use your cluster and you can deploy [Helm charts](charts.md) to it. diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/index.md b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/index.md new file mode 100644 index 00000000000..bd1dea65869 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/index.md @@ -0,0 +1,138 @@ +--- +title: Deploy a Hyperledger Besu private network with Kubernetes +description: Deploying Hyperledger Besu with Kubernetes +tags: + - private networks +--- + +# Deploy Besu using Kubernetes + +Use the [reference implementations](https://github.com/ConsenSys/besu-kubernetes) to install private networks using Kubernetes (K8s). Reference implementations are available using: + +- [Helm](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm). +- [Helmfile](https://github.com/roboll/helmfile). +- [`kubectl`](https://github.com/ConsenSys/besu-kubernetes/tree/master/playground/kubectl). + +Familiarize yourself with the reference implementations and customize them for your requirements. + +## Quorum-Kubernetes + +[Quorum-Kubernetes](https://github.com/ConsenSys/quorum-Kubernetes) is a repository containing Kubernetes manifests and Helm charts that you can customize and deploy on a local cluster or in the cloud. + +:::important + +We recommend starting with the [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) directory and working through the example setups before moving to the [`Helm charts`](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm/) directory. + +::: + +The `helm` directory contains charts for the various components, and each chart has a `cluster` map with features that you can toggle. + +```bash +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) +``` + +Setting `cluster.cloudNativeServices: true` stores keys in AWS Secrets Manager or Azure Key Vault instead of Kubernetes Secrets, and will also make use of AWS IAM or Azure Managed Identities for the pods. + +### Cloud support + +The repository's `helm` charts support on-premise and cloud providers such as AWS, Azure, GCP, IBM etc. You can configure the provider in the [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) file of the respective charts by setting `cluster.provider` to `local`, `aws`, or `azure`. If you use GCP, IBM etc., please set `cluster.provider: local` and `cluster.cloudNativeServices: false`. + +The repository also contains [Azure ARM templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) and [AWS `eksctl` templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) to deploy the required base infrastructure. + +## Limitations + +When using multi-clusters, Kubernetes load balancers disallow TCP and UDP traffic on the same port, which inhibits discovery working natively for each pod. Use the following solutions to mitigate this limitation: + +- Disallow discovery and use static nodes to allow only TCP traffic. This isn't an issue for load balancers or exposing nodes publicly. +- If you need to use discovery, use something such as [CNI](#cni) which is supported by all major cloud providers, and the cloud templates already have CNI implemented. + +### CNI + +With the traditional `kubenet` networking mode, nodes get an IP from the virtual network subnet. Each node in turn uses NAT to configure the pods so that they reach other pods on the virtual network. This limits where they can reach but also more specifically what can reach them. For example, an external VM which must have custom routes does not scale well. + +![without-CNI](../../../assets/images/kubernetes-1.jpeg) + +CNI, on the other hand, allows every pod to get a unique IP directly from the virtual subnet which removes this restriction. Therefore, it has a limit on the maximum number of pods that can be spun up, so you must plan ahead to avoid IP exhaustion. + +![with-CNI](../../../assets/images/kubernetes-2.jpeg) + +## Multi-cluster + +You must enable [CNI](#cni) to use multi-cluster, or to connect external nodes to an existing Kubernetes cluster. To connect multiple clusters, they must each have different CIDR blocks to ensure no conflicts, and the first step is to peer the VPCs or VNets together and update the route tables. From that point on you can use static nodes and pods to communicate across the cluster. + +The same setup also works to connect external nodes and business applications from other infrastructure, either in the cloud or on premise. + +![multi-cluster](../../../assets/images/kubernetes-3.png) + +## Concepts + +### Namespaces + +In Kubernetes, [namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) provide a mechanism for isolating groups of resources within a single cluster. Both namespaces and resources (for example, Stateful Sets or Services) within a namespace must be unique, but resources across namespaces don't need to be. + +:::note + +Namespace-based scoping is not applicable for cluster-wide objects (for example, Storage Class or Persistent Volumes). + +::: + +### Nodes + +Consider using Stateful Sets instead of Deployments for Besu. The term 'client node' refers to bootnode, validator and member/RPC nodes. For Besu nodes, we only use CLI arguments to keep things consistent. + +### Role-based access controls + +We encourage using role-based access controls (RBACs) for access to the private key of each node, that is, only a specific pod or statefulset is allowed to access a specific secret. + +If you need to specify a Kube configuration file for each pod, use the `KUBE_CONFIG_PATH` variable. + +### Storage + +We use separate data volumes to store the blockchain data. This is similar to using separate volumes to store data when using docker containers natively or docker-compose. This is done for a few reasons: + +- Containers are mortal and we do not want to store data on them. +- Kubernetes host nodes can fail and we want the chain data to persist. + +Ensure that you provide enough data storage capacity for all nodes on the cluster. Select the appropriate type of [Storage Class](https://kubernetes.io/docs/concepts/storage/storage-classes/) based on your cloud provider. In the templates, the size of the [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) is set to 20Gb by default; you can change this depending on your needs. If you have a different storage account than the one in the charts, you may edit those [Storage Classes](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/charts/besu-node/templates/node-storage.yaml). + +When using Persistent Volume Claims, set the `allowVolumeExpansion` to `true`. This helps keep costs low and enables growing the volume over time rather than creating new volumes and copying data across. + +### Monitoring + +We recommend deploying metrics to get an overview of the network, nodes, and volumes. You can also create alerts. + +Besu publishes metrics to Prometheus, and you can configure metrics using the kubernetes scraper configuration. We also have custom Grafana dashboards to monitor the blockchain. + +:::note + +Refer to `values/monitoring.yml` to configure the alerts per your requirements (for example slack or email). + +::: + +```bash +cd helm +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm repo update +helm install monitoring prometheus-community/kube-prometheus-stack --version 34.10.0 --namespace=besu --create-namespace --values ./values/monitoring.yml --wait +kubectl --namespace besu apply -f ./values/monitoring/ +``` + +You can configure Besu to suit your environment. For example, use the Elastic charts to log to a file that you can parse using Logstash into an ELK cluster. + +```bash +cd helm +helm repo add elastic https://helm.elastic.co +helm repo update +# if on cloud +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace besu --create-namespace --values ./values/elasticsearch.yml +# if local - set the replicas to 1 +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace besu --create-namespace --values ./values/elasticsearch.yml --set replicas=1 --set minimumMasterNodes: 1 +helm install kibana --version 7.17.1 elastic/kibana --namespace besu --values ./values/kibana.yml +helm install filebeat --version 7.17.1 elastic/filebeat --namespace besu --values ./values/filebeat.yml +``` + +### Ingress Controllers + +If you require the ingress controllers for the RPC calls or the monitoring dashboards, we have provided example [rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) that are pre-configured for common use cases. Use these as a reference and develop solutions to match your network topology and requirements. diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/maintenance.md b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/maintenance.md new file mode 100644 index 00000000000..a32bf1a15b2 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/maintenance.md @@ -0,0 +1,64 @@ +--- +title: Maintenance +sidebar_position: 5 +description: Maintenance for Besu on a Kubernetes cluster +tags: + - private networks +--- + +# Maintenance + +You can perform maintenance for Besu on a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) with a [network](charts.md) +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) + +## Update a persistent volume claim size + +Over time, as the chain grows, so will the amount of space used by the persistent volume claim (PVC). As of Kubernetes v1.11, [certain types of Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/#allow-volume-expansion) allow volume resizing. Production charts for Azure use Azure Files, and on AWS use EBS Block Store which allow for volume expansion. + +To update the volume size, you must update the override values file. For example, to increase the size on the transaction nodes volumes, add the following snippet to the [`txnode values.yml`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) file, with the new size limit (the following example uses 50Gi). + +```bash +storage: + sizeLimit: "50Gi" + pvcSizeLimit: "50Gi" +``` + +Once complete, update the node via helm: + +```bash +helm upgrade tx-1 ./charts/besu-node --namespace besu --values ./values/txnode.yml +``` + +## Update Besu versions + +:::important + +When updating Besu nodes across a cluster, perform the updates as a rolling update and not all at once, especially for the validator pool. If all the validators are taken offline, the chain halts, and you must wait for round changes to expire before blocks are created again. + +::: + +Updates for Besu can be done via Helm in exactly the same manner as other applications. Alternatively, this can be done via `kubectl`. This example updates a node called `besu-validator-3`: + +1. Set the update policy to use rolling updates (if not done already): + + ```bash + kubectl patch statefulset besu-validator-3 --namespace besu -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}' + ``` + +2. Update the Besu version via Helm: + + ```bash + helm upgrade bootnode-1 ./charts/besu-node --namespace besu --values ./values/bootnode.yml --set image.besu.tag=21.10.0 + ``` + + Or via `kubectl`: + + ```bash + kubectl patch statefulset besu-validator-3 --namespace besu --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"hyperledger/besu:21.10.0"}]' + ``` diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/nat-manager.md b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/nat-manager.md new file mode 100644 index 00000000000..5a66ede1f48 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/nat-manager.md @@ -0,0 +1,221 @@ +--- +title: Configure Kubernetes mode in NAT manager +sidebar_position: 9 +description: Tutorial to configure Kubernetes mode for Hyperledger Besu Nat Manager +tags: + - private networks +--- + +# Configure Kubernetes mode in NAT Manager + +Use [`--nat-method=AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) or [`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) CLI options to let the Besu node automatically configure its IP address and ports. + +Use mode [`--nat-method=NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) to be able to set your Besu ports and IP address manually. + +Default mode is [`AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) but Besu will fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode if automatic configuration fails. + +:::info The following log shows fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode after an automatic detection failure. + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: + +## Automatic configuration + +Follow 3 steps to configure Besu for automatic IP address and ports detection on Kubernetes: + +1. [Create a load balancer](#1-create-a-load-balancer) +1. [Check if the load balancer is properly deployed](#2-check-if-the-load-balancer-is-properly-deployed) +1. [Deploy Besu](#3-deploy-besu) + +### 1. Create a load balancer + +Deploy a `LoadBalancer` service for Besu to recover IP address and ports. + +Here is an example that you can customize with your own ports and routing rules. + +```yaml +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + name: besu +spec: + ports: + - name: "json-rpc" + port: 8545 + targetPort: 8545 + - name: "rlpx" + port: 30303 + targetPort: 30303 + selector: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + type: LoadBalancer +``` + +This service example lists the rules for the different ports used by Besu (`json-rpc` and` rlpx`). The default value is used for `discovery`. + +### 2. Check if the load balancer is properly deployed + +Verify the load balancer readiness before launching Besu. + +Run `kubectl describe services besu` to check the service status. + +The command should display the following information: + +```bash +Name: besu +Namespace: default +Labels: app.kubernetes.io/name=besu + app.kubernetes.io/release=1.0.0 +Annotations: kubectl.kubernetes.io/last-applied-configuration: + {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"besu","app.kubernetes.io/release":"1.... +Selector: app.kubernetes.io/name=besu,app.kubernetes.io/release=1.0.0 +Type: LoadBalancer +IP: -------- +LoadBalancer Ingress: ****** +``` + +The load balancer must have an IP address displayed in place of `******` on the `LoadBalancer Ingress` line to be ready. + +Run the `kubectl describe services besu` command again until the load balancer IP address appears in the output. + +### 3. Deploy Besu + +When steps 1 and 2 are completed, deploy Besu using the following YAML example: + +```yaml +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: besu-config + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: 1.0.0 +data: + BESU_LOGGING: "INFO" + BESU_NETWORK: "dev" + BESU_P2P_ENABLED: "true" + BESU_RPC_HTTP_ENABLED: "true" + BESU_RPC_HTTP_APIS: "eth,net,web3,debug,admin" + KUBE_CONFIG_PATH: "/opt/besu/shared/kube-config" +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: besu + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" +spec: + replicas: 1 + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + spec: + containers: + - name: besu + image: "hyperledger/besu:latest" + imagePullPolicy: Always + ports: + - containerPort: 8545 + - containerPort: 30303 + envFrom: + - configMapRef: + name: besu-config + restartPolicy: Always +status: {} +``` + +## Automatic detection errors + +:::danger + +Automatic detection error messages do not prevent you to use Besu. + +Try the fix indicated for each error or use [`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) CLI option and [set IP address and port manually](../../../public-networks/how-to/connect/configure-ports.md). + +::: + +Possible errors messages for Kubernetes automatic detection failure: + +- [`Service not found`](#service-not-found-error-message) +- [`Forbidden`](#forbidden-error-message) +- [`Ingress not found`](#ingress-not-found-error-message) + +### `Service not found` error message + +- **Error message:** `Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used` +- **Cause:** load balancer did start correctly or has the incorrect name. +- **Fix:** check and modify load balancer YAML configuration and restart service. + +:::info Example error log + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: + +### `Forbidden` error message + +- **Error message:** `Nat manager failed to configure itself automatically due to the following reason Forbidden. NONE mode will be used` +- **Cause:** Besu don't have permission to list the services via the Kubernetes API to retrieve IP address and ports from the load balancer. +- **Fix:** Give it the required permissions using [Role-based access control](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). + + If you can't manage permissions, define the IP address and ports manually with [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode + +:::info Example error log + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Forbidden. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: + +:::tip + +For development environment, the permission issue can be fixed by running `kubectl create clusterrolebinding myapp-view-binding --clusterrole=admin --serviceaccount=default:default` + +This command should only be used on development environment and not in production environment. + +In production environment, require a finer management of permissions using Kubernetes [Role-based access control](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). + +::: + +### `Ingress not found` error message + +- **Error message:** `Nat manager failed to configure itself automatically due to the following reason Ingress not found. NONE mode will be used` +- **Cause:** Load balancer did not finish to recover an IP address. +- **Fix:** [Check that the load balancer is properly deployed](#2-check-if-the-load-balancer-is-properly-deployed) before launching Besu. + +:::info Example error log + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Ingress not found. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/playground.md b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/playground.md new file mode 100644 index 00000000000..67962456a62 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/playground.md @@ -0,0 +1,28 @@ +--- +title: Local playground +sidebar_position: 1 +description: Deploying a Hyperledger Besu private network locally with Kubernetes +tags: + - private networks +--- + +# Deploy in a local environment + +The [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) was created to provide an opportunity to deploy [quorum-kubernetes](https://github.com/ConsenSys/quorum-kubernetes/) in a local environment before attempting in a live environment (such as in the cloud or on-premise). Local deployment can be done with any local Kubernetes tool. Minikube and Rancher Desktop have been tested to work, but any complete Kubernetes solution with support for `kubectl` should suffice. + +## Steps + +1. Navigate to the playground [`README`](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground). +1. Ensure that your system meets the requirements specified. +1. Choose your Ethereum client (Hyperledger Besu or GoQuorum): `quorum-besu` or `quorum-go`. +1. Choose your consensus algorithm. The playground supports Clique, Ethash (PoW), and IBFT2 for Besu, and IBFT for GoQuorum. +1. Follow the instructions from the `README` for the chosen client and consensus algorithm folder. + +## Important notes + +Consider the following when deploying and developing with the playground: + +- The playground is created specifically for developers and operators to become familiar with the deployment of Besu in a Kubernetes environment in preparation for going into a cloud or on-premise environment. Thus, it should **not** be deployed into a production environment. +- The playground is not a complete reflection of the `helm` charts as it does not use `Helm`, but rather static or non-templated code that is deployed through `kubectl apply -f`. This means that without `Helm` there's a significant amount of repeated code. This is fine for development but not ideal for a production environment. +- The playground uses static/hard-coded keys. Automatic key generation is only supported in `helm` charts. +- As the playground is for local development, no cloud integration or lifecycle support is offered. diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/production.md b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/production.md new file mode 100644 index 00000000000..a9cd60d9da3 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/production.md @@ -0,0 +1,89 @@ +--- +title: Production +sidebar_position: 6 +description: Deploying Besu Helm Charts for production on a Kubernetes cluster +tags: + - private networks +--- + +# Deploy for production + +You can deploy Besu for production on a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- [Helm3](https://helm.sh/docs/intro/install/) + +## Overview + +To get things production-ready, we'll use the same charts, and set a few of the values in the `cluster` map as in the [Deploy](#deploy-the-network) section. + +:::warning + +The following tutorial ONLY supports AWS and Azure currently. Other cloud providers will be added in time. + +::: + +:::warning + +We recommend using AWS RDS or Azure PostgreSQL in High Availability mode for any Tessera nodes that you use. The templates don't include that functionality. They can be provisioned with CloudFormation or Azure Resource Manager, respectively. Once created, please specify the connection details to the `values.yml`. + +::: + +## Deploy + +### Check that you can connect to the cluster with `kubectl` + +Once you have a [cluster running](cluster.md), verify `kubectl` is connected to cluster with: + +```bash +kubectl version +Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.1", GitCommit:"86ec240af8cbd1b60bcc4c03c20da9b98005b92e", GitTreeState:"clean", BuildDate:"2021-12-16T11:41:01Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"} +Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"} +``` + +### Deploy the network + +For the rest of this tutorial we use Helm charts. After you have cloned the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change the directory to `helm` for the rest of this tutorial. + +```bash +cd helm +``` + +Each helm chart has the following keys that must be set. + +Specify either `aws` or `azure` for the `cluster.provider`. Additionally, set `cloudNativeServices: true` and `reclaimPolicy: Retain` so that it looks like the following for AWS: + +```bash +cluster: + provider: aws # choose from: aws | azure + cloudNativeServices: true # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) + reclaimPolicy: Retain # set to either Retain or Delete; note that PVCs and PVs will still exist after a 'helm delete'. Setting to Retain will keep volumes even if PVCs/PVs are deleted in kubernetes. Setting to Delete will remove volumes from EC2 EBS when PVC is deleted +``` + +Follow the steps outlined in the [deploy charts](charts.md) tutorial to deploy the network. + +## Best practices + +The most important thing is to plan your network out on paper first and then test it in a Dev cluster to make sure connectivity works with your applications and you get the required throughput in transactions per second (TPS). We also recommend you test the entire process, from provisioning infrastructure to updating nodes on a Dev cluster, prior to launching your production network. + +By default, the cloud Kubernetes clusters take care of availability and do multi-zones within a region. The scheduler also ensures that deployments are spread out across zones. Where possible, we recommend you use multiple bootnodes and static nodes to speed up peering. + +You can connect to APIs and services outside the cluster normally, but connecting into your network (such as adding an on-premise node to the network) might require more configuration. Please check the [limitations](index.md#limitations) and use CNI where possible. To connect an external node to your cluster, the easiest way is to use a VPN as seen in the following [multi-cluster](#multi-cluster-support) setup. + +Finally, we recommend setting up monitoring and alerting from the beginning, so you can get early warnings of issues rather than after failure. We have a monitoring chart which uses Grafana and you can use it with Alertmanager to create alerts or alternatively alert via Cloudwatch or Azure Monitoring. + +## Multi-cluster support + +When CNI is used, multi-cluster support is simple, but you have to cater for cross-cluster DNS names. Ideally, you want to create two separate VPCs (or VNets) and make sure they have different base CIDR blocks so that IP addresses don't conflict. Once done, peer the VPCs together and update the subnet route table, so they are effectively a giant single network. + +![multi-cluster](../../../assets/images/kubernetes-3.png) + +When you [spin up clusters](cluster.md), use [CNI](index.md#limitations) and CIDR blocks to match the subnet's CIDR settings. Then deploy the genesis chart on one cluster and copy across the genesis file and static nodes config maps. Depending on your DNS settings, they might be fine as is, or they might need to be actual IP addresses. That is, you can provision cluster B only after cluster A has Besu nodes up and running. + +Deploy the network on cluster A, and then on cluster B. Besu nodes on cluster A should work as expected, and Besu nodes on cluster B should use the list of peers provided to communicate with the nodes on cluster A. + +Keeping the list of peers on the clusters live and up to date can be challenging, so we recommend using the cloud service provider's DNS service such as Route 53 or Azure DNS and adapting the charts to create entries for each node when it comes up. diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/quorum-explorer.md b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/quorum-explorer.md new file mode 100644 index 00000000000..cd69831c806 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/kubernetes/quorum-explorer.md @@ -0,0 +1,69 @@ +--- +title: Using the Quorum Explorer +sidebar_position: 4 +description: Using the Quorum Explorer on a Kubernetes cluster +tags: + - private networks +--- + +# Use the Quorum Explorer + +You can use the Quorum Explorer on a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- [Helm3](https://helm.sh/docs/intro/install/) +- [Existing network](charts.md) + +## Deploy the Quorum Explorer helm chart + +[Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight blockchain explorer. The Quorum Explorer is **not** recommended for use in production and is intended for demonstration or development purposes only. + +The explorer can provide an overview over the whole network, such as block information, voting or removing validators from the network, and demonstrates using the `SimpleStorage` smart contract with privacy enabled, and sending transactions between wallets in one interface. + +To use the explorer, update the [Quorum-Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) with your node details and endpoints, and then [deploy](charts.md). + +## Nodes + +The **Nodes** page provides an overview of the nodes on the network. Select the node you would like to interact with from the drop-down on the top right, and you'll get details of the node, block height, peers, queued transactions etc. + +![`k8s-explorer`](../../../assets/images/kubernetes-explorer.png) + +## Validators + +The **Validators** page simulates a production environment or consortium where each node individually runs API calls to vote to add a validator or remove an existing validator. + +When using the buttons to remove, discard pending validators, or proposing a validator, the app sends an API request to the selected node in the drop-down only. To add or remove a validator you need to select a majority of the existing validator pool individually, and perform the vote API call by clicking the button. Each node can call a discard on the voting process during or after the validator has been added. + +The vote calls made from non-validator nodes have no effect on overall consensus. + +![`k8s-explorer-validators`](../../../assets/images/kubernetes-explorer-validators.png) + +## Explorer + +The **Explorer** page gives you the latest blocks from the chain and the latest transactions as they occur on the network. In addition, you can search by block number or transaction hash using the respective search bar. + +![`k8s-explorer-explorer`](../../../assets/images/kubernetes-explorer-explorer.png) + +## Contracts + +Use the **Contracts** page to compile and deploy a smart contract. Currently, the only contract available for deployment through the app is the `SimpleStorage` contract. However, in time, we plan to add more contracts to that view. + +In this example, we deploy from `member-1` and select `member-1` and `member-3` in the **Private For** multi-select. Then click on `Compile` and `Deploy` + +![`k8s-explorer-contracts-1`](../../../assets/images/kubernetes-explorer-contracts-1.png) + +Once deployed, you can interact with the contract. As this is a new transaction, select `member-1` and `member-3` in **Interact** multi-select, and then click on the appropriate method call to `get` or `set` the value at the deployed contract address. + +![`k8s-explorer-contracts-set`](../../../assets/images/kubernetes-explorer-contracts-set.png) + +To test the private transaction functionality, select `member-2` from the drop-down on the top right, you'll notice that you are unable to interact with the contract because `member-2` was not part of the transaction. Only `members-1` and `member-3` responds correctly. + +## Wallet + +The **Wallet** page gives you the functionality to send simple ETH transactions between accounts by providing the account's private key, the recipient's address, and transfer amount in Wei. + +![`k8s-explorer-wallet`](../../../assets/images/kubernetes-explorer-wallet.png) diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/_category_.json b/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/_category_.json new file mode 100644 index 00000000000..da14c12d4b3 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create a permissioned network", + "position": 7 +} diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/index.md b/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/index.md new file mode 100644 index 00000000000..054469e436d --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/index.md @@ -0,0 +1,497 @@ +--- +title: Create a permissioned network +sidebar_position: 1 +description: Hyperledger Besu create a permissioned network +tags: + - private networks +--- + +# Create a permissioned network + +The following steps set up a permissioned network with local node and account permissions. The network uses the [IBFT 2.0 proof of authority consensus protocol]. + +:::danger + +A permissioned Ethereum network as described here is not protected against all attack vectors. We recommend applying defense in depth to protect your infrastructure. + +::: + +## Prerequisites + +- [Hyperledger Besu](../../get-started/install/binary-distribution.md) +- [curl (or similar Web service client)](https://curl.haxx.se/download.html) + +## Steps + +### 1. Create folders + +Each node requires a data directory for the blockchain data. + +Create directories for your permissioned network and each of the three nodes, and a data directory for each node: + +```bash +Permissioned-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 +│   ├── data +└── Node-4 + ├── data +``` + +### 2. Create the configuration file + +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `Permissioned-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::danger Security warning + +Don't use the accounts in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `Permissioned-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```bash +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │   ├── key + │   └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │   ├── key + │   └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │   ├── key + │   └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the Permissioned-Network directory + +Copy the `genesis.json` file to the `Permisssioned-Network` directory. + +### 5. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```bash +Permissioned-Network/ +├── genesis.json +├── Node-1 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-2 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-3 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-4 +│ ├── data +│ │    ├── key +│ │    ├── key.pub +``` + +### 6. Create the permissions configuration file + +The [permissions configuration file](../../how-to/use-permissioning/local.md#permissions-configuration-file) defines the nodes and accounts allowlists. + +Copy the following permissions configuration to a file called `permissions_config.toml` and save a copy in the `Node-1/data`, `Node-2/data`, `Node-3/data`, and `Node-4/data` directories: + +```toml title="permissions_config.toml" +accounts-allowlist=["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "0x627306090abaB3A6e1400e9345bC60c78a8BEf57"] + +nodes-allowlist=[] +``` + +The permissions configuration file includes the first two accounts from the genesis file. + +Use the [`perm_addNodesToAllowlist`](../../reference/api/index.md#perm_addnodestoallowlist) JSON-RPC API method to add permissioned nodes after starting the nodes. + +### 7. Start Node-1 + +Use the following command: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" +``` + + + +The command line allows you to enable: + +- Nodes and accounts permissions using [`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) and [`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled). +- The JSON-RPC API using [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled). +- The `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). +- All-host access to the HTTP JSON-RPC API using [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). +- All-domain access to the node through the HTTP JSON-RPC API using [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to specify Node-1 as a peer and update the permissions configuration file in the following steps. + +![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) + +### 8. Start Node-2 + +Start another terminal, change to the `Node-2` directory, and start Node-2: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 +``` + + + +The command line specifies: + +- A different port to Node-1 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- A data directory for Node-2 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). +- Other options as for [Node-1](#7-start-node-1). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. + +### 9. Start Node-3 + +Start another terminal, change to the `Node-3` directory, and start Node-3: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 +``` + + + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- A data directory for Node-3 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). +- Other options as for [Node-1](#7-start-node-1). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. + +### 10. Start Node-4 + +Start another terminal, change to the `Node-4` directory, and start Node-4: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 +``` + + + +The command line specifies: + +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- A data directory for Node-4 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). +- Other options as for [Node-1](#7-start-node-1). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. + +### 11. Add enode URLs for nodes to permissions configuration file + +Start another terminal and use the [`perm_addNodesToAllowlist`](../../reference/api/index.md#perm_addnodestoallowlist) JSON-RPC API method to add the nodes to the permissions configuration file for each node. + +Replace ``, ``, ``, and `` with the enode URL displayed when starting each node. + + + +# Node-1 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8545 +``` + +# Node-2 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8546 +``` + +# Node-3 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8548 +``` + + + +:::tip + +The curl call is the same for each node except for the JSON-RPC endpoint. + +::: + +### 12. Add nodes as peers + +Use the [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer) JSON-RPC API method to add Node-1 as a peer for Node-2, Node-3, and Node-4. + +Replace `` with the enode URL displayed when starting Node-1. + + + +# Node-2 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8546 +``` + +# Node-3 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` + + + +:::tip + +The curl call is the same for each node except for the JSON-RPC endpoint. + +::: + +Replace `` with the enode URL displayed when starting Node-2. + + + +# Node-3 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` + + + +Replace `` with the enode URL displayed when starting Node-3. + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` + +### 13. Confirm permissioned network is working + +#### Check peer count + +Use curl to call the JSON-RPC API [`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 +``` + +The result confirms Node-1 (the node running the JSON-RPC service) has three peers (Node-2, Node-3 and Node-4): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x3" +} +``` + +#### Send a transaction from an account in the allowlist + +Import the first account from the genesis file into MetaMask and send transactions, as described in [Quickstart tutorial]: + +:::info Account 1 + +- Address: `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73` +- Private key : `0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63` +- Initial balance : `0xad78ebc5ac6200000` (200000000000000000000 in decimal) + +::: + +:::info + +Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). + +::: + +### Try sending a transaction from an account not in the accounts allowlist + +Import the third account from the genesis file into MetaMask and try to send a transaction, as described in [Quickstart tutorial]: + +:::info Account 3 + +- Address: `0xf17f52151EbEF6C7334FAD080c5704D77216b732` +- Private key: `0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f` +- Initial balance: `0x90000000000000000000000` (2785365088392105618523029504 in decimal) + +::: + +### Start a node not on the nodes allowlist + +In your `Permissioned-Network` directory, create a `Node-5` directory and `data` directory inside it. + +Change to the `Node-5` directory and start Node-5 specifying the Node-1 enode URL as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --bootnodes="" --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 +``` + +# Windows + +```bash +besu --data-path=data --bootnodes="" --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 +``` + + + +Start another terminal and use curl to call the JSON-RPC API [`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8549 +``` + +The result confirms Node-5 has no peers even though it specifies Node-1 as a bootnode: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x0" +} +``` + +## Stop nodes + +When finished using the permissioned network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the permissioned network in the future, start from [step 7](#7-start-node-1). + +::: + + + +[IBFT 2.0 proof of authority consensus protocol]: ../../how-to/configure/consensus/ibft.md +[Private network example tutorial]: ../quickstart.md#create-a-transaction-using-metamask diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/onchain.md b/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/onchain.md new file mode 100644 index 00000000000..e9d2353a0cd --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/onchain.md @@ -0,0 +1,340 @@ +--- +title: Get started with onchain permissioning +sidebar_position: 1 +description: Setting up and using Hyperledger Besu onchain permissioning +tags: + - private networks +--- + +# Get started with onchain permissioning + +The following steps describe bootstrapping a permissioned network using a Hyperledger Besu node. + +This tutorial configures permissioning on a [IBFT 2.0 proof of authority (PoA)] network. + +## Prerequisites + +- [Node.js](https://nodejs.org/en/) v10.16.0 or later +- [Yarn](https://yarnpkg.com/en/) v1.15 or later +- Browser with [MetaMask installed](https://metamask.io/) + +## Steps + +### 1. Create folders + +Each node requires a data directory for the blockchain data. + +Create directories for your permissioned network and each of the three nodes, and a data directory for each node: + +```bash +Permissioned-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 +│   ├── data +└── Node-4 + ├── data +``` + +### 2. Create the configuration file + +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `Permissioned-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::critical Security warning + +Don't use the accounts in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `Permissioned-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```bash +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │   ├── key + │   └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │   ├── key + │   └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │   ├── key + │   └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the Permissioned-Network directory + +Copy the `genesis.json` file to the `Permisssioned-Network` directory. + +### 5. Add the Ingress contracts to the genesis file + +:::tip + +If the network is using only account or node permissioning, add only the relevant Ingress contract to the genesis file. + +::: + +Add the Ingress contracts to the genesis file for your network by copying them from [`genesis.json`](https://github.com/ConsenSys/permissioning-smart-contracts/blob/e6c2d4d5a728c11cdb8e97a07ddda3c0bfb57b5d/genesis.json) in the [`permissioning-smart-contracts` repository](https://github.com/ConsenSys/permissioning-smart-contracts) to the `alloc` section of the contract: + +```json +"0x0000000000000000000000000000000000008888": { + "comment": "Account Ingress smart contract", + "balance": "0", + "code": , + "storage": { + + } +} + +"0x0000000000000000000000000000000000009999": { + "comment": "Node Ingress smart contract", + "balance": "0", + "code": , + "storage": { + + } +} +``` + +:::info + +To support the permissioning contracts, ensure your genesis file includes at least the `constantinopleFixBlock` milestone. + +The permissioning contract has multiple interfaces, and each interface maps to a specific version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). Ensure that you specify the [permissioning contract interface](../../how-to/use-permissioning/onchain.md) being used when starting Besu. + +::: + +### 6. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```bash +Permissioned-Network/ +├── genesis.json +├── Node-1 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-2 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-3 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-4 +│ ├── data +│ │    ├── key +│ │    ├── key.pub +``` + +### 7. Start Node-1 + +:::info + +The specified node must be producing blocks, that is, be a miner (PoW networks) or validator (PoA networks). + +To allow MetaMask to connect, the node must have JSON-RPC HTTP enabled, and have `--rpc-http-cors-origins` set to allow MetaMask. + +If your network is not a [free gas network](../../how-to/configure/free-gas.md), the account used to interact with the permissioning contracts must have a balance. + +::: + +Start the first node with command line options to enable onchain permissioning and the location of the **data** folder and genesis file: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" +``` + +On the command line: + +- Enable onchain accounts permissioning using [`--permissions-accounts-contract-enabled`](../../reference/cli/options.md#permissions-accounts-contract-enabled). +- Set the address of the Account Ingress contract in the genesis file using [`--permissions-accounts-contract-address`](../../reference/cli/options.md#permissions-accounts-contract-address). +- Enable onchain nodes permissioning using [`--permissions-nodes-contract-enabled`](../../reference/cli/options.md#permissions-nodes-contract-enabled). +- Set the address of the Node Ingress contract in the genesis file using [`--permissions-nodes-contract-address`](../../reference/cli/options.md#permissions-nodes-contract-address). +- Set the version of the [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) using [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version). +- Enable the JSON-RPC API using [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled). +- Enable the `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). +- Allow all-host access to the HTTP JSON-RPC API using [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). +- Allow all-domain access to the node through the HTTP JSON-RPC API using [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to use when starting Node-2, Node-3, and Node-4. + +### 8. Start Node-2 + +Use the following command to start Node-2: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --p2p-port=30304 --rpc-http-port=8546 +``` + +The command line specifies: + +- A different port to Node-1 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- The enode URL of Node-1 using [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes). +- Other options as for [Node-1](#7-start-node-1). + +### 9. Start Node-3 + +Use the following command to start Node-3: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --p2p-port=30305 --rpc-http-port=8547 +``` + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- The enode URL of Node-1 using [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes). +- Other options as for [Node-1](#7-start-node-1). + +### 10. Start Node-4 + +Use the following command to start Node-4: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --p2p-port=30306 --rpc-http-port=8548 +``` + +The command line specifies: + +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- The enode URL of Node-1 using [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes). +- Other options as for [Node-1](#7-start-node-1). + +:::tip + +If your nodes are having trouble connecting as peers, update the `--bootnodes` option for each node to include all four enode URLs. + +::: + +### 11. Clone the contracts and install dependencies + +Clone the `permissioning-smart-contracts` repository: + +```bash +git clone https://github.com/ConsenSys/permissioning-smart-contracts.git +``` + +Change into the `permissioning-smart-contracts` directory. + +### 12. Set the environment variables + +Create the following environment variables and set to the specified values: + +- `BESU_NODE_PERM_ACCOUNT` - Account to deploy the permissioning contracts and become the first admin account. +- `BESU_NODE_PERM_KEY` - Private key of the account to deploy the permissioning contracts. +- `ACCOUNT_INGRESS_CONTRACT_ADDRESS` - Address of the Account Ingress contract in the genesis file. +- `NODE_INGRESS_CONTRACT_ADDRESS` - Address of the Node Ingress contract in the genesis file. +- `BESU_NODE_PERM_ENDPOINT` - Required only if your node is not using the default JSON-RPC host and port (`http://127.0.0.1:8545`). Set to JSON-RPC host and port. When bootstrapping the network, Besu uses the specified node to deploy the contracts and is the first node in the network. +- `CHAIN_ID` - The chain ID from the genesis file. +- `INITIAL_ALLOWLISTED_NODES`(optional) - The enode URLs of permitted nodes. Specify multiple nodes (Node-1, Node-2, Node-3) as a comma-separated list. + +:::tip + +A simple way to set multiple environment variables is to create a file called `.env` with the required settings: + +```env +NODE_INGRESS_CONTRACT_ADDRESS=0x0000000000000000000000000000000000009999 +ACCOUNT_INGRESS_CONTRACT_ADDRESS=0x0000000000000000000000000000000000008888 +BESU_NODE_PERM_ACCOUNT=627306090abaB3A6e1400e9345bC60c78a8BEf57 +BESU_NODE_PERM_KEY=c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 +BESU_NODE_PERM_ENDPOINT=http://127.0.0.1:8545 +CHAIN_ID=1337 +INITIAL_ALLOWLISTED_NODES=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` + +If using a `.env` file, save the file to the `permissioning-smart-contracts` directory. + +::: + +### 13. Deploy the contracts + +In the `permissioning-smart-contracts` directory, while your network is running, deploy the Admin and Rules contracts: + +```bash +yarn truffle migrate --reset --network besu +``` + +This also updates the Ingress contract with the name and version of the Admin and Rules contracts. The migration logs the addresses of the Admin and Rules contracts. + +:::important + +The account that deploys the contracts is automatically an admin account. + +::: + + + +[Node-1, Node-2, Node-3, and Node-4 to the allowlist]: ../../how-to/use-permissioning/onchain.md#update-nodes-allowlist +[IBFT 2.0 proof of authority (PoA)]: ../../how-to/configure/consensus/ibft.md diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/upgrade-contracts.md b/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/upgrade-contracts.md new file mode 100644 index 00000000000..00078d551b2 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/permissioning/upgrade-contracts.md @@ -0,0 +1,155 @@ +--- +title: Upgrade permissioning contracts +sidebar_position: 2 +description: Upgrade the permissioning contracts for onchain permissioning +tags: + - private networks +--- + +# Upgrade permissioning contracts + +The following tutorial describes the steps to upgrade the onchain permissioning contracts to the latest version. + +## Prerequisites + + + +- [Node.js](https://nodejs.org/en/) v10.16.0 or later + +- [Yarn](https://yarnpkg.com/en/) v1.15 or later +- Browser with [MetaMask installed](https://metamask.io/). + +## Steps + +### 1. Get the latest contracts and install dependencies + +:::note + +Pull the latest changes if you already have a cloned repository using the `git pull` command inside the `permissioning-smart-contracts` directory. + +::: + +1. Clone the `permissioning-smart-contracts` repository: + + ```bash + git clone https://github.com/ConsenSys/permissioning-smart-contracts.git + ``` + +### 3. Update environment variables + +If using a `.env` file to configure environment variables, then the file must be in the `permissioning-smart-contracts` directory. + +:::tip + +You can use environment variables to retain existing contracts if required. For example: + +- `RETAIN_ADMIN_CONTRACT=true` to retain the current admin list +- `RETAIN_NODE_RULES_CONTRACT=true` to retain the current Node rules contract +- `RETAIN_ACCOUNT_RULES_CONTRACT=true` to retain the current Account rules contract + +::: + +1. Legacy: If they exist, rename the following environment variables: + + - `PANTHEON_NODE_PERM_ACCOUNT` to `BESU_NODE_PERM_ACCOUNT` + - `PANTHEON_NODE_PERM_KEY` to `BESU_NODE_PERM_KEY` + - `PANTHEON_NODE_PERM_ENDPOINT` to `BESU_NODE_PERM_ENDPOINT` + +2. If updating from v1 to v2, you need to re-deploy the `NodeIngress` contract. In order to do this, first delete the `NODE_INGRESS_CONTRACT_ADDRESS` environment variable. + + :::important + + This step is only required if upgrading from v1 of the node permissioning contract to v2 (because the interface changed, a new `NodeIngress` contract must be deployed). + + ::: + +### 4. Optional: Export current allowlists + +:::note + +This step enables you to export the current allowlists to assist in updating. + +::: + +1. Export the current allowlists by setting the following environment variables: + + ```bash + RETAIN_ADMIN_CONTRACT=true + RETAIN_NODE_RULES_CONTRACT=true + RETAIN_ACCOUNT_RULES_CONTRACT=true + ``` + +2. Log the current allowlists to console: + + ```bash + truffle migrate --reset + ``` + + The migration scripts will log the existing allowlists to the console, but no contracts will be deployed. + +3. Set initial values for updated deployment using the values logged in the previous step: + + ```bash + INITIAL_ADMIN_ACCOUNTS= + INITIAL_ALLOWLISTED_ACCOUNTS= + INITIAL_ALLOWLISTED_NODES= + ``` + +4. Update environment variables for contracts that are to be deployed. For example: + + ```bash + RETAIN_ADMIN_CONTRACT=true + RETAIN_NODE_RULES_CONTRACT=false + RETAIN_ACCOUNT_RULES_CONTRACT=false + ``` + +### 5. Deploy the contracts + +1. In the `permissioning-smart-contracts` directory, deploy the contracts: + + ```bash + truffle migrate --reset + ``` + + :::important + + - If updating from v1 to v2, the new `NodeIngress` contract address must be specified when restarting the Besu nodes. Copy this address from the migration output. For example: + + ```bash + > Deployed NodeIngress contract to address = 0x12B1f953395080A13AeED0dC4d0bb14e787A91cF + ``` + + - If upgrading from v2 (using separate storage contracts) copy the `Storage` contract addresses displayed in the output. For example: + + ``` + > Deployed NodeStorage contract to address = 0x4F3e35A3Be3C1b77Ade39969D175C743ad3484Ee + ... + > Deployed AccountStorage contract to address = 0x2362187023D738034B516438Af187356b31E8Fb8 + ``` + + ::: + +1. Set the storage contract address environment variables to ensure that the storage contracts are not re-deployed. For example: + + ```bash + NODE_STORAGE_CONTRACT_ADDRESS=0xE0bF6021e023a197DBb3fABE64efA880E13D3f4b + ACCOUNT_STORAGE_CONTRACT_ADDRESS=0x7153CCD1a20Bbb2f6dc89c1024de368326EC6b4F + ``` + +1. Deploy the updated contracts: + + ```bash + truffle migrate --reset + ``` + +### 6. Restart Besu nodes + +Restart the Besu nodes with the updated [`NodeIngress`](#5-deploy-the-contracts) contract address and [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) version 2. + +```besu +cmd besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x4E72770760c011647D4873f60A3CF6cDeA896CD8" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" +``` + + + +[nodes to the allowlist]: ../../how-to/use-permissioning/onchain.md#update-nodes-allowlist diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/_category_.json b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/_category_.json new file mode 100644 index 00000000000..c6e33f3bea4 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create a privacy enabled network", + "position": 6 +} diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/index.md b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/index.md new file mode 100644 index 00000000000..f3991a18afd --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/index.md @@ -0,0 +1,433 @@ +--- +title: Create a privacy enabled network using the Quickstart +sidebar_position: 1 +description: Configure Hyperledger Besu privacy +tags: + - private networks +--- + +# Create a privacy-enabled network + +Configuring a network that supports private transactions requires starting a [Tessera] node for each Hyperledger Besu node. Besu command line options associate the Besu node with the Tessera node. + +This tutorial assumes you have completed setting up an IBFT 2.0 network to the point where you have [created the genesis file and copied the private keys](../ibft/index.md#5-copy-the-node-private-keys-to-the-node-directories). If not, complete steps 1 to 5 of the [Create an IBFT 2.0](../ibft/index.md) tutorial before continuing. + +:::important + +To support privacy, ensure your genesis file includes at least the `byzantium` milestone. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires 4 validators to be Byzantine fault tolerant. + +::: + +In this tutorial we start Tessera nodes for the four Besu nodes and associate each Besu node with a Tessera node. + +## Prerequisites + +- [Install Tessera](https://docs.tessera.consensys.net/category/install). + +## 1. Create Tessera directories + +Inside each `Node-*` directory, create a `Tessera` directory: + +```bash +IBFT-Network/ +├── Node-1 +│   ├── data +│ ├── Tessera +├── Node-2 +│   ├── data +│ ├── Tessera +├── Node-3 +│   ├── data +│ ├── Tessera +└── Node-4 + ├── data + ├── Tessera +``` + +## 2. Generate Tessera keys + +This example creates an unlocked private key, meaning you do not need a password to decrypt the private key file. + +In each `Tessera` directory, generate a public/private key pair for the Tessera node: + +```bash +tessera -keygen -filename nodeKey +``` + +At the prompt, press **Enter** to create an unlocked key. + +Tessera generates the public/private key pair and saves the keys in the `nodeKey.pub` and `nodeKey.key` files. + +## 3. Create Tessera configuration files + +In the `Tessera` directory for each node, create a file called `tessera.conf`, with the following configuration: + +:::important + +In production environments, only specify [`tls`](https://docs.tessera.consensys.net/HowTo/Configure/TLS/) as `OFF` if another transport security mechanism, such as WireGuard, is in place. + +::: + + + +# Node-1 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9101", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9102", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9103", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +# Node-2 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9201", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9202", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9203", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +# Node-3 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9301", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9302", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9303", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +# Node-4 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9401", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9402", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9403", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + + + +In the configuration file, specify: + +- Different port numbers for the various servers in the [`serverConfigs`](https://docs.tessera.consensys.net/HowTo/Configure/TesseraAPI/) section. +- The address of the Tessera nodes to discover, in the [`peer`](https://docs.tessera.consensys.net/HowTo/Configure/Peer-discovery/#specify-peers) section. +- The location of the public/private key pair. + +## 4. Start the Tessera nodes + +In each `Tessera` directory, start Tessera specifying the [configuration file](#3-create-tessera-configuration-files) created in the previous step: + +```bash +tessera -configfile tessera.conf +``` + +:::info + +After starting the first Tessera node and before starting the other nodes, the log message `failed to connect to node` displays. This is normal behavior. Until you start the other peer nodes, your node is not connected and displays this warning. You can continue to start the other nodes. + +::: + +## 5. Start Besu Node-1 + +In the `Node-1` directory, start Besu Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies privacy options: + +- [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy +- [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the Q2T server address of the Tessera node (`Q2T` in `tessera.conf`) +- [`--privacy-public-key-file`](../../reference/cli/options.md#privacy-public-key-file) specifies the file containing Tessera node public key (created in [3. Generate Tessera Keys](#2-generate-tessera-keys)) +- [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) includes `EEA` and `PRIV` in the list of JSON-RPC APIs to enable privacy JSON-RPC API methods. +- [`--min-gas-price`](../../../public-networks/reference/cli/options.md#min-gas-price) is 0 for a [free gas network](../../how-to/configure/free-gas.md). + +:::note + +Use the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option to sign [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md) using a supplied key. The command line option is mandatory in privacy-enabled paid gas networks. + +::: + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) + +## 6. Start Besu Node-2 + +In the `Node-2` directory, start Besu Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + +:::note + +When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), [expose ports](../../get-started/install/run-docker-image.md#expose-ports). + +::: + +## 7. Start Besu Node-3 + +In the `Node-3` directory, start Besu Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + +## 8. Start Besu Node-4 + +In the `Node-4` directory, start Besu Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + + + +[Tessera]: https://docs.tessera.consensys.net/ diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/multi-tenancy.md b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/multi-tenancy.md new file mode 100644 index 00000000000..c077e8910e5 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/multi-tenancy.md @@ -0,0 +1,187 @@ +--- +title: Create a multi-tenant network +sidebar_position: 2 +description: Configure multi-tenancy +tags: + - private networks +--- + +# Configure a multi-tenant node + +You can configure Besu and associated Tessera node in a privacy-enabled network to host [multiple tenants](../../concepts/privacy/multi-tenancy.md). + +In this tutorial we'll add tenants to the `Node-1` Besu and Tessera node in a [privacy-enabled network](index.md). + +```bash +IBFT-Network/ +├── Node-1 +│   ├── data +│ ├── Tessera +├── Node-2 +│   ├── data +│ ├── Tessera +├── Node-3 +│   ├── data +│ ├── Tessera +└── Node-4 + ├── data + ├── Tessera +``` + +:::info + +This tutorial uses [JWT public key authentication] to create the tenant's JWT, but you can also use [username and password authentication]. + +::: + +## Prerequisites + +- A [Privacy-enabled network](index.md). + +## 1. Generate a private and public key pair + +In the `Node-1` directory, [generate the private and public key pair]. The key pair, which must be in `.pem` format, belongs to the operator who uses the key pair to authenticate the [tenant JWTs](#6-generate-the-tenant-jwts). + +:::info + +This step is not required when using [username and password authentication] to create the required JWTs. + +::: + +## 2. Generate Tessera keys + +In the `Node-1/Tessera` directory, [generate a public/private key pair for each tenant](index.md#2-generate-tessera-keys). + +:::note + +The instructions creates an unlocked private key, meaning you do not need a password to decrypt the private key file. + +::: + +Name the key pair `nodeKey2` and `nodeKey3`. + +## 3. Update the Tessera configuration file + +In the `Node-1/Tessera` directory, update the `tessera.conf` file by adding the new key pairs: + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9101", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9102", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9103", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + }, + { + "privateKeyPath": "nodeKey2.key", + "publicKeyPath": "nodeKey2.pub" + }, + { + "privateKeyPath": "nodeKey3.key", + "publicKeyPath": "nodeKey3.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +:::info + +Besu requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode). Add the line `"mode": "orion",` to the Tessera configuration file. + +::: + +## 4. Start Tessera + +[Start the Tessera nodes](index.md#4-start-the-tessera-nodes) and specify the configuration file. + +## 5. Start Besu Node-1 + +In the `Node-1` directory, start Besu Node-1: + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-authentication-enabled --rpc-http-authentication-jwt-public-key-file=publicKey.pem --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-multi-tenancy-enabled --min-gas-price=0 +``` + +The command line specifies privacy options: + +- [`--rpc-http-authentication-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-enabled) enables authentication for JSON-RPC APIs. +- [`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) specifies the Operator's [public key file](#1-generate-a-private-and-public-key-pair). Used to authenticate the [tenant JWTs](#6-generate-the-tenant-jwts). +- [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy. +- [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the [Quorum to Tessera (Q2T)] server address of the Tessera node (`Q2T` in `tessera.conf`). +- [`--privacy-multi-tenancy-enabled`](../../reference/cli/options.md#privacy-multi-tenancy-enabled) enables multi-tenancy. + +:::note + +[`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) is only required when using [JWT public key authentication]. If using [username and password authentication], use [`--rpc-http-authentication-credentials-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-credentials-file) instead. + +::: + +[Start the remaining Besu nodes](index.md#6-start-besu-node-2). + +## 6. Generate the tenant JWTs + +[Generate the JWT](../../../public-networks/how-to/use-besu-api/authenticate.md#2-create-the-jwt) for each tenant and specify the [tenant's Tessera public key](#2-generate-tessera-keys) in the `privacyPublicKey` field. + +Ensure you apply the appropriate [JSON-RPC API permissions](../../../public-networks/how-to/use-besu-api/authenticate.md#json-rpc-permissions) to the token. For example, ensure you enable the `PRIV` and `EEA` APIs for privacy. + +:::note + +This step is not required when using [username and password authentication] to create the required JWTs. + +::: + +[Use the authentication token to make requests]. + + + +[JWT public key authentication]: ../../../public-networks/how-to/use-besu-api/authenticate.md#jwt-public-key-authentication +[username and password authentication]: ../../../public-networks/how-to/use-besu-api/authenticate.md#username-and-password-authentication +[generate the private and public key pair]: ../../../public-networks/how-to/use-besu-api/authenticate.md#1-generate-a-private-and-public-key-pair +[Use the authentication token to make requests]: ../../../public-networks/how-to/use-besu-api/authenticate.md#using-an-authentication-token-to-make-requests +[Quorum to Tessera (Q2T)]: https://docs.tessera.consensys.net/Reference/TesseraAPI + + + +\*[JWT]: JSON Web Token diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/quickstart.md b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/quickstart.md new file mode 100644 index 00000000000..147c617dcb9 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/quickstart.md @@ -0,0 +1,160 @@ +--- +description: Hyperledger Besu privacy-enabled private network tutorial +tags: + - private networks +--- + +# Create a privacy-enabled network using the Quorum Developer Quickstart + +You can create a privacy-enabled network using the [Quorum Developer Quickstart](../quickstart.md). It runs a private Hyperledger Besu network that uses [Tessera](https://docs.tessera.consensys.net/en/stable/) as its private transaction manager. + +You can use the [Block Explorer](../quickstart.md#block-explorer), make [JSON-RPC requests](../quickstart.md#run-json-rpc-requests), and [create transactions using MetaMask](../quickstart.md#create-a-transaction-using-metamask). This tutorial describes how to make private transactions between nodes, and perform read and write operations on private contracts. + +:::important + +This tutorial runs a private network suitable for education or demonstration purposes and is not intended for running production networks. + +::: + +## Prerequisites + +To run this tutorial, you must have the following installed: + +- [Docker and Docker-compose](https://docs.docker.com/compose/install/) + + :::important + + If using [MacOS](https://docs.docker.com/docker-for-mac/) or [Windows](https://docs.docker.com/docker-for-windows/), enable Docker to use up to 6GB of memory on the _Advanced_ tab in _Preferences_. + + ::: + +- [Nodejs](https://nodejs.org/en/download/) +- [Git command line](https://git-scm.com/) +- [Curl command line](https://curl.haxx.se/download.html). + +## Create Docker-compose file + +## Usage + +To create the docker-compose file and artifacts, run: + +```bash +npx quorum-dev-quickstart +``` + +Follow the prompts displayed to run Hyperledger Besu, private transactions, and [logging with ELK](../../how-to/monitor/elastic-stack.md). Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/). + +## Start the network + +:::caution + +If running in Windows, please run commands from the GitBash shell + +::: + +In the installation directory, start the network: + +```bash +./run.sh +``` + +The script pulls the Docker images starts the network. Pulling the images takes a few minutes the first time. The network details display. + +```bash +************************************* +Quorum Dev Quickstart +************************************* +Setting up the index patterns in kibana ................. +---------------------------------- +List endpoints and services +---------------------------------- +JSON-RPC HTTP service endpoint : http://localhost:8545 +JSON-RPC WebSocket service endpoint : ws://localhost:8546 +Web block explorer address : http://localhost:25000/ +Prometheus address : http://localhost:9090/graph +Grafana address : http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All +Collated logs using Kibana endpoint : http://localhost:5601/app/kibana#/discover + +For more information on the endpoints and services, refer to README.md in the installation directory. +**************************************************************** +``` + +## Deploy the private contract and interact with the nodes + +To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls, the example creates three Besu nodes, with each node having a corresponding Tessera node for privacy. You can access the Besu member nodes for API calls on the following ports: + +```bash +Member1Besu RPC: http://localhost:20000 +Member1Tessera: http://localhost:9081 + +Member2Besu RPC: http://localhost:20002 +Member2Tessera: http://localhost:9082 + +Member3Besu RPC: http://localhost:20004 +Member3Tessera: http://localhost:9083 +``` + +Navigate to the `smart_contracts` directory and deploy the private transaction: + +```bash +cd smart_contracts +npm install +node scripts/private_tx.js +``` + +The script deploys the contract and sends an arbitrary value (47) from `Member1` to `Member3`. Once done, it queries all three members (Tessera) to check the value at an address. Only `Member1` & `Member3` has this information as they were involved in the transaction, `Member2` responds with a `0x` to indicate it is unaware of the transaction. + +```bash +node scripts/private_tx.js +Creating contract... +Getting contractAddress from txHash: 0xc1b57f6a7773fe887afb141a09a573d19cb0fdbb15e0f2b9ed0dfead6f5b5dbf +Waiting for transaction to be mined ... +Address of transaction: 0x8220ca987f7bb7f99815d0ef64e1d8a072a2c167 +Use the smart contracts 'get' function to read the contract's constructor initialized value .. +Waiting for transaction to be mined ... +Member1 value from deployed contract is: 0x000000000000000000000000000000000000000000000000000000000000002f +Use the smart contracts 'set' function to update that value to 123 .. - from member1 to member3 +Transaction hash: 0x387c6627fe87e235b0f2bbbe1b2003a11b54afc737dca8da4990d3de3197ac5f +Waiting for transaction to be mined ... +Verify the private transaction is private by reading the value from all three members .. +Waiting for transaction to be mined ... +Member1 value from deployed contract is: 0x000000000000000000000000000000000000000000000000000000000000007b +Waiting for transaction to be mined ... +Member2 value from deployed contract is: 0x +Waiting for transaction to be mined ... +Member3 value from deployed contract is: 0x000000000000000000000000000000000000000000000000000000000000007b +``` + +The general contract deployment flow is: + +1. Deploy a contract, which returns a transaction hash. + +1. Obtain the privacy transaction receipt from the transaction hash. + +1. Use the contract address in the privacy transaction receipt to [interact with the contract](../contracts/interact.md) from that point on. + +## Further examples + +View the [web3js-quorum client library example](web3js-quorum.md) and view the [sample code examples](https://github.com/ConsenSys/web3js-quorum/tree/master/example). + +You can also test the erc20 token example by executing `erc20.js` which deploys a `HumanStandardToken` contract and transfers 1 token to Node2. + +This can be verified from the `data` field of the `logs` which is `1`. + +## Stop the network + +Do one of the following to stop the network: + +- Stop the network: + + ```bash + ./stop.sh + ``` + +- Stop the network and remove the containers and volumes: + + ```bash + ./remove.sh + ``` diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/web3js-quorum.md b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/web3js-quorum.md new file mode 100644 index 00000000000..c4c7fd0f92d --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/privacy/web3js-quorum.md @@ -0,0 +1,120 @@ +--- +title: Use the web3js-quorum multi-node example +sidebar_position: 3 +description: web3js-quorum client library multi-node example +tags: + - private networks +--- + +# Use the multi-node example in the web3js-quorum client library + +To use the examples provided in the web3js-quorum library with [your privacy network](index.md): + +:::note + +This example uses 3 of the 4 nodes configured in the [privacy tutorial](index.md). + +::: + +1. Clone the **ConsenSys/web3js-quorum** repository: + + ```bash + git clone https://github.com/ConsenSys/web3js-quorum + ``` + +2. In the `web3js-quorum` directory: + + ```bash + npm install + ``` + +3. In the `example` directory, update the `keys.js` file to include: + + - chain ID + - Tessera node public keys + - Hyperledger Besu node RPC URLs + - [Hyperledger Besu node private keys](../../../public-networks/concepts/node-keys.md#node-private-key). + +4. In the `example/multiNodeExample` directory, deploy the contract: + + ```bash + node deployContract.js + ``` + + A private transaction receipt returns. + + ```text + Transaction Hash 0x23b57ddc3ecf9c9a548e4401a411420ffc0002fd259a86d5656add7c6108beeb + Waiting for transaction to be mined ... + Private Transaction Receipt + { contractAddress: '0xfee84481da8f4b9a998dfacb38091b3145bb01ab', + from: '0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb', + to: null, + output: + '0x6080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f245811461005b5780636057361d1461008257806367e404ce146100ae575b600080fd5b34801561006757600080fd5b506100706100ec565b60408051918252519081900360200190f35b34801561008e57600080fd5b506100ac600480360360208110156100a557600080fd5b50356100f2565b005b3480156100ba57600080fd5b506100c3610151565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60025490565b604080513381526020810183905281517fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f5929181900390910190a16002556001805473ffffffffffffffffffffffffffffffffffffffff191633179055565b60015473ffffffffffffffffffffffffffffffffffffffff169056fea165627a7a72305820c7f729cb24e05c221f5aa913700793994656f233fe2ce3b9fd9a505ea17e8d8a0029', + logs: [] } + ``` + + :::note + + If you receive a `Method not enabled` error, ensure you enabled the appropriate APIs using the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) + + ::: + +5. Copy the contract address from the private transaction receipt and set the `CONTRACT_ADDRESS` environment variable: + + ```bash + export CONTRACT_ADDRESS= + ``` + + :::tip example + ```bash + export CONTRACT_ADDRESS=0xfee84481da8f4b9a998dfacb38091b3145bb01ab + ``` + ::: + +6. Store a value in the contract from Node 1: + + ```bash + node storeValueFromNode1.js + ``` + + Node 1 stores the value of 1000 (3e8 in hex) and is visible to Node 1 and Node 2. + + ```bash + Transaction Hash: 0xd9d71cc6f64675e1a48183ded8f08930af317eb883ebae4c4eec66ae68618d85 + Waiting for transaction to be mined ... + Event Emited: 0x0000000000000000000000009811ebc35d7b06b3fa8dc5809a1f9c52751e1deb00000000000000000000000000000000000000000000000000000000000003e8 + Waiting for transaction to be mined ... + Get Value from http://localhost:8545: 0x00000000000000000000000000000000000000000000000000000000000003e8 + Waiting for transaction to be mined ... + Get Value from http://localhost:8546: 0x00000000000000000000000000000000000000000000000000000000000003e8 + Waiting for transaction to be mined ... + Get Value from http://localhost:8547: 0x + ``` + +7. Store a value in the contract from Node 2: + + ```bash + node storeValueFromNode2.js + ``` + + Node 2 stores the value of 42 (2a in hex) and is visible to Node 1 and Node 2. + + ```text + Transaction Hash: 0xa025433aec47a71b0230f12f43708812fd38ff7b7c1dc89a715f71dcbd5fbdbf + Waiting for transaction to be mined ... + Event Emited: 0x000000000000000000000000372a70ace72b02cc7f1757183f98c620254f9c8d000000000000000000000000000000000000000000000000000000000000002a + Waiting for transaction to be mined ... + Get Value from http://localhost:8545: 0x000000000000000000000000000000000000000000000000000000000000002a + Waiting for transaction to be mined ... + Get Value from http://localhost:8546: 0x000000000000000000000000000000000000000000000000000000000000002a + Waiting for transaction to be mined ... + Get Value from http://localhost:8547: 0x + ``` + + :::note + + As expected, log messages indicate that Node 3 Tessera cannot find payloads because Node 3 does not have access to the private transactions between Node 1 and Node 2. + + ::: diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/qbft.md b/versioned_docs/version-23.4.1/private-networks/tutorials/qbft.md new file mode 100644 index 00000000000..a8c2234ee1a --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/qbft.md @@ -0,0 +1,377 @@ +--- +title: Create a QBFT network +sidebar_position: 2 +description: Create a private network using the QBFT consensus protocol. +tags: + - private networks +--- + +# Create a private network using QBFT + +A private network provides a configurable network for testing. This private network uses the [QBFT (proof of authority) consensus protocol](../how-to/configure/consensus/qbft.md). + +The QBFT network in this tutorial implements the [block header validator selection method] to manage validators. For a tutorial on how to implement the [contract validator selection method], follow the steps in the [example smart contract repository]. + +:::important + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +This tutorial configures a private network using QBFT for educational purposes only. QBFT requires 4 validators to be Byzantine fault tolerant. + +::: + +## Prerequisites + +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using QBFT with four nodes. The four nodes are all validators. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. + +Create directories for your private network, each of the four nodes, and a data directory for each node: + +```bash +QBFT-Network/ +├── Node-1 +│ ├── data +├── Node-2 +│ ├── data +├── Node-3 +│ ├── data +└── Node-4 + ├── data +``` + +### 2. Create a configuration file + +The configuration file defines the [QBFT genesis file](../how-to/configure/consensus/qbft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the QBFT genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `qbftConfigFile.json` and save it in the `QBFT-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +:::warning + +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `QBFT-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=qbftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```text +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │ ├── key + │ └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │ ├── key + │ └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │ ├── key + │ └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the QBFT-Network directory + +Copy the `genesis.json` file to the `QBFT-Network` directory. + +### 5. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```text +QBFT-Network/ +├── genesis.json +├── Node-1 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +├── Node-2 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +├── Node-3 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +├── Node-4 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +``` + +### 6. Start the first node as the bootnode + +In the `Node-1` directory, start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line: + +- Specifies the data directory for Node-1 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- Enables the JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables the ETH, NET, and QBFT APIs using the [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option. +- Enables all-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. +- Enables all-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../assets/images/EnodeStartup.png) + +### 7. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + + +The command line specifies: + +- The data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 8. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + + +The command line specifies: + +- The data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 9. Start Node-4 + +Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 +``` + + + +The command line specifies: + +- The data directory for Node-4 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 10. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`qbft_getvalidatorsbyblocknumber`](../reference/api/index.md#qbft_getvalidatorsbyblocknumber) method and confirm the network has four validators: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' localhost:8545 +``` + +The result displays the four validators: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x73ced0bd3def2e2d9859e3bd0882683a2e6835fb", + "0x7a175f3542ceb60bf80fb536b3f42e7a30c0a6d7", + "0x7f6efa6e34f8c9b591a9ad4763e21b3fca31bcd6", + "0xc64140f1c9d5bb82e54976e568ad39958c3e94be" + ] +} +``` + +Look at the logs to confirm Besu is producing blocks: + +```bash +2021-05-26 08:47:00.221+10:00 | EthScheduler-Workers-0 | INFO | PersistBlockTask | Imported #1 / 0 tx / 0 om / 0 (0.0%) gas / (0x4ee4456536e2793523df87288fae76518089eec91c3f7e05e220f1f4d3f6f95b) in 0.016s. Peers: 4 +2021-05-26 08:47:02.071+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #2 / 0 tx / 0 pending / 0 (0.0%) gas / (0x6fc47ada7146d75f6a46911d8d4038795b0c99970bbd4ce0c6d6aa60955f66fe) +2021-05-26 08:47:04.051+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #3 / 0 tx / 0 pending / 0 (0.0%) gas / (0x3cb663880a65103266b11a8d8631beca5c482d515ac287125aa077b2e31b80b0) +2021-05-26 08:47:06.058+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Produced #4 / 0 tx / 0 pending / 0 (0.0%) gas / (0xc2927915ac0c94bab5fc9acea6608455f1c857d69e97191dc2c39e4ac411817b) +2021-05-26 08:47:08.058+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #5 / 0 tx / 0 pending / 0 (0.0%) gas / (0xba63471d62c936733add9b884f5213c3842af9f52460268e39e0666ab82f02a5) +``` + +:::important + +If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), the network will not start producing blocks. + +The logs for each node should indicate the public key was loaded from the `data/key` directory: + +```bash +2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Loaded public key 0x931d32f1aec4e45b150ee38f3c74157a750fc53f523e63fe2b07bf3fce43a3de64587fc9aaf3736444f2e3eef0eea90be3b67d18be7b5b2b7cb2fcd670416a7e from /QBFT-Network/Node-1/data/key +``` + +If the keys were not copied to the correct directory, Besu creates a key when starting up: + +```bash +2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /QBFT-Network/Node-1/data/key +``` + +If a new key was created, the validator key specified in the configuration does not match the created key and the node cannot participate in creating blocks. + +::: + +## Next steps + +Use the [QBFT API](../reference/api/index.md#qbft-methods) to remove or add validators, or import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::note + +To add or remove nodes as validators you need the node address. The directory [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the name. + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: + +You can switch from the [block header validator selection method] configured here, to the [contract validator selection method] by updating the genesis file and [configuring a transition]. + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the QBFT network in the future, start from [step 6](#6-start-the-first-node-as-the-bootnode). + +::: + + + +[block header validator selection method]: ../how-to/configure/consensus/qbft.md#add-and-remove-validators-using-block-headers +[contract validator selection method]: ../how-to/configure/consensus/qbft.md#add-and-remove-validators-using-a-smart-contract +[example smart contract repository]: https://github.com/ConsenSys/validator-smart-contracts +[configuring a transition]: ../how-to/configure/consensus/qbft.md#transitions + + + +\*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. diff --git a/versioned_docs/version-23.4.1/private-networks/tutorials/quickstart.md b/versioned_docs/version-23.4.1/private-networks/tutorials/quickstart.md new file mode 100644 index 00000000000..54760801e41 --- /dev/null +++ b/versioned_docs/version-23.4.1/private-networks/tutorials/quickstart.md @@ -0,0 +1,594 @@ +--- +title: Quorum Developer Quickstart +sidebar_position: 1 +description: Rapidly generate a local blockchain network using the Quickstart. +tags: + - private networks +--- + +import TestAccounts from '../../global/test_accounts.md'; + +import Postman from '../../global/postman.md'; + +# Developer Quickstart + +The Quorum Developer Quickstart uses the Hyperledger Besu Docker image to run a private [IBFT 2.0](../how-to/configure/consensus/ibft.md) network of Besu nodes managed by Docker Compose. + +:::danger + +This tutorial runs a private network suitable for education or demonstration purposes and is not intended for running production networks. + +::: + +## Prerequisites + +- One of the following operating systems: + - Linux on x86_64 architecture + - macOS on an Intel processor (M1 processor not supported yet) + - Windows 64-bit edition, with: + - Windows Subsystem for Linux 2 + - Docker desktop configured to use the WSL2-based engine +- [Docker and Docker Compose](https://docs.docker.com/compose/install/) +- [Node.js](https://nodejs.org/en/download/) version 12 or higher +- [Truffle](https://www.trufflesuite.com/truffle) +- [cURL command line](https://curl.haxx.se/download.html) +- [MetaMask](https://metamask.io/) + +:::info + +Allow Docker up to 4G of memory or 6G if running the privacy examples. Refer to the **Resources** section in [Docker for Mac](https://docs.docker.com/docker-for-mac/) and [Docker Desktop](https://docs.docker.com/docker-for-windows/) for details. + +::: + +## Generate the tutorial blockchain configuration files + +To create the tutorial `docker-compose` files and artifacts, run: + +```bash +npx quorum-dev-quickstart +``` + +Follow the prompts displayed to run Hyperledger Besu and [logging with ELK](../how-to/monitor/elastic-stack.md). Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) and [private transactions](../concepts/privacy/index.md). + +:::note + +If you enter `y` for private transactions, you get three Besu nodes with corresponding Tessera nodes for privacy. You can follow the [privacy walk-through](privacy/index.md), which details how to send private transactions and interact with deployed private contracts. + +::: + +## Start the network + +To start the network, go to the installation directory (`quorum-test-network` if you used the default value) and run: + +```bash +./run.sh +``` + +The script builds the Docker images, and runs the Docker containers. + +Four Besu IBFT 2.0 validator nodes and a non-validator node are created to simulate a base network. + +When execution is successfully finished, the process lists the available services: + +```log title="Services list" +************************************* +Quorum Dev Quickstart +************************************* +---------------------------------- +List endpoints and services +---------------------------------- +JSON-RPC HTTP service endpoint : http://localhost:8545 +JSON-RPC WebSocket service endpoint : ws://localhost:8546 +Web block explorer address : http://localhost:25000/ +Prometheus address : http://localhost:9090/graph +Grafana address : http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All +Kibana logs address : http://localhost:5601/app/kibana#/discover +Collated logs using Grafana Loki : http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search= + +For more information on the endpoints and services, refer to README.md in the installation directory. +**************************************************************** +``` + +- Use the **JSON-RPC HTTP service endpoint** to access the RPC node service from your dapp or from cryptocurrency wallets such as MetaMask. +- Use the **JSON-RPC WebSocket service endpoint** to access the Web socket node service from your dapp. +- Use the **Web block explorer address** to display the [block explorer Web application](http://localhost:25000). +- Use the **Prometheus address** to access the [Prometheus dashboard](http://localhost:9090/graph). [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). +- Use the **Grafana address** to access the [Grafana dashboard](http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All). [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). +- Use the **Kibana logs address** to access the [logs in Kibana](http://localhost:5601/app/kibana#/discover). [Read more about log management](../how-to/monitor/elastic-stack.md). +- Use the **Grafana Loki logs address** to access the [logs in Grafana](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=). [Read more about log management](../how-to/monitor/loki.md). + +To display the list of endpoints again, run: + +```bash +./list.sh +``` + +## Use a block explorer + +You can [use Sirato Blockchain Explorer](../how-to/monitor/sirato-explorer.md) to analyze block information, contract metadata, transaction searches, and more. Sirato has built-in support for privacy-enabled Besu networks. + +:::note + +You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, in order to allow access for Besu [privacy API methods](../reference/api/index.md#priv-methods). In production networks, you must [secure access](../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. + +::: + +Clone the [Sirato GitHub repository](https://github.com/web3labs/sirato-free): + +```bash +git clone https://github.com/web3labs/sirato-free +``` + +From the Sirato directory, run the following command: + +```bash +cd docker-compose +NODE_ENDPOINT=member1besu PORT=26000 docker-compose -f docker-compose.yml -f sirato-extensions/docker-compose-quorum-dev-quickstart.yml up +``` + +Open `http://localhost/` on your browser. You’ll see the new initialization page while it boots up. This may take 5–10 minutes for the all services to start and the ingestion sync to complete. + +To stop all the services from running, run the following script from the `docker-compose` directory: + +```bash +docker-compose down -v +``` + +## Monitor nodes with Prometheus and Grafana + +The sample network also includes Prometheus and Grafana monitoring tools to let you visualize node health and usage. You can directly access these tools from your browser at the addresses displayed in the endpoint list. + +- [Prometheus dashboard](http://localhost:9090/graph) +- [Grafana dashboard](http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All) +- [Grafana Loki logs dashboard](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=quorum&var-search=) + +For more details on how to configure and use these tools for your own nodes, see the [performance monitoring documentation](../../public-networks/how-to/monitor/metrics.md), [Prometheus documentation](https://prometheus.io/docs/introduction/overview/) and [Grafana documentation](https://grafana.com/docs/). + +![Grafana dashboard screenshot](../../assets/images/grafana.png) + +and collated logs via Grafana Loki + +![Grafana Loki dashboard screenshot](../../assets/images/grafana_loki.png) + +## Run JSON-RPC requests + +You can run JSON-RPC requests on: + +- HTTP with `http://localhost:8545`. +- WebSockets with `ws://localhost:8546`. + +### Run with `cURL` + +This tutorial uses [cURL](https://curl.haxx.se/download.html) to send JSON-RPC requests over HTTP. + +### Run with Postman + +You can also run all the requests with the Besu Postman collection. + + + +### Request the node version + +Run the following command from the host shell: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://localhost:8545 +``` + +The result displays the client version of the running node: + + + +# Result example + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "besu/v21.1.2/linux-x86_64/oracle_openjdk-java-11" +} +``` + +# Result explanation + +- `"jsonrpc" : "2.0"` indicates that the JSON-RPC 2.0 spec format is used. +- `"id" : 1` is the request identifier used to match the request and the response. This tutorial always uses 1. +- `"result"` contains the running Besu information: + - `v21.1.2` is the running Besu version number. This may be different when you run this tutorial. + - `linux-x86_64` is the architecture used to build this version. + - `oracle_openjdk-java-11` is the JVM type and version used to build this version. This may be different when you run this tutorial. + + + +Successfully calling this method shows that you can connect to the nodes using JSON-RPC over HTTP. + +From here, you can walk through more interesting requests demonstrated in the rest of this section, or skip ahead to [Create a transaction using MetaMask](#create-a-transaction-using-metamask). + +### Count the peers + +Peers are the other nodes connected to the node receiving the JSON-RPC request. + +Poll the peer count using [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount): + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' http://localhost:8545 +``` + +The result indicates that there are four peers (the validators): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4" +} +``` + +### Request the most recent block number + +Call [`eth_blockNumber`](../../public-networks/reference/api/index.md#eth_blockNumber) to retrieve the number of the most recently synchronized block: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http://localhost:8545 +``` + +The result indicates the highest block number synchronized on this node. + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x2a" +} +``` + +Here the hexadecimal value `0x2a` translates to decimal as `42`, the number of blocks received by the node so far, about two minutes after the new network started. + +## Create a transaction using MetaMask + +You can use [MetaMask](https://metamask.io/) to send a transaction on your private network. + +1. Open MetaMask and connect it to your private network RPC endpoint by selecting `Localhost 8545` in the network list. +1. Choose one of the following test accounts and [import it into MetaMask by copying the corresponding private key](https://metamask.zendesk.com/hc/en-us/articles/360015489331-How-to-import-an-Account). + + + +:::note + +Besu doesn't incorporate [account management](../../public-networks/how-to/send-transactions.md). To create your own account, you have to use a third-party tool, such as MetaMask. + +::: + +1. After importing an existing test account, [create another test account from scratch] to use as the recipient for a test Ether transaction. + +1. In MetaMask, select the new test account and [copy its address](https://metamask.zendesk.com/hc/en-us/articles/360015289512-How-to-copy-your-MetaMask-Account-Public-Address). + +1. In the [Block Explorer](http://localhost:25000), search for the new test account by selecting the :mag: and pasting the test account address into the search box. + + The new test account displays with a zero balance. + +1. [Send test Ether](https://metamask.zendesk.com/hc/en-us/articles/360015488931-How-to-send-ETH-and-ERC-20-tokens-from-your-MetaMask-Wallet) from the first test account (containing test Ether) to the new test account (which has a zero balance). + + :::tip + + You can use a zero gas price here as this private test network is a [free gas network](../how-to/configure/free-gas.md), but the maximum amount of gas that can be used (the gas limit) for a value transaction must be at least 21000. + + ::: + +1. Refresh the Block Explorer page in your browser displaying the target test account. + + The updated balance reflects the transaction completed using MetaMask. + +## Smart contract and dapp usage + +You can use a demo dapp called Pet Shop, provided by [Truffle](https://www.trufflesuite.com/tutorial). + +The dapp runs a local website using Docker, and uses smart contracts deployed on the network. + +The directory created by `quorum-dev-quickstart` includes a `dapps` directory with a `pet-shop` subdirectory, which contains the source code for the dapp, including the smart contracts, website, and configurations to run this tutorial. + +With the blockchain running and MetaMask connected to `Localhost 8545` via the browser, run the following command to start the Pet Shop dapp: + +```bash +cd dapps/pet-shop +./run_dapp.sh +``` + +The script: + +1. Installs the dapp Node dependencies (you may see some warnings here, but it will not prevent the dapp from running). +1. Compiles the contracts. +1. Deploys the contracts to the blockchain. +1. Runs tests. +1. Builds and runs a Docker image to serve the dapp website. + +```text './run_dapp.sh' example output +Compiling your contracts... +=========================== +> Compiling ./contracts/Adoption.sol +> Compiling ./contracts/Migrations.sol +> Artifacts written to /Users/demo/quorum-test-network/dapps/pet-shop/pet-shop-box/build/contracts +> Compiled successfully using: + - solc: 0.5.16+commit.9c3226ce.Emscripten.clang + +Starting migrations... +====================== +> Network name: 'quickstartWallet' +> Network id: 1337 +> Block gas limit: 16234336 (0xf7b760) + +1_initial_migration.js +====================== + + Deploying 'Migrations' + ---------------------- + > transaction hash: 0xdd27f5bc5b0c4a42bb4f4d9ba00b4d33742de10ba8f03484cbf095ee824ba11a + > Blocks: 0 Seconds: 0 + > contract address: 0xFB88dE099e13c3ED21F80a7a1E49f8CAEcF10df6 + > block number: 2747 + > block timestamp: 1618000437 + > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 + > balance: 89999.97435026 + > gas used: 221555 (0x36173) + > gas price: 20 gwei + > value sent: 0 ETH + > total cost: 0.0044311 ETH + + + > Saving migration to chain. + > Saving artifacts + ------------------------------------- + > Total cost: 0.0044311 ETH + +2_deploy_contracts.js +===================== + + Deploying 'Adoption' + -------------------- + > transaction hash: 0xd6f5b11807a0727a92b6063c95b9101769d310592b0d3cf35d6df233d05d50e6 + > Blocks: 0 Seconds: 0 + > contract address: 0xf204a4Ef082f5c04bB89F7D5E6568B796096735a + > block number: 2749 + > block timestamp: 1618000441 + > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 + > balance: 89999.968712 + > gas used: 239915 (0x3a92b) + > gas price: 20 gwei + > value sent: 0 ETH + > total cost: 0.0047983 ETH + + + > Saving migration to chain. + > Saving artifacts + ------------------------------------- + > Total cost: 0.0047983 ETH + +Summary +======= +> Total deployments: 2 +> Final cost: 0.0092294 ETH + + +Using network 'quickstartWallet'. + +Compiling your contracts... +=========================== +> Compiling ./test/TestAdoption.sol + +TestAdoption +✓ testUserCanAdoptPet (2071ms) +✓ testGetAdopterAddressByPetId (6070ms) +✓ testGetAdopterAddressByPetIdInArray (6077ms) + +3 passing (37s) +``` + +After these tests are successful, the script builds a container for the Pet Shop dapp and deploys it, binding it to port 3001 on your system. + +```text +Sending build context to Docker daemon 489.4MB +Step 1/5 : FROM node:12.14.1-stretch-slim +---> 2f7e25ad14ea +Step 2/5 : EXPOSE 3001 +---> Using cache +---> 2ef0665a040a +Step 3/5 : WORKDIR /app +---> Using cache +---> e8e97cedb575 +Step 4/5 : COPY . /app +---> f70e4265e598 +Step 5/5 : CMD npm run dev +---> Running in 3c6e8bdb3f3b +Removing intermediate container 3c6e8bdb3f3b +---> ce2588e47ab0 +Successfully built ce2588e47ab0 +Successfully tagged quorum-dev-quickstart_pet_shop:latest +b1615ab765656bc027f63fc60019dba1ca572305766c820f41eaf113b7e14cf8 +``` + +In the browser where you have MetaMask enabled and one of the test accounts loaded, open a new tab and navigate to [the Pet Shop dapp](http://localhost:3001) where you can adopt lovely pets (sorry, not for real, it's a demo). + +When you select **Adopt**, a MetaMask window pops up and requests your permission to continue with the transaction. + +After the transaction is complete and successful, the status of the pet you adopted shows **Success**. + +![Dapp UI](../../assets/images/dapp-ui.png) + +You can also search for the transaction and view its details in the [Block Explorer](http://localhost:25000/). + +![Dapp UI](../../assets/images/dapp-explorer-tx.png) + +The MetMask UI also keeps a record of the transaction. + +![Dapp UI](../../assets/images/dapp-metamask-tx.png) + +### Deploy your own dapp + +You can deploy your own dapp to the Quorum Developer Quickstart, by configuring your dapp to point to the Quickstart network. + +If you're using [Truffle](https://trufflesuite.com/truffle/), update the `networks` object in the [Truffle configuration file](https://trufflesuite.com/docs/truffle/reference/configuration#networks) to specify which networks to connect to for deployments and testing. The Quickstart RPC service endpoint is `http://localhost:8545`. + +For example, the following is the Truffle configuration file for the Pet Shop dapp used in the Quickstart Besu network: + +```js +const PrivateKeyProvider = require("@truffle/hdwallet-provider"); + +// insert the private key of the account used in MetaMask, e.g. Account 1 (Miner Coinbase Account) +const privateKey = + "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; + +module.exports = { + networks: { + development: { + host: "127.0.0.1", + port: 7545, + network_id: "*", // Match any network id + }, + develop: { + port: 8545, + }, + quickstartWallet: { + provider: () => + new PrivateKeyProvider(privateKey, "http://localhost:8545"), + network_id: "*", + }, + }, +}; +``` + +Deploy the dapp using: + +```bash +truffle migrate --network quickstartWallet +``` + +## Stop and restart the private network without removing containers + +To shut down the private network without deleting the containers: + +```bash +./stop.sh +``` + +This command stops the containers related to the services specified in the `docker-compose.yml` file. + +To restart the private network: + +```bash +./resume.sh +``` + +## Stop the private network and remove containers + +To shut down the private network and delete all containers and images created from running the sample network and the Pet Shop dapp: + +```bash +./remove.sh +``` + +## Add a new node to the network + +New nodes joining an existing network require the following: + +- The same genesis file used by all other nodes on the running network. +- A list of nodes to connect to; this is done by specifying [bootnodes], or by providing a list of [static nodes]. +- A node key pair and optionally an account. If the running network is using permissions, then you need to add the new node's enode details to the [permissions file] used by existing nodes, or update the onchain permissioning contract. + +The following steps describe the process to add a new node to the Developer Quickstart. + +### 1. Create the node key files + +Create a node key pair and account for a new node by running the following script: + +```bash +cd ./extra +npm install +node generate_node_keys.js --password "Password" +``` + +:::note + +The `--password` parameter is optional. + +::: + +### 2. Create new node directory + +Navigate to the directory where the configuration files for the network were created. + +:::note + +The directory was specified in an earlier step when running `npx quorum-dev-quickstart`. The default location is `./quorum-test-network`. + +::: + +In the `config/nodes` directory, create a subdirectory for the new node (for example, `newnode`), and move the `nodekey`, `nodekey.pub`, `address` and `accountkey` files from the previous step into this directory. + +### 3. Update docker-compose + +Add an entry for the new node into the docker-compose file: + +```yaml +newnode: + <<: *besu-def + container_name: newnode + volumes: + - public-keys:/opt/besu/public-keys/ + - ./config/besu/:/config + - ./config/nodes/newnode:/opt/besu/keys + - ./logs/besu:/tmp/besu + depends_on: + - validator1 + networks: + quorum-dev-quickstart: + ipv4_address: 172.16.239.41 +``` + +:::caution important +Select an IP address and port map not being used for the other containers. +Mount the newly created folder `./config/nodes/newnode` to the `/opt/besu/keys` directory of the new node, as seen +in this example. +::: + +### 4. Update Prometheus configuration + +Update `prometheus.yml` in the `./config/prometheus/` directory to configure metrics to display in Grafana. + +Insert the following under `scrape_configs` section in the file. Change `job_name` and `targets` appropriately if you've updated them. + +```yaml +- job_name: newnode + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: [newnode:9545] +``` + +### 5. Update files with the enode address + +Add the new node's enode address to the [static nodes] file and [permissions file]. The enode uses the format `enode://pubkey@ip_address:30303`. If the `nodekey.pub` is `4540ea...9c1d78` and the IP address is `172.16.239.41`, then the enode address is `"enode://4540ea...9c1d78@172.16.239.41:30303"`, which must be added to both files. + +Alternatively, call the [`perm_addNodesToAllowlist`](../../public-networks/reference/api/index.md#perm_addnodestoallowlist) API method on existing nodes to add the new node without restarting. + +:::note + +Calling the API method by itself only persists for as long as the nodes remain online and is lost on the next restart. + +On a live network, the new node must be added to the [permissions file] so that subsequent restarts of the nodes are aware of the change. + +::: + +### 6. Start the network + +Once complete, start the network up with `./run.sh`. When using the smart contract you can either make changes via a [dapp](https://github.com/ConsenSys/permissioning-smart-contracts) or via [RPC API calls](../../public-networks/reference/api/index.md#perm_addnodestoallowlist). + + + +[bootnodes]: ../how-to/configure/bootnodes.md +[permissions file]: ../how-to/use-permissioning/local.md +[static nodes]: ../../public-networks/how-to/connect/static-nodes.md +[allow list]: ../how-to/use-permissioning/local.md#node-allowlisting +[Import one of the existing accounts above into MetaMask]: https://metamask.zendesk.com/hc/en-us/articles/360015489331-Importing-an-Account-New-UI- +[create another test account from scratch]: https://metamask.zendesk.com/hc/en-us/articles/360015289452-Creating-Additional-MetaMask-Wallets-New-UI- diff --git a/versioned_docs/version-23.4.1/public-networks/.meta.yml b/versioned_docs/version-23.4.1/public-networks/.meta.yml new file mode 100644 index 00000000000..47f9110472f --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/.meta.yml @@ -0,0 +1,6 @@ +--- +# Meta items setting with yaml files is an insider only feature +# see https://squidfunk.github.io/mkdocs-material/reference/#built-in-meta-plugin + +tags: + - public networks diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/_category_.json b/versioned_docs/version-23.4.1/public-networks/concepts/_category_.json new file mode 100644 index 00000000000..0eb56feedb7 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Concepts", + "position": 4, + "link": { + "type": "generated-index", + "slug": "public-networks/concepts" + } +} diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/data-storage-formats.md b/versioned_docs/version-23.4.1/public-networks/concepts/data-storage-formats.md new file mode 100644 index 00000000000..30802b9a080 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/data-storage-formats.md @@ -0,0 +1,93 @@ +--- +title: Data storage formats +sidebar_position: 3 +description: Learn about storing data using Forest of Tries and Bonsai Tries. +tags: + - public networks +--- + +# Data storage formats + +Besu offers two formats for storing the world state, [Forest of Tries](#forest-of-tries) and [Bonsai Tries](#bonsai-tries). + +## Forest of Tries + +Forest of Tries, also called forest mode, is the default storage format. + +In forest mode, each node in the trie is saved in a key-value store by hash. For each block, the world state is updated with new nodes, leaf nodes, and a new state root. Old leaf nodes remain in the underlying data store. Data is accessed and stored by hash, which increases the size of the database and increases the resources and time needed to access account data. + +

+ +![forest_of_tries](../../assets/images/forest_of_tries.png) + +

+ +### Pruning + +Pruning reduces the storage required by removing state trie nodes unreachable from [recent blocks](../../public-networks/reference/cli/options.md#pruning-blocks-retained). + +Pruning is disabled by default, and can be enabled with the [`--pruning-enabled`](../../public-networks/reference/cli/options.md#pruning-enabled) command line option. + +:::info + +Using pruning with [private transactions](../../private-networks/concepts/privacy/private-transactions)\ +isn't supported. + +::: + +Pruning might increase block import times, but it doesn't affect the ability of nodes to stay in sync. + +:::caution + +Pruning is being deprecated for [Bonsai Tries](#bonsai-tries) and is currently not being updated. + +::: + +## Bonsai Tries + +Bonsai Tries is a data storage layout policy designed to reduce storage requirements and increase read performance. + +Bonsai stores leaf values in a trie log, separate from the branches of the trie. Bonsai stores nodes by the location of the node instead of the hash of the node. Bonsai can access the leaf from the underlying storage directly using the account key. This greatly reduces the disk space needed for storage and allows for less resource-demanding and faster read performance. Bonsai inherently prunes orphaned nodes and old branches. + +To run a node with Bonsai Tries data storage format, use the command line option [`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). + +

+ +![Bonsai_tries](../../assets/images/Bonsai_tries.png) + +

+ +## Forest of Tries vs. Bonsai Tries + +### Storage requirements + +Forest mode uses significantly more memory than Bonsai. With an [archive node](../get-started/connect/sync-node.md#run-an-archive-node), forest mode uses an estimated 12 TB of storage, while Bonsai uses an estimated 1100 GB of storage. With a [full node](../get-started/connect/sync-node.md#run-a-full-node), forest mode uses an estimated 750 GB of storage, while Bonsai uses an estimated 650 GB of storage. + +### Accessing data + +Forest mode must go through all the branches by hash to read a leaf value. Bonsai can access the leaf from the underlying storage directly using the account key. Bonsai will generally read faster than forest mode, particularly if the blocks are more recent. + +However, Bonsai becomes increasingly more resource-intensive the further in history you try to read data. To prevent this, you can limit how far Bonsai looks back while reconstructing data. The default limit Bonsai looks back is 512. To change the parameter, use the [`--bonsai-historical-block-limit`](../reference/cli/options.md#bonsai-historical-block-limit) option. + +:::note + +Using `--bonsai-historical-block-limit` doesn't affect the size of the database being stored, only how far back to load. This means there is no "safe minimum" value to use with this option. + +::: + +### Syncing nodes + +The following table shows the ways you can [sync a full node](../get-started/connect/sync-node.md#run-a-full-node) with the different data storage formats using [fast](../get-started/connect/sync-node.md#fast-synchronization) and [snap](../get-started/connect/sync-node.md#snap-synchronization) sync. + +| Data storage format | Sync mode | Storage estimate | Can other nodes sync to your node? | +| --- | --- | --- | --- | +| Bonsai | Fast | 650 GB | No | +| Bonsai | Snap | 650 GB | To be implemented | +| Forest | Fast | 750 GB | Yes | +| Forest | Snap | 750 GB | No | + +:::tip + +We recommend using snap sync with Bonsai for the fastest sync and lowest storage requirements. + +::: diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/events-and-logs.md b/versioned_docs/version-23.4.1/public-networks/concepts/events-and-logs.md new file mode 100644 index 00000000000..c5b78fe2bbb --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/events-and-logs.md @@ -0,0 +1,186 @@ +--- +title: Events and logs +sidebar_position: 6 +description: Learn about events and logs in Besu. +tags: + - public networks + - private networks +--- + +# Events and logs + +Transaction mining causes smart contracts to emit events and write logs to the blockchain. + +The smart contract address is the link to the logs and the blockchain includes the logs, but contracts cannot access logs. Log storage is cheaper than contract storage (that is, it costs less gas) so storing and accessing the required data in logs reduces the cost. For example, use logs to display all transfers made using a specific contract, but not the current state of the contract. + +A Dapp front end can either access logs using the [JSON-RPC API filter methods](../how-to/use-besu-api/access-logs.md) or subscribe to logs using the [RPC Pub/Sub API](../how-to/use-besu-api/rpc-pubsub.md#logs). + +Use [`admin_generateLogBloomCache`](../reference/api/index.md#admin_generatelogbloomcache) to improve log retrieval performance. + +## Topics + +Log entries contain up to four topics. The first topic is the [event signature hash](#event-signature-hash) and up to three topics are the indexed [event parameters](#event-parameters). + +```json title="A log entry for an event with one indexed parameter" +{ + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x84", + "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", + "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] +} +``` + +## Event parameters + +Up to three event parameters can have the `indexed` attribute. Logs store these indexed parameters as `topics`. Indexed parameters are searchable and filterable. + +Topics are 32 bytes. If an indexed argument is an array (including `string` and `byte` datatypes), the log stores the keccak-256 hash of the parameter as a topic. + +Log `data` includes non-indexed parameters but is difficult to search or filter. + +A Solidity contract storing one indexed and one non-indexed parameter and has an event emitting the value of each parameter: + +```solidity +pragma solidity ^0.5.1; +contract Storage { + uint256 public valueIndexed; + uint256 public valueNotIndexed; + + event Event1(uint256 indexed valueIndexed, uint256 valueNotIndexed); + + function setValue(uint256 _valueIndexed, uint256 _valueNotIndexed) public { + valueIndexed = _valueIndexed; + valueNotIndexed = _valueNotIndexed; + emit Event1(_valueIndexed, _valueNotIndexed); + } +} +``` + +A log entry created by invoking the contract in the previous example with `valueIndexed` set to 5 and `valueNotIndexed` set to 7: + +```json +{ + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d6", + "blockHash": "0x7d0ac7c12ac9f622d346d444c7e0fa4dda8d4ed90de80d6a28814613a4884a67", + "transactionHash": "0xe994022ada94371ace00c4e1e20663a01437846ced02f18b3f3afec827002781", + "transactionIndex": "0x0", + "address": "0x43d1f9096674b5722d359b6402381816d5b22f28", + "data": "0x0000000000000000000000000000000000000000000000000000000000000007", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] +} +``` + +## Event signature hash + +The first topic in a log entry is always the event signature hash. The event signature hash is a keccak-256 hash of the event name and input argument types, with argument names ignored. For example, the event `Hello(uint256 worldId)` has the signature hash `keccak('Hello(uint256)')`. The signature identifies to which event log topics belong. + +A Solidity contract with two different events: + +```solidity +pragma solidity ^0.5.1; +contract Storage { + uint256 public valueA; + uint256 public valueB; + + event Event1(uint256 indexed valueA); + event Event2(uint256 indexed valueB); + + function setValue(uint256 _valueA) public { + valueA = _valueA; + emit Event1(_valueA); + } + + function setValueAgain(uint256 _valueB) public { + valueB = _valueB; + emit Event2(_valueB); + } +} +``` + +The event signature hash for event 1 is `keccak('Event1(uint256)')` and the event signature hash for event 2 is `keccak('Event2(uint256)')`. The hashes are: + +- `04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3` for event 1 +- `06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e` for event 2. + +:::tip + +You can use a library keccak (sha3) hash function, such as provided in [Web3.js](https://web3js.readthedocs.io/en/v1.2.11/web3-utils.html?highlight=sha3#sha3), or an online tool, such as https://emn178.github.io/online-tools/keccak_256.html, to generate event signature hashes. + +::: + +Log entries from invoking the Solidity contract in the previous example: + +```json +[ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x84", + "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", + "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x87", + "blockHash": "0x6643a1e58ad857f727552e4572b837a85b3ca64c4799d085170c707e4dad5255", + "transactionHash": "0xa95295fcea7df3b9e47ab95d2dadeb868145719ed9cc0e6c757c8a174e1fcb11", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } +] +``` + +## Topic filters + +[Filter options objects](../reference/api/objects.md#filter-options-object) have a `topics` key to filter logs by topics. + +Topics are order-dependent. A transaction with a log containing topics `[A, B]` matches with the following topic filters: + +- `[]` - Match any topic +- `[A]` - Match A in first position +- `[[null], [B]]` - Match any topic in first position AND B in second position +- `[[A],[B]]` - Match A in first position AND B in second position +- `[[A, C], [B, D]]` - Match (A OR C) in first position AND (B OR D) in second position. + +The following filter option object returns log entries for the [Event Parameters example contract](#event-parameters) with `valueIndexed` set to 5 or 9: + +```json +{ + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x43d1f9096674b5722d359b6402381816d5b22f28", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + [ + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000009" + ] + ] +} +``` diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/genesis-file.md b/versioned_docs/version-23.4.1/public-networks/concepts/genesis-file.md new file mode 100644 index 00000000000..d91a237e096 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/genesis-file.md @@ -0,0 +1,50 @@ +--- +title: Genesis file +sidebar_position: 7 +description: Learn about configuring a network using the genesis file. +tags: + - public networks + - private networks +--- + +# Genesis file + +The genesis file defines the first block in the chain, and the first block defines which chain you want to join. + +For Ethereum Mainnet and public testnets (for example, Goerli) the genesis configuration definition is in Besu and used when specifying a public network using the [`--network`](../reference/cli/options.md#network) command line option. + +For private networks, [create a JSON genesis file](https://consensys.net/blog/quorum/hyperledger-besu-how-to-create-an-ethereum-genesis-file/), then specify the genesis file using the [`--genesis-file`](../reference/cli/options.md#genesis-file) command line option. + +The genesis file specifies the [network-wide settings](../reference/genesis-items.md), such as those for a [free gas network](../../private-networks/how-to/configure/free-gas.md), so all nodes in a network must use the same genesis file. + +:::note + +You can specify node-level settings on the command line or in the [node configuration file](../how-to/configuration-file.md). + +::: + +```json title="Example IBFT 2.0 genesis file" +{ + "config": { + "chainId": 2018, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000c0", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb": { + "balance": "0xad78ebc5ac6200000" + } + } +} +``` diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/network-and-chain-id.md b/versioned_docs/version-23.4.1/public-networks/concepts/network-and-chain-id.md new file mode 100644 index 00000000000..85db0c4b7da --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/network-and-chain-id.md @@ -0,0 +1,76 @@ +--- +title: Network ID and chain ID +sidebar_position: 5 +description: Learn about network ID and chain ID in Besu. +tags: + - public networks + - private networks +--- + +# Network ID and chain ID + +Ethereum networks have two identifiers, a network ID and a chain ID. Although they often have the same value, they have different uses. + +Peer-to-peer communication between nodes uses the _network ID_, while the transaction signature process uses the _chain ID_. + +:::note + +[EIP-155](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md) introduced using the chain ID as part of the transaction signing process to protect against transaction replay attacks. + +::: + +For most networks, including Mainnet and the public testnets, the network ID and the chain ID are the same, with the network ID defaulting to the chain ID, as specified in the genesis file. + +```json title="Chain ID in the genesis file" +{ + "config": { + "ethash": { + }, + "chainID": 1981 + }, + ... +} +``` + +Besu sets the chain ID (and by default the network ID) automatically, using either the [`--genesis-file`](../reference/cli/options.md#genesis-file) option or when specifying a network using the [`--network`](../reference/cli/options.md#network) option. The following table lists the available networks and their chain and network IDs. + +| Network | Chain | Chain ID | Network ID | Type | +| --------- | ----- | -------- | ---------- | ----------- | +| `mainnet` | ETH | 1 | 1 | Production | +| `goerli` | ETH | 5 | 5 | Test | +| `sepolia` | ETH | 11155111 | 11155111 | Test | +| `dev` | ETH | 2018 | 2018 | Development | +| `classic` | ETC | 61 | 1 | Production | +| `mordor` | ETC | 63 | 7 | Test | +| `kotti` | ETC | 6 | 6 | Test | +| `astor` | ETC | 212 | 212 | Test | + +:::info + +The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: + +## Specify a different network ID + +Usually the network ID is the same as the chain ID, but if you want to separate specific nodes from the rest of the network so they can't connect or synchronize with other nodes, you can override the default network ID for those nodes using the [`--network-id`](../reference/cli/options.md#network-id) option. + +## Start a new chain with a new chain ID + +If you update the chain ID (or network ID) of existing nodes, they can no longer peer with other nodes in the network. Nodes need to have a matching [genesis file](genesis-file.md), including the chain ID, in order to peer. In this case, you're effectively running two chains that can't communicate with each other. + +To change a chain ID and start a new chain: + +1. Stop all your nodes using ctrl+c in each terminal window. +2. Update the [genesis file](genesis-file.md) with the new chain ID. +3. Make sure all nodes have the same genesis file. +4. Delete the old data directory or point to a new location for each node. +5. [Restart the nodes](../../private-networks/tutorials/ibft/index.md#6-start-the-first-node-as-the-bootnode). + +:::danger Warning + +Starting a new chain is starting from block zero. + +This means when you start a new chain with a new chain ID, you lose all previous data. + +::: diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/node-keys.md b/versioned_docs/version-23.4.1/public-networks/concepts/node-keys.md new file mode 100644 index 00000000000..01f1c98a31a --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/node-keys.md @@ -0,0 +1,104 @@ +--- +title: Node keys +sidebar_position: 8 +description: Learn about node public and private keys, and the node address. +tags: + - public networks + - private networks +--- + +# Node keys and node address + +Each node has a private and public key pair, and a node address. Hyperledger Besu uses the private and public key pair to sign and verify transactions, and the node address as an identifier for the node. + +## Node private key + +When starting Hyperledger Besu, if the [`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option is not specified and a `key` file does not exist in the data directory for the node, Besu generates a node private key and writes it to the `key` file. + +If a `key` file does exist in the data directory when starting Besu, the node starts using the private key in the `key` file. + +:::info + +The private key is not encrypted. + +::: + +## Node public key + +The node public key displays in the log after starting Besu. Also referred to as the node ID, the node public key forms part of the enode URL of a node. + +You can export the node public key, either to standard output or to a specified file, using the [`public-key export`](../reference/cli/subcommands.md#public-key) subcommand. + +## Node address + +Besu generates the node address by creating a hash of the node public key and using the last 20 bytes of the hash as the node address. It is also displayed in the logs after starting Besu. + +You can export the node address, either to standard output or to a specified file, using the [`public-key export-address`](../reference/cli/subcommands.md#public-key) subcommand. + +## Specify a custom node private key file + +Use the [`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option to specify a custom `key` file in any location. + +If the `key` file exists, the node starts with the private key in the `key` file. If the `key` file does not exist, Besu generates a node private key and writes it to the `key` file. + +For example, the following command either reads the node private key from `privatekeyfile` or writes a generated private key to `privatekeyfile`. + +```bash +besu --node-private-key-file="/Users/username/privatekeyfile" +``` + +## Enode URL + +The enode URL identifies a node. For example, the [`--bootnodes`](../reference/cli/options.md#bootnodes) option and the [`perm_addNodesToAllowlist`](../reference/api/index.md#perm_addnodestoallowlist) method specify nodes by enode URL. + +The enode URL format is `enode://@[?discport=]` where: + +- `` is the node public key, excluding the initial 0x. +- `` is the host and TCP port the bootnode is listening on for P2P discovery. Specify the host and TCP port using the [`--p2p-host`](../reference/cli/options.md#p2p-host) and [`--p2p-port`](../reference/cli/options.md#p2p-port) options. The default host is `127.0.0.1` and the default port is `30303`. + + :::note + + Standard Ethereum enode URLs allow hostnames as IP addresses only, however Besu provides [domain name support](#domain-name-support) in private permissioned networks. + + ::: + +- If the TCP listening and UDP discovery ports differ, the UDP port is specified as query parameter `discport`. + +:::info + +If the node public key is `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, the host is `10.3.58.6`, the TCP listening port is `30303`, and the UDP discovery port is `30301`, then the enode URL is `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@10.3.58.6:30303?discport=30301` + +If the [`--p2p-host`](../reference/cli/options.md#p2p-host) or [`--p2p-port`](../reference/cli/options.md#p2p-port) options are not specified and the node public key is `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, then the enode URL is `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303` + +::: + +The enode URL displays when starting a Besu node. Use the [`net_enode`](../reference/api/index.md#net_enode) JSON-RPC API method to get the enode URL of the node. + +The enode advertised to other nodes during discovery is the external IP address and port, as defined by [`--nat-method`](../how-to/connect/specify-nat.md). + +### Domain name support + +:::caution + +Enode URL domain name support is an early access feature that you can use in private [permissioned networks](../../private-networks/concepts/permissioning/index.md) only. + +::: + +To use domain names in enode URLs: + +- Configure DNS reverse lookup. +- Enable DNS support using the early access option `--Xdns-enabled`. + +```bash title="Example enode URL using a domain name" +enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@mydomain.dev.example.net:30301 +``` + +:::tip + +If deploying Besu using Kubernetes in private permissioned networks, use the `--Xdns-enabled` and `--Xdns-update-enabled` options to ensure that Besu can connect to a container after restarting even if the IP address of the container changes. + +Use the [`--Xhelp`](../reference/cli/options.md#xhelp) command line option to view early access options and their descriptions. + +::: + +If nodes are not connecting as expected, set the [log level to TRACE](../reference/api/index.md#admin_changeloglevel) to help troubleshoot the issue. diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/proof-of-stake/_category_.json b/versioned_docs/version-23.4.1/public-networks/concepts/proof-of-stake/_category_.json new file mode 100644 index 00000000000..47b2323cd5d --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/proof-of-stake/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Proof of stake consensus", + "position": 2 +} diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/proof-of-stake/attestations.md b/versioned_docs/version-23.4.1/public-networks/concepts/proof-of-stake/attestations.md new file mode 100644 index 00000000000..765320567b6 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/proof-of-stake/attestations.md @@ -0,0 +1,76 @@ +--- +title: Attestations +sidebar_position: 1 +description: Proof of stake attestations +tags: + - public networks +--- + +# Attestations + +Ethereum's move to [proof of stake consensus](./index.md) has brought many changes to the way the network operates. An important aspect of proof of stake is the need for validators to provide attestations in a timely and accurate manner. However, missed attestations have become a common occurrence among validators, leading to a loss of rewards and earnings. This page explores the context behind missing attestations. + +## What are attestations? + +Every epoch (6.4 minutes), a validator proposes an attestation to the network. The attestation is for a specific slot (every 12 seconds) in the epoch. The attestation votes in favor of the validator's view of the chain, in particular, the most recent justified block and the first block in the current epoch (known as _source_ and _target_ checkpoints). This information is collected for all participating validators, enabling the network to reach consensus about the state of the blockchain. + +Honest nodes have 1/3 \* `SECONDS_PER_SLOT` (4 seconds) from the start of the slot to either receive the block or decide there was no block produced and attest to an “empty” or “skip” slot. Once this time has elapsed, attesters should broadcast their attestation reflecting their local view of the chain. + +See the [official specification](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) for more information about attestations. + +## Attestation rewards + +Around 85% of validators' rewards come from making attestations. Although committee and slot assignments for attesting are randomized, every active validator will be selected to make exactly one attestation each epoch. + +Attestations receive rewards only if they're included in Beacon Chain blocks. An attestation contains three votes. Each vote is eligible for a reward, subject to the following conditions: + +- Getting attestations included with the correct source checkpoint within 5 slots +- Getting attestations included with the correct target checkpoint within 32 slots +- Getting attestations included with the correct head within 1 slot immediately + +Each of these duties carries a reward rate, a portion of the entire "weight denominator," or the sum of weighted rewards for each attestation. The remaining weights relate to participating in sync committees and proposing blocks (excluding any tips/MEV, the bulk of block rewards). The following table (from [Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/)) breaks down these weights for cumulative rewards: + +| Name | Percentage | Value | +| ---------------------- | ---------- | ------------ | +| `TIMELY_SOURCE_WEIGHT` | 21.9% | `uint64(14)` | +| `TIMELY_TARGET_WEIGHT` | 40.6% | `uint64(26)` | +| `TIMELY_HEAD_WEIGHT` | 21.9% | `uint64(14)` | +| `SYNC_REWARD_WEIGHT` | 3.1% | `uint64(2)` | +| `PROPOSER_WEIGHT` | 12.5% | `uint64(8)` | +| `WEIGHT_DENOMINATOR` | 100% | `uint64(64)` | + +## Incorrect attestations + +If you have attestations with incorrect head votes, your node might be experiencing slow block imports. However, block producers can also be slow to publish blocks, resulting in a majority of validators getting the head vote wrong. A <100% head vote doesn't necessarily imply a problem with your node. + +In case of a slowdown, identify whether the issue is with the beacon node or the execution client. Block timing logs can be helpful in determining this. + +If you're using [Teku](https://docs.teku.consensys.net/) as a consensus layer client, identify late blocks (the block didn't get to Teku in time) with the following kind of log: + +```bash +Late Block Import *** Block: c2b911533a8f8d5e699d1a334e0576d2b9aa4caa726bde8b827548b579b47c68 (4765916) proposer 6230 arrival 3475ms, pre-state_retrieved +5ms, processed +185ms, execution_payload_result_received +1436ms, begin_importing +0ms, transaction_prepared +0ms, transaction_committed +0ms, completed +21ms +``` + +The time of arrival indicates how much time elapsed after the start of the slot before your node received the block. In this example, the block arrived after 3475ms, which is slower than optimal, but still enough time for Teku to create an attestation 4 seconds into the slot. + +Typically, delayed arrivals occur when the block producer is slow in generating the block. It's also possible that the block was published on time but took longer to propagate to your node through peer-to-peer gossip. If delayed arrivals are a recurring issue, it might be a problem with your node, such as an incorrect system clock, network issues, or a reduction in the number of peers. + +## Conclusion + +Attestations are complicated. Rewards can be impacted by: + +- The contents of a block (how long it takes to compute). +- The hardware processing that block (execution speed). +- How long it takes for the block to arrive to Besu from the consensus layer. +- The arrival time of the block from other consensus layer peers. Besu and your consensus layer client have no control over how late into a slot they receive blocks. +- General network latency. +- The status of either Besu or the consensus layer client. + +[Monitoring](../../how-to/monitor/index.md) your validator carefully for uptime, execution speed, and a valid consensus layer connection will help you explore attestation performance for your node. + +## References + +- [Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/) +- [Understanding Attestation Misses](https://www.symphonious.net/2022/09/25/understanding-attestation-misses/) +- [Block production in Ethereum after the Merge](https://notes.ethereum.org/DaWh-02HQ4qftum1xdphkg?view#Broadcast-attestation) +- [Ethereum Consensus Specs](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/proof-of-stake/index.md b/versioned_docs/version-23.4.1/public-networks/concepts/proof-of-stake/index.md new file mode 100644 index 00000000000..8fad0be6237 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/proof-of-stake/index.md @@ -0,0 +1,47 @@ +--- +description: Ethereum proof of stake consensus +tags: + - public networks +--- + +# Proof of stake consensus + +[The Merge](../the-merge.md) transitioned Ethereum Mainnet to [proof of stake +(PoS)](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/) consensus. + +In Ethereum's PoS, you must run a [full node](../the-merge.md#execution-and-consensus-clients) and +[stake 32 ETH](https://ethereum.org/en/staking/) to become a validator. + +:::note +You must run a beacon node and an execution client to operate a full node on Mainnet. +To become a validator, you must also run a validator client (either [in the same process as the +beacon node](https://docs.teku.consensys.net/get-started/start-teku#start-the-clients-in-a-single-process) +or [separately](https://docs.teku.consensys.net/get-started/start-teku#run-the-clients-separately)). +::: + +PoS is preferred over proof of work and proof of authority as a consensus mechanism because it is +more secure, requires less energy, and lowers the barrier to entry. + +The PoS mechanism randomly chooses validators to propose or validate blocks on the [Beacon +Chain](https://ethereum.org/en/upgrades/beacon-chain/) in defined time frames. + +Proposers are responsible for proposing new consensus blocks, and non-proposing validators are +responsible for validating (attesting to) proposed blocks. +Validators earn [rewards](https://www.blocknative.com/ethereum-staking-calculator) for proposing and +attesting to consensus blocks eventually included in the Beacon Chain, and penalized for malicious behavior. +[Attestations](./attestations.md) make up the bulk of validator rewards (~85%). +Validators also receive transaction fees for included blocks. + +Each consensus block contains an execution payload, which contains a list of transactions and other data required to execute and validate the payload. + +When a node validates a consensus block, its [consensus client](../the-merge.md#consensus-clients) processes the block and sends the execution payload to the [execution client](../the-merge.md#execution-clients), which: + +1. Assembles a block on the execution layer. +2. Verifies pre-conditions. +3. Executes transactions. +4. Verifies post-conditions. +5. Sends the validity result back to the consensus client. + +If the block is valid, the execution client includes it in the execution chain and stores the new state in execution state storage. + +If a consensus block receives attestations backed by enough staked ETH, the block is included in the Beacon Chain. diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/the-merge.md b/versioned_docs/version-23.4.1/public-networks/concepts/the-merge.md new file mode 100644 index 00000000000..a84e7f428ae --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/the-merge.md @@ -0,0 +1,85 @@ +--- +title: The Merge +sidebar_position: 1 +description: Learn about The Merge, and execution and consensus clients. +tags: + - public networks +--- + +# The Merge + +:::info + +The Merge was executed on **September 15, 2022**. + +::: + +[The Merge](https://ethereum.org/en/upgrades/merge/) was an Ethereum upgrade that merged the +[Beacon Chain] into Ethereum Mainnet, turning Mainnet into a combination of an [execution layer and +consensus layer](#execution-and-consensus-clients). +The Merge transitioned Mainnet from proof of work to [proof of stake consensus](proof-of-stake/index.md). + +You can run Besu as an execution client with: + +- [Any consensus client on Mainnet](../get-started/connect/mainnet.md). +- [Any consensus client on a testnet](../get-started/connect/testnet.md). +- [Teku on Mainnet](../tutorials/besu-teku-mainnet.md). +- [Teku on a testnet](../tutorials/besu-teku-testnet.md). + +## Execution and consensus clients + +After The Merge, a full Ethereum Mainnet node is a combination of an execution client (previously +called an [Ethereum 1.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client) and +a consensus client (previously called an [Ethereum +2.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client). + +Execution and consensus clients communicate with each other using the [Engine API](../how-to/use-engine-api.md). + +![Ethereum Merge node](../../assets/images/Execution-Consensus-Clients.png) + +### Execution clients + +Execution clients, such as Besu, manage the execution layer, including executing transactions and +updating the world state. +Execution clients serve [JSON-RPC API](../reference/engine-api/index.md) requests and communicate +with each other in a peer-to-peer network. + +### Consensus clients + +Consensus clients, such as [Teku], contain beacon node and validator client implementations. +The beacon node is the primary link to the [Beacon Chain] (consensus layer). +The validator client performs [validator duties](proof-of-stake/index.md) on the consensus layer. +Consensus clients serve [REST API](https://docs.teku.consensys.net/reference/rest) requests and +communicate with each other in a peer-to-peer network. + +## What happened during The Merge + +Before The Merge, the execution and consensus clients' configurations were updated to listen for a +certain total terminal difficulty (TTD) to be reached. + +:::info +The TTD is a specific value for the total difficulty, which is the sum of the proof-of-work mining +difficulty for all blocks up to some point in the blockchain. +::: + +The consensus layer enabled the Merge configuration (Bellatrix) before reaching the TTD. +Once the execution layer blocks reached the TTD, the Beacon Chain merged into Ethereum Mainnet, and +Ethereum transitioned to a proof of stake network. + +:::tip +After The Merge, a Mainnet node operator must run both an execution client and a beacon node at the +same time. +To become a validator, you must also run a validator client (either [in the same process as the +beacon node](https://docs.teku.consensys.net/get-started/start-teku#start-the-clients-in-a-single-process) +or [separately](https://docs.teku.consensys.net/get-started/start-teku#run-the-clients-separately). +::: + +After The Merge, validators earn [rewards](https://www.blocknative.com/ethereum-staking-calculator) +for performing [validator duties](proof-of-stake/index.md), and [fee +recipients](https://docs.teku.consensys.net/reference/cli#validators-proposer-default-fee-recipient) +also earn rewards for the inclusion of execution layer transactions. + + + +[Beacon Chain]: https://ethereum.org/en/upgrades/beacon-chain/ +[Teku]: https://docs.teku.consensys.net/en/stable/ diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/transactions/_category_.json b/versioned_docs/version-23.4.1/public-networks/concepts/transactions/_category_.json new file mode 100644 index 00000000000..e82ef121922 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Transactions", + "position": 4 +} diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/transactions/pool.md b/versioned_docs/version-23.4.1/public-networks/concepts/transactions/pool.md new file mode 100644 index 00000000000..87f2e499e8c --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/transactions/pool.md @@ -0,0 +1,48 @@ +--- +title: Transaction pool +sidebar_position: 2 +description: Transaction pool overview +tags: + - public networks + - private networks +--- + +# Transaction pool + +All nodes maintain a transaction pool to store pending transactions before processing. + +Options and methods for configuring and monitoring the transaction pool include: + +- [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions) JSON-RPC API method to list transactions in the transaction pool. +- [`--tx-pool-max-size`](../../reference/cli/options.md#tx-pool-max-size) command line option to specify the maximum number of transactions in the transaction pool. +- [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) command line option to specify the price bump percentage to replace an existing transaction. +- [`--tx-pool-retention-hours`](../../reference/cli/options.md#tx-pool-retention-hours) command line option to specify the maximum number of hours to keep pending transactions in the transaction pool. +- [`newPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#pending-transactions) and [`droppedPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#dropped-transactions) RPC subscriptions to notify of transactions added to and dropped from the transaction pool. + +:::tip + +When submitting [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md#nonce-validation), the [privacy marker transaction](../../../private-networks/concepts/privacy/private-transactions/processing.md) is submitted to the transaction pool, not the private transaction itself. + +::: + +## Dropping transactions when the transaction pool is full + +When the transaction pool is full, it accepts and retains local transactions in preference to remote transactions. If the transaction pool is full of local transactions, Besu drops the oldest local transactions first. That is, a full transaction pool continues to accept new local transactions by first dropping remote transactions and then by dropping the oldest local transactions. + +## Replacing transactions with the same sender and nonce + +You can replace a pending transaction with a transaction that has the same sender and nonce but a higher gas price. + +If sending a [legacy transaction](types.md#frontier-transactions), the old transaction is replaced if the new transaction has a gas price higher than the existing gas price by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). + +If sending an [`EIP1559` transaction](types.md#eip1559-transactions), the old transaction is replaced if one of the following is true: + +- The new transaction's effective gas price is higher than the existing gas price by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) AND the new effective priority fee is greater than or equal to the existing priority fee. + +- The new transaction's effective gas price is the equal to the existing gas price AND the new effective priority fee is higher than the existing priority fee by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). + +The default value for [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) is 10%. + +## Size of the transaction pool + +Decreasing the maximum size of the transaction pool reduces memory use. If the network is busy and there is a backlog of transactions, increasing the size of the transaction pool reduces the risk of removing transactions from the transaction pool. diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/transactions/types.md b/versioned_docs/version-23.4.1/public-networks/concepts/transactions/types.md new file mode 100644 index 00000000000..91306fa3d4d --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/transactions/types.md @@ -0,0 +1,41 @@ +--- +title: Transaction types +sidebar_position: 1 +description: Description of the different transaction types +tags: + - public networks + - private networks +--- + +# Transaction types + +You can interact with the Hyperledger Besu JSON-RPC API using different transaction types (specified by the `transactionType` parameter). + +The following API objects use a unique format for each `transactionType`: + +- [Pending transaction object](../../reference/api/objects.md#pending-transaction-object) +- [Transaction object](../../reference/api/objects.md#transaction-object) +- [Transaction call object](../../reference/api/objects.md#transaction-call-object) +- [Transaction receipt object](../../reference/api/objects.md#transaction-receipt-object) + +## `FRONTIER` transactions + +Transactions with type `FRONTIER` are _legacy transactions_ that use the transaction format existing before typed transactions were introduced in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). They contain the parameters `chainId`, `nonce`, `gasPrice`, `gasLimit`, `to`, `value`, `data`, `v`, `r`, and `s`. Legacy transactions don't use [access lists](#access_list-transactions) or incorporate [EIP-1559 fee market changes](#eip1559-transactions). + +## `ACCESS_LIST` transactions + +Transactions with type `ACCESS_LIST` are transactions introduced in [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930). They contain, along with the [legacy parameters](#frontier-transactions), an `accessList` parameter, which specifies an array of addresses and storage keys that the transaction plans to access (an _access list_). `ACCESS_LIST` transactions must specify an access list, and they don't incorporate [EIP-1559 fee market changes](#eip1559-transactions). + +Use the [`eth_createAccessList`](../../reference/api/index.md#eth_createaccesslist) API to simulate a transaction which returns the addresses and storage keys that may be used to send the real transaction, and the approximate gas cost. + +## `EIP1559` transactions + +Transactions with type `EIP1559` are transactions introduced in [EIP-1559](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md). EIP-1559 addresses the network congestion and overpricing of transaction fees caused by the historical fee market, in which users send transactions specifying a gas price bid using the `gasPrice` parameter, and miners choose transactions with the highest bids. + +`EIP1559` transactions don't specify `gasPrice`, and instead use an in-protocol, dynamically changing _base fee_ per gas. At each block, the base fee per gas is adjusted to address network congestion as measured by a gas target. + +`EIP1559` transactions contain, along with the [`accessList`](#access_list-transactions) parameter and [legacy parameters](#frontier-transactions) except for `gasPrice`, a `maxPriorityFeePerGas` parameter, which specifies the maximum fee the sender is willing to pay per gas above the base fee (the maximum _priority fee_ per gas), and a `maxFeePerGas` parameter, which specifies the maximum total fee (base fee + priority fee) the sender is willing to pay per gas. + +An `EIP1559` transaction always pays the base fee of the block it's included in, and it pays a priority fee as priced by `maxPriorityFeePerGas` or, if the base fee per gas + `maxPriorityFeePerGas` exceeds `maxFeePerGas`, it pays a priority fee as priced by `maxFeePerGas` minus the base fee per gas. The base fee is burned, and the priority fee is paid to the miner that included the transaction. A transaction's priority fee per gas incentivizes miners to include the transaction over other transactions with lower priority fees per gas. + +`EIP1559` transactions must specify both `maxPriorityFeePerGas` and `maxFeePerGas`. They must not specify `gasPrice`. diff --git a/versioned_docs/version-23.4.1/public-networks/concepts/transactions/validation.md b/versioned_docs/version-23.4.1/public-networks/concepts/transactions/validation.md new file mode 100644 index 00000000000..39368ee1927 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/concepts/transactions/validation.md @@ -0,0 +1,30 @@ +--- +title: Transaction validation +sidebar_position: 3 +description: What transaction validation and when +tags: + - public networks + - private networks +--- + +# Transaction validation + +For transactions submitted and added to a block, Besu validates the transactions, as illustrated in the following diagram. + +![Transaction Validation](../../../assets/images/transaction-validation.png) + +Besu repeats the set of transaction pool validations after propagating the transaction. Besu repeats the same set of validations when importing the block that includes the transaction, except the nonce must be exactly right when importing the block. + +:::tip + +Private transactions are not added to the transaction pool. The privacy marker transaction is submitted to the transaction pool but the private transaction itself is directly distributed to the transaction participants. + +::: + +When adding the transaction to a block, Besu performs an additional validation to check that the transaction gas limit is less than the remaining block gas limit. After creating a block, the node imports the block and then repeats the transaction pool validations. + +:::info + +The transaction is only added if the entire transaction gas limit is less than the remaining gas for the block. The total gas used by the transaction is not relevant to this validation. That is, if the total gas used by the transaction is less than the remaining block gas, but the transaction gas limit is more than the remaining block gas, the transaction is not added. + +::: diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/_category_.json b/versioned_docs/version-23.4.1/public-networks/get-started/_category_.json new file mode 100644 index 00000000000..25ee51d48e5 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Get started", + "position": 2, + "collapsed": false, + "link": { + "type": "generated-index", + "slug": "/public-networks/get-started" + } +} diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/connect/_category_.json b/versioned_docs/version-23.4.1/public-networks/get-started/connect/_category_.json new file mode 100644 index 00000000000..f326ba7b151 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/connect/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Connect to a network", + "position": 4 +} diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/connect/index.md b/versioned_docs/version-23.4.1/public-networks/get-started/connect/index.md new file mode 100644 index 00000000000..0ce16f25aba --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/connect/index.md @@ -0,0 +1,11 @@ +--- +title: Connect to a network overview +tags: + - public networks +hide: + - feedback +--- + +# Connect to a network + +This section provides information on connecting Besu to a public Ethereum network. diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/connect/mainnet.md b/versioned_docs/version-23.4.1/public-networks/get-started/connect/mainnet.md new file mode 100644 index 00000000000..00722030e74 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/connect/mainnet.md @@ -0,0 +1,144 @@ +--- +title: Connect to Mainnet +sidebar_position: 2 +description: How to connect to Mainnet +tags: + - public networks +--- + +# Connect to Mainnet + +:::info + +[The Merge](../../concepts/the-merge.md) was executed on **September 15, 2022**. Ethereum is now a [proof of stake](../../concepts/proof-of-stake/index.md) network, and a full Ethereum node requires both [an execution client and a consensus client](../../concepts/the-merge.md#execution-and-consensus-clients). + +::: + +Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus client on Ethereum Mainnet. + +If you're using [Teku] as a consensus client, you can follow the [Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md). + +## Prerequisites + +- [Besu installed](../install/binary-distribution.md). +- A consensus client installed. For example, [Teku](https://docs.teku.consensys.net/en/latest/). + +## Steps + +### 1. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and the consensus client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../../how-to/use-engine-api.md). + +### 2. Generate validator keys + +If you're running the consensus client as a beacon node only, skip to the [next step](#3-start-besu). + +If you're also running the consensus client as a validator client, have a funded Ethereum address ready (32 ETH and gas fees for each validator). + +Generate validator keys for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: + +### 3. Start Besu + +Run the following command or specify the options in a [configuration file](../../how-to/configuration-file.md): + +```bash +besu \ + --sync-mode=X_SNAP \ + --data-storage-format=BONSAI \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist=,127.0.0.1,localhost \ + --engine-host-allowlist=,127.0.0.1,localhost \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. +- The IP address of your Besu node using the [`--host-allowlist`](../../reference/cli/options.md#host-allowlist) and [`--engine-host-allowlist`](../../reference/cli/options.md#engine-host-allowlist) options. + +Also, in the command: + +- [`--sync-mode`](../../reference/cli/options.md#sync-mode) specifies using [snap sync](sync-node.md#snap-synchronization). +- [`--data-storage-format`](../../reference/cli/options.md#data-storage-format) specifies using [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). +- [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC service. +- [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC service. +- [`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--engine-rpc-enabled`](../../reference/cli/options.md#engine-rpc-enabled) enables the [Engine API](../../reference/engine-api/index.md). + +You can modify the option values and add other [command line options](../../reference/cli/options.md) as needed. + +### 4. Start the consensus client + +Refer to your consensus client documentation to configure and start the consensus client. + +:::info + +If you're running a validator client, make sure you set a fee recipient address. + +::: + +If you're using Teku, follow the [Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md#5-start-teku). + +### 5. Wait for the clients to sync + +After starting Besu and the consensus client, your node starts syncing and connecting to peers. + + + +# Besu logs + +```bash +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running the consensus client as a beacon node only, you're all set. If you're also running the consensus client as a validator client, ensure your clients are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. + +### 6. Stake ETH + +Stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +You can check your validator status by searching your Ethereum address on the [Beacon Chain explorer](https://beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + + + +[Teku]: https://docs.teku.consensys.net/en/stable/ diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/connect/sync-node.md b/versioned_docs/version-23.4.1/public-networks/get-started/connect/sync-node.md new file mode 100644 index 00000000000..5a6fd8ddfca --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/connect/sync-node.md @@ -0,0 +1,163 @@ +--- +title: Sync Besu +sidebar_position: 1 +description: Full and archive node types +tags: + - public networks +--- + +# Sync Besu + +Besu supports two node types, commonly referred to as [full nodes](#run-a-full-node) and [archive nodes](#run-an-archive-node). + +Full nodes have the current state of the blockchain. They can't serve the network with all data requests (for example, the balance of an account at an old block). Full nodes can guarantee the latest state for the blockchain (and some older states, but not all). You can check current balances, sign and send transactions, and look at current dapp data. + +Archive nodes also store the intermediary state of every account and contract for every block since the genesis block. Archive nodes can do everything full nodes do, and they can access historical state data. Archive nodes require more disk space than full nodes. + +Besu must connect with other peers to sync with the network. If your node is having trouble peering, try [troubleshooting peering](../../how-to/troubleshoot/peering.md). + +## Sync times + +To sync with a public network, Besu runs two processes in parallel: the world state sync and the blockchain download. + +The following table shows the average world state sync time for each sync mode on Mainnet. All times are hardware dependent; this table is based on running AWS instances m6gd.2xlarge. Each sync mode also has its own world state database size. + +| Sync mode | Time to sync world state | Disk usage | +| ---------- | ------------------------ | ------------- | +| Snap | ~6 hours | Average disk | +| Checkpoint | ~5 hours | Smallest disk | +| Fast | ~1.5 days | Average disk | +| Full | ~weeks | Largest disk | + +:::note + +- As of late 2022, an average Mainnet snap sync consumes around 750 GB using Bonsai Tries. Read more about [storage requirements](../../concepts/data-storage-formats.md#storage-requirements) across data storage formats and sync modes. + +- Testnets take significantly less time and space to sync. + +::: + +While the world state syncs, Besu downloads and imports the blockchain in the background. The blockchain download time depends on CPU, the network, Besu's peers, and disk speed. It generally takes longer than the world state sync. + +Besu must catch up to the current chain head and sync the world state to participate on Mainnet. + +## Storage + +You can store the world state using [Forest of Tries](../../concepts/data-storage-formats.md#forest-of-tries) or [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). We recommend using Bonsai Tries for the lowest storage requirements. + +## Run a full node + +You can run a full node using [snap synchronization (snap sync)](#snap-synchronization), [checkpoint synchronization (checkpoint sync)](#checkpoint-synchronization), or [fast synchronization (fast sync)](#fast-synchronization). + +### Snap synchronization + +:::tip + +We recommend using snap sync over fast sync because snap sync can be faster by several days. + +We recommend using snap sync with the [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries) data storage format for the fastest sync and lowest storage requirements. + +::: + +Enable snap sync using [`--sync-mode=X_SNAP`](../../reference/cli/options.md#sync-mode). You need Besu version 22.4.0 or later to use snap sync. + +Instead of downloading the [state trie](../../concepts/data-storage-formats.md) node by node, snap sync downloads as many leaves of the trie as possible, and reconstructs the trie locally. + +You can't switch from fast sync to snap sync. If your node is blocked in the middle of a fast sync, you can start over using snap sync instead by stopping the node, deleting the data directory, and starting over using `--sync-mode=X_SNAP`. + +You can restart Besu during a snap sync in case of hardware or software problems. The sync resumes from the last valid world state and continues to download blocks starting from the last downloaded block. + +See [how to read the Besu metrics charts](../../how-to/monitor/understand-metrics.md) when using snap sync. + +### Checkpoint synchronization + +:::caution + +Checkpoint sync is an early access feature. + +::: + +Enable checkpoint sync using [`--sync-mode=X_CHECKPOINT`](../../reference/cli/options.md#sync-mode). You need Besu version 22.4.3 or later to use checkpoint sync. + +Checkpoint sync behaves like [snap sync](#snap-synchronization), but instead of syncing from the genesis block, it syncs from a specific checkpoint block configured in the [Besu genesis file](../../concepts/genesis-file.md). + +Ethereum Mainnet and the Goerli testnet configurations already define default checkpoints, so you don't have to add this yourself. + +For other networks, you can configure a checkpoint in the genesis file by specifying the block hash, number, and total difficulty as in the following example. + +```json title="Checkpoint configuration example" +"checkpoint": { + "hash": "0x844d581cb00058d19f0584fb582fa2de208876ee56bbae27446a679baf4633f4", + "number": 14700000, + "totalDifficulty": "0xA2539264C62BF98CFC6" +} +``` + +:::note + +If using [Clique](../../../private-networks/how-to/configure/consensus/clique.md) consensus, the checkpoint must be the beginning of an epoch. + +::: + +If you enable checkpoint sync without a checkpoint configuration in the genesis file, Besu snap syncs from the genesis block. + +You can restart Besu during a checkpoint sync in case of hardware or software problems. The sync resumes from the last valid world state and continues to download blocks starting from the last downloaded block. + +### Fast synchronization + +:::caution + +It might become impossible to sync Ethereum Mainnet using fast sync in the future. If you sync for the first time or ever need to re-sync, update Besu to a version that supports newer sync methods. + +::: + +Enable fast sync using [`--sync-mode=FAST`](../../reference/cli/options.md#sync-mode). + +Fast sync downloads the block headers and transaction receipts, and verifies the chain of block headers from the genesis block. + +When starting fast sync, Besu first downloads the world state for a recent block verified by its peers (referred to as a pivot block), and then begins fast sync from the genesis block. + +Fast sync is the default for named networks specified using the [`--network`](../../reference/cli/options.md#network) option, except for the `dev` development network. It's also the default if connecting to Ethereum Mainnet by not specifying the [`--network`](../../reference/cli/options.md#network) or [`--genesis-file`](../../reference/cli/options.md#genesis-file) options. + +Using fast sync with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. + +You can observe the `besu_synchronizer_fast_sync_*` and `besu_synchronizer_world_state_*` [metrics](../../how-to/monitor/metrics.md#metrics-list) to monitor fast sync. + +:::note + +When fast syncing, block numbers increase until close to the head block, then the process pauses while the world state download completes. This may take a significant amount of time depending on world state size, during which the current head block doesn't increase. For example, Mainnet may take several days or more to fast sync. Fast sync time may increase because Besu picks new pivot blocks, or because peers prune the world state before it completes downloading. + +::: + +:::caution RocksDB error on AWS + +When running Besu on some cloud providers, a known [RocksDB](https://github.com/facebook/rocksdb/issues/6435) issue causes fast sync to fail occasionally. The following error is displayed repeatedly: + +``` +EthScheduler-Services-1 (importBlock) | ERROR | PipelineChainDownloader | Chain download failed. Restarting after short delay. +java.util.concurrent.CompletionException: org.hyperledger.besu.plugin.services.exception.StorageException: org.rocksdb.RocksDBException: block checksum mismatch: +``` + +The failure has been seen on AWS and Digital Ocean. On AWS, A full restart of the VM is required to restart the fast sync. Fast sync isn't [currently supported on Digital Ocean](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/CHANGELOG.md#143). + +::: + +:::caution Pending state nodes stays constant + +When fast syncing, the pending state nodes count is the number of nodes yet to be downloaded, and it should change constantly. Pending state nodes trend to 0 during fast sync and then goes to 0. + +If the number stays constant, this could mean your node isn't syncing against any peers. + +In the following example, the pivot block is 0 and the pending state nodes value is constant. This means the node isn't syncing against any peers. The fact that state nodes have been downloaded means at some stage it was syncing. + +![Fast synchronization](../../../assets/images/fastsync.png) + +The easiest solution in this scenario is to restart fast sync to obtain a new pivot block. + +::: + +## Run an archive node + +To run an archive node, enable full synchronization (full sync) using [`--sync-mode=FULL`](../../reference/cli/options.md#sync-mode). + +Full sync starts from the genesis block and reprocesses all transactions. diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/connect/testnet.md b/versioned_docs/version-23.4.1/public-networks/get-started/connect/testnet.md new file mode 100644 index 00000000000..ee8b4017f94 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/connect/testnet.md @@ -0,0 +1,155 @@ +--- +title: Connect to a testnet +sidebar_position: 3 +Description: How to connect to a testnet +tags: + - public networks +--- + +# Connect to a testnet + +Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus client on the [Goerli](https://github.com/eth-clients/goerli) and [Sepolia](https://github.com/eth-clients/sepolia) testnets. + +If you're using [Teku](https://docs.teku.consensys.net/en/latest/) as a consensus client, you can follow the [Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md). + +:::note + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. You can connect your consensus client using the beacon node only, without any validator duties. + +::: + +## Prerequisites + +- [Besu installed](../install/binary-distribution.md). +- A consensus client installed. For example, [Teku](https://docs.teku.consensys.net/en/latest/). + +## Steps + +### 1. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and the consensus client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../../how-to/use-engine-api.md). + +### 2. Generate validator keys + +If you're running the consensus client as a beacon node only, skip to the [next step](#3-start-besu). + +If you're also running the consensus client as a validator client, create a test Ethereum address (you can do this in [MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and [Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). + +:::note + +If you can't get ETH using the faucet, you can ask for help on the [EthStaker Discord](https://discord.io/ethstaker). + +::: + +Generate validator keys for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or [request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: + +### 3. Start Besu + +Run the following command or specify the options in a [configuration file](../../how-to/configuration-file.md): + + + +# Goerli + +```bash +besu \ + --network=goerli \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +# Sepolia + +```bash +besu \ + --network=sepolia \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. + +You can modify the option values and add other [command line options](../../reference/cli/options.md) as needed. + +### 4. Start the consensus client + +Refer to your consensus client documentation to configure and start the consensus client. + +:::info + +If you're running a validator client, make sure you set a fee recipient address. + +::: + +If you're using Teku, follow the [Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md#5-start-teku). + +### 5. Wait for the clients to sync + +After starting Besu and the consensus client, your node starts syncing and connecting to peers. + + + +# Besu logs + +```bash +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running the consensus client as a beacon node only, you're all set. If you're also running the consensus client as a validator client, ensure your clients are fully synced before submitting your staking deposit in the next step. This can take several days. + +### 6. Stake ETH + +Stake your testnet ETH for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). + +You can check your validator status by searching your Ethereum address on the [Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/install/_category_.json b/versioned_docs/version-23.4.1/public-networks/get-started/install/_category_.json new file mode 100644 index 00000000000..043580c1474 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/install/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Install Besu", + "position": 2 +} diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/install/binary-distribution.md b/versioned_docs/version-23.4.1/public-networks/get-started/install/binary-distribution.md new file mode 100644 index 00000000000..ae1e28a5b6c --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/install/binary-distribution.md @@ -0,0 +1,94 @@ +--- +title: Install binary distribution +sidebar_position: 2 +description: Install or upgrade Hyperledger Besu from binary distribution +tags: + - public networks +--- + +# Install binary distribution + +## MacOS with Homebrew + +### Prerequisites + +- [Homebrew](https://brew.sh/) +- Java JDK + +:::caution + +Hyperledger Besu supports: + +- MacOS High Sierra 10.13 or later versions. +- Java 17+. You can install Java using `brew install openjdk`. Alternatively, you can manually install the [Java JDK](https://www.oracle.com/java/technologies/downloads). + +::: + +### Install (or upgrade) using Homebrew + +To install Besu using Homebrew: + +```bash +brew tap hyperledger/besu +brew install hyperledger/besu/besu +``` + +To upgrade an existing Besu installation using Homebrew: + +```bash +brew upgrade hyperledger/besu/besu +``` + +:::note + +If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. + +::: + +:::note + +When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command `brew tap --repair`. + +::: + +To display the Besu version and confirm installation: + +```bash +besu --version +``` + +To display Besu command line help: + +```bash +besu --help +``` + +## Linux / Unix + +### Prerequisites + +- [Java JDK 17+](https://www.oracle.com/java/technologies/downloads/) + +:::note Linux open file limit + +If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the maximum number of open files allowed using `ulimit`. If the open files limit is not high enough, a `Too many open files` RocksDB exception occurs. + +::: + +:::tip + +We recommend installing [jemalloc](https://jemalloc.net/) to reduce memory usage. If using Ubuntu, you can install it with the command: `apt install libjemalloc-dev`. + +::: + +### Install from packaged binaries + +Download the Besu [packaged binaries](https://github.com/hyperledger/besu/releases). + +Unpack the downloaded files and change into the `besu-` directory. + +Display Besu command line help to confirm installation: + +```bash +bin/besu --help +``` diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/install/index.md b/versioned_docs/version-23.4.1/public-networks/get-started/install/index.md new file mode 100644 index 00000000000..c4717c1fe65 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/install/index.md @@ -0,0 +1,23 @@ +--- +title: Installation options +description: Options for getting started with Hyperledger Besu +tags: + - public networks +--- + +# Installation options + +- [Docker image](run-docker-image.md) +- [Binaries](binary-distribution.md) + +## Build from source + +If you want to use the latest development version of Hyperledger Besu or a specific commit, build from source. Otherwise, use the [binary] or [Docker image] for more stable versions. + +View the [Hyperledger Wiki] for instructions to install Hyperledger Besu from source. + + + +[Hyperledger Wiki]: https://wiki.hyperledger.org/display/BESU/Building+from+source +[binary]: binary-distribution.md +[Docker image]: run-docker-image.md diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/install/run-docker-image.md b/versioned_docs/version-23.4.1/public-networks/get-started/install/run-docker-image.md new file mode 100644 index 00000000000..a2561f40c08 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/install/run-docker-image.md @@ -0,0 +1,143 @@ +--- +title: Run Besu from Docker image +sidebar_position: 1 +description: Run Hyperledger Besu using the official docker image +tags: + - public networks +--- + +# Run Besu from a Docker image + +Hyperledger Besu provides a Docker image to run a Besu node in a Docker container. + +Use this Docker image to run a single Besu node without installing Besu. + +## Prerequisites + +- [Docker](https://docs.docker.com/install/) + +- MacOS or Linux + + :::info + + The Docker image doesn't run on Windows. + + ::: + +## Default node for Mainnet + +To run a Besu node in a container connected to the Ethereum Mainnet: + +```bash +docker run hyperledger/besu:latest +``` + +:::note + +https://hub.docker.com/r/hyperledger/besu/tags lists the available tags for the image. + +If you previously pulled `latest`, Docker runs the cached version. + +To ensure your image is up to date, pull the `latest` version again using `docker pull hyperledger/besu:latest`. + +::: + +## Expose ports + +Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need to expose the ports to use the default ports or the ports specified using [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), [`--p2p-port`](../../reference/cli/options.md#p2p-port), [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), [`--metrics-port`](../../reference/cli/options.md#metrics-port), [`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port), and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. + +To run Besu exposing local ports for access: + +```bash +docker run -p :8545 -p :8546 -p :30303 hyperledger/besu:latest --rpc-http-enabled --rpc-ws-enabled +``` + +:::note + +The examples on this page expose TCP ports only. To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: + +```bash +docker run -p :/udp +``` + +See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). + +::: + +To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: + +```bash +docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled +``` + +## Start Besu + +:::danger + +Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default data path interferes with the operation of Besu and prevents Besu from safely launching. + +To run a node that maintains the node state (key and database), [`--data-path`](../../reference/cli/options.md#data-path) must be set to a location other than `/opt/besu` and a storage volume mounted at that location. + +When running in a Docker container, [`--nat-method`](../../how-to/connect/specify-nat.md) must be set to `DOCKER` or `AUTO` (default). Don't set [`--nat-method`](../../how-to/connect/specify-nat.md) to `NONE` or `UPNP`. + +::: + +You can specify [Besu environment variables](../../reference/cli/options.md#specify-options) with the Docker image instead of the command line options. + +```bash title="Example" +docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest +``` + +:::caution Unsupported address type exception + +When running Besu from a Docker image, you might get the following exception: + +```bash +Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. +``` + +This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, preventing outbound communication. IPv6 is disabled by default in Docker. + +[Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound IPv6 traffic and allow connection with IPv6 peers. + +::: + +### Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes with WebSocket enabled: + +```bash +docker run -p 8546:8546 --mount type=bind,source=/,target=/var/lib/besu hyperledger/besu:latest --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-ws-enabled --network=dev --data-path=/var/lib/besu +``` + +### Run a node on Goerli testnet + +To run a node on Goerli: + +```bash +docker run -p 30303:30303 --mount type=bind,source=/,target=/var/lib/besu hyperledger/besu:latest --network=goerli --data-path=/var/lib/besu +``` + +### Run a node on Ethereum Mainnet + +To run a node on Ethereum Mainnet with the HTTP JSON-RPC service enabled: + +```bash +docker run -p 8545:8545 --mount type=bind,source=/,target=/var/lib/besu -p 30303:30303 hyperledger/besu:latest --rpc-http-enabled --data-path=/var/lib/besu +``` + +## Stop Besu and clean up resources + +When done running nodes, you can shut down the node container without deleting resources or you can delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the container and volume names. + +To stop a container: + +```bash +docker stop +``` + +To delete a container: + +```bash +docker rm +``` diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/migrate-to-besu.md b/versioned_docs/version-23.4.1/public-networks/get-started/migrate-to-besu.md new file mode 100644 index 00000000000..2693411ced0 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/migrate-to-besu.md @@ -0,0 +1,15 @@ +--- +description: Migrate to Besu from a different Ethereum execution client. +tags: + - public networks +--- + +# Migrate to Besu + +Migrate from a different Ethereum [execution client](../concepts/the-merge.md#execution-clients) to Besu to contribute to [client diversity](https://clientdiversity.org/). + +To migrate from a different client, [configure Besu as an execution client](connect/mainnet.md#2-start-besu) and connect your [consensus client](../concepts/the-merge.md#consensus-clients) to Besu instead of your original execution client. + +To minimize downtime while [Besu syncs](connect/sync-node.md) and avoid downtime penalties, you can sync Besu with a new consensus layer instance. Once Besu has fully synced you can connect it to your existing consensus client. + +Find guides to switch from specific clients on the [client diversity website](https://clientdiversity.org/#switch). diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/start-node.md b/versioned_docs/version-23.4.1/public-networks/get-started/start-node.md new file mode 100644 index 00000000000..803f9345c97 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/start-node.md @@ -0,0 +1,151 @@ +--- +title: Start Besu +sidebar_position: 3 +description: Start Besu on a public Ethereum network. +tags: + - public networks +--- + +# Start Besu + +Nodes can connect to Ethereum Mainnet and public testnets. + +Use the [`besu`](../reference/cli/options.md) command with the required command line options to start a node. + +## Prerequisites + +[Besu installed](install/binary-distribution.md) + +## Local block data + +When connecting to a network other than the network previously connected to, you must either delete the local block data or use the [`--data-path`](../reference/cli/options.md#data-path) option to specify a different data directory. + +To delete the local block data, delete the `database` directory in the `besu/build/distribution/besu-` directory. + +## Genesis configuration + +Besu specifies the genesis configuration, and sets the network ID and bootnodes when connecting to [Goerli](#run-a-node-on-goerli-testnet), [Sepolia](#run-a-node-on-sepolia-testnet), and [Mainnet](#run-a-node-on-ethereum-mainnet). + +:::info + +The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: + +When you specify [`--network=dev`](../reference/cli/options.md#network), Besu uses the development mode genesis configuration with a fixed low difficulty. A node started with [`--network=dev`](../reference/cli/options.md#network) has an empty bootnodes list by default. + +The genesis files defining the genesis configurations are in the [Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). + +To define a genesis configuration, create a genesis file (for example, `genesis.json`) and specify the file using the [`--genesis-file`](../reference/cli/options.md#genesis-file) option. + +## Syncing and storage + +By default, Besu syncs to the current state of the blockchain using [fast sync](connect/sync-node.md#fast-synchronization) in: + +- Networks specified using [`--network`](../reference/cli/options.md#network) except for the `dev` development network. +- Ethereum Mainnet. + +We recommend using [snap sync](connect/sync-node.md#snap-synchronization) for a faster sync, by starting Besu with [`--sync-mode=X_SNAP`](../reference/cli/options.md#sync-mode). + +By default, Besu stores data in the [Forest of Tries](../concepts/data-storage-formats.md#forest-of-tries) format. We recommend using [Bonsai Tries](../concepts/data-storage-formats.md#bonsai-tries) for lower storage requirements, by starting Besu with [`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). + +## Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes: + +```bash +besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir +``` + +You can also use the following [configuration file](../how-to/configuration-file.md) on the command line to start a node with the same options as above: + +```toml +network="dev" +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +rpc-http-cors-origins=["all"] +host-allowlist=["*"] +rpc-ws-enabled=true +rpc-http-enabled=true +data-path="/tmp/tmpdata-path" +``` + +:::danger Warning + +The following settings are a security risk in production environments: + +- Enabling the HTTP JSON-RPC service ([`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled)) and setting [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the RPC connection on your node to any remote connection. +- Setting [`--host-allowlist`](../reference/cli/options.md#host-allowlist) to `"*"` allows JSON-RPC API access from any host. +- Setting [`--rpc-http-cors-origins`](../reference/cli/options.md#rpc-http-cors-origins) to `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. + +::: + +## Run a node on Goerli testnet + +To run a node on [Goerli](https://github.com/goerli/testnet) specifying a data directory: + +```bash +besu --network=goerli --data-path=/ +``` + +Where `` and `` are the path and directory to save the Goerli chain data to. + +See the [guide on connecting to a testnet](connect/testnet.md) for more information. + +## Run a node on Sepolia testnet + +To run a node on [Sepolia](https://github.com/goerli/sepolia) specifying a data directory: + +```bash +besu --network=sepolia --data-path=/ +``` + +Where `` and `` are the path and directory to save the Sepolia chain data to. + +See the [guide on connecting to a testnet](connect/testnet.md) for more information. + +## Run a node on Ethereum Mainnet + +To run a node on the Ethereum Mainnet: + +```bash +besu +``` + +To run a node on Mainnet with the HTTP JSON-RPC service enabled and available for localhost only: + +```bash +besu --rpc-http-enabled +``` + +See the [guide on connecting to Mainnet](connect/mainnet.md) for more information. + +## Confirm node is running + +If you started Besu with the [`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) option, use [cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to confirm the node is running. + +- `eth_chainId` returns the chain ID of the network. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 + ``` + +- `eth_syncing` returns the starting, current, and highest block. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 + ``` + + For example, after connecting to Mainnet, `eth_syncing` will return something similar to: + + ```json + { + "jsonrpc": "2.0", + "id": 1, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x2d0", + "highestBlock": "0x66c0" + } + } + ``` diff --git a/versioned_docs/version-23.4.1/public-networks/get-started/system-requirements.md b/versioned_docs/version-23.4.1/public-networks/get-started/system-requirements.md new file mode 100644 index 00000000000..e0d9dfe7122 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/get-started/system-requirements.md @@ -0,0 +1,144 @@ +--- +title: System requirements +sidebar_position: 1 +description: Ensure you meet the system requirements to sync and run Besu. +tags: + - public networks +--- + +# System requirements + +Determine public network system requirements by checking CPU and disk space requirements using [Prometheus](../how-to/monitor/metrics.md). Grafana provides a [sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. + +:::tip + +CPU requirements are highest when syncing to the network and typically reduce after the node is synchronized to the chain head. + +::: + +## Java distribution and installation + +Besu requires an installation of Java 17+ to run. +We currently recommend two Java distributions, [OpenJDK 17](https://jdk.java.net/17/) and +[OpenJ9](https://www.eclipse.org/openj9/), though you can experiment based on your needs. + +OpenJDK is the default for many Java users and is balanced in performance and garbage collection. +OpenJ9 consumes less memory and system resources, but can have worse performance on some setups. + +If you have more than 32GB RAM (for Besu and your [consensus client](../concepts/the-merge.md)), use OpenJDK. +If you have less RAM: + +* If you're on Linux (or Unix-based) and your CPU is x86-64 bit architecture (like Intel), use OpenJ9. +* If you're on ARM-64 CPU architecture (Mac M-series, Raspberry Pi), use OpenJDK. + +If you have OpenJDK installed or need a fresh installation of OpenJ9, you can pick up the OpenJ9 +docker image, or install the OpenJ9 JDK using the following steps: + +1. Get the [binaries](https://github.com/ibmruntimes/semeru17-binaries/releases) corresponding to + your OS architecture. + For example: + + ```bash + wget https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.5%2B8_openj9-0.35.0/ibm-semeru-open-jdk_x64_linux_17.0.5_8_openj9-0.35.0.tar.gz + ``` +2. Uncompress the binaries: + + + + # Command + + ```bash + tar -xvf YOUR_J9_IMAGE.tar.gz + ``` + # Example + + ```bash + tar -xvf ibm-semeru-open-jdk_x64_linux_17.0.5_8_openj9-0.35.0.tar.gz + ``` + + + +3. Move the binaries to `bin` directory: + + + + # Command + + ```bash + sudo cp -r YOUR_IMAGE/ /usr/bin/ + ``` + # Example + + ```bash + sudo cp -r jdk-17.0.5+8/ /usr/bin/ + ``` + + + +4. Specify OpenJ9 for Java on your machine: + + + + # Command + + ```bash + sudo update-alternatives --install "/usr/bin/java" "java" "/usr/bin/YOUR_IMAGE" 1 + sudo update-alternatives --config java (and choose OpenJ9) + ``` + + # Example + + ```bash + sudo update-alternatives --install "/usr/bin/java" "java" "/usr/bin/jdk-17.0.5+8/bin/java" + ``` + + + + Change your `JAVA_HOME` to OpenJ9 (if using the JDK implementation), where `jdk-install-dir` is + the installation location you specified: + + + + # Command + + ```bash + export JAVA_HOME=jdk-install-dir` + ``` + + # Example + + ```bash + export JAVA_HOME=/usr/bin/jdk-17.0.5+8 + ``` + + + +## Java Virtual Machine size + +For Mainnet and testnets, the minimum [Java Virtual Machine (JVM) memory requirement is 8 GB](../how-to/configure-jvm/manage-memory.md). + +JVM memory requirements are highest when syncing, but will reduce after the node is synchronized to the chain head. Monitor your system to determine your actual JVM memory needs. + +## Disk space + +[Fast synchronization](../reference/cli/options.md#sync-mode) with [pruning](../concepts/data-storage-formats.md) enabled requires approximately 750 GB of disk space. [Full synchronization](../reference/cli/options.md#sync-mode) requires approximately 3 TB. + +## Disk type + +Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). Read-only nodes can use a lower performance setup. + +You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). For higher performance in production settings, we recommend upgrading to [NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). + +## AWS requirements + +We are running 22.4.2 Mainnet nodes using `m6gd.2xlarge` boxes. + +We synchronized the 22.4.2 Mainnet nodes using `m6gd.2xlarge` boxes. + +Using a larger box while synchronizing speeds up the sync process by giving it more resources. When the sync is completed, the box size can be reduced. + +:::caution + +If you are using a more recent release than 22.4.2, resource requirements may have increased. + +::: diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/_category_.json b/versioned_docs/version-23.4.1/public-networks/how-to/_category_.json new file mode 100644 index 00000000000..6a19126f23e --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "How to", + "position": 3, + "link": { + "type": "generated-index", + "slug": "public-networks/how-to" + } +} diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/configuration-file.md b/versioned_docs/version-23.4.1/public-networks/how-to/configuration-file.md new file mode 100644 index 00000000000..8a70c92c997 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/configuration-file.md @@ -0,0 +1,66 @@ +--- +title: Use a configuration file +sidebar_position: 3 +description: Specify options in the Besu configuration file. +tags: + - public networks + - private networks +--- + +# Use the Hyperledger Besu configuration file + +To specify command line options in a file, use a TOML configuration file. + +Save the configuration file and reuse it across node startups. To specify the configuration file, use the [`--config-file`](../reference/cli/options.md#config-file) option. + +To override an option specified in the configuration file, either specify the same option on the command line or as an [environment variable](../reference/cli/options.md#specify-options). For options specified in more than one place, the order of precedence is command line, environment variable, configuration file. + +:::note + +The configuration file is used for node-level settings. You can specify network-wide settings in the [genesis file](../concepts/genesis-file.md). + +::: + +## TOML specification + +The configuration file must be a valid TOML file composed of key/value pairs. Each key is the same as the corresponding command line option name without the leading dashes (`--`). + +Values must conform to TOML specifications for string, numbers, arrays, and booleans. Specific differences between the command line and the TOML file format are: + +- Comma-separated lists on the command line are string arrays in the TOML file. +- Enclose file paths, hexadecimal numbers, URLs, and <host:port> values in quotes. + +:::tip + +The [command line reference](../reference/cli/options.md) includes configuration file examples for each option. + +::: + +```toml title="Sample TOML configuration file" +# Valid TOML config file +data-path="~/besudata" # Path + +# Network +bootnodes=["enode://001@123:4567", "enode://002@123:4567", "enode://003@123:4567"] + +p2p-host="1.2.3.4" +p2p-port=1234 +max-peers=42 + +rpc-http-host="5.6.7.8" +rpc-http-port=5678 + +rpc-ws-host="9.10.11.12" +rpc-ws-port=9101 + +# Chain +genesis-file="~/genesis.json" # Path to the custom genesis file + +# Mining +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +``` + +```bash title="Starting Besu with a configuration file" +besu --config-file=/home/me/me_node/config.toml +``` diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/configure-ha/_category_.json b/versioned_docs/version-23.4.1/public-networks/how-to/configure-ha/_category_.json new file mode 100644 index 00000000000..450cbdb623f --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/configure-ha/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure high availability", + "position": 7 +} diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/configure-ha/index.md b/versioned_docs/version-23.4.1/public-networks/how-to/configure-ha/index.md new file mode 100644 index 00000000000..0f642295f0a --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/configure-ha/index.md @@ -0,0 +1,107 @@ +--- +description: Hyperledger Besu high availability +tags: + - public networks + - private networks +--- + +# High availability of JSON-RPC and RPC Pub/Sub APIs + +To enable high availability to the [RPC Pub/Sub API over WebSocket](../use-besu-api/rpc-pubsub.md) or the [JSON-RPC API](../use-besu-api/json-rpc.md), run and synchronize more than one Hyperledger Besu node to the network. Use a load balancer to distribute requests across nodes in the cluster that are ready to receive requests. + +![Load Balancer](../../../assets/images/LoadBalancer.png) + +:::tip + +We don't recommend putting [bootnodes](../../../private-networks/how-to/configure/bootnodes.md) behind a load balancer. + +::: + +:::info + +We recommend using load balancers over WebSockets because WebSockets are persistent connections associated with specific nodes. If you use load balancers configured in sticky mode over HTTP instead, the connection sticks to the associated node even when the node is congested and there is a lower load node available. If you use load balancers not configured in sticky mode over HTTP, the connections may switch from node to node, so some JSON-RPC requests may not provide expected results (for example, [`admin` methods](../../reference/api/index.md#admin-methods), [`net_enode`](../../reference/api/index.md#net_enode), [`net_peerCount`](../../reference/api/index.md#net_peercount), and [`eth_syncing`](../../reference/api/index.md#eth_syncing)). + +::: + +## Determine when a node is ready + +Use the [readiness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) to determine when a node is ready. + +:::note + +The minimum number of peers and number of blocks from the best known block for determining if a node considered ready is deployment specific. + +::: + +## Transaction nonces + +Besu obtains the nonce for the next transaction using [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). The nonce depends on the transactions in the [transaction pool](../../concepts/transactions/pool.md). If sending [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) and [`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction) requests for a specific account to more than one node, the [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) results might be incorrect. + +:::note + +If using [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md), retrieve the nonce using [`priv_getTransactionCount`](../../../private-networks/reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../../private-networks/reference/api/index.md#priv_geteeatransactioncount) and send the private transactions using [`eea_sendRawTransaction`](../../../private-networks/reference/api/index.md#eea_sendrawtransaction). + +::: + +To get correct nonces when distributing requests across a cluster, either: + +- Track the next nonce outside of the Besu node (as MetaMask does). +- Configure the load balancer in sticky mode to send requests from a specific account to a single node, unless that node is unavailable. + +## Subscriptions + +You can subscribe to events using: + +- [RPC Pub/Sub over WebSockets](../use-besu-api/rpc-pubsub.md). +- [Filters over HTTP](../use-besu-api/access-logs.md). + +We recommend using [RPC Pub/Sub over WebSocket](../use-besu-api/rpc-pubsub.md) because WebSockets connections associate with a specific node and do not require using the load balancer in sticky mode. + +If using [filters over HTTP](../use-besu-api/access-logs.md), configure the load balancer in sticky mode to associate the subscription with a specific node. + +## Recover from dropped subscriptions + +Dropped subscriptions can occur because of: + +- A disconnected WebSockets connection +- The removal of the node serving the subscription from the ready pool. + +If there is a dropped subscription, missed events might occur while reconnecting to a different node. To recover dropped messages, create another subscription and follow the process for that [subscription type](../use-besu-api/rpc-pubsub.md#subscribe): + +- [`newHeads`](#new-headers) +- [`logs`](#logs) +- [`newPendingTransactions`](#new-pending-transactions) +- [`droppedPendingTransactions`](#dropped-pending-transactions) +- [`syncing`](#syncing). + +### New headers + +To request information on blocks from the last block before the subscription dropped to the first block received from the new subscription, use [`eth_getBlockByNumber`](../../reference/api/index.md#eth_getblockbynumber). + +### Logs + +To request logs from the block number of the last log received before the subscription dropped to the current chain head, use [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). + +### New pending transactions + +To request all pending transactions for the new node, use [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). + +:::note + +Nodes do not all store the same pending transactions. + +::: + +### Dropped pending transactions + +To request all pending transactions for the new node, use [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). + +:::note + +Nodes do not all store the same pending transactions. + +::: + +### Syncing + +The syncing state of each node is specific to that node. To retrieve the syncing state of the new node, use [`eth_syncing`](../../reference/api/index.md#eth_syncing). diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/configure-ha/sample-configuration.md b/versioned_docs/version-23.4.1/public-networks/how-to/configure-ha/sample-configuration.md new file mode 100644 index 00000000000..b018ba2a75b --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/configure-ha/sample-configuration.md @@ -0,0 +1,99 @@ +--- +title: Sample load balancer configurations +sidebar_position: 1 +description: Sample load balancers +tags: + - public networks + - private networks +--- + +# Sample load balancer configurations + +## AWS + +For AWS, we recommend the Classic Load Balancer. The Classic Load Balancer is the easiest to configure and work with. Register the Hyperledger Besu instances to the load balancer and use the [liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) for health checks. + +For finer grain control, use the Application Load Balancer: + +- Configure one target group with n nodes. +- Configure multiple listeners with one per port (for example, `30303`, `8545`) you are using and route to the target group. +- Use the [liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) for health checks. +- Register the Besu instances multiple times with different ports. This is like configuring microservices on Elastic Container Service (ECS) or Elastic Kubernetes Service (EKS). + +### HTTPS redirection + +With either AWS load balancer, you can add certificates using ACM (Amazon Certificate Manager), add them to the load balancers, and redirect all HTTP calls to HTTPS. + +## Elastic Kubernetes Service + +For Elastic Kubernetes Service (AWS Kubernetes service) use the same load balancer configuration as when running nodes in Kubernetes. Use labels to specify nodes for the load balanced group. + +## Manual configurations + +Where applicable, we strongly recommend using service discovery. That is, pair your load balancer configuration with something that dynamically detects new nodes and removed failed nodes. + +For Nginx, use multiple upstreams (one for each port). Pair each upstream with a separate server block. + +```conf title="Upstreams paired with server blocks" +upstream discovery_tcp_30303 { + server 10.0.1.1:30303; + server 10.0.1.2:30303; +} + +upstream rpc_tcp_8545 { + server 10.0.1.1:8545; + server 10.0.1.2:8545; +} + +server { + listen 30303; + server_name some.host; + location / { + proxy_pass http://discovery_tcp_30303; + } +} + +server { + listen 8545; + server_name some.host; + location / { + proxy_pass http://rpc_tcp_8545; + } +} +... +``` + +For HAProxy, create multiple backend and frontend sets. + +```text title="Multiple backend and frontend sets" +frontend discovery-tcp-30303 + bind *:30303 + acl ... + ... + default_backend back-discovery-tcp-30303 + +frontend rpc-tcp-8545 + bind *:8545 + acl ... + ... + default_backend back-rpc-tcp-8545 + +backend back-discovery-tcp-30303 + balance leastconn + server node-01 10.0.1.1:30303 weight 1 check + server node-02 10.0.1.2:30303 weight 1 check + option ... + timeout server 600s + +backend back-rpc-tcp-8545 + balance leastconn + server node-01 10.0.1.1:8545 weight 1 check + server node-02 10.0.1.2:8545 weight 1 check + option .... + timeout server 600s +... +``` + +### HTTPS redirection + +To add HTTPS capability, update the above server blocks to include the certificates and specific ciphers. If you require an HTTP to HTTPS redirection, add separate blocks to return a 301 code with the new URI. diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/_category_.json b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/_category_.json new file mode 100644 index 00000000000..bb5cfebb77f --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure the Java Virtual Machine", + "position": 8 +} diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/index.md b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/index.md new file mode 100644 index 00000000000..95bf95bfac3 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/index.md @@ -0,0 +1,12 @@ +--- +title: Configure Java and Besu +tags: + - public networks + - private networks +hide: + - feedback +--- + +# Configure the Java Virtual Machine + +This section contains information on configuring Besu and the Java Virtual Machine (JVM). diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/java-flight-recorder.md b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/java-flight-recorder.md new file mode 100644 index 00000000000..b1cd6e32fcd --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/java-flight-recorder.md @@ -0,0 +1,36 @@ +--- +title: Use Java Flight Recorder +sidebar_position: 3 +description: Using Java Flight Recorder with Hyperledger Besu +tags: + - public networks + - private networks +--- + +# Use Java Flight Recorder + +[Java Flight Recorder (JFR)](https://docs.oracle.com/javacomponents/jmc-5-4/jfr-runtime-guide/about.htm#JFRUH170) is a monitoring tool that collects information about the Java Virtual Machine (JVM) when Hyperledger Besu is running. Use the JFR as a tool to analyze Besu performance. + +## Enable Java Flight Recorder + +To enable JFR, set `BESU_OPTS` to the JFR tags as follows: + +```bash +export BESU_OPTS=-XX:StartFlightRecording=disk=true,delay=15s,dumponexit=true,\ +filename=/tmp/recording.jfr,maxsize=1024m,maxage=1d,\ +settings=profile,path-to-gc-roots=true +``` + +:::tip + +When recording, cleanly exiting Besu results in better data. If not possible to cleanly exit, the file may be missing some information not flushed to disk. + +::: + +Inspect the file written to `/tmp/recording.jfr` with tools such as [Mission Control](https://docs.oracle.com/javacomponents/jmc-5-5/jmc-user-guide/intro.htm#JMCCI109). + +:::danger + +If providing the output file to [ConsenSys Quorum support](https://consensys.net/quorum/support/), be aware that while JFR files don't contain secrets such as private keys, some details about the user configuration can be inferred from the JFR output. + +::: diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/manage-memory.md b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/manage-memory.md new file mode 100644 index 00000000000..9605ce18cfe --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/manage-memory.md @@ -0,0 +1,74 @@ +--- +title: Manage JVM memory +sidebar_position: 2 +description: Besu memory management +tags: + - public networks + - private networks +--- + +# Manage JVM memory + +You can manage Java Virtual Machine (JVM) memory usage for Besu by modifying the maximum heap size. + +By default, the JVM uses 25% of system RAM. For example, if you have 16 GB RAM installed, the JVM uses 4 GB by default. + +On public networks, we recommend setting the maximum heap size to: + +- 3 GB on an 8 GB RAM system. +- 5 GB on a 16 GB RAM system. +- 8 GB on a system with at least 24 GB RAM. + +:::note + +Setting a higher maximum heap size speeds up the sync period but doesn't have much impact after sync. Thus, we recommend setting it to 8 GB only when you have available RAM. + +::: + +You can set the maximum heap size using the `BESU_OPTS` environment variable and the `-Xmx` option. The following examples set the maximum heap size to 8 GB: + + + +# Exported environment variable example + +Set the variable for the whole shell before running Besu. + +```bash +export BESU_OPTS=-Xmx8g +``` + +# Inline environment variable example + +Set the variable only for the specific Besu command. + +```bash +BESU_OPTS=-Xmx8g besu [Besu options] +``` + +# `.service` file example + +```bash +[Service] +... +Environment="BESU_OPTS=-Xmx8g" +ExecStart=besu [Besu options] +... +``` + + + +## Manage the heap dump + +Heap dump file generation is disabled by default. To enable it, set the `-XX:+HeapDumpOnOutOfMemoryError` Java option. + +```bash +BESU_OPTS="-XX:+HeapDumpOnOutOfMemoryError" +``` + +When heap dump file generation is enabled, and an out-of-memory error occurs, the heap dump file is saved in the Besu runtime directory by default. + +The heap dump file might be large and can saturate your drive. It can be up to the size of the allocated memory. For example, for 8 GB heap memory, the file can be up to 8 GB. Specify the directory where you want the dump to be saved using the `-XX:HeapDumpPath` Java option. + +```bash +BESU_OPTS="-XX:HeapDumpPath=///" +``` diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/pass-jvm-options.md b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/pass-jvm-options.md new file mode 100644 index 00000000000..39196ef84fb --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/configure-jvm/pass-jvm-options.md @@ -0,0 +1,21 @@ +--- +title: Pass JVM options +sidebar_position: 1 +description: Passing Java virtual machine JVM options to Hyperledger Besu at runtime +tags: + - public networks + - private networks +--- + +# Pass JVM options + +To perform tasks such as attaching a debugger or configuring the garbage collector, pass Java Virtual Machine (JVM) options to Hyperledger Besu. + +Besu passes the contents of the `BESU_OPTS` environment variable to the JVM. Set standard JVM options in the `BESU_OPTS` variable. + +For Bash-based executions, you can set the variable for only the scope of the program execution by setting it before starting Besu. + +```bash +BESU_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \ +besu --network=goerli +``` diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/connect/_category_.json b/versioned_docs/version-23.4.1/public-networks/how-to/connect/_category_.json new file mode 100644 index 00000000000..cce59e7c3f8 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/connect/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Find and connect to peers", + "position": 5 +} diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/connect/configure-ports.md b/versioned_docs/version-23.4.1/public-networks/how-to/connect/configure-ports.md new file mode 100644 index 00000000000..55df8aa0fd8 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/connect/configure-ports.md @@ -0,0 +1,48 @@ +--- +title: Configure ports +sidebar_position: 2 +description: To enable communication you must expose Hyperledger Besu ports appropriately +tags: + - public networks + - private networks +--- + +# Configure ports + +To enable communication you must expose Hyperledger Besu ports appropriately. The following shows an example port configuration for a Besu node on AWS. + +![Port Configuration](../../../assets/images/PortConfiguration.png) + +When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), [expose ports](../../get-started/install/run-docker-image.md#exposing-ports). + +:::tip + +Besu supports [UPnP](specify-nat.md) for home or small office environments where a wireless router or modem provides NAT isolation. + +::: + +## P2P networking + +To enable peer discovery, the P2P UDP port must be open for inbound connections. Specify the P2P port using the [`--p2p-port`](../../reference/cli/options.md#p2p-port) option. The default is `30303`. + +We also recommend opening the P2P TCP port for inbound connections. This is not strictly required because Besu attempts to open outbound TCP connections. But if no nodes on the network are accepting inbound TCP connections, nodes cannot communicate. + +Combine the P2P port with the values for the [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-interface`](../../reference/cli/options.md#p2p-interface) options when specifying the [P2P host](../../reference/cli/options.md#p2p-host) and [P2P network interface](../../reference/cli/options.md#p2p-interface). + +:::info + +By default, peer discovery listens on `0.0.0.0:30303` (all interfaces). If the device Besu is running on must bind to a specific network interface, specify the interface using the [`--p2p-interface`](../../reference/cli/options.md#p2p-interface) option. + +::: + +## JSON-RPC API + +To enable access to the [JSON-RPC API](../use-besu-api/json-rpc.md), open the HTTP JSON-RPC and WebSockets JSON-RPC ports to the intended users of the JSON-RPC API on TCP. + +Specify the HTTP and WebSockets JSON-RPC ports using the [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) and [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port) options. The defaults are `8545` and `8546`. + +## Metrics + +To enable [Prometheus to access Besu](../monitor/metrics.md), open the metrics port or metrics push port to Prometheus or the Prometheus push gateway on TCP. + +Specify the ports for Prometheus and Prometheus push gateway using the [`--metrics-port`](../../reference/cli/options.md#metrics-port) and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. The defaults are `9545` and `9001`. diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/connect/manage-peers.md b/versioned_docs/version-23.4.1/public-networks/how-to/connect/manage-peers.md new file mode 100644 index 00000000000..84e29fe2573 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/connect/manage-peers.md @@ -0,0 +1,88 @@ +--- +title: Manage peers +sidebar_position: 3 +description: Managing Hyperledger Besu peers +tags: + - public networks + - private networks +--- + +# Manage peers + +Hyperledger Besu peer-to-peer (P2P) discovery happens periodically based on the number of peers in a network and the node's [peer limit](#limit-peers). + +The frequency of discovery isn't configurable, but you can [limit remote connections](#limit-remote-connections) in public networks and [randomly prioritize connections](../../reference/cli/options.md#random-peer-priority-enabled) in small, stable networks. + +:::info + +You can use [`admin_addPeer`](../../reference/cli/options.md#admin_addpeer) to attempt a specific connection, but this isn't P2P discovery. + +::: + +In private networks, we recommend [using bootnodes](../../../private-networks/how-to/configure/bootnodes.md) to initially discover peers. + +## Limit peers + +You can limit peers to reduce the bandwidth, CPU time, and disk access Besu uses to manage and respond to peers. + +To reduce the maximum number of peers, use the [`--max-peers`](../../reference/cli/options.md#max-peers) option. The default is 25. + +:::caution + +The minimum number of peers is set by the `--Xp2p-peer-lower-bound` option, which also has a default of 25. If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` option to the same value or lower. For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. + +Note, `Xp2p-peer-lower-bound` is an early access option. + +::: + +## Limit remote connections + +Prevent eclipse attacks when using [`--sync-mode`](../../reference/cli/options.md#sync-mode) and [`--fast-sync-min-peers`](../../reference/cli/options.md#fast-sync-min-peers) on public networks by enabling the [remote connection limits](../../reference/cli/options.md#remote-connections-limit-enabled). + +In private and permissioned networks with only trusted peers, enabling the remote connection limits is unnecessary and might adversely affect the speed at which nodes can join the network. Limiting remote connections can cause a closed group of peers to form when the number of nodes in the network is slightly higher than [`--max-peers`](../../reference/cli/options.md#max-peers). The nodes in this closed group are all connected to each other and can't accept more connections. + +:::tip + +You can use [`--random-peer-priority-enabled`](../../reference/cli/options.md#random-peer-priority-enabled) to help prevent closed groups of peers in small, stable networks. + +::: + +## Monitor peer connections + +JSON-RPC API methods to monitor peer connections include: + +- [`net_peerCount`](../../reference/api/index.md#net_peercount). +- [`admin_peers`](../../reference/api/index.md#admin_peers). +- [`debug_metrics`](../../reference/api/index.md#debug_metrics). + +Each peer entry returned by [`admin_peers`](../../reference/api/index.md#admin_peers) includes a `protocols` section. Use the information in the `protocols` section to: + +- Determine the health of peers. For example, an external process can use [`admin_peers`](../../reference/api/index.md#admin_peers) and [`admin_removePeer`](../../reference/api/index.md#admin_removepeer) to disconnect from peers that are stalled at a single difficulty for an extended period of time. + +- Monitor node health. For example, if peers report increasing difficulties but the node is stuck at the same block number, the node may be on a different fork to most peers. + +- Determine which protocol level peers are communicating with. For example, you can see if `"version": 65` is being used to reduce transaction sharing traffic. + +## List node connections + +The default logging configuration doesn't list node connection and disconnection messages. To enable listing them, set the [`--logging`](../../reference/cli/options.md#logging) option to `DEBUG`. For more verbosity, set the option to `TRACE`. + +The console logs connection and disconnection events when the log level is `DEBUG` or higher. If the message `Successfully accepted connection from ...` displays, connections are getting through the firewalls. + +```bash title="Sample log output" +2018-10-16 12:37:35.479-04:00 | nioEventLoopGroup-3-1 | INFO | NettyP2PNetwork | Successfully accepted connection from 0xa979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c +``` + +## Disable discovery + +To disable P2P discovery, set the [`--discovery-enabled`](../../reference/cli/options.md#discovery-enabled) option to `false`. + +With discovery disabled, peers can't open connections with the node unless they were previously discovered or manually peered (for example, using [`admin_addPeer`](../../reference/api/index.md#admin_addpeer)). [Static nodes](static-nodes.md) can also open connections. + +## Troubleshoot + +If your nodes fail to connect, ensure the [required ports are open](configure-ports.md). + +If your nodes are running in AWS, check you have appropriate `SecurityGroups` to allow access to the required ports. + +Check that the [enode URLs](../../concepts/node-keys.md#enode-url) specified for [bootnodes](../../../private-networks/how-to/configure/bootnodes.md) or [static nodes](static-nodes.md) match the enode URLs displayed when starting the remote nodes. diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/connect/specify-nat.md b/versioned_docs/version-23.4.1/public-networks/how-to/connect/specify-nat.md new file mode 100644 index 00000000000..6438ab2fc13 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/connect/specify-nat.md @@ -0,0 +1,93 @@ +--- +title: Specify NAT method +sidebar_position: 4 +description: Configuring NAT with Hyperledger Besu +tags: + - public networks + - private networks +--- + +# Specify the NAT method + +Use the [`--nat-method`](../../reference/cli/options.md#nat-method) option to specify the NAT method. Options are: [`UPNP`](#upnp), [`KUBERNETES`](#kubernetes), [`DOCKER`](#docker), [`AUTO`](#auto), and [`NONE`](#none). + +The [enode](../../concepts/node-keys.md#enode-url) advertised to other nodes during discovery is the external IP address and port. The [`admin_nodeInfo`](../../reference/api/index.md#admin_nodeinfo) JSON-RPC API method returns the external address and port for the `enode` and `listenAddr` properties. + +While Hyperledger Besu is running, the following are not supported: + +- IP address changes +- Changing NAT methods. To change the NAT method, restart the node with the [`--nat-method`](../../reference/cli/options.md#nat-method) option set. + +## Auto + +`AUTO` detects if Besu is running inside a Kubernetes cluster or a Docker container. + +- If Besu is running in a Kubernetes cluster, `AUTO` sets to [`KUBERNETES`](#kubernetes). +- If Besu is running in a Docker container, `AUTO` sets to [`DOCKER`](#docker). +- If Besu is not running in Kubernetes or Docker container, `AUTO` sets to [`NONE`](#none). + +`AUTO` is the default NAT method. + +The following log shows an automatic detection failure. + +```log title="The following log shows an automatic detection failure" +INFO | KubernetesNatManager | Starting kubernetes NAT manager. +DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. +DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used +INFO | NetworkRunner | Starting Network. +``` + +:::tip + +If automatic detection fails, set the IP and ports in [`NONE`](#none) mode. + +::: + +## UPnP + +Specify `UPNP` to quickly allow inbound peer connections without manual router configuration. Use UPnP in home or small office environments where a wireless router or modem provides NAT isolation. + +UPnP automatically detects if a node is running in a UPnP environment and provides port forwarding. UPnP might introduce delays during node startup, especially on networks without a UPnP gateway device. + +Use `UPNPP2PONLY` if you wish to enable UPnP only for p2p traffic. + +:::tip + +UPnP support is often disabled by default in networking firmware. If disabled by default, you must explicitly enable UPnP support. + +::: + +:::info + +When the NAT method is set to `UPNP`, the advertised port is the same as the [listening port](../../reference/cli/options.md#p2p-port). + +::: + +## Kubernetes + +Specify `KUBERNETES` to explicitly specify Hyperledger Besu is running inside a Kubernetes cluster. Besu automatically detects if it's running inside of a Kubernetes cluster and interacts with Kubernetes APIs as required to determine external IP addresses and exposed ports. + +In Kubernetes, the Ingress IP of the load balancer will be used as the external IP for Besu. A load balancer service can map any incoming port to a target port. These mapping rules will be the one retrieved by Besu. + +A tutorial to [Configure the Nat Manager for Kubernetes](../../../private-networks/tutorials/kubernetes/nat-manager.md) is available. + +## Docker + +Specify `DOCKER` to explicitly specify Hyperledger Besu is running inside a Docker container. If you specify `DOCKER`, you advertise the host IP address not the container IP address. + +The host IP address is the advertised host specified in the [`docker run` command](https://docs.docker.com/engine/reference/commandline/run/#add-entries-to-container-hosts-file---add-host). If not specified in the `docker run` command, the advertised host defaults to the values for [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-port`](../../reference/cli/options.md#p2p-port). + +## None + +Specify `NONE` to explicitly configure the external IP address and ports advertised using: + +- [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-port`](../../reference/cli/options.md#p2p-port) for the P2P service. +- [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) and [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) for the JSON-RPC HTTP service. + +The P2P and JSON-RPC HTTP hosts and ports are advertised in the [`net_services`](../../reference/api/index.md#net_services) method. + +:::tip + +When the NAT method is set to `NONE`, the advertised port is the same as the [listening port](../../reference/cli/options.md#p2p-port). + +::: diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/connect/static-nodes.md b/versioned_docs/version-23.4.1/public-networks/how-to/connect/static-nodes.md new file mode 100644 index 00000000000..aa0eb09641f --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/connect/static-nodes.md @@ -0,0 +1,65 @@ +--- +title: Configure static nodes +sidebar_position: 1 +description: Configuring static nodes +tags: + - public networks + - private networks +--- + +# Static nodes + +Static nodes are a configured set of trusted nodes. Static nodes are exempt from [maximum peer](manage-peers.md#limit-peers) and [remote connection](manage-peers.md#limit-remote-connections) limits. + +Besu attempts to maintain connections with static nodes by periodically initiating a connection to any unconnected static node. + +:::tip + +Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, you can use only bootnodes, only static nodes, or both bootnodes and static nodes. For example, you run multiple nodes on Mainnet (discovery using bootnodes), but want to ensure your nodes are always connected (using static nodes). + +To find peers, configure one or more [bootnodes](../../../private-networks/how-to/configure/bootnodes.md). To configure a specific set of peer connections, use static nodes. + +::: + +## Configure static nodes + +To configure a network of static nodes: + +1. List the [enode URLs](../../concepts/node-keys.md#enode-url) of the nodes in the [`static-nodes.json` file](#static-nodesjson-file). + +1. Save the `static-nodes.json` file in the data directory (specified by [`--data-path`](../../reference/cli/options.md#data-path)) of each node. Alternatively, you can explicitly specify the static nodes file on the command line using [`--static-nodes-file`](../../reference/cli/options.md#static-nodes-file). + +1. Start Besu with discovery disabled using [`--discovery-enabled=false`](../../reference/cli/options.md#discovery-enabled). + +To update the list of static peers at run time, use the [`admin_addPeer`](../../reference/api/index.md#admin_addpeer) and [`admin_removePeer`](../../reference/api/index.md#admin_removepeer) JSON-RPC API methods. + +:::note + +Runtime modifications of static nodes are not persisted between runs. The `static-nodes.json` file is not updated by the `admin_addPeer` and `admin_removePeer` methods. + +Nodes not in the list of the static nodes are not prevented from connecting. To prevent nodes from connecting, use [Permissioning](../../../private-networks/concepts/permissioning/index.md). + +::: + +:::tip + +If the added peer does not appear in the peer list (returned by [`admin_peers`](../../reference/api/index.md#admin_peers)), check the the supplied [enode URL](../../concepts/node-keys.md#enode-url) is correct, the node is running, and the node is listening for TCP connections on the endpoint. + +::: + +### `static-nodes.json` file + +The `static-nodes.json` file must be in the data directory (specified by [`--data-path`](../../reference/cli/options.md#data-path)) and contain a JSON array of [enode URLs](../../concepts/node-keys.md#enode-url). + +```json title="Example" +[ + "enode://cea71cb65a471037e01508cebcc178f176f9d5267bf29507ea1f6431eb6a5dc67d086dc8dc54358a72299dab1161febc5d7af49d1609c69b42b5e54544145d4f@127.0.0.1:30303", + "enode://ca05e940488614402705a6b6836288ea902169ecc67a89e1bd5ef94bc0d1933f20be16bc881ffb4be59f521afa8718fc26eec2b0e90f2cd0f44f99bc8103e60f@127.0.0.1:30304" +] +``` + +:::note + +Each node has a `static-nodes.json` file. We recommend each node in the network has the same `static-nodes.json` file. + +::: diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/develop/_category_.json b/versioned_docs/version-23.4.1/public-networks/how-to/develop/_category_.json new file mode 100644 index 00000000000..8c8a280b930 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/develop/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Develop dapps", + "position": 9 +} diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/develop/client-libraries.md b/versioned_docs/version-23.4.1/public-networks/how-to/develop/client-libraries.md new file mode 100644 index 00000000000..009e82d8d35 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/develop/client-libraries.md @@ -0,0 +1,31 @@ +--- +title: Use client libraries +sidebar_position: 2 +description: Hyperledger Besu client libraries +tags: + - public networks + - private networks +--- + +# Use client libraries + +Dapps use client libraries, such as [web3.js](https://github.com/ethereum/web3.js/), [web3j](https://github.com/web3j/web3j), or [ethereumj](https://github.com/ethereum/ethereumj), to forward JSON-RPC requests to Hyperledger Besu. Any client library implementing core Ethereum RPC methods works with Besu. + +Use the [web3js-quorum library](../../../private-networks/how-to/use-privacy/web3js-quorum.md) with Besu for [privacy features](../../../private-networks/concepts/privacy/index.md). + +![Client Libraries](../../../assets/images/Hyperledger-Besu-Client-Libraries.png) + +Use client libraries to: + +- Create signed transactions +- [Create and send private transactions]. + +:::note + +[Hyperledger Besu does not support key management inside the client](../send-transactions.md#use-wallets-for-key-management). + +::: + + + +[Create and send private transactions]: ../../../private-networks/how-to/send-transactions/private-transactions.md diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/develop/truffle.md b/versioned_docs/version-23.4.1/public-networks/how-to/develop/truffle.md new file mode 100644 index 00000000000..a97d5d4620a --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/develop/truffle.md @@ -0,0 +1,65 @@ +--- +title: Use Truffle +sidebar_position: 1 +description: Using Hyperledger Besu with Truffle +tags: + - public networks + - private networks +--- + +# Use Truffle + +Developing for Hyperledger Besu using Truffle is the same as developing for public Ethereum networks using Truffle. Truffle supports Besu with the only difference being Besu does not support private key management. To use Besu with Truffle, you must configure a Truffle wallet. + +## Install a Truffle wallet + +To install a Truffle wallet: + +```bash +npm install --save @truffle/hdwallet-provider +``` + +:::note + +With Truffle 5, you must use a Web3 1.0 enabled wallet or the Truffle tasks hang. + +::: + +### Update the Truffle configuration file + +To add the wallet provider, update the `truffle-config.js` file in the project directory. Replace: + +- `` with the JSON-RPC endpoint (IP address and port) of a Besu node. +- `` with the private key of an Ethereum account containing Ether. + +```javascript +const PrivateKeyProvider = require("@truffle/hdwallet-provider"); +const privateKey = ""; +const privateKeyProvider = new PrivateKeyProvider( + privateKey, + "", +); + +module.exports = { + // See + // for more about customizing your Truffle configuration! + networks: { + besuWallet: { + provider: privateKeyProvider, + network_id: "*", + }, + }, +}; +``` + +### Start a Besu node + +Start a Besu node with JSON-RPC enabled on the endpoint specified in the Truffle configuration file. + +### Deploy a contract + +To deploy a contract onto the Besu network: + +```bash +truffle migrate --network besuWallet +``` diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/monitor/_category_.json b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/_category_.json new file mode 100644 index 00000000000..9be56b91890 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Monitor nodes", + "position": 6 +} diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/monitor/index.md b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/index.md new file mode 100644 index 00000000000..c2c49d0e9fd --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/index.md @@ -0,0 +1,15 @@ +--- +description: Monitoring using metrics and logging +tags: + - public networks + - private networks +--- + +# Monitor Besu + +Monitoring enables identification of node and network issues. Specifically, configuring metrics and logging enables: + +- [Visual representation of declining node or network performance](metrics.md) +- [Collection of log files to enable issue diagnosis](logging.md). + +For an overview of monitoring Hyperledger Besu, view [this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/monitor/logging.md b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/logging.md new file mode 100644 index 00000000000..c994d6388c6 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/logging.md @@ -0,0 +1,77 @@ +--- +title: Configure logging +sidebar_position: 3 +description: Hyperledger Besu log level setting and log formatting +path: blob/master/besu/src/main/resources/ +source: log4j2.xml +tags: + - public networks + - private networks +--- + +# Use logging + +Hyperledger Besu uses Log4J2 for logging and provides two methods to configure logging behavior: + +- [Basic](#basic-logging) - Changes the log level. +- [Advanced](#advanced-logging) - Configures the output and format of the logs. + +[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) provides an [example implementation using Elastic Stack](../../../private-networks/how-to/monitor/elastic-stack.md) for log management. + +## Basic logging + +Use the [`--logging`](../../reference/cli/options.md#logging) command line option to specify logging verbosity. The [`--logging`](../../reference/cli/options.md#logging) option changes the volume of events displayed in the log. Valid log levels are `OFF`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. The default level is `INFO`. + +For most use cases, the basic method provides enough configurability. + +:::tip + +Use the [`admin_changeLogLevel`](../../reference/api/index.md#admin_changeloglevel) API method to change the log level while Besu is running. + +::: + +## Advanced logging + +You can provide your own logging configuration using the standard Log4J2 configuration mechanisms. For example, the following Log4J2 configuration is the same as the [default configuration] except for the exclusion of logging of stack traces for exceptions. + +```xml title="debug.xml" + + + + INFO + + + + + + + + + + + + + +``` + +To use your custom configuration, set the environment variable `LOG4J_CONFIGURATION_FILE` to the location of your configuration file. + +If you have more specific requirements, you can create your own [log4j2 configuration](https://logging.apache.org/log4j/2.x/manual/configuration.html). + +For Bash-based executions, you can set the variable for only the scope of the program execution by setting it before starting Besu. + +To set the debug logging and start Besu connected to the Goerli testnet: + +```bash +LOG4J_CONFIGURATION_FILE=./debug.xml besu --network=goerli +``` + +### Log rotation + +[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) logging configuration defines a [log rotation to restrict the size of the log files]. + + + +[default configuration]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/besu/src/main/resources/log4j2.xml +[log rotation to restrict the size of the log files]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/besu/config/besu/log-config.xml +[default configuration]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/besu/src/main/resources/log4j2.xml diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/monitor/metrics.md b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/metrics.md new file mode 100644 index 00000000000..e76b90abbc2 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/metrics.md @@ -0,0 +1,297 @@ +--- +title: Use metrics +sidebar_position: 1 +description: Monitoring and metrics +tags: + - public networks + - private networks +--- + +# Use metrics to monitor node performance + +To enable the [Prometheus](https://prometheus.io/) monitoring and alerting service to access Hyperledger Besu metrics, use the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. Use [Grafana](https://grafana.com/) to visualize the collected data. See the sample [Besu Full Grafana dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). + +The Besu example networks have [monitoring with Prometheus and Grafana configured]. + +Use Prometheus to monitor the number of blocks your Besu node is behind the chain head, and to alert you that your node is not keeping up with the chain head. + +[This recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be) shows examples of monitoring Hyperledger Besu. + +## Install Prometheus + +To use Prometheus with Besu, install the [Prometheus main component](https://prometheus.io/download/). On MacOS, install with [Homebrew](https://formulae.brew.sh/formula/prometheus): + +```bash +brew install prometheus +``` + +:::tip + +You can also install: + +- Exporters that send system metrics to Prometheus to monitor non-Besu-specific items such as disk and CPU usage. +- Other Prometheus components, such as the Alert Manager. Additional configuration is not required for these components because Prometheus handles and analyzes data directly from the feed. + +::: + +## Set up and run Prometheus with Besu + +To configure Prometheus and run with Besu: + +1. Configure Prometheus to poll Besu. For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: + + + + # Fragment to insert in prometheus.yml + + ```yml + - job_name: besu + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9545 + ``` + + # Full prometheus.yml example + + ```yml + global: + scrape_interval: 15s + + scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: besu + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9545 + ``` + + + + Prometheus requires 3 MB of space per node per hour for metrics, with a `scrape_interval` of 15 seconds. + +2. Start Besu with the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. To start a single node for testing with metrics enabled, run the following command: + + + + # Syntax + + ```bash + besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled + ``` + + # Example + + ```bash + besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled + ``` + + + + To specify the host and port on which Prometheus accesses Besu, use the [`--metrics-host`](../../reference/cli/options.md#metrics-host) and [`--metrics-port`](../../reference/cli/options.md#metrics-port) options. The default host and port are 127.0.0.1 (`localhost`) and 9545. + + :::danger + + To avoid DNS rebinding attacks, if running Prometheus on a different host than your Besu node (any host other than `localhost`), add the hostname that Prometheus uses to [`--host-allowlist`](../../reference/cli/options.md#host-allowlist). + + For example, if Prometheus is configured to get metrics from `http://besu.local:8008/metrics`, then `besu.local` has to be in `--host-allowlist`. + + ::: + +3. In another terminal, run Prometheus specifying the `prometheus.yml` file: + + ```bash + prometheus --config.file=prometheus.yml + ``` + +4. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). + + :::tip + + Use a log ingestion tool, such as Logstash, to parse the logs and alert you to configured anomalies. + + ::: + +## Run Prometheus with Besu in push mode + +The [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option enables Prometheus polling of Besu, but sometimes metrics are hard to poll (for example, when running inside Docker containers with varying IP addresses). To enable Besu to push metrics to a [Prometheus push gateway](https://github.com/prometheus/pushgateway), use the [`--metrics-push-enabled`](../../reference/cli/options.md#metrics-push-enabled) option. + +To configure Prometheus and run with Besu pushing to a push gateway: + +1. Configure Prometheus to read from a push gateway. For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: + + ```yml + - job_name: push-gateway + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9091 + ``` + +1. Start the push gateway. You can deploy the push gateway using the Docker image: + + ```bash + docker pull prom/pushgateway + docker run -d -p 9091:9091 prom/pushgateway + ``` + +1. Start Besu specifying the `--metrics-push-enabled` option and port of the push gateway: + + + + # Syntax + + ```bash + besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 + ``` + + # Example + + ```bash + besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 + ``` + + + +1. In another terminal, run Prometheus specifying the `prometheus.yml` file: + + ```bash + prometheus --config.file=prometheus.yml + ``` + +1. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). + +## View Prometheus graphical interface + +1. Open a Web browser to [`http://localhost:9090`](http://localhost:9090) to view the Prometheus graphical interface. + +1. Choose **Graph** from the menu bar and click the **Console** tab below. + +1. From the **Insert metric at cursor** drop-down, select a [metric](#metrics-list) such as `besu_blockchain_difficulty_total` or `ethereum_blockchain_height` and click **Execute**. The values display. + +1. Click the **Graph** tab to view the data as a time-based graph. The query string displays below the graph. For example, `{ethereum_blockchain_height{instance="localhost:9545",job="prometheus"}`. + +## Metrics list + +The following table lists available metrics. Each metric starts with a metric category prefix. Metrics specific to Besu use the `besu_` prefix, followed by another metric category. Metric categories can be enabled using the [`metrics-category`](../../reference/cli/options.md#metrics-category) command line option. If a metric has a JSON-RPC equivalent, it is included in the definition column. + +| Name | Metric type | Definition | +| --- | --- | --- | +| `besu_blockchain_chain_head_gas_limit` | Gauge | Block gas limit of the current chain head block | +| `besu_blockchain_chain_head_gas_used` | Gauge | Gas used by the current chain head block | +| `besu_blockchain_chain_head_ommer_count` | Gauge | Number of uncles in the current chain head block (JSON-RPC equivalent: [`eth_getUncleCountByBlockHash`](../../reference/api/index.md#eth_getunclecountbyblockhash) or [`eth_getUncleCountByBlockNumber`](../../reference/api/index.md#eth_getunclecountbyblocknumber)) | +| `besu_blockchain_chain_head_timestamp` | Gauge | Timestamp from the current chain head | +| `besu_blockchain_chain_head_transaction_count` | Gauge | Number of transactions in the current chain head block (JSON-RPC equivalent: [`eth_getBlockTransactionCountByHash`](../../reference/api/index.md#eth_getblocktransactioncountbyhash) or [`eth_getBlockTransactionCountByNumber`](../../reference/api/index.md#eth_getblocktransactioncountbynumber)) | +| `besu_blockchain_difficulty_total` | Gauge | Difficulty of the chain head (JSON-RPC equivalent: `difficulty` of [`admin_peers`](../../reference/api/index.md#admin_peers)) | +| `besu_executors_ethscheduler_computation_active_threads_current` | Gauge | Current number of threads executing computation tasks | +| `besu_executors_ethscheduler_computation_completed_tasks_total` | Gauge | Total number of computation tasks executed | +| `besu_executors_ethscheduler_computation_pool_size_current` | Gauge | Current number of threads in the computation thread pool | +| `besu_executors_ethscheduler_computation_queue_length_current` | Gauge | Current number of computation tasks awaiting execution | +| `besu_executors_ethscheduler_computation_rejected_tasks_total` | Counter | Total number of tasks rejected by this computation executor | +| `besu_executors_ethscheduler_computation_submitted_tasks_total` | Gauge | Total number of computation tasks submitted | +| `besu_executors_ethscheduler_timer_active_threads_current` | Gauge | Current number of threads executing timer tasks | +| `besu_executors_ethscheduler_timer_completed_tasks_total` | Gauge | Total number of timer tasks executed | +| `besu_executors_ethscheduler_timer_pool_size_current` | Gauge | Current number of threads in the timer thread pool | +| `besu_executors_ethscheduler_timer_queue_length_current` | Gauge | Current number of timer tasks awaiting execution | +| `besu_executors_ethscheduler_timer_rejected_tasks_total` | Counter | Total number of tasks rejected by this timer executor | +| `besu_executors_ethscheduler_timer_submitted_tasks_total` | Gauge | Total number of timer tasks submitted | +| `besu_executors_ethscheduler_workers_active_threads_current` | Gauge | Current number of threads executing worker tasks | +| `besu_executors_ethscheduler_workers_completed_tasks_total` | Gauge | Total number of worker tasks executed | +| `besu_executors_ethscheduler_workers_pool_size_current` | Gauge | Current number of threads in the worker thread pool | +| `besu_executors_ethscheduler_workers_queue_length_current` | Gauge | Current number of worker tasks awaiting execution | +| `besu_executors_ethscheduler_workers_rejected_tasks_total` | Counter | Total number of tasks rejected by this worker executor | +| `besu_executors_ethscheduler_workers_submitted_tasks_total` | Gauge | Total number of worker tasks submitted | +| `besu_network_discovery_inflight_interactions_current` | Gauge | Current number of inflight discovery interactions | +| `besu_network_discovery_interaction_count` | Counter | Total number of discovery interactions initiated | +| `besu_network_discovery_interaction_retry_count` | Counter | Total number of interaction retries performed | +| `besu_network_discovery_messages_inbound` | Counter | Total number of P2P discovery messages received | +| `besu_network_discovery_messages_outbound` | Counter | Total number of P2P discovery messages sent | +| `besu_network_netty_boss_pending_tasks` | Gauge | Number of pending tasks in Netty boss event loop | +| `besu_network_netty_workers_pending_tasks` | Gauge | Number of pending tasks in Netty workers event loop | +| `besu_network_p2p_messages_inbound` | Counter | Total number of P2P messages received | +| `besu_network_vertx_eventloop_pending_tasks` | Gauge | Number of pending tasks in Vertx event loop | +| `besu_network_vertx_worker_pool_completed_total` | Counter | Total number of tasks completed by Vertx worker pool | +| `besu_network_vertx_worker_pool_rejected_total` | Counter | Total number of tasks rejected by Vertx worker pool | +| `besu_network_vertx_worker_pool_submitted_total` | Counter | Total number of tasks submitted to Vertx worker pool | +| `besu_peers_connected_total` | Counter | Total number of peers connected | +| `besu_peers_disconnected_total` | Counter | Total number of peers disconnected | +| `besu_peers_pending_peer_requests_current` | Gauge | Current number of peer requests pending because peers are busy | +| `besu_pruner_mark_time_duration` | Gauge | Cumulative number of seconds spent marking the state trie across all pruning cycles | +| `besu_pruner_mark_operations_total` | Counter | Total number of mark operations performed | +| `besu_pruner_marked_nodes_total` | Counter | Total number of nodes marked as in use | +| `besu_pruner_sweep_operations_total` | Counter | Total number of sweep operations performed | +| `besu_pruner_swept_nodes_total` | Counter | Total number of unused nodes removed | +| `besu_stratum_connections` | Counter | Number of connections over time | +| `besu_stratum_difficulty` | Gauge | Current mining difficulty | +| `besu_stratum_disconnections` | Counter | Number of disconnections over time | +| `besu_stratum_miners` | Gauge | Number of connected miners | +| `besu_synchronizer_chain_download_pipeline_processed_total` | Counter | Number of entries processed by each chain download pipeline stage | +| `besu_synchronizer_chain_download_pipeline_restarts` | Counter | Number of times chain download pipeline has been restarted | +| `besu_synchronizer_fast_sync_pivot_block_current` | Gauge | The current fast sync pivot block | +| `besu_synchronizer_fast_sync_pivot_block_selected_count` | Counter | Number of times a fast sync pivot block has been selected | +| `besu_synchronizer_fast_sync_validation_mode` | Counter | Number of blocks validated using light vs full validation during fast sync | +| `besu_synchronizer_in_sync` | Gauge | Whether or not the local node has caught up to the best known peer (1 or 0) | +| `besu_synchronizer_task` | Summary | Internal processing tasks | +| `besu_synchronizer_world_state_completed_requests_total` | Counter | Total number of node data requests completed as part of fast sync world state download | +| `besu_synchronizer_world_state_existing_nodes_total` | Counter | Total number of node data requests completed using existing data | +| `besu_synchronizer_world_state_inflight_requests_current` | Gauge | Number of in progress requests for world state data | +| `besu_synchronizer_world_state_node_requests_since_last_progress_current` | Gauge | Number of world state requests made since the last time new data was returned | +| `besu_synchronizer_world_state_pending_requests_cache_size` | Gauge | Pending request cache size for fast sync world state download | +| `besu_synchronizer_world_state_pending_requests_current` | Gauge | Number of pending requests for fast sync world state download | +| `besu_synchronizer_world_state_pipeline_processed_total` | Counter | Number of entries processed by each world state download pipeline stage | +| `besu_synchronizer_world_state_retried_requests_total` | Counter | Total number of node data requests repeated as part of fast sync world state download | +| `besu_transaction_pool_pending_transactions_messages_skipped_total` | Counter | Total number of pending transactions messages skipped by the processor | +| `besu_transaction_pool_transactions` | Gauge | Current size of the transaction pool (JSON-RPC equivalent: result number of [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions)) | +| `besu_transaction_pool_transactions_added_total` | Counter | Count of transactions added to the transaction pool | +| `besu_transaction_pool_transactions_messages_skipped_total` | Counter | Total number of transactions messages skipped by the processor. | +| `ethereum_best_known_block_number` | Gauge | Estimated highest block available (JSON-RPC equivalent: `highestBlock` of [`eth_syncing`](../../reference/api/index.md#eth_syncing), or [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) if not syncing) | +| `ethereum_blockchain_height` | Gauge | Current height of the canonical chain (JSON-RPC equivalent: [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber)) | +| `ethereum_peer_count` | Gauge | Current number of peers connected (JSON-RPC equivalent: [`net_peerCount`](../../reference/api/index.md#net_peercount)) | +| `ethereum_peer_limit` | Gauge | Maximum number of peers this node allows to connect | +| `jvm_buffer_pool_capacity_bytes` | Gauge | Bytes capacity of a given JVM buffer pool | +| `jvm_buffer_pool_used_buffers` | Gauge | Used buffers of a given JVM buffer pool | +| `jvm_buffer_pool_used_bytes` | Gauge | Used bytes of a given JVM buffer pool | +| `jvm_classes_loaded` | Gauge | Current number of classes loaded in the JVM | +| `jvm_classes_loaded_total` | Counter | Total number of classes loaded since the JVM started execution | +| `jvm_classes_unloaded_total` | Counter | Total number of classes unloaded since the JVM started execution | +| `jvm_gc_collection_seconds` | Summary | Seconds spent in a given JVM garbage collector | +| `jvm_memory_bytes_committed` | Gauge | Committed bytes of a given JVM memory area | +| `jvm_memory_bytes_init` | Gauge | Initial bytes of a given JVM memory area | +| `jvm_memory_bytes_max` | Gauge | Maximum bytes of a given JVM memory area | +| `jvm_memory_bytes_used` | Gauge | Used bytes of a given JVM memory area | +| `jvm_memory_pool_bytes_committed` | Gauge | Committed bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_init` | Gauge | Initial bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_max` | Gauge | Maximum bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_used` | Gauge | Used bytes of a given JVM memory pool | +| `jvm_threads_current` | Gauge | Current thread count of a JVM | +| `jvm_threads_daemon` | Gauge | Daemon thread count of a JVM | +| `jvm_threads_deadlocked` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors or ownable synchronizers | +| `jvm_threads_deadlocked_monitor` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors | +| `jvm_threads_peak` | Gauge | Peak thread count of a JVM | +| `jvm_threads_started_total` | Counter | Started thread count of a JVM | +| `jvm_threads_state` | Gauge | Current count of threads by state | +| `process_cpu_seconds_total` | Counter | Total user and system CPU time spent in seconds | +| `process_max_fds` | Gauge | Maximum number of open file descriptors | +| `process_open_fds` | Gauge | Number of open file descriptors | +| `process_start_time_seconds` | Gauge | Start time of the process since Unix epoch in seconds | + +:::info + +- The `ethereum_best_known_block_number` metric always has a value. When the [`eth_syncing` JSON-RPC method](../../reference/api/index.md#eth_syncing) returns false, the current chain height displays. +- Although the `ethereum_peer_limit` metric does not have a JSON-RPC equivalent, the [`max peers` command line option](../../reference/cli/options.md#max-peers) sets the maximum number of P2P connections that can be established. + +::: + + + +[monitoring with Prometheus and Grafana configured]: ../../../private-networks/tutorials/quickstart.md#monitor-nodes-with-prometheus-and-grafana diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/monitor/understand-metrics.md b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/understand-metrics.md new file mode 100644 index 00000000000..863798555be --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/monitor/understand-metrics.md @@ -0,0 +1,101 @@ +--- +title: Understand metrics +sidebar_position: 2 +description: Understand Besu performance metrics +tags: + - public networks +--- + +# Understand metrics + +When running Besu on Ethereum Mainnet using [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), you might notice graphical patterns that stand out in different metrics charts. These patterns are related to the [CPU usage](#cpu-usage) and [block time](#block-time) of the Besu sync process. + +## CPU usage + +The following screenshot from [monitoring Besu with Prometheus and Grafana] shows patterns related to CPU usage. + +![CPU Grafana Besu dashboard patterns screenshot](../../../assets/images/besu-cpu-pattern-during-sync.png) + +The CPU pattern is a "staircase" pattern, where each step represents one of the Besu running stages. + +### 1. Blocks import and world state download + +Step 1 highlights blocks import and world state download, two tasks executed in parallel in Besu. Besu manages these two tasks with two different pipelines. + +This step is CPU-bound.[^1] The two pipeline stages run on multiple threads. + +As displayed in the following screenshot (for a VM with 8 CPUs) the CPU load average is about 7.5 and sometimes exceeds 10 (a 100% load for the 8 CPUs is 8). This means there's more work to be done than what the CPUs can handle. + +![System load metrics screenshot](../../../assets/images/system-load.png) + +### 2. World state healing + +Step 2, world state healing, starts just after the world state download in step 1 is complete. The peak in system CPU is related to the high rate of input and output (IO) required during this step. IO usage is around 61% during healing, and it's only 39% during the remaining sync. + +![IO utilization metrics screenshot](../../../assets/images/io-utilization.png) + +### 3. Blocks import + +After steps 1 and 2, world state is downloaded and healed, and block import continues. + +The visible drop in CPU shows that Besu finished the world state nodes download. + +The block import step is long because Besu can't parallelize block import -- it must validate each parent block before importing a child. + +:::note + +The Besu team is currently working on other algorithm and implementations to make this block import faster. + +::: + +### 4. Blocks full import + +In step 4, Besu executes all transactions of each block. This is when Besu updates the world state after the healing step. + +The quantity of imported blocks in this step depends on the speed of the sync. This number indicates the cumulated blocks quantity behind head since the last healing step. + +This step consumes less CPU than the previous steps because the sequential part -- executing transactions on the EVM -- must be single-threaded, reducing the concurrent work at the CPU level. + +### 5. Blocks production and propagation + +Once Besu is completely synced, it propagates blocks and executes the transactions inside each block. Step 5, block production and propagation, shows a reduction in CPU consumption due to the idle time while waiting for the new block and the sequential nature of executing transactions on the EVM. + +## Block time + +Block time measures the duration of getting new blocks in Besu. Block time is closely related to [CPU usage](#cpu-usage). + +The following screenshot shows patterns related to block time as available in the [Besu Grafana full dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). + +![Block time Grafana Besu dashboard patterns screenshot](../../../assets/images/block-time.png) + +The block time pattern is also a "staircase" pattern. + +### 1. Block import time + +Step 1, block import time, is the duration of importing a block. + +Import includes: + +- Data retrieval over the network. +- Headers, body, and receipt validation. +- Persisting the block in the database. + +Block import takes between a few and tens of milliseconds. + +### 2. Block full import time + +Step 2, block full import time, is the duration of importing a block (step 1) and executing all its transactions. + +Block full import takes between 1 and 2 seconds per block, depending on the number and complexity of the transactions. + +### 3. Block network time + +Step 3, block network time, is the duration of propagating a block over the network and executing all its transactions. + +Block network takes between 13 and 16 seconds. + + + +[monitoring Besu with Prometheus and Grafana]: ../../../private-networks/tutorials/quickstart.md#monitor-nodes-with-prometheus-and-grafana + +[^1]: A CPU-bound task means that the time required to execute the task is determined only by the CPU speed. diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/send-transactions.md b/versioned_docs/version-23.4.1/public-networks/how-to/send-transactions.md new file mode 100644 index 00000000000..56d74607621 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/send-transactions.md @@ -0,0 +1,65 @@ +--- +title: Create and send transactions +sidebar_position: 4 +description: Send transactions using eth_call or eth_sendRawTransaction. +tags: + - public networks +--- + +# Create and send transactions + +You can send signed transactions using the [`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction) JSON-RPC API method. + +Signed transactions can be simple value transfers, contract creation, or contract invocation. Set the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../reference/cli/options.md#rpc-tx-feecap) CLI option. + +To accept signed transactions from remote connections, set the [API listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0`. + +[Use client libraries](develop/client-libraries.md) to create and send a signed raw transaction to transfer Ether and create a smart contract. + +:::danger Private keys + +Don't use the accounts from the examples on Mainnet or any public network except for testing. The private keys are displayed which means the accounts are not secure. + +All accounts and private keys in the examples are from the `dev.json` genesis file in the [`/besu/config/src/main/resources`](https://github.com/hyperledger/besu/tree/master/config/src/main/resources) directory. + +In production environments avoid exposing your private keys by creating signed transactions offline, or use [EthSigner](https://docs.ethsigner.consensys.net/) to isolate your private keys and sign transactions with [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). + +::: + +:::caution + +Setting the [listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0` exposes the API service connection on your node to any remote connection. In a production environment, ensure you are using a firewall to avoid exposing your node to the internet. + +::: + +:::tip + +Libraries such as [web3j](https://github.com/web3j/web3j) or [ethereumj](https://github.com/ethereum/ethereumj) and tools such as [MyCrypto](https://mycrypto.com/) can also create signed transactions. + +::: + +## `eth_call` vs `eth_sendRawTransaction` + +You can interact with contracts using [`eth_call`](../reference/api/index.md#eth_call) or [`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction). The table below compares the characteristics of both calls. + +| `eth_call` | `eth_sendRawTransaction` | +| --- | --- | +| Read-only | Write | +| Invokes contract function locally | Broadcasts to the network | +| Does not change state of blockchain | Updates the blockchain (for example, transfers ether between accounts) | +| Does not consume gas | Requires gas | +| Synchronous | Asynchronous | +| Returns the value of a contract function available immediately | Returns transaction hash only. A block might not include all possible transactions (for example, if the gas price is too low). | + +## Use wallets for key management + +Besu doesn't support key management inside the client. Use: + +- [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu to provide access to your key store and sign transactions. +- Third-party tools (for example, [MetaMask](https://metamask.io/) and [web3j](https://web3j.io/)) for creating accounts. + +:::tip + +[EthSigner](http://docs.ethsigner.consensys.net/en/latest/) implements [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction) and [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +::: diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/_category_.json b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/_category_.json new file mode 100644 index 00000000000..cf5f9653813 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Troubleshoot", + "position": 12 +} diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/evm-tool.md b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/evm-tool.md new file mode 100644 index 00000000000..7e5a044180a --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/evm-tool.md @@ -0,0 +1,74 @@ +--- +title: Use EVM tool +sidebar_position: 1 +description: Hyperledger Besu EVM tool +tags: + - public networks + - private networks +--- + +# Use the EVM tool + +The Besu EVM tool is a CLI program that executes arbitrary EVM programs and Ethereum State Tests outside the context of an operating node. Use the EVM tool for benchmarking and fuzz testing. + +## Get the EVM tool + +The Besu EVM tool does not have a standard zip file distribution. To use, you need to either build from the source repository or use a pre-published docker image. + +### Build from source + +To build from source, run the following from the root of the Besu repository: + +```bash +./gradlew :ethereum:evmTool:installDist +``` + +An extractable archive files is created in `ethereum/evmtool/build/distributions` and an executable installation in `ethereum/evmtool/build/install/evmtool`. + +Execute the EVM tool: + +```bash +ethereum/evmtool/build/install/evmtool/bin/evm +``` + +### Execute with Docker + +To run the Besu EVM tool in a container: + +```bash +docker run -rm hyperledger/besu-evmtool:develop +``` + +- Because no data is stored in local directories we recommended using the `-rm` docker option. The `-rm` option deletes the container at the end of execution. +- If you use an option that requires input from standard in, use the `-i` docker option. The `-i` option pipes standard input to the EVM tool. +- If you need to reference files we recommend using a docker file binding, such as `-v ${PWD}:/opt/data`, which maps the current directory to the `/opt/data` directory in the container. + +:::note + +The `latest` tag is the latest released version of Besu, starting with 1.5.3. The `develop` tag is the current main branch code that will go into a future release version of Besu. + +::: + +## EVM tool run options + +The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. [Command line options](../../reference/evm-tool.md) specify the code and other contextual information. + +The EVM tool also has a [`state-test` subcommand](../../reference/evm-tool.md#state-test-options) that allows [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) to be evaluated, and a [`code-validate` subcommand](../../reference/evm-tool.md#eof-code-validation) that allows [Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. Most of the options from EVM execution don't apply. + + + +# `state-test` + +```bash +evm state-test --nomemory +``` + +# `code-validate` + +```bash +evm code-validate --file +``` + + + +The [EVM tool reference](../../reference/evm-tool.md) provides more information on these modes. diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/peering.md b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/peering.md new file mode 100644 index 00000000000..a0b218f40ff --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/peering.md @@ -0,0 +1,69 @@ +--- +title: Troubleshoot peering +sidebar_position: 4 +description: How to troubleshoot peering +tags: + - public networks +--- + +# Troubleshoot peering + +Many factors can affect the ability of your node to find and maintain peers. Your network router, machine environment, and node configuration are all important. If you have peering issues, start by [configuring your ports](../connect/configure-ports.md) and [managing peers](../connect/manage-peers.md). + +## Peering FAQ + +### "Why can’t I find enough peers to sync?" + +One or more of the following may be the cause: + +- Your hardware doesn't have enough CPU, disk IOPS, or bandwidth to handle all the peers. +- Your ports aren't open in your firewall and/or router. +- Your node is sending large numbers of DNS requests. See [issue #4375](https://github.com/hyperledger/besu/issues/4375). +- You're using [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), which doesn't download all historical block data, so your peers may disconnect you when fetching those blocks. +- Your node is experiencing the normal behavior of peers connecting and disconnecting. This is especially normal soon after you start your node. + +You can try the following to find more peers: + +- Set [`p2p-host`](../../reference/cli/options.md#p2p-host) to your external IP address to allow inbound connections. +- Restart Besu. This can take a while to build up again. +- Set `-Xdns-enabled` to `true` (only for private networks). +- Set `-Xp2p-peer-lower-bound` to a minimum number of peers. +- Delete the node key (which is autogenerated in your data directory). There are two reasons that this might help find more peers: + 1. Your node (identified by the address associated with this key) has been put onto other peers' bad peer lists for some reason. + 2. Peer discovery is influenced by the value of the node key. This is related to the node "distance" in the [discovery algorithm](https://github.com/ethereum/devp2p/wiki/Discovery-Overview#kademlia). + +You can read the [Prysm EL and CL peering documentation](https://docs.prylabs.network/docs/prysm-usage/p2p-host-ip) for more information. + +### "What network or router/modem settings should I check?" + +Check the following settings: + +- Your machine and router's specified DNS should support TCP. You can check your DNS online for TCP support. Google and Cloudflare, 8.8.8.8 and 1.1.1.1, support TCP over port 853. Other DNS might as well. +- The appropriate ports should be open on your router, or your router should have UPNP enabled. See the next FAQ for more information on router settings. +- If you use [Docker](https://docs.docker.com/network/network-tutorial-host/) or virtualization, the container should be able to create outbound connections on the host machine. + +### "How do I open/forward my ports?" + +If you’re behind NAT, you probably need to set up port forwarding in your router. You might also need to configure your firewall. Forward and open `30303` (if using the default p2p port) for both UDP and TCP. If your router supports UPNP, you can set [`--nat-method`](../../reference/cli/options.md#nat-method) to [`UPNPP2PONLY`](../connect/specify-nat.md#upnp). + +### "How do I test that my ports are open?" + +You can use this [open port checker](https://www.yougetsignal.com/tools/open-ports/). + +### "What's the ideal number of peers for Besu?" + +The default maximum is 25. Increasing the number of peers increases the bandwidth, CPU, and disk access Besu uses to respond to peers. Hardware with low specifications might result in low peer numbers. You'll experience diminishing returns with a larger number of peers (>100). + +### question "What's the benefit of increasing the number of peers?" + +Increasing the number of max peers won't speed up Besu syncing, because the bottleneck during sync is disk IO and CPU. + +Note that Besu's peers are only used for the initial sync and transaction gossip, neither of which affects attestation performance. The beacon node connectivity controls how quickly you receive blocks and how attestations are published. Increasing Besu's peer count increases the load on your node, which may hurt attestations. + +## Metrics + +Capture [metrics](../monitor/index.md) to gain insights into peering behavior over time. + +To [enable Prometheus to access Besu](../monitor/metrics.md), open the metrics port or metrics push port to Prometheus or the Prometheus push gateway on TCP. + +Specify the ports for Prometheus and Prometheus push gateway using the [`--metrics-port`](../../reference/cli/options.md#metrics-port) and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. The defaults are `9545` and `9001`. diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/performance.md b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/performance.md new file mode 100644 index 00000000000..ba2da3268ad --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/performance.md @@ -0,0 +1,45 @@ +--- +description: Troubleshoot poor performance and resource constraints. +sidebar_label: Troubleshoot performance +sidebar_position: 3 +tags: + - public networks +--- + +# Troubleshoot poor performance and resource constraints + +Your hardware, machine environment, and node configuration can affect your node's ability to serve +requests and perform [validator duties](../../concepts/proof-of-stake/index.md), including +[attestation performance](../../concepts/proof-of-stake/attestations.md). + +If you notice high resource usage when [monitoring your node](../monitor/index.md), you can +try the following suggestions: + +* Disable swapping. + Besu is an I/O intensive application, especially during sync, enabling swapping hurts Besu's performance. + You can disable swap at the OS level. + [This article](https://www.tecmint.com/disable-swap-partition/) provides information on how to + disable swap (and caveats). +* Use a high performance SSD disk with NVMe, since Besu's performance bottleneck is often slow disk I/O. +* Configure memory and RAM: + * If you have RAM constraints, use [OpenJ9](../../get-started/system-requirements.md) if you're + running on `x86_64` Linux architecture to reduce memory usage. + * Review and change your [Java heap size](../configure-jvm/manage-memory.md) if necessary. + 5GB is an appropriate limit. + Higher values may improve sync time, but can be reduced after completing sync. + * Ensure Besu is using [jemalloc](../../get-started/install/binary-distribution.md). + * If you have 32GB RAM or more, set the `Xplugin-rocksdb-high-spec-enabled` configuration option + to `true`. + Don't use this on RAM machines with 16GB RAM or less if you're running a consensus client on the + same hardware. +* If you're running on ARM64, make sure the glibc version is greater than 2.29. + If not, Besu uses a Java implementation instead of the native one for some precompiled contracts, + which results in lower performance. + * On Ubuntu, run `ldd --version`. + See [the methods for other environments](https://dev.to/0xbf/how-to-get-glibc-version-c-lang-26he). +* Pay attention to what processes are running on the same machine/VM as Besu. + Java applications, with default settings, are designed to run alone on the machine. + You can run your consensus client on the same machine, but this adds overhead on Besu, and vice + versa (on CPU cache misses, CPU scheduler latency, IO, etc.). + +You should continue to monitor your node after following these suggestions. \ No newline at end of file diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/trace-transactions.md b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/trace-transactions.md new file mode 100644 index 00000000000..773b0d9fa05 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/troubleshoot/trace-transactions.md @@ -0,0 +1,40 @@ +--- +title: Trace transactions +sidebar_position: 2 +description: How to trace transactions +tags: + - public networks + - private networks +--- + +# Trace transactions + +To get detailed information about transaction processing, use the [`TRACE` API](../../reference/api/index.md#trace-methods). Enable the `TRACE` API using the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api) command line options. + +The `TRACE` API has two sets of trace calls, [ad-hoc tracing APIs](#ad-hoc-tracing-apis) and [transaction-trace filtering APIs](#transaction-trace-filtering-apis). + +## Ad-hoc tracing APIs + +These APIs allow you to use the [`trace`, `vmTrace`, or `stateDiff`](../../reference/trace-types.md) diagnostic options when tracing calls or transactions. + +To use the ad-hoc tracing APIs, the requested block or transaction must be within the number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) (by default, 1024). + +The ad-hoc tracing APIs are: + +- [`trace_call`](../../reference/api/index.md#trace_call) +- [`trace_callMany`](../../reference/api/index.md#trace_callmany) +- [`trace_rawTransaction`](../../reference/api/index.md#trace_rawtransaction) +- [`trace_replayBlockTransactions`](../../reference/api/index.md#trace_replayblocktransactions) + +## Transaction-trace filtering APIs + +These APIs allow you to filter and search by specific information such as the block, address, or transaction. These APIs only use the [`trace` type](../../reference/trace-types.md#trace). + +To use the transaction-trace filtering APIs, your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block or transaction must be within the number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) (by default, 1024). + +The transaction-trace filtering APIs are: + +- [`trace_block`](../../reference/api/index.md#trace_block) +- [`trace_filter`](../../reference/api/index.md#trace_filter) +- [`trace_get`](../../reference/api/index.md#trace_get) +- [`trace_transaction`](../../reference/api/index.md#trace_transaction) diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/upgrade-node.md b/versioned_docs/version-23.4.1/public-networks/how-to/upgrade-node.md new file mode 100644 index 00000000000..4e33d3dce08 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/upgrade-node.md @@ -0,0 +1,33 @@ +--- +title: Upgrade Besu +sidebar_position: 11 +description: Upgrade your Besu node to a new version. +tags: + - public networks +--- + +# Upgrade your Besu node + +When upgrading your Besu node, we recommend: + +- Using an orchestration method (for example, Ansible or Chef) to keep all nodes in sync with your desired configuration. +- Storing your configuration under version control. + +## Ansible + +You can use the [Ansible role on Galaxy](https://galaxy.ansible.com/consensys/hyperledger_besu) directly or customize it to suit your needs. + +Upgrade the Besu version on nodes by running the play with the new version. For more information, For more information, select **Read Me** on the [Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). + +The playbook: + +1. Stops Besu. +1. Downloads the updated version. +1. Applies any new configuration. +1. Starts Besu. + +## Find peers on restarting + +Nodes store known peers in the peer table. The peer table is not persisted to disk. When a node restarts, the node connects to the specified bootnodes and discovers other nodes through the peer discovery process. The node continues collecting data from where it left off before the restart (assuming there was no data corruption in a failure scenario). + +Before the node restarted, connected peers saved the node details in their peer tables. These peers can reconnect to the restarted node. The restarted node uses these peers and the bootnodes, to discover more peers. To ensure that the restarted node successfully rejoins the network, ensure you specify at least one operational bootnode. diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/_category_.json b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/_category_.json new file mode 100644 index 00000000000..300deff1cbe --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use the Besu API", + "position": 1 +} diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/access-logs.md b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/access-logs.md new file mode 100644 index 00000000000..04dbfd60d34 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/access-logs.md @@ -0,0 +1,194 @@ +--- +title: Access logs using JSON-RPC +sidebar_position: 5 +description: Accessing logs using the Hyperledger Besu API +tags: + - private networks +--- + +# Access logs using the Hyperledger Besu API + +Subscribe to events, such as logs, using either [RPC Pub/Sub over WebSockets](rpc-pubsub.md) or filters over HTTP. + +Access logs using the following Hyperledger Besu API methods: + +- [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) +- [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs) +- [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). + +Use [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) to create the filter before using [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) and [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs)). + +Access logs for [private contracts](../../../private-networks/concepts/privacy/index.md) using the equivalent [`priv_*` methods and specifying the privacy group ID](#filters-for-private-contracts). For example, [`priv_getLogs`](../../reference/api/index.md#priv_getlogs). + +:::note + +The following examples use the sample contract included in [events and logs](../../concepts/events-and-logs.md). + +::: + +## Create a filter + +Create a filter using [`eth_newFilter`](../../reference/api/index.md#eth_newfilter). + +If the [example contract](../../concepts/events-and-logs.md) was deployed to 0x42699a7612a82f1d9c36148af9c77354759b210b, the following request for `eth_newFilter` creates a filter to log when `valueIndexed` is set to 5: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_newFilter", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + ["0x0000000000000000000000000000000000000000000000000000000000000005"] + ] + } + ], + "id": 1 +} +``` + +[`eth_newFilter`](../../reference/api/index.md#eth_newfilter) returns a filter ID hash (for example, `0x1ddf0c00989044e9b41cc0ae40272df3`). + +### Poll a filter for changes + +To poll the filter for changes since the last poll, use [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) with the filter ID hash returned by [`eth_newFilter`](../../reference/api/index.md#eth_newfilter). + +If the contract had been executed twice since the last poll, with `valueIndexed` set to 1 and 5, [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) returns only the log where the [topic](../../concepts/events-and-logs.md#event-parameters) for `valueIndexed` is 5: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x21c", + "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", + "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + ] +} +``` + +### Get all logs for a filter + +To get all logs for a filter, use [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). + +If the contract had been executed twice with `valueIndexed` set to 5 since the filter was created using `eth_newFilter`, `eth_getFilterLogs` returns: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x1a7", + "blockHash": "0x4edda22a242ddc7bc51e2b6b11e63cd67be1af7389470cdea9c869768ff75d42", + "transactionHash": "0x9535bf8830a72ca7d0020df0b547adc4d0ecc4321b7d5b5d6beb1eccee5c0afa", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x21c", + "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", + "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + ] +} +``` + +:::tip + +You can use [`eth_getLogs`](#get-logs-using-a-filter-options-object) with a filter options object to get all logs matching the filter options instead of using [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) followed by [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). + +::: + +## Uninstall a filter + +When a filter is no longer required, use [`eth_uninstallFilter`](../../reference/api/index.md#eth_uninstallfilter) to remove the filter. + +## Filters for private contracts + +Filters for private contracts are created, accessed, and uninstalled using: + +- [`priv_getFilterChanges`](../../reference/api/index.md#priv_getfilterchanges) +- [`priv_getFilterLogs`](../../reference/api/index.md#priv_getfilterlogs) +- [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) +- [`priv_newFilter`](../../reference/api/index.md#priv_newfilter) +- [`priv_uninstallFilter`](../../reference/api/index.md#priv_uninstallfilter). + +The [privacy group ID](../../../private-networks/concepts/privacy/index.md) must be specified as parameter 0 for the `priv` methods. + +```json +{ + "jsonrpc": "2.0", + "method": "priv_newFilter", + "params": [ + "4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=", + { + "fromBlock": "earliest", + "toBlock": "latest", + "addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"], + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410" + ] + } + ], + "id": 1 +} +``` + +## Get logs using a filter options object + +To get all logs for a filter options object, use [`eth_getLogs`](../../reference/api/index.md#eth_getlogs) or [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) for a private contract. + +The following request for `eth_getLogs` returns all the logs where the example contract has been deployed to `0x42699a7612a82f1d9c36148af9c77354759b210b` and executed with `valueIndexed` set to 5. + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + ["0x0000000000000000000000000000000000000000000000000000000000000005"] + ] + } + ], + "id": 1 +} +``` + +The above example returns the same result as calling [eth_newFilter](#creating-a-filter) followed by [eth_getFilterLogs](#getting-all-logs-for-a-filter). diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/authenticate.md b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/authenticate.md new file mode 100644 index 00000000000..747debefe94 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/authenticate.md @@ -0,0 +1,272 @@ +--- +title: Authenticate over JSON-RPC requests +sidebar_position: 4 +description: Hyperledger Besu authentication and authorization for JSON-RPC +tags: + - private networks +--- + +# Authenticate and authorize JSON-RPC + +Authentication identifies a user, and authorization verifies user access to requested JSON-RPC methods. Hyperledger Besu verifies users using [JSON Web Tokens (JWT)](https://jwt.io/introduction/). JWT is also used in [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md) to verify tenant data access. + +Besu supports two mutually exclusive authentication methods: + +- [Username and password](#username-and-password-authentication) +- [JWT public key](#jwt-public-key-authentication). + +Besu creates JWT internally with [username and password authentication](#username-and-password-authentication), and externally with [JWT public key authentication](#jwt-public-key-authentication). + +:::info + +Using JSON-RPC authentication and authorization with [MetaMask](https://metamask.io/) is not supported. + +::: + +:::caution + +To prevent interception of authentication credentials and authenticated tokens, make authenticated requests over HTTPS. We recommend running production deployments behind a network layer that provides SSL termination. Besu does not provide a HTTPS connection natively. + +::: + +## Username and password authentication + +Enable authentication from the command line. Supply the credentials file and send a request to the `/login` endpoint using the username and password. The `/login` endpoint creates a JWT for making permitted JSON-RPC requests. + +Using [public key authentication](#jwt-public-key-authentication) disables the `/login` endpoint. + +### 1. Create the credentials file + +The `toml` credentials file defines user details and the JSON-RPC methods they can access. + +:::info Sample `auth.toml` credentials file + +```toml +[Users.username1] +password = "$2a$10$l3GA7K8g6rJ/Yv.YFSygCuI9byngpEzxgWS9qEg5emYDZomQW7fGC" +permissions=["net:*","eth:blockNumber"] +privacyPublicKey="U7ANiOOd5L9Z/dMxRFjdbhA1Qragw6fLuYgmgCvLoX4=" + +[Users.username2] +password = "$2b$10$6sHt1J0MVUGIoNKvJiK33uaZzUwNmMmJlaVLkIwinkPiS1UBnAnF2" +permissions=["net:version","admin:*"] +privacyPublicKey="quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=" +``` + +::: + +Each user requiring JSON-RPC access the configuration file lists the: + +- Username. `Users.` is mandatory and followed by the username. That is, replace `` in `[Users.]` with the username. +- Hash of the user password. Use the [`password hash`](../../reference/cli/subcommands.md#password) subcommand to generate the hash. +- [JSON-RPC permissions](#json-rpc-permissions). +- Optional. The tenant's Tessera public key using `privacyPublicKey`. Only used for [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). + + + +# Command + +```bash +besu password hash --password=MyPassword +``` + +# Hash output + +```text +$2a$10$L3Xb5G/AJOsEK5SuOn9uzOhpCCfuVWTajc5hwWerY6N5xBM/xlrMK +``` + + + +### 2. Enable authentication + +To require authentication for the JSON-RPC API, use the [`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) options. + +To specify the [credentials file](#1-create-the-credentials-file), use the [`--rpc-http-authentication-credentials-file`](../../reference/cli/options.md#rpc-http-authentication-credentials-file) and [`--rpc-ws-authentication-credentials-file`](../../reference/cli/options.md#rpc-ws-authentication-credentials-file) options. + +### 3. Generate an authentication token + +To generate an authentication token, make a request to the `/login` endpoint with your username and password. Specify the HTTP port or the WS port to generate a token to authenticate over HTTP or WS respectively. HTTP and WS requires a different token. + + + +# Generate a token for HTTP + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login +``` + +# Example for HTTP + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8545/login +``` + +# Generate a token for WS + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login +``` + +# Example for WS + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8546/login +``` + +# JSON result + +```json +{ + "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MDYwNCwiZXhwIjoxNTUwNDYwOTA0fQ.l2Ycqzl_AyvReXBeUSayOlOMS_E8-DCuz3q0Db0DKD7mqyl6q-giWoEtfdWzUEvZbRRi2_ecKO3N6JkXq7zMKQAJbVAEzobfbaaXWcQEpHOjtnK4_Yz-UPyKiXtu7HGdcdl5Tfx3dKoksbqkBl3U3vFWxzmFnuu3dAISfVJYUNA" +} +``` + + + +Authentication tokens expire five minutes after generation. If you require access after the token expires, you need to generate a new token. + +## JWT public key authentication + +Enable authentication from the command line and supply the external JWT provider's public key. + +:::danger + +JWT public authentication disables the Besu `/login` endpoint, meaning [username and password authentication](#username-and-password-authentication) will not work. + +::: + +### 1. Generate a private and public key pair + +The private and accompanying public key files must be in `.pem` format. + +The [key algorithm](https://datatracker.ietf.org/doc/html/rfc7518#section-3.1) can be: + +- RSA with private key length of at least 2048 bits using algorithm `RS256`, `RS384` or `RS512`. +- ECDSA private key, using `ES256` (`secp256r1` or `secp256k1`), `ES384` or `ES512`. + +Besu default is `RS256`. + + + +# `RS256` RSA Keys + +1. Generate the private key: + + ```bash + openssl genrsa -out privateRSAKey.pem 2048 + ``` + +2. Generate the public key: + + ```bash + openssl rsa -pubout -in privateRSAKey.pem -pubout -out publicRSAKey.pem + ``` + +# `ES256` `secp256r1` ECDSA Keys + +1. Generate the private key: + + ```bash + openssl ecparam -name secp256r1 -genkey -out privateECDSAKey.pem + ``` + +2. Generate the public key: + + ```bash + openssl ec -in privateECDSAKey.pem -pubout -out publicECDSAKey.pem + ``` + + + +:::danger Private key security + +The private key must be kept secret. Never share private keys publicly or on a Web site, even if advertised as secure. + +Always keep your private keys safe -- ideally using [hardware](https://connect2id.com/products/nimbus-jose-jwt/examples/pkcs11) or [vault](https://www.vaultproject.io/docs/secrets/identity/identity-token) -- and define a strong security policy and [best practices](https://auth0.com/docs/best-practices/token-best-practices). + +Compromised keys can provide attackers access to you nodes RPC-API. + +::: + +### 2. Create the JWT + +Create the JWT using a trusted authentication provider[^1] or [library](https://jwt.io/libraries) in your own code. + +[^1]: for example [Auth0](https://auth0.com/) or [Keycloak](https://www.keycloak.org/) + +See [Java code sample to generate JWT using Vertx](https://github.com/NicolasMassart/java-jwt-sample-generation/) for an example implementation. + +:::caution + +The JWT must use one of the `RS256`, `RS384`, `RS512`, `ES256`, `ES384`, or `ES512` algorithms. + +::: + +Each payload for the JWT must contain: + +- [JSON-RPC permissions](#json-rpc-permissions) +- [`exp` (Expiration Time) claim](https://tools.ietf.org/html/rfc7519#section-4.1.4) +- Optionally, the tenant's Tessera public key using `privacyPublicKey`. Only used for [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). + + + +# Example JSON Payload + +```json +{ + "permissions": ["*:*"], + "privacyPublicKey": "2UKH3VJThkOoKskrLFpwoxCnnRARyobV1bEdgseFHTs=", + "exp": 1600899999002 +} +``` + +# Example JWT result + +![Example result](jwt.png) + + + +### 3. Enable authentication + +To require authentication for the JSON-RPC API, use the [`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) options. + +To specify the JWT provider's public key file to use with the externally created JWT, use the [`--rpc-http-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) or [`--rpc-ws-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-ws-authentication-jwt-public-key-file) options. + +## JSON-RPC permissions + +Each user has a list of permissions strings defining the methods they can access. To give access to: + +- All API methods, specify `["*:*"]`. +- All API methods in an API group, specify `[":*"]`. For example, `["eth:*"]`. +- Specific API methods, specify `[":"]`. For example, `["admin:peers"]`. + +With authentication enabled, to explicitly specify a user cannot access any methods, include the user with an empty permissions list (`[]`). Users with an empty permissions list and users not included in the credentials file cannot access any JSON-RPC methods. + +## Use an authentication token to make requests + +Specify the authentication token as a `Bearer` token in the JSON-RPC request header. + +### Postman + +In the **Authorization** tab in the **TYPE** drop-down list, select **Bearer Token** and specify the token (generated either [externally](#2-create-the-jwt) or by the [`login` request](#3-generate-an-authentication-token)). + +### cURL + +Specify the `Bearer` in the header. + + + +# cURL Request with authentication placeholders + +```bash +curl -X POST -H 'Authorization: Bearer ' -d '{"jsonrpc":"2.0","method":"","params":[],"id":1}' +``` + +# cURL Request with authentication + +```bash +curl -X POST -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MTQxNiwiZXhwIjoxNTUwNDYxNzE2fQ.WQ1mqpqzRLHaoL8gOSEZPvnRs_qf6j__7A3Sg8vf9RKvWdNTww_vRJF1gjcVy-FFh96AchVnQyXVx0aNUz9O0txt8VN3jqABVWbGMfSk2T_CFdSw5aDjuriCsves9BQpP70Vhj-tseaudg-XU5hCokX0tChbAqd9fB2138zYm5M' -d '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":1}' http://localhost:8545 +``` + + diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/graphql.md b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/graphql.md new file mode 100644 index 00000000000..ba369af65a3 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/graphql.md @@ -0,0 +1,102 @@ +--- +title: Use GraphQL over HTTP +sidebar_position: 3 +description: How to access the Hyperledger Besu API using GraphQL +tags: + - private networks +--- + +# Use GraphQL over HTTP + +GraphQL can reduce the overhead needed for common queries. For example, instead of querying each receipt in a block, GraphQL can get the same result with a single query for the entire block. + +The [Besu GraphQL schema] describes the GraphQL implementation for Ethereum. Enable the GraphQL service using [command line options](index.md#enable-api-access). + +:::note + +GraphQL is not supported over WebSocket. + +::: + +Access the GraphQL endpoint at `http://:/graphql`. Configure `` and `` using [`graphql-http-host`](../../reference/cli/options.md#graphql-http-host) and [`graphql-http-port`](../../reference/cli/options.md#graphql-http-port). The default endpoint is `http://127.0.0.1:8547/graphql`. + +## GraphQL requests with cURL + +[Hyperledger Besu JSON-RPC API methods](../../reference/api/index.md) with an equivalent [GraphQL](graphql.md) query include a GraphQL request and result in the method example. + +The following [`syncing`](../../reference/api/index.md#eth_syncing) request returns data about the synchronization status. + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock}}"}' http://localhost:8547/graphql +``` + +## GraphQL requests with GraphiQL app + +The third-party tool, [GraphiQL](https://github.com/skevy/graphiql-app), provides a tabbed interface for editing and testing GraphQL queries and mutations. GraphiQL also provides access to the [Besu GraphQL schema] from within the app. + +![GraphiQL](../../../assets/images/GraphiQL.png) + +## Pending + +`transactionCount` and `transactions` supports the Pending query. + +:::info + +Besu does not execute pending transactions so results from `account`, `call`, and `estimateGas` for Pending do not reflect pending transactions. + +::: + + + +# Pending transaction count + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactionCount}}"}' http://localhost:8547/graphql +``` + +# Result + +```json +{ + "data": { + "pending": { + "transactionCount": 2 + } + } +} +``` + + + + + +# Pending transactions + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactions{hash}}}"}' http://localhost:8547/graphql +``` + +# Result + +```json +{ + "data": { + "pending": { + "transactions": [ + { + "hash": "0xbb3ab8e2113a4afdde9753782cb0680408c0d5b982572dda117a4c72fafbf3fa" + }, + { + "hash": "0xf6bd6b1bccf765024bd482a71c6855428e2903895982090ab5dbb0feda717af6" + } + ] + } + } +} +``` + + + + + +[Besu GraphQL schema]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/ethereum/api/src/main/resources/schema.graphqls diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/index.md b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/index.md new file mode 100644 index 00000000000..5fca272858e --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/index.md @@ -0,0 +1,98 @@ +--- +description: Hyperledger Besu API +tags: + - public networks + - private networks +--- + +# Access the Hyperledger Besu API + +Access the [Hyperledger Besu API](../../reference/api/index.md) using: + +- [JSON-RPC over HTTP, WebSocket, or IPC](json-rpc.md) +- [RPC Pub/Sub over WebSockets](rpc-pubsub.md) +- [GraphQL over HTTP](graphql.md). + +The following sections provide information about JSON-RPC, RPC Pub/Sub, and GraphQL. + +## Enable API access + +To enable API access, use the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled), [`--ws-http-enabled`](../../reference/cli/options.md#rpc-ws-enabled), [`--graphql-http-enabled`](../../reference/cli/options.md#graphql-http-enabled), and `--Xrpc-ipc-enabled` options. + +:::caution + +`--Xrpc-ipc-enabled` is an early access option. + +::: + +## Service hosts + +To specify the host the API service listens on, use the [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host), [`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host), and [`--graphql-http-host`](../../reference/cli/options.md#graphql-http-host) options. The default host is `127.0.0.1`. + +To allow remote connections, set the host to `0.0.0.0`. + +:::caution + +Setting the host to `0.0.0.0` exposes the API service connection on your node to any remote connection. In a production environment, ensure you use a firewall to avoid exposing your node to the internet. + +::: + +## Service ports + +To specify the port the API service listens on, use the [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), and [`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port) options. + +The default ports are: + +- 8545 for JSON-RPC over HTTP. +- 8546 for JSON-RPC over WebSocket. +- 8547 for GraphQL over HTTP. + +Ports must be [exposed appropriately](../connect/configure-ports.md). + +## Socket path + +To specify the socket path for the IPC socket, use the `--Xrpc-ipc-path` option. The default path is `besu.ipc` in the Besu data directory. + +:::caution + +`--Xrpc-ipc-path` is an early access option. + +::: + +## Host allowlist + +To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL requests. Besu accepts requests only when hostnames specified using the [`--host-allowlist`](../../reference/cli/options.md#host-allowlist) option matches the request host headers. By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the API, we recommend using the [Besu authentication mechanism](authenticate.md) with username and password authentication or JWT public key authentication. + +::: + +If your application publishes RPC ports, specify the hostnames when starting Besu. + +```bash +besu --host-allowlist=example.com +``` + +Specify `*` for `--host-allowlist` to effectively disable host protection. + +:::caution + +Specifying `*` for `--host-allowlist` is not recommended for production code. + +::: + +## Not supported by Besu + +### Account management + +Account management relies on private key management in the client, which is not supported by Besu. + +To send signed transactions, use [`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction). `eth_sendTransaction` is not implemented. + +For [account management](../send-transactions.md#use-wallets-for-key-management), use third-party wallets. + +### Protocols + +Besu does not support the Whisper and Swarm protocols. diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/json-rpc.md b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/json-rpc.md new file mode 100644 index 00000000000..f7890d9bd12 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/json-rpc.md @@ -0,0 +1,291 @@ +--- +title: Use JSON-RPC over HTTP, WS, and IPC +sidebar_position: 1 +description: How to access the Hyperledger Besu API using JSON-RPC +tags: + - private networks +--- + +import Postman from '../../../global/postman.md'; + +# Use JSON-RPC over HTTP, WebSocket, and IPC + +JSON-RPC APIs allow you to interact with your node. JSON-RPC endpoints are not enabled by default. + +:::caution + +You should secure access to your node's JSON-RPC endpoints. Users with access to your node via JSON-RPC can make calls directly to your node, causing your node to consume resources. + +::: + +To enable JSON-RPC over HTTP or WebSocket, use the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) and [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) options. + +To enable JSON-RPC over an [IPC socket](index.md#socket-path), use the `--Xrpc-ipc-enabled` option. + +:::caution + +`--Xrpc-ipc-enabled` is an early access option. + +::: + + + +## Geth console + +The geth console is a REPL (Read, Evaluate, & Print Loop) JavaScript console. Use JSON-RPC APIs supported by geth and Hyperledger Besu directly in the console. + +To use the geth console with Besu: + +1. Start Besu with the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) or `--Xrpc-ipc-enabled` option. +1. Specify which APIs to enable using the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or `--Xrpc-ipc-api` option. +1. Start the geth console specifying the JSON-RPC endpoint: + + + +# HTTP endpoint + +```bash +geth attach http://localhost:8545 +``` + +# IPC endpoint + +```bash +geth attach /path/to/besu.ipc +``` + +Use the geth console to call [JSON-RPC API methods](../../reference/api/index.md) that geth and Besu share. + +```bash +eth.syncing +``` + +## JSON-RPC authentication + +Besu disables [Authentication](authenticate.md) by default. + +## HTTP and WebSocket requests + +### HTTP + +To make RPC requests over HTTP, you can use [`curl`](https://curl.haxx.se/download.html). + + + +# Syntax + +```bash +curl -X POST --data '{"jsonrpc":"2.0","id":,"method":"","params":[]}' +``` + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}' http://127.0.0.1:8555 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": "1", + "result": "0x60e" +} +``` + + + +You can use `curl` to make multiple RPC requests (batch requests) over HTTP at the same time. Send the requests as an array, and receive an array of responses. The default number of allowed requests in a RPC batch request is `1024`. Use the [`--rpc-http-max-batch-size`](../../reference/cli/options.md#rpc-http-max-batch-size) command line option to update the default value. + + + +# curl HTTP request + +```bash +curl -X POST --data '[{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}]' http://127.0.0.1:8555 +``` + +# JSON result + +```json +[ + { + "jsonrpc": "2.0", + "id": "1", + "result": "0x60e" + }, + { + "jsonrpc": "2.0", + "id": "2", + "result": [] + } +] +``` + + + +### WebSocket + +To make RPC requests over WebSocket, you can use [`wscat`](https://github.com/websockets/wscat), a Node.js based command-line tool. + +First connect to the WebSocket server using `wscat` (you only need to connect once per session): + +```bash +wscat -c ws:// +``` + +After you establish a connection, the terminal displays a '>' prompt. Send individual requests as a JSON data package at each prompt. + + + +# Syntax + +```bash +{"jsonrpc":"2.0","id":,"method":"","params":[]} +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": "1", + "result": "0x23" +} +``` + + + +You can use `wscat` to make multiple RPC requests over WebSocket at the same time. Send the requests as an array, and receive an array of responses. + + + +# wscat WS request + +```bash +[{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}] +``` + +# JSON result + +```json +[ + { + "jsonrpc": "2.0", + "id": "1", + "result": "0x23" + }, + { + "jsonrpc": "2.0", + "id": "2", + "result": [] + } +] +``` + + + +:::note + +`wscat` does not support headers. [Authentication](authenticate.md) requires you to pass an authentication token in the request header. To use authentication with WebSocket, you need an app that supports headers. + +::: + +## Readiness and liveness endpoints + +Besu provides readiness and liveness endpoints to confirm the Besu node status. Both return a `200 OK` status when ready or live and a `503 Service Unavailable` status if not ready or live. + +### Readiness + +By default, the readiness check requires a connected peer and the node to be within two blocks of the best known block. If you have [disabled P2P communication](../../reference/cli/options.md#p2p-enabled), you do not need peers. A live node with P2P disabled is always ready. + +Use the query parameters `minPeers` and `maxBlocksBehind` to adjust the number of peers required and the number of blocks tolerance. + + + +# Readiness endpoint + +```bash +http:///readiness +``` + +# curl request example + +```bash +curl -v 'http://localhost:8545/readiness' +``` + +# Query parameters example + +```bash +curl -v 'http://localhost:8545/readiness?minPeers=0&maxBlocksBehind=10' +``` + + + +### Liveness + +The liveness check requires the JSON-RPC server to be up. You can use the endpoint to verify that the node can respond to RPC calls. The status in the response will always be `UP`. + + + +# Liveness endpoint + +```bash +http:///liveness +``` + +# curl request example + +```bash +curl -v 'http://localhost:8545/liveness' +``` + + + +## API methods enabled by default + +Besu enables the `ETH`, `NET`, and `WEB3` API methods by default. + +To enable the `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `IBFT`, `MINER`, `PERM`, `PLUGINS`, `PRIV`, `TRACE`, and `TXPOOL` API methods, use the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api), [`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api), or `--Xrpc-ipc-api` options. + +:::caution + +`--Xrpc-ipc-api` is an early access option. + +::: + +## Block parameter + +When you make requests that might have different results depending on the block accessed, the block parameter specifies the block. Methods such as [`eth_getTransactionByBlockNumberAndIndex`](../../reference/api/index.md#eth_gettransactionbyblocknumberandindex) have a block parameter. + +The block parameter can have one of the following values: + +- `blockNumber` : _quantity_ - The block number, specified in hexadecimal or decimal. 0 represents the genesis block. +- `blockHash` : _string_ or _object_ - 32-byte block hash or JSON object specifying the block hash. If using a JSON object, you can specify `requireCanonical` to indicate whether the block must be a canonical block. See [this example](https://github.com/hyperledger/besu/blob/a2dedb0b2c7980cdc35db8eb4c094f2eb0dc7deb/ethereum/api/src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/eth/eth_getBalance_blockHashObjectCanonical.json). + + :::note + + Only the following methods support the `blockHash` parameter: + + - [`eth_call`](../../reference/api/index.md#eth_call) + - [`eth_getBalance`](../../reference/api/index.md#eth_getbalance) + - [`eth_getCode`](../../reference/api/index.md#eth_getcode) + - [`eth_getProof`](../../reference/api/index.md#eth_getproof) + - [`eth_getStorageAt`](../../reference/api/index.md#eth_getstorageat) + - [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) + + ::: + +- `earliest` : _tag_ - The earliest (genesis) block. +- `latest` : _tag_ - The last block mined. +- `pending` : _tag_ - The last block mined plus pending transactions. Use only with [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). +- `finalized` : _tag_ - The most recent crypto-economically secure block. It cannot be reorganized outside manual intervention driven by community coordination. +- `safe` : _tag_ - The most recent block that is safe from reorganization under honest majority and certain synchronicity assumptions. diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/jwt.png b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/jwt.png new file mode 100644 index 00000000000..ee676469c77 Binary files /dev/null and b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/jwt.png differ diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/rpc-pubsub.md b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/rpc-pubsub.md new file mode 100644 index 00000000000..4bc56782d7b --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-besu-api/rpc-pubsub.md @@ -0,0 +1,532 @@ +--- +title: Use RPC Pub/Sub over WS +sidebar_position: 2 +description: Using RPC Pub/Sub with Hyperledger Besu WebSockets +tags: + - private networks +--- + +# Use RPC Pub/Sub over WebSockets + +## Introduction + +Subscribe to events by using either RPC Pub/Sub over WebSockets or [filters over HTTP](access-logs.md). + +Use RPC Pub/Sub over WebSockets to wait for events instead of polling for them. For example, dapps subscribe to logs and receive notifications when a specific event occurs. + +Methods specific to RPC Pub/Sub are: + +- `eth_subscribe` and `eth_unsubscribe` - create or cancel a subscription for specific events. +- `priv_subscribe` and `priv_unsubscribe` - create or cancel a subscription for [private logs](../../../private-networks/concepts/privacy/index.md). + +:::info + +Unlike other [Hyperledger Besu API methods](../../reference/api/index.md), you cannot call the RPC Pub/Sub methods over HTTP. Use the [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) option to enable the WebSockets JSON-RPC service. + +::: + +### Use RPC Pub/Sub + +[WebSockets](json-rpc.md#http-and-websocket-requests) supports the RPC Pub/Sub API. + +To create subscriptions, use `eth_subscribe` or `priv_subscribe`. Once subscribed, the API publishes notifications using `eth_subscription` or `priv_subscription`. + +Subscriptions couple with connections. If a connection is closed, all subscriptions created over the connection are removed. + +### Subscription ID + +`eth_subscribe` and `priv_subscribe` return a subscription ID for each subscription created. Notifications include the subscription ID. + +For example, to create a synchronizing subscription: + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["syncing"] } +``` + +The result includes the subscription ID of `"0x1"`: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +The notifications also include the subscription ID of `"0x1"`: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": { + "startingBlock": "0x0", + "currentBlock": "0x50", + "highestBlock": "0x343c19" + } + } +} +``` + +### Notifications when synchronizing + +Subscribing to some events (for example, logs) can cause a flood of notifications while the node is synchronizing. + +## Subscribe + +Use `eth_subscribe` to create subscriptions for the following event types: + +- [Use RPC Pub/Sub over WebSockets](#use-rpc-pubsub-over-websockets) + - [Introduction](#introduction) + - [Use RPC Pub/Sub](#use-rpc-pubsub) + - [Subscription ID](#subscription-id) + - [Notifications when synchronizing](#notifications-when-synchronizing) + - [Subscribe](#subscribe) + - [New headers](#new-headers) + - [Logs](#logs) +- [All logs](#all-logs) +- [Specific address, topic, fromBlock and toBlock](#specific-address-topic-fromblock-and-toblock) +- [Result](#result) +- [Notification](#notification) +- [All logs for privacy group](#all-logs-for-privacy-group) +- [Specific address and topic](#specific-address-and-topic) +- [Result](#result-1) +- [Notification](#notification-1) + - [Pending transactions](#pending-transactions) + - [Dropped transactions](#dropped-transactions) + - [Synchronizing](#synchronizing) + - [Unsubscribe](#unsubscribe) + +Use `priv_subscribe` to [create subscriptions for logs on private contracts](#logs). + +:::tip + +Only logs subscriptions are relevant for private transactions because private transactions are anchored to the public chain rather than having their own private blockchain. + +::: + +### New headers + +To notify you about each block added to the blockchain, use the `newHeads` parameter with `eth_subscribe`. + +If a chain reorganization occurs, the subscription publishes notifications for blocks in the new chain. This means the subscription can publish notifications for multiple blocks at the same height on the blockchain. + +The new headers notification returns [block objects](../../reference/api/objects.md#block-object). The second parameter is optional. If specified, the notifications include whole [transaction objects](../../reference/api/objects.md#transaction-object), Otherwise, the notifications include transaction hashes. + +To subscribe to new header notifications: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newHeads", { "includeTransactions": true }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 2, "result": "0x1" } +``` + +Example notification without the `{"includeTransactions": true}` parameter included: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": { + "number": "0x40c22", + "hash": "0x16af2ee1672203c7ac13ff280822008be0f38e1e5bdc675760015ae3192c0e3a", + "parentHash": "0x1fcf5dadfaf2ab4d985eb05d40eaa23605b0db25d736610c4b87173bfe438f91", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00008000000000080000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000040000000000000000000000000000000000000000001000000000000000000000040000000000000000000000000000000000000400000000010000000000000000100000000000020000000000000000000000000000000000010000000000000000000000000000000000000000000", + "transactionsRoot": "0x5b2e3c1a49352f1ca9fb5dfe74b7ffbbb6d70e23a12693444e26058d8a8e6296", + "stateRoot": "0xbe8d3bc58bd982421a3ea8b66753404502df0f464ae78a17661d157c406dd38b", + "receiptsRoot": "0x81b175ec1f4d44fbbd6ba08f1bd3950663b307b7cb35751c067b535cc0b58f12", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x7c16e", + "extraData": "0xd783010600846765746887676f312e372e33856c696e757800000000000000002160f780bb1f61eda045c67cdb1297ba37d8349df8035533cb0cf82a7e45f23f3d72bbec125a9f499b3eb110b7d1918d466cb2ede90b38296cfe2aaf452c513f00", + "size": "0x3a1", + "gasLimit": "0x47e7c4", + "gasUsed": "0x11ac3a", + "timestamp": "0x592afc24", + "uncles": [], + "transactions": [ + "0x419c69d21b14e2e8f911def22bb6d0156c876c0e1c61067de836713043364d6c", + "0x70a5b2cb2cee6e0b199232a1757fc2a9d6053a4691a7afef8508fd88aeeec703", + "0x4b3035f1d32339fe1a4f88147dc197a0fe5bbd63d3b9dec2dad96a3b46e4fddd" + ] + } + } +} +``` + +Example notification with the `{"includeTransactions": true}` parameter included: + +```json +{ +"jsonrpc": "2.0", +"method": "eth_subscription", +"params":{ + "subscription":"0x1", + "result": { + .... + "transactions":[ + { + "blockHash":"0xa30ee4d7c271ae5150aec494131c5f1f34089c7aa8fb58bd8bb916a55275bb90", + "blockNumber":"0x63", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0x5208", + "gasPrice":"0x3b9aca00", + "hash":"0x11f66c3e96a92e3c14c1c33ad77381221bf8b58a887b4fed6aee456fc6f39b24", + "input":"0x", + "nonce":"0x1", + "to":"0x627306090abab3a6e1400e9345bc60c78a8bef57", + "transactionIndex":"0x0", + "value":"0x56bc75e2d63100000", + "v":"0xfe8", + "r":"0x4b57d179c74885ef5f9326fd000665ea7fae44095c1e2016a2817fc671beb8cc", + "s":"0x7ec060b115746dda392777df07ae1feacc0b83b3646f0a3de9a5fc3615af9bb8", + } + ], + }, + } +} +``` + +### Logs + +To notify you about [logs](../../concepts/events-and-logs.md) included in new blocks, use the `logs` parameter with `eth_subscribe` or `priv_subscribe`. Specify a filter object to receive notifications only for logs matching your filter. + +Logs subscriptions have an filter object parameter with the following fields: + +- `address` - (optional) Either an address or an array of addresses. Returns only logs created from these addresses. +- `topics` - (optional) Returns only logs that match the [specified topics](../../concepts/events-and-logs.md#topic-filters). +- `fromBlock` - (optional) The earliest block from which to return logs. +- `toBlock` - (optional) The last block from which to return logs. + +For private contracts, the privacy group ID must be specified. Only members of a privacy group receive logs for a private contract subscription. If you create a subscription for a privacy group you are not a member of, you will not receive any notifications. + +If a chain reorganization occurs, the subscription publishes notifications for logs from the old chain with the `removed` property in the [log object](../../reference/api/objects.md#log-object) set to `true`. This means the subscription can publish notifications for multiple logs for the same transaction. + +The logs subscription returns [log objects](../../reference/api/objects.md#log-object). + + + +# All logs + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["logs", {}] } +``` + +# Specific address, topic, fromBlock and toBlock + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": [ + "logs", + { + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "topics": [ + "0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902" + ], + "fromBlock": "0x0", + "toBlock": "latest" + } + ] +} +``` + +# Result + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x2" } +``` + +# Notification + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x2", + "result": { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x2174", + "blockHash": "0x7bc83837534aa13df55ff7db77784b1d1ba666d4c4bdd223cae9fe09c7c37eba", + "transactionHash": "0x942179373e413824c6bc7045e92295aff91b679215446549b4aeb084da46495b", + "transactionIndex": "0x0", + "address": "0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517", + "data": "0x", + "topics": [ + "0x199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca072787", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + } +} +``` + + + + + +# All logs for privacy group + +```json +{ + "id": 1, + "method": "priv_subscribe", + "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "logs", {}] +} +``` + +# Specific address and topic + +```json +{ + "id": 1, + "method": "priv_subscribe", + "params": [ + "4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", + "logs", + { + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "topics": [ + "0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902" + ] + } + ] +} +``` + +# Result + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +# Notification + +```json +{ + "jsonrpc": "2.0", + "method": "priv_subscription", + "params": { + "subscription": "0x1", + "privacyGroupId": "4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", + "result": { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x285", + "blockHash": "0x98490766b16de2a4d044c04d92599d71e626bc96e42f0c74274ef4e03fafd579", + "transactionHash": "0x40034ef14e3a22946693dd2a11efddf3a8850ddcad46b408198df6c176c53ffb", + "transactionIndex": "0x0", + "address": "0x61f96a7ed09877197d4fff0c29b8e523913651a9", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + } +} +``` + + + +### Pending transactions + +To notify you about pending transactions added to the transaction pool for the node, use the `newPendingTransactions` parameter with `eth_subscribe`. + +The pending transactions subscription returns the transaction hashes or transaction details of the pending transactions. If the `includeTransactions` parameter is not included, the default is transaction hashes only. + +If a chain reorganization occurs, Besu resubmits transactions for inclusion in the new canonical chain. This means the subscription can publish notifications for the same pending transaction more than once. + +To subscribe to pending transaction notifications and receive transaction hashes only: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newPendingTransactions", { "includeTransactions": false }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": "0x5705bc8bf875ff03e98adb98489428835892dc6ba6a6b139fee1becbc26db0b8" + } +} +``` + +To subscribe to pending transaction notifications and receive transaction details: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newPendingTransactions", { "includeTransactions": true }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x2" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x2", + "result": { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0x2540be400", + "hash": "0x7a4185f40ee93cb27eb132f301d0a5414c1f871051f166fc8804c376aab3ffec", + "input": "0x", + "nonce": "0x13", + "to": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f", + "value": "0x8ac7230489e80000", + "v": "0xfe7", + "r": "0xdd9013c67469d2fe79afdc61777c55bdced33c90fa6f9b83d8f9b7e445085123", + "s": "0x45823a1ab22ae9c83876ea435dc5ecc4fe3a83c1bfbc340a5f57df2f5a474fa5" + } + } +} +``` + +### Dropped transactions + +To notify you about transactions dropped from the transaction pool for the node, use the `droppedPendingTransactions` parameter with `eth_subscribe`. + +The dropped transactions subscription returns the transaction hashes of the dropped transactions. + +Dropped transactions can be re-added to the transaction pool from a variety of sources. For example, receiving a previously dropped transaction from a peer. As a result, it's possible to receive multiple dropped transaction notifications for the same transaction. + +To subscribe to dropped transaction notifications: + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["droppedPendingTransactions"] } +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": "0xf57d6a90a7fb30880cfbdf6b432b487d0e94a3b55b34dc4b45e3b0b237ecab4c" + } +} +``` + +### Synchronizing + +To notify you about synchronization progress, use the `syncing` parameter with `eth_subscribe`. + +When behind the chain head, the synchronizing subscription returns an object indicating the synchronization progress. When fully synchronized, returns `false`. + +To subscribe to synchronizing notifications: + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["syncing"] } +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x4" } +``` + +Example notification while synchronizing: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4", + "result": { + "startingBlock": "0x0", + "currentBlock": "0x3e80", + "highestBlock": "0x67b93c" + } + } +} +``` + +Example notification when synchronized with chain head: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4", + "result": false + } +} +``` + +## Unsubscribe + +To cancel a subscription, use the [subscription ID](#subscription-id) with `eth_unsubscribe` or `priv_unsubscribe`. Only the connection that created a subscription can unsubscribe from it. + +When cancelling a subscription for private logs, the privacy group ID must be specified. + +`eth_unsubscribe` and `priv_unsubscribe` return `true` if subscription successfully unsubscribed; otherwise, returns an error. + +To unsubscribe from a subscription with subscription ID of `0x1`: + +```json +{ "id": 1, "method": "eth_unsubscribe", "params": ["0x1"] } +``` + +To unsubscribe from private logs subscription: + +```json +{ + "id": 1, + "method": "priv_unsubscribe", + "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "0x2"] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": true } +``` diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-engine-api.md b/versioned_docs/version-23.4.1/public-networks/how-to/use-engine-api.md new file mode 100644 index 00000000000..1155a51fe6a --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-engine-api.md @@ -0,0 +1,220 @@ +--- +title: Use the Engine API +sidebar_position: 2 +description: Use the Engine API to communicate with a consensus client. +tags: + - public networks +--- + +# Use the Engine API + +[Consensus and execution clients](../concepts/the-merge.md#execution-and-consensus-clients) communicate with each other using the [Engine API](../reference/engine-api/index.md). These API methods are a separate subsection of the [JSON-RPC API](../how-to/use-besu-api/index.md). + +## Configure the Engine API + +To configure the Engine API: + +- [Enable the Engine API](#enable-the-engine-api) (it's disabled by default). +- [Enable the JSON-RPC API](use-besu-api/index.md#enable-api-access). Ensure the [`ETH` method is enabled](use-besu-api/json-rpc.md#api-methods-enabled-by-default) (it's enabled by default). +- Specify the [service ports](#service-ports). +- Specify the [host allowlist](#host-allowlist). + +```bash title="Example Engine API configuration" +besu --engine-rpc-enabled --rpc-http-enabled --engine-rpc-port=8551 --engine-host-allowlist=localhost,127.0.0.1 --engine-jwt-secret=jwt.hex +``` + +### Enable the Engine API + +Enable the Engine API with the [`--engine-rpc-enabled`](../reference/cli/options.md#engine-rpc-enabled) CLI option. + +:::note + +The `--engine-rpc-enabled` CLI option enables the Engine API even if no consensus client configuration exists. + +::: + +### Service ports + +To specify the port the Engine API service listens on for HTTP and WebSocket, use the [`--engine-rpc-port`](../reference/cli/options.md#engine-rpc-port) option. The default is `8551`. + +### Host allowlist + +To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL requests. Besu accepts requests only when hostnames specified using the [`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) option matches the request host headers. By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the Engine API, we recommend using [authentication](#authentication). + +::: + +If your application publishes RPC ports, specify the hostnames when starting Besu. + +Specify `*` for `--engine-host-allowlist` to effectively disable host protection. + +:::caution + +We don't recommend specifying `*` for `--engine-host-allowlist` in production. + +::: + +## Authentication + +By default, [authentication](../how-to/use-besu-api/authenticate.md) for the Engine API is enabled. To disable, set the [`--engine-jwt-disabled`](../reference/cli/options.md#engine-jwt-disabled) option to `true`. + +:::caution + +Don't disable JWT authentication in production environments. + +Disable only for testing purposes. + +::: + +Set the [JWT secret](use-besu-api/authenticate.md#jwt-public-key-authentication) by using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. + +## Send a payload using the Engine API + +### 1. Prepare a payload + +Prepare to send a payload using [`engine_forkchoiceUpdatedV1`](../reference/engine-api/index.md#engine_forkchoiceupdatedv1). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "safeBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "finalizedBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000"},{"timestamp": "0x5","prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000","suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"}],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } +} +``` + + + +### 2. Get the payload + +Get the payload using [`engine_getPayloadV1`](../reference/engine-api/index.md#engine_getpayloadv1) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x1"],"id":1}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +} +``` + + + +### 3. Execute the payload + +Execute the payload using [`engine_newPayloadV1`](../reference/engine-api/index.md#engine_newpayloadv1) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } +} +``` + + + +### 4. Update the fork choice + +Update the fork choice using [`engine_forkchoiceUpdatedV1`](../reference/engine-api/index.md#engine_forkchoiceupdatedv1) again. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": null + } +} +``` + + diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-pow/_category_.json b/versioned_docs/version-23.4.1/public-networks/how-to/use-pow/_category_.json new file mode 100644 index 00000000000..1381dd9fc66 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-pow/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use proof of work", + "position": 10 +} diff --git a/versioned_docs/version-23.4.1/public-networks/how-to/use-pow/mining.md b/versioned_docs/version-23.4.1/public-networks/how-to/use-pow/mining.md new file mode 100644 index 00000000000..6dbd9b29f52 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/how-to/use-pow/mining.md @@ -0,0 +1,111 @@ +--- +title: Configure mining +sidebar_position: 1 +description: Using Hyperledger Besu for PoW CPU mining +tags: + - public networks + - private networks +--- + +# Configure mining + +Hyperledger Besu supports CPU and GPU mining, which are configured using command line options. + +GPU mining tests used [Ethminer](https://github.com/ethereum-mining/ethminer) with the `stratum+tcp` and `getwork` schemes. + +Ethminer has been used with Hyperledger Besu to mine blocks on the [Ropsten testnet](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine), [ETC Mainnet (uncle block only)](https://etc.tokenview.com/en/uncleblock/10555173) and Mordor ETC testnet. + +:::note + +- Some mining software supports the `getwork` scheme as the `http` scheme. + +- The Ropsten testnet is now deprecated. It transitioned to proof of stake consensus before deprecation. + +::: + +## Configure CPU mining + +To enable CPU mining, start Hyperledger Besu with the following options: + +```bash +besu --rpc-http-api=ETH,MINER --miner-enabled --miner-coinbase= +``` + +Where `` is the account you pay mining rewards to. For example, `fe3b557e8fb62b89f4916b721be55ceb828dbd73`. + +Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and [`miner_stop`](../../reference/api/index.md#miner_stop) APIs. + +## Configure GPU mining + +Besu supports GPU mining, tested using [Ethminer](https://github.com/ethereum-mining/ethminer) with the `stratum+tcp` scheme. + +To enable GPU mining, start Hyperledger Besu with the following options: + +```bash +besu --rpc-http-api=ETH,MINER --miner-enabled --miner-stratum-enabled --miner-coinbase= +``` + +Where `` is the account you pay mining rewards to. For example, `fe3b557e8fb62b89f4916b721be55ceb828dbd73`. + +Optional command line options are: + +- [`--miner-stratum-host`](../../reference/cli/options.md#miner-stratum-host) to specify the host of the mining service. +- [`--miner-stratum-port`](../../reference/cli/options.md#miner-stratum-port) to specify the port of the mining service. + +:::note + +Besu also supports the `getwork` scheme. Use the [`--miner-stratum-enabled`](../../reference/cli/options.md#miner-stratum-enabled) option and [enable the `ETH` RPCs](../../reference/cli/options.md#rpc-http-api). + +The `getwork` scheme is supported as the `http` scheme in certain mining software. + +::: + +Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and [`miner_stop`](../../reference/api/index.md#miner_stop) APIs. + +## Mining APIs + +The JSON-RPC API methods for mining are: + +- [`miner_start`](../../reference/api/index.md#miner_start) to start mining. +- [`miner_stop`](../../reference/api/index.md#miner_stop) to stop mining. +- [`eth_mining`](../../reference/api/index.md#eth_mining) to determine whether the client is actively mining new blocks. +- [`eth_getMinerDataByBlockHash`](../../reference/api/index.md#eth_getminerdatabyblockhash) and [`eth_getMinerDataByBlockNumber`](../../reference/api/index.md#eth_getminerdatabyblocknumber) to get the miner data for a specified block. +- [`eth_hashrate`](../../reference/api/index.md#eth_hashrate) to get the number of hashes per second with which the node is mining. Not supported for GPU mining. +- [`eth_getWork`](../../reference/api/index.md#eth_getwork) to get the hash of the current block, the seed hash, and the target boundary condition. Only used when using the `getwork` scheme. +- [`eth_submitWork`](../../reference/api/index.md#eth_submitwork) to submit the PoW solution. Only used when using the `getwork` scheme. + +## Besu mined blocks + +Besu has successfully mined blocks on the Ropsten testnet, ETC Mainnet (uncle block only) and Mordor ETC testnet. Blocks mined by the Hyperledger Besu team contain the version number used in the block's `extraData` field. The following accounts have been used to mine on public networks with Hyperledger Besu: + +- **Ropsten**: [`0x2f14582947E292a2eCd20C430B46f2d27CFE213c`](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine) +- **ETC**: [`0x3125309aa670f5e60493b50884a7e7abf9ebb701`](https://etc.tokenview.com/en/address/0x3125309aa670f5e60493b50884a7e7abf9ebb701) +- **Mordor**: `0x2f14582947E292a2eCd20C430B46f2d27CFE213c` + +## Troubleshoot + +### Check block creation + +On mining nodes, log messages indicate block creation. + +```bash +2019-05-08 20:28:27.026+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=660, Round=0}, hash=0x759afaba4e923d89175d850ceca4b8ef81f7d9c727b0b0b8e714b624a4b8e8cc +2019-05-08 20:28:29.020+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=661, Round=0}, hash=0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14 +``` + +On non-mining nodes, log messages indicate importing blocks. + +```bash +2019-05-08 20:28:29.026+10:00 | EthScheduler-Workers-1 | INFO | BlockPropagationManager | Imported #661 / 0 tx / 0 om / 0 (0.0%) gas / (0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14) in 0.000s. +2019-05-08 20:28:31.031+10:00 | EthScheduler-Workers-0 | INFO | BlockPropagationManager | Imported #662 / 0 tx / 0 om / 0 (0.0%) gas / (0x0ead4e20123d3f1433d8dec894fcce386da4049819b24b309963ce7a8a0fcf03) in 0.000s. +``` + +To confirm the block number is increasing, use the [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) JSON-RPC API method. + +If there's no block creation in [Clique](../../../private-networks/how-to/configure/consensus/clique.md#extra-data) or [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md#extra-data) networks, ensure the validator addresses in the genesis file match running nodes. + +### No mined transactions + +If you add a transaction to the [transaction pool](../../concepts/transactions/pool.md) and the transaction hash returns, but the transaction is never mined, check the [`--min-gas-price`](../../reference/cli/options.md#min-gas-price) option on mining nodes. If the `gasPrice` on a [transaction](../send-transactions.md) is lower than the `min-gas-price` for the mining node, the transaction will never mine. + +In [free gas networks](../../../private-networks/how-to/configure/free-gas.md), you must set [`--min-gas-price`](../../reference/cli/options.md#min-gas-price) to zero. diff --git a/versioned_docs/version-23.4.1/public-networks/index.md b/versioned_docs/version-23.4.1/public-networks/index.md new file mode 100644 index 00000000000..d16d273afd8 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/index.md @@ -0,0 +1,25 @@ +--- +title: Public networks +sidebar_position: 1 +sidebar_label: Introduction +description: Public networks overview +tags: + - public networks +--- + +# Hyperledger Besu for public networks + +Besu serves as an [execution client](concepts/the-merge.md#execution-clients) on public proof-of-stake Ethereum networks such as Ethereum Mainnet, Goerli, and Sepolia. + +You can also run Besu using proof of work on [Ethereum Classic (ETC)](how-to/use-pow/mining.md). + +Get started by [installing Besu](get-started/install/index.md). + +## Architecture + +The following diagram outlines the high-level architecture of Besu for public networks. + +![Public architecture](../assets/images/public-architecture.jpeg) + +If you have any questions about Besu for public networks, ask on the **besu** channel on +[Hyperledger Discord](https://discord.gg/hyperledger). diff --git a/versioned_docs/version-23.4.1/public-networks/reference/_category_.json b/versioned_docs/version-23.4.1/public-networks/reference/_category_.json new file mode 100644 index 00000000000..1f988aef3d0 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Reference", + "position": 6, + "link": { + "type": "generated-index", + "slug": "public-networks/reference" + } +} diff --git a/versioned_docs/version-23.4.1/public-networks/reference/api/index.md b/versioned_docs/version-23.4.1/public-networks/reference/api/index.md new file mode 100644 index 00000000000..852a6cc370f --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/api/index.md @@ -0,0 +1,6659 @@ +--- +title: Besu API +sidebar_position: 2 +description: Hyperledger Besu JSON-RPC API methods reference +tags: + - public networks + - private networks +--- + +import Postman from '../../../global/postman.md' + +# Besu API methods + +:::caution + +- This reference contains API methods that apply to both public and private networks. For private-network-specific API methods, see the [private network API reference](../../../private-networks/reference/api/index.md). +- All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If using the [--rpc-http-host](../cli/options.md#rpc-http-host) or [--rpc-http-port](../cli/options.md#rpc-http-port) options, update the endpoint. +- Most example requests are made against private networks. Depending on network configuration and activity, your example results might be different. + +::: + + + +## `ADMIN` methods + +The `ADMIN` API methods provide administrative functionality to manage your node. + +:::note + +The `ADMIN` API methods are not enabled by default for JSON-RPC. To enable the `ADMIN` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `admin_addPeer` + +Adds a [static node](../../how-to/connect/static-nodes.md). + +:::caution + +If connections are timing out, ensure the node ID in the [enode URL](../../concepts/node-keys.md#enode-url) is correct. + +::: + +#### Parameters + +`enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of peer to add + +#### Returns + +`result`: _boolean_ - `true` if peer added or `false` if peer already a [static node](../../how-to/connect/static-nodes.md) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `admin_changeLogLevel` + +Changes the log level without restarting Besu. You can change the log level for all logs, or you can change the log level for specific packages or classes. + +You can specify only one log level per RPC call. + +#### Parameters + +- `level`: _string_ - [log level](../cli/options.md#logging) + +- `log_filter`: _array_ - (optional) packages or classes for which to change the log level + +#### Returns + +`result`: _string_ - `Success` if the log level has changed, otherwise `error` + +The following example changes the debug level for specified classes to `DEBUG`. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +The following example changes the debug level of all logs to `WARN`. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_changeLogLevel","params":["WARN"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_changeLogLevel", + "params": ["WARN"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `admin_generateLogBloomCache` + +Generates cached log bloom indexes for blocks. APIs such as [`eth_getLogs`](#eth_getlogs) and [`eth_getFilterLogs`](#eth_getfilterlogs) use the cache for improved performance. + +:::tip + +Manually executing `admin_generateLogBloomCache` is not required unless the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option is set to false. + +::: + +:::note + +Each index file contains 100000 blocks. The last fragment of blocks less than 100000 are not indexed. + +::: + +#### Parameters + +- `startBlock`: _string_ - block to start generating indexes + +- `endBlock`: _string_ - block to stop generating indexes + +#### Returns + +`result`: _object_ - log bloom index details: + +- `startBlock`: _string_ - starting block for the last requested cache generation + +- `endBlock`: _string_ - ending block for the last requested cache generation + +- `currentBlock`: _string_ - most recent block added to the cache + +- `indexing`: _boolean_ - indicates if indexing is in progress + +- _boolean_ - indicates acceptance of the request from this call to generate the cache + + + +# curl HTTP request + +```bash +curl -X POST --data '{jsonrpc":"2.0","method":"admin_generateLogBloomCache", "params":["0x0", "0x10000"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_generateLogBloomCache", + "params": ["0x0", "0x10000"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "startBlock": "0x0", + "endBlock": "0x10000", + "currentBlock": "0x0", + "indexing": true, + "requestAccepted": true + } +} +``` + + + +### `admin_logsRemoveCache` + +Removes cache files for the specified range of blocks. + +#### Parameters + +- `fromBlock`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlock`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +You can skip a parameter by using an empty string, `""`. If you specify: + +- No parameters, the call removes cache files for all blocks. + +- Only `fromBlock`, the call removes cache files for the specified block. + +- Only `toBlock`, the call removes cache files from the genesis block to the specified block. + +#### Returns + +`result`: _object_ - `Cache Removed` status or `error`. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRemoveCache","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_logsRemoveCache", + "params": ["1", "100"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "Status": "Cache Removed" + } +} +``` + + + +### `admin_logsRepairCache` + +Repairs cached logs by fixing all segments starting with the specified block number. + +#### Parameters + +`startBlock`: _string_ - decimal index of the starting block to fix; defaults to the head block + +#### Returns + +`result`: _object_ - status of the repair request; `Started` or `Already running` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRepairCache","params":["1200"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_logsRepairCache", + "params": ["1200"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "Status": "Started" + } +} +``` + + + +### `admin_nodeInfo` + +Returns networking information about the node. The information includes general information about the node and specific information from each running Ethereum sub-protocol (for example, `eth`). + +#### Parameters + +None + +#### Returns + +`result`: _object_ - node object with the following fields: + +- `enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of the node + +- `listenAddr`: _string_ - host and port for the node + +- `name`: _string_ - client name + +- `id`: _string_ - [node public key](../../concepts/node-keys.md#node-public-key) + +- `ports`: _object_ - peer discovery and listening [ports](../../how-to/connect/manage-peers.md#port-configuration) + +- `protocols`: _object_ - list of objects containing information for each Ethereum sub-protocol + +:::note + +If the node is running locally, the host of the `enode` and `listenAddr` display as `[::]` in the result. When advertising externally, the external address displayed for the `enode` and `listenAddr` is defined by [`--nat-method`](../../how-to/connect/specify-nat.md). + +::: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enode": "enode://87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3@[::]:30303", + "listenAddr": "[::]:30303", + "name": "besu/v1.0.1-dev-0d2294a5/osx-x86_64/oracle-java-1.8", + "id": "87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3", + "ports": { + "discovery": 30303, + "listener": 30303 + }, + "protocols": { + "eth": { + "config": { + "chainId": 2018, + "homesteadBlock": 0, + "daoForkBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "constantinopleFixBlock": 0, + "ethash": { + "fixeddifficulty": 100 + } + }, + "difficulty": 78536, + "genesis": "0x43ee12d45470e57c86a0dfe008a5b847af9e372d05e8ba8f01434526eb2bea0f", + "head": "0xc6677651f16d07ae59cab3a5e1f0b814ed2ec27c00a93297b2aa2e29707844d9", + "network": 2018 + } + } + } +} +``` + + + +### `admin_peers` + +Returns networking information about connected remote nodes. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _objects_ - list of objects returned for each remote node, with the following fields. + +- `version`: _string_ - P2P protocol version + +- `name`: _string_ - client name + +- `caps`: _array_ of _strings_ - list of Ethereum sub-protocol capabilities + +- `network`: _object_ - local and remote addresses established at time of bonding with the peer (the remote address might not match the hex value for `port`; it depends on which node initiated the connection.) + +- `port`: _string_ - port on the remote node on which P2P discovery is listening + +- `id`: _string_ - node public key (excluding the `0x` prefix, the node public key is the ID in the [enode URL](../../concepts/node-keys.md#enode-url) `enode://@:`.) + +- `protocols`: _object_ - [current state of peer](../../how-to/connect/manage-peers.md#monitor-peer-connections) including `difficulty` and `head` (`head` is the hash of the highest known block for the peer.) + +- `enode`: _string_ - enode URL of the remote node + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "version": "0x5", + "name": "besu/v20.10.4-dev-0905d1b2/osx-x86_64/adoptopenjdk-java-11", + "caps": ["eth/62", "eth/63", "eth/64", "eth/65", "IBF/1"], + "network": { + "localAddress": "192.168.1.229:50115", + "remoteAddress": "168.61.153.255:40303" + }, + "port": "0x765f", + "id": "0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc", + "protocols": { + "eth": { + "difficulty": "0x1ac", + "head": "0x964090ae9277aef43f47f1b8c28411f162243d523118605f0b1231dbfdf3611a", + "version": 65 + } + }, + "enode": "enode://e143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc@127.0.0.1:30303" + } + ] +} +``` + + + +### `admin_removePeer` + +Removes a [static node](../../how-to/connect/static-nodes.md). + +#### Parameters + +`enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of peer to remove + +#### Returns + +`result`: _boolean_ - `true` if peer removed or `false` if peer not a [static node](../../how-to/connect/static-nodes.md) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `DEBUG` methods + +The `DEBUG` API methods allow you to inspect and debug the network. The `DEBUG` API is a more verbose alternative to the [`TRACE` API](#trace-methods), and its main purpose is compatibility with tools such as [Remix](https://remix.ethereum.org/). Where these APIs overlap, we recommend using the [`TRACE` API](#trace-methods) for production use over the `DEBUG` API. Specifically, we recommend `trace_block` over `debug_traceBlock`, and `trace_transaction` over `debug_traceTransaction`. + +:::note + +The `DEBUG` API methods are not enabled by default for JSON-RPC. To enable the `DEBUG` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `debug_accountAt` + +Returns account information at the specified index of the specified block. + +#### Parameters + +- `blockHashOrNumber`: _string_ - block hash or number at which to retrieve account information + +- `txIndex`: _number_ - transaction index at which to retrieve account information + +- `address`: _string_ - contract or account address for which to retrieve information + +#### Returns + +`result`: _object_ - account details object with the following fields: + +- `code`: _data_ - code for the account. Displays `0x0` if the address is an externally owned account. + +- `nonce`: _quantity_ - number of transactions made by the account before this one + +- `balance`: _quantity_ - balance of the account in Wei + +- `codehash`: _data_ - code hash for the account + +This example uses an externally owned account address for the `address` parameter. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", 0, "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountAt", + "params": [ + "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", + 0, + "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "code": "0x0", + "nonce": "0x5", + "balance": "0xad78ebc5ac6200000", + "codehash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + } +} +``` + + + +This example uses a contract address for the `address` parameter. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", 0, "0x0e0d2c8f7794e82164f11798276a188147fbd415"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountAt", + "params": [ + "0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", + 0, + "0x0e0d2c8f7794e82164f11798276a188147fbd415" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "code": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b27b880414610030575b600080fd5b61004a60048036038101906100459190610108565b61004c565b005b60606000806000604051935036600085376000803686885af490503d9150816000853e806000811461007d57610093565b60008311156100925761012085019350836040525b5b5060008114156100ec578473ffffffffffffffffffffffffffffffffffffffff167f410d96db3f80b0f89b36888c4d8a94004268f8d42309ac39b7bcba706293e099856040516100e3919061016e565b60405180910390a25b5050505050565b60008135905061010281610227565b92915050565b60006020828403121561011e5761011d610211565b5b600061012c848285016100f3565b91505092915050565b600061014082610190565b61014a818561019b565b935061015a8185602086016101de565b61016381610216565b840191505092915050565b600060208201905081810360008301526101888184610135565b905092915050565b600081519050919050565b600082825260208201905092915050565b60006101b7826101be565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156101fc5780820151818401526020810190506101e1565b8381111561020b576000848401525b50505050565b600080fd5b6000601f19601f8301169050919050565b610230816101ac565b811461023b57600080fd5b5056fea2646970667358221220fdfb5c371055342507b8fb9ca7b0c234f79819bd5cb05c0d467fb605de979eb564736f6c63430008060033", + "nonce": "0x1", + "balance": "0x0", + "codehash": "0xf5f334d41776ed2828fc910d488a05c57fe7c2352aab2d16e30539d7726e1562" + } +} +``` + + + +### `debug_accountRange` + +[Retesteth](https://github.com/ethereum/retesteth/wiki/Retesteth-Overview) uses `debug_accountRange` to implement debugging. + +Returns the accounts for a specified block. + +#### Parameters + +- `blockHashOrNumber`: _string_ - block hash or number at which to retrieve account information + +- `txIndex`: _number_ - transaction index at which to retrieve account information + +- `address`: _string_ - address hash from which to start + +- `limit`: _integer_ - maximum number of account entries to return + +#### Returns + +`result`: _object_ - account details object with the following fields: + +- `addressMap`: _map_ of _strings_ to _strings_ - map of address hashes and account addresses + +- `nextKey`: _string_ - hash of the next address if any addresses remain in the state, otherwise zero + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountRange","params":["12345", 0, "0", 5],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountRange", + "params": ["12345", 0, "0", 5], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "addressMap": { + "0x005e5...86960": "0x0000000000000000000000000000000000000000", + "0x021fe...6ffe3": "0x0000000000000000000000000000000000000000", + "0x028e6...ab776": "0x0000000000000000000000000000000000000000", + "0x02cb5...bc4d8": "0x0000000000000000000000000000000000000000", + "0x03089...23fd5": "0x0000000000000000000000000000000000000000" + }, + "nextKey": "0x04242954a5cb9748d3f66bcd4583fd3830287aa585bebd9dd06fa6625976be49" + } +} +``` + + + +### `debug_batchSendRawTransaction` + +Sends a list of [signed transactions](../../how-to/send-transactions.md). This is used to quickly load a network with a lot of transactions. This does the same thing as calling [`eth_sendRawTransaction`](#eth_sendrawtransaction) multiple times. + +#### Parameters + +`data`: _string_ - signed transaction data array + +#### Returns + +`result`: _array_ of _objects_ - object returned for each transaction, with the following fields: + +- `index`: _string_ - index of the transaction in the request parameters array + +- `success`: _boolean_ - indicates whether or not the transaction has been added to the transaction pool + +- `errorMessage`: _string_ - (optional) error message + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "index": 0, + "success": true + }, + { + "index": 1, + "success": false, + "errorMessage": "Invalid raw transaction hex" + }, + { + "index": 2, + "success": true + }, + { + "index": 3, + "success": false, + "errorMessage": "TRANSACTION_REPLACEMENT_UNDERPRICED" + } + ] +} +``` + + + +### `debug_getBadBlocks` + +Returns a list of invalid blocks. This is used to detect and analyze consensus flaws. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _objects_ - list of [block objects](objects.md#block-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "block": { + "number": "0xd", + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x02c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41", + "stateRoot": "0x861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5", + "receiptsRoot": "0xccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x1", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a488", + "timestamp": "0x5f5b6824", + "uncles": [], + "transactions": [ + { + "blockHash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "blockNumber": "0xd", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a49e", + "gasPrice": "0x3e8", + "hash": "0xdd8cf045113754c306ba9ac8ac8786235e33bc5c087678084ef260a2a583f127", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0xa7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7", + "s": "0x130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fca" + } + ] + }, + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "rlp": "0xf9039df9025ca0544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5a002c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41a0ccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d86ffffffffffff8301a488845f5b6824b86100000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a49e8080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da0a7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7a0130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fcac0" + }, + { + "block": { + "number": "0x8", + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x98ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x8ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486", + "stateRoot": "0x140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3bac", + "receiptsRoot": "0x2b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x2", + "totalDifficulty": "0x2", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a4c9", + "timestamp": "0x5f5b6b80", + "uncles": [], + "transactions": [ + { + "blockHash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "blockNumber": "0x8", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a4c9", + "gasPrice": "0x3e8", + "hash": "0x675e336a4281b29c619dfd4ccfbd2f930f3728b20caf9e0067284aa3224e6758", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0x2e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4", + "s": "0x50e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0" + } + ] + }, + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "rlp": "0xf9039df9025ca098ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3baca08ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486a02b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020886ffffffffffff8301a4c9845f5b6b80b86100000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a4c98080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da002e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4a050e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0c0" + } + ] +} +``` + + + +### `debug_getRawBlock` + +Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) of the specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _object_ - RLP-encoded [block object](objects.md#block-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xf96096f90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9bf95c56f8ac82d51f8502540be4008303c9e294a68d4c1e3de1b721ad1356bbf827d6bc8cef304f80b844b1bb4d351300dbc7e12342566318001b83aefc9f20080000f3ef25472407fe9c9c69a1470000000242692bb4cd506c409651ab80eb3acfa54551d3dbc9af4493605d79871ba01e474fb147b16b9538d7a59a57738e406158d9cc306a9062b1b7a9f544c35abfa061aabb714c760f2243a16a024811679d402c8822e8b25dfd0038d84298fb5205b87502f87283aa36a754849502f900849502f9108302222794102554afa6b5dbccc86176faef2b2d854201756e8084e2bc7b43c001a04f2398f24bc950db1f5439de3cf6431ea277236595ae8dc5815c0cc671c9f97ca029898786a59c56f086fc0f7a16859f366cf46084add999fe137cbf43693712e8b87c02f87983aa36a7830293748459682f00850165a0bc008255f094fafb56bb5b37c3b0b0ee9d7c31f018aac91dfb778806f05b59d3b2000080c080a0b069dd8967533a773e592c26b1b36df0793d0b9f6eceba34da246f602c2fae58a002009dab32ab63a25b705d9a00e311f7cd5d85e73f9b2c03ffd0e5135c0bb2c6b89502f89283aa36a7018459682f008459682f0983011fec945b9fedd37f0b92e7e282b19cebcf06f57b77c60480a46a62784200000000000000000000000019a1fcc6fcc5832cd2db7704d75efbc800f5a742c001a0c65eb0e48090a8f8830de47f430b9ad11071a62a5db9555619a990d7e9b81738a05a6e826610a5b2ee529a22942ebcd3abd2a8a10228098c8158380e8fcceb962fb9028002f9027c83aa36a7178459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e17852000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f16827000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a004f8666c8e5d0f3c7110994f624d24aa47a1327814289698c3e2777284a5cfdca04ff05f1b8c5beb58972d40e5a7b894d5e28ad2f15a3429c7d2bee6b6a9633730b9019f02f9019b83aa36a70b8459682f008459682f098303644f944284890d4acd0bcb017ece481b96fd4cb457cac88715c0f4db6e0ea0b90124ee1490b20000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d40000000000000000000000001e8c104d068f22d351859cdbfe41a697a98e6ea20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000222e00000000000000000000000000000000000000000000000000015c0f4db6e0ea00000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d400000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000c080a0e5270f6291acc162885656bedf64fbcb904c41951221dc0cbbbdca03bb33ce43a01f08c7ed3c231403b55f37a157d80e121b653baa810add8c02aea722631450dcb87c02f87983aa36a7830293758459682f00850165a0bc008255f0948d247f4fbbe81429d3d164a5c9ae0063210edbdc8806f05b59d3b2000080c080a0bb83dd6181c9a7ae3069af3bdf1820b5e556eaf99e385b8d7b3571321fb2966ba02ac193773704524adcd02824796df83407a42cdd81e786b591eba43c4ffc6c40b9028002f9027c83aa36a7048459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e178520000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac6790000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c00000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac679000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c001a0fc882968005f717a74a2c2fb345f691091cab084f4bd3934358741807bd5a66ea03f81c68d05d06bf851a6ef5ea6874557a221cbadde24f3fa51f777699b5d2804b8d802f8d583aa36a7822c0b8459682f008459682f098303534f943367dfa11e3148a07c2da773e1f65b155b0abe5680b864ad58bdd100000000000000000000000053844f9577c2334e541aec7df7174ece5df1fcf0000000000000000000000000e9e12c660e77a732940bab3c2cf385c843b834b800000000000000000000000000000000000000000006015d637c177581800000c001a0a292e7723d3c950aa8a557bd91dece34ec527d9efe2cc413d582dcd9fc6bf6eba03386ce6f58e862f329946bf32897f7df5d1c8f818fecfafc1223052fb251d97eb8b602f8b383aa36a7138459682f008459682f09832dc6c094ba175fdab00e7fcf603f43be8f68db7f4de9f3a980b844095ea7b300000000000000000000000084a0cc1ab353da6b7817947f7b116b8ea982c3d20000000000000000000000000000000000000000000000068f365aea1e440000c001a0968ed0274829918071d9cef28e1adbf1fd15ec76e5a4f809971e887b4c9f34b6a001ce26485bc7e3ea71fb99866bd43002b264b2ed80e10850203c2f07b78856bdb87c02f87983aa36a7830293768459682f00850165a0bc008255f0946d3b93db4e4078cf6541a68532d00705d9a4da618806f05b59d3b2000080c080a083c831630788e7ee57c87128d18582e29aa51f1f233e91d916c06d0750578156a0549b5a00477f3fb4d8fbf95ba3a636c3a14ff011c1bbf3a717e00d61735cbf34b87c02f87983aa36a7830293778459682f00850165a0bc008255f0940d3a7d69859a0dd6971d39703b15379e05ae2ec48806f05b59d3b2000080c001a0082660b5db2d3a8a58c0b863673ab27f7cfe4c049dcc52c76a00ab45b0358db5a05a7519a2d399cb534480383ac21262fbde2dd85241495d7832dee8bb02c49c87b87c02f87983aa36a7830293788459682f00850165a0bc008255f0941be13f64a2463fc7a76b4092c53328cc965a77fb8806f05b59d3b2000080c001a0e6ee9b85c3b729518524fdaeb25d47f89f6fc6c4d2c4df707187bef74d73f958a0756bbf4ab119805b77466957b5895c1d5bf422c5f65d8a06f7efd37dcb2c87afb87c02f87983aa36a7830293798459682f00850165a0bc008255f094a90b28fd6f8e46ac668fcb688414184a163e2cd28806f05b59d3b2000080c080a0d394dd43c58591e5dda8a7f3a2f4eae1bfd65655b9e9eec5facc6dcb39aa77baa002eeabf3fe9c0a56eae476d2f6452ea72e63a9c9b1180290b792883258f939f5b8f802f8f583aa36a7830283818459682f008459682f1082962494d0f723c6b2226df56fe41e63b9eaa66eb540bcb880b884abac047b000000000000000000000000000000000000000000000000000000000103e9f0f3471dc445d8f209ef546e0d20eaccc12ed0a5b4100007f57d9bc8638dacaf6480000000000000000000000000000000000000000000000000000000001d209b1ea11d77d1ab457eb3e2954cb2b98e77b5b07e2a4f48507af0adc61329ddc210c001a0efa10ab60f3bd1e7c4a8d52a275a568fbe2f5edc9e1eaf386299577ff9ddbd6ba06e62cf2f66b58f655ddd3eae47ce40408445b086f6ea858edb7bd847ee206207f86f82e6e582014482f618949ebf6b12e7e33b8672788e7b2b3330356f6f2c41880de0b6b3a7640000808401546d72a008d6be7aa21be0a43e08e960620f4c40c44010a743ead9919ef9423863c08b12a06a63a7caae4504ee5528e50387ca09974f7124035328a62d1085da2fee6618f9f86f82e1c382014482f618949c68eb31c4d00b94c3e3d4c2887946f8b076b24c880de0b6b3a7640000808401546d72a0c22d48d72c70ccf0a44d0950daf16741838f9333ee0bc5e05ff02b058da1e010a06a20c9f74cbc14c0d5bf3b3c38d3c33a5ace9194cddc2c533afb16459eaa7647f86f82e4cb82014482f61894d531e7aa3c0bee832aaff22642c7a3128d48a81a880de0b6b3a7640000808401546d72a01dbaeffc8e11964c06a722bae73e35bb5de55b8f959592868f2ff5fc13b69bd3a002acadc04665570a2032cdb616de15bdca79127f21302d62db5baf96ae4734e6f86e830176e381d882520894ad346e81c5b26fe563ab1ba2aa4ff811655882ca872386f26fc10000808401546d72a0b6de11598824e338100d5ebe70c0b0f4d6893fbb36f11ad55cf74b2f43afc5dda05101e65e7e84ea9edba6e5bf1a1e07028ae3fa5213240e812e57cf6b29080726b9235302f9234f83aa36a7830137d564748315f52194ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5000000000000000000000000000077770000000000000000000000000000000191c15235c348207e935e72b9151056a9661d73631d1e2c3f89ffddf8e74efe8a42ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000030ef2c000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000ec15abee257256da1a964434000f59ddd45b1ce67d5df44f1c82fd5bfe95c3b31dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000777700000000000000000000000000000001d4b5b35d93f51c8143f6a4cc3d7b320d37ce03989cd88c28601f4ea94cd6554249cff83e4dd8e99a8ef9004b2ac7518996f4784af1f9e52debb6223a697e9652530feda219f333e01f8cd0b31ee83b9c250ee51fde9718ef5fa305cbcd01901200200100002020000400000280000006004000c0020000000000000000000100000000029000000000000000090000000000008000200040000012004020000800000000240002400008000800000020000000001040000000000040824000000000000002040000400000002000080000000000000804000000001001000c84000208000000000180020000014000000000210100510008000082c0000000001200002000000024000008400000000220001800400000008010000052000200000200028000000000800000040200000110000010000010000001020000210004100002000000000900280000010008001000000018004000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc0000000000000000000000000000000000000000000000000000000000034bfbc00000000000000000000000000000000000000000000000000000000002ddb24000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000002e042ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b2a7122720155935f15da0807d0054f1a4c3db2a92ec4124bf590ce7a16594f3f1812f260acb049d01ad534a937840a80c0f56fd9a54ca5a8628ed896d14a5f8b2570f5813e35c990656f6300a1a1849429135ada6337646248f6ea03a7f70ac426c1d805216d154ea5a8e5ff953bc04b71b049b4b5bd549b6b0cfa7f8b21dba72a3805c7093d8589f2d4c55b6211441041e8bd7916daed5093fcebd377c31e810a6499e6e26840e3afadc9b339c6abc86b7f89fc3559f4242d373a71389db20219195f6e13069701f6d539dcf63a049726cdd8cadc412d1c43cf3fc0095ae5e2157dc668bdb924d7d7afc2b4632ab8a0e4ef71941a0a6a65645f6cd8570302f90b98bbdd01be238dc07780ee9b93e22ab87f26170d7fc5531347fb9fadcb65dc2ca20442a70be9e785292d533fa9496308a7b1588b50b45c17ea765de525259f036edd3984782399b46793acd5abb9f49e38b309c2363aead57264ac1a44e6432b81127a0bfdc29f01bd04e7db2b2545ed8426d2fe9b3e561793ec8fc875f2a71f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f11fcba848e01c60438611958101321898e95c8fdc936d31389bdba8073b382e5b1e2cd25993ad31586d7525f165fb25a1cf8c22623f983c025d21f0e52ecfec5f0232a753addaad88340ca39f00e9722f35dd25fbe8fdd8846bfc0288215d0638004009396bfcd5e6eb0c587797ae8297decbca48b02407219b910ce163552ed230438292cec430007886beabe7cdf5c6f9c3740a3dd6c52ba88e6d652ce43f90044193c4a42335291795c2cc160dc68b6225edb425a88d27cae159f77df3a2241fbe809c8f1122d245bf439df0761bec97358b96d6653bc83702b559bde5a2d12f771a2a11bc9dc32580bc3ccf9dfacd0a5379587ac5160b45d333a85cde46810ad2875b406f00438aee245ecc63815528a185e9e2a029147db7fcffcb8875e5259f15c3e467de02e035891b131bc715e54e7e27a7acc437bb9f6f84fa4456aa016b3578a73ed8a4706efb935be8b6abe0697e46d878d9c74e274f2816d2fd88146b316731719e125d227e002af95aa13f468a9bae4ff41a4a6036ee7fc321b3249aed4dfb6e75089ec0656ee4e87e1fffefbd74edf55a20d752a85caccf583c0d9e2ef1040b4d36a8e992ad50ce1c4bd2b300b344ca881725c164886a5f8f18035f6e75e67a3eaa2064fc24ff79897edb624e1a67f34deb414d5efaf4c55d482da108aa2ab7504fd5d7f78d91da5c20230380ec013b910b01a26b8bed8a05a004d52db30b7fb01f16347692e9f19f303f48ea8cbbed2d3a3eb277ddf4e9ed8026af5ce92a618c8942caf28b3249044347e14e5c3c2ed5ec0f9cccf1d11a5b290c00773e12c25feafbcceeb8ae6c25a88c9657c627187af6fe0bfea0b3cc36c908a76f90e965bc4135c8596534f444c91aaaaaa6277985e36248bd53ef0f74f103eeac98ba92c5350e4a0c586c851ad25df982e16b2d408de37c687efc6915a41197df379614aa657ab5100627c47896b51b000cb95505bac77e4e440ecd1fe50252fc98f15ee41cafbf717e144da35f424e141639de04ebe5d333e9df8c06821c689d1ef2abbfd12e8a1edc059a9279db7ff44bac1962b5f7297da5c989528229e98a91a3a2e351f371dfa34d4c3676725baa5fa4696f67f4239b5fe1e3fa351d66aa5a2df992426d94ba049bbb4eea0ab22e3b9a7409f2b6719ede64353f4112e4da3919adc16dcd99c545966256493d2699ae529e365c20515d95c013ba2627576fb75a030ffd25b85ed3fc40dbbedbca54427f8dc2255c16b742b3e2b82e1bb634ae73a402927e6dc424d1908942b9b0f2cc17909ed050defe85d24a1986291facbb4ecf9b7ff66c27f8e771d28ec6866e3d24bc97e7be388013df8ba8f407b9147ed9b3581784003a22eeada55656d2be271afce06ef3fca32ac9b77b4f2420d60e892c95418b2a1b7d3dae2738a073ef105e66c08488e8a91e8ebdb5a10e979611bd29245c13cc4c0f5b33eedc5263edd6c27666e0c3f02161114120230511406f9f82102fd8c37c36d4e383e445df4afc6e7dbaa570cfe05b3f6038ec1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5006f155ac97d6757728caceba5530eb745e72277723ad34268b34008a97a27c370e9bc006aeaca4ac36414f35aa41ff400f698623a447c949f7f004f3c3fdb09f2af3c96042e215f0d4bbb23fda72d4f01dd9a55dbdec930919715a23e2cd772a260e2b91324c244d88ce1b83c92dce1aa0e0c255b80ed9325dec0e677563984a1c559ddb4a544eadeb2a38e8ed7736174a30d2bee6e0b65f3766e0b7a4e4d8022dd9f82493a9b1fadd1907147ac29edeb8cf8c7c58fbfa9b82ed3d9f9f05bfc900e52e29a05ca8d445b5245b16928dd61800ebb63933d9c471c2fb38776459641e9debdc606abf6ccfdf8fb41da88ba0745d96fd4557a879fee82e33df32d18b18d7360529f89f3dea680a5cb0c6a7652ee38589e1997f3e64ce4db1d3c04cd628fc0fd6e7ef1944108d48eb742a28467fa4bca693dbc8f923945256da2a83222d172286c82b1949803c54409de4653f258d0cf4266c83d5675ca9b5b3a3fb322b9c493ed7bff0a6165babb19c94d9e2014b13b099f09894fbcf32959b9d4ce71ddf9d24dee8bc40d6be92ee6e1220d84d68ecf1a0424132315c0612802b477b0acabcf346b0ad5ea329ea72f4de7524530bc00ad36baeee835908655faecd350463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea0908c560e84b404afb45f69169d28348ca20bb4f5693db19304d154f60a91ec4e9255be05739f5dc7e0b420d4bde4b188a8520bf39202f81dd3e2f4adcc6f4b4be16880103e0ab232f509729c91ddf0006d6a099a769b38affb89d7489b3bf261106aec362c77acdbb0a71c3da369067eb0f2ee9866a0bbdc4ee41ae81a88d860f1784565b7b1cdd350e8e12241103ff9d57c86c368775530773bafc058cbcea6309bd6d9c144cf6657cac5084ac5fe63ef038a71b3d79e6b7a32cc70039e182052f5cd5e415128e9ab1f553f13c165ea122d089975c1daf617766e12d9f3abb2501571eefde182b767e4b63568d37a8c553671adcee2ee4c7c6d77493e4599cd70d002a718fe0d7c31b7df3893f8b9993c90d7d55eea1c38292f1eae3a7887cfd182977403d5c029a42809f2c6fb8d04aff1c60106ba36367ecca0699866e5ec922ebaeffc4e624d0cc2c748f9c446da0c293d8ba7a28125145ce0936a2dd47172c4502ccf050145fc0584ad8608ee8f6c34c3e718fa5ca616722c5b3549ddb5e2f6a96e82c3d706bf255afda0272c199da51f9a4a869ce8b164694f6ef7593ce08b4bb0afda822eed4a0a7863f532fc0a22de9de5d3456574021b711c42eb1c9190de35ea592568f8ba5528c0f5fadc38e10b14a89a1e49fba9a76ca2478dcca20f8a3c78bb3e1b9869b7375d0deb87819ce7209ad4d73d84a92d08d23649bb50ecb4a1763050b7860afb055461b3158647b453d7977bddde0fac9415327e7eb2ea373fc8abd6793f576e72a47c92d6f6e19fadfdf2c6912365b74929d9b483c19f5146ac5a8dd943caf50b2e0a95fb19066a63a71862a540b2e41731ea66697094e51d309589ce9d25a37c06c9a12839c4c08a050a3ff9e502514f20d573c610466ac5399e11b0153954428f25d16958ab48614d34f768991f84411c401e6900fb0dfaab4108db0ad42fc9ae0a255e60fa4d92747ddda47d07de9f847e7a2be289798c5d34924aae419abdc41d30fb095c6ccabe5c5d5be73ec6197371ea74e08f0583b21901bd748db5348282cabaf57d883f5c55311f1304d7fcd30a9f0b22f810b1a7f089860e4ca0f23ddce9a23d7167762734b10b995d5bd2cf3b31f8f24b18d0a2f7ce1101d3a32d18988f162e91ac94b0f521f24fa287b0d2b97c408079336b89af9e842cf31886c701018ba98d5b0eb0e6d41b67b499f4c466cb1412db0e5937f7ffa83426c9234c713096444d0fc65d1b45f166e54d2a54bc103de110669fbc34555a6d16714ca37651e976b06a7ee96d80af9ff50162016a998451e2ce5819f3346b1fcdf6fe9ff3ec8420d4860a9980ce28fd8c55660983a3fb02cbedb5c638a49e5cdf0b69b71d78e071f1200608e235e6ed0ee8fea5567be12018bcd026412db0538c28bcd4a9afe799d5c677298646943c4200a039d2fced71d985d188f84dfd3132b6a015c50b8a60d712a97c89e0cd7d3a1740244c1522b117dad1220463f5d4af1004c1a2ad6b5708d7d6b28f8ae1e1e7dd1b2d3798b8c2e27a3559c7202aa268099eb3bbdf7c42d0d20b47e5623dba8e6aa1392ff532113c32bd836f4160abb287aefe648aaff6bb0a23928f580347046b64babf354790704538c6ce83f117ac7e83e1e0f54054466cc82b2144cf135be31f24f1b224e2a956827c303b0d82964e284b968c5ebe97688e49ca793a4aba81a3d36eefd8c12e3ce9409be63c3a308636a7b296b804d8125b4f29068ef44d3f2a3c9eb13e61d6365bb96d6973e88a70757b1d9213511d357d252df58d1e848d534d9517165263e803855e8caf387579f1ff0e7e9c3c8e532a2025d8016b70a45c24a546f0b21acf38d16b27eae6466e22396097090291184a7719beb4a55beb89275c6893e01f2075d3b73e165c39335d34a5aa7b280386e30a6df9ba917e1dc6774e2edaa0c87e8f5fcf89306a6fdbcf8cf52cf25f5df473fe350325d510421546765acd00b34ef53e56b01445deea042282e7d6ce20c8f967204c26bda9f2596fa378dc611091ab6db9e1e8d4e9b5c1cc4c4d6ee2ad82b32d08f8cb5a9dd9b03f7aa754f2738ddf2dc0c3318974ff3810765917c251c74ce3d7132c26b5f2ede12a6f62f2e8ddecd5e0d02f99f2ed8ac15641c586d68e093fbe80cefd6a7dbdac6d43e261160807eb82fc2aea870a22b25148d256a083325a5b97bcf0187f748b6c0a1691867344efdd53809fb9edea57669c33780a4aa9e65149937817d3d845d9fccae1876575d5383d06adeacd0f3371209a30e1a9c98446174b0b98560652d0643f120bdabd5484435871b42ad0ce36aa8330c7edd26e64e89eb84e0c72a2c6e49fb24088ae2bdaf7ef07af9bfe381dd6a9ed430a553de1bad4dcefd5239b389090925a69e44e25800d9fccda11ff4e1e4d3049386397f1145c3595ab5115255bc1c1eabb379a37504eda27b1a103b88ae8f174e1d182e3dfbb0b8317d05d6e08c191661b04537421fd84057a9ff5a6eceb68c5bf1f0e356df6e93d936bb6bdccb42127cba43e7615d522242df13f08e5fa162a641430c1431a7d7181dec65202fb618a690c2bf3361d7dc689d5e4a97a550a9b17c8a5ada8f32db3f774e9ed047c02eb7d1ba7add29fa07ab90f290e77bd91ee9b5208b1fb19a37f29dd1a492fa32156a7d43146a336fe6144d19228f975c54ab304565269124e069e864873c0eef23f2e7b012e84ad0c71d76e1b23b8b9a0a66edcd59f4b203a9773ce26baee206254b49efb10cc48bad814b2e299bd478fd4bd8b1ae2c8bd99070b259a9e204e42fc5f65f9e25cb4e4a1a3b67872314fcaeede2abbbc6978660c3e685f6dccb53160d1f7517bbda54177495c23fcf45cdd66363a70a84f2699e239b5071c9e6cb19069f3e0be9f4390c8028ae9960851e34ea18ff88d36ee826c0a4db4e33e94f0ec6651a728a1a2b0c15b30a1783ad4b1d224d87264779a817d107d40c75b77c25addd7b7d6a8b73b2d551f125daed95786920c4130d2061178604f9604a0e2f1c6cdbf3066fd28bf276ee0aee379bc049bc8eba361f4052bd2a698da312c991015c0fbc43ea1d2e72426279fc5181851a15a2f4883018ab01ff8745625f388f05f5fa9abc5d87a710a1227322626115b60f781f4ddd91e205c1cca582a5e37e005396703375846be4f36fdb76c277dc1a2ff1f183cbafc6db485a562f4d08262a207844a3d12261fa0ac479abca76f417df42b037e611b1b6acfda94d5dacc620c3edf5744db24bcc41ef1722dc0e620f8a35c50585a7cecfc97f05bfec21f919420e62a9c4f28ea9585cc056aee08ed8891d077a9647d9c0b5c3141f8c517f13b05bf0a18b99111d2d6e7b4892e78fab35d882e4e153060f0c44cb946d20ad0897a34d2a24d3800b54acd68fdd797aa362560dcede6d12909948bd6f4726a20142eec9c6b78d224b2c24885490bfb492217c6809e0628164579d2c2c16a90f28aa5393ad44c45d4e1500fccdcc684023d7cac4e2cca889333f048cd9a29de018e958d00553c77c74ab50d974df5f654233fb923e809ef6ceabe6a860386603003cc376e90b8bee74f2477343a5ae923aea4ffe99a91b9d9289ddcc3ca316b026b3d369aca474b7941588fc6e9cb062528b10f13b90dd55afd64f7b0ab79163163ce02aed379af25740ac5e37c5628c0b868b7ccfed0ae521c964846f0287d3006952539b2dffaf891bd01fe98a1685e71536d7f33ae85775d11545eb379e0916be616206968605e5033267f6f79cc651c2ce71a790ae5cef19fea7604e479c0793f82db1f8e85bec40d8c6a2dbc9bf76d02a616aced611ae1a7a3756d87dab2855ca585d0048e1e4222ed9d6fa24e3e13677256fbb9959b965727c192696a11474a7f6a6b6c8efb649b1f601c76576f36996ec7a20eee84208232c20e8502903d4e303e4ad7139c654b7e5d2aa262d75672cbb4f653e62ed8e4d28835f7d6d0efb3f39c40558d9cbf19f250681a5c8a59143fec80d6a69d8a265835d6562ef248fa4ac508bd60c9283f6e731baa786828d0f7a635e1d14a448383c8b0243570df4a42799afe03143c227e3fcf0b1393bdf8bacbd26f1041d5e3112c84755942fac77981fe16f048cd882243a8787b09bdc38847a5a9cc9aaf4d30544181ff014dca8b2892c00a933333df6d8ef79041483f2d8c6416897ae7897ca1da85e8f0a493be4520595cd0dd7d32c87999e703704ba0ac7d8b444dba807746123100e2cf7573843a0a755eebad6045d2970a0ef8c9adddff093e79731d5e506f1c43318fb25144ff5fb63041574e89216ebe0ac75d7dcffc35d095691723493c94dcc11d4480bf3fe7b76ba53cae5b409c002f2d1bb5eab08ac993054ec297543798700fe3e2877a4a0cce53599a66eb4f1fef5cafc774277f0e694ebd7f8748fb5140735282e5e0b9bb35b8aeb098775a33820c9b8decad3ad6ce36f79c347dcc2c60a5442d2eab4368827acae1f0ccd52f0475fab95ac57c3c9d7c2649d355756140d5a1e8c6eab8b67a5c169cb899230c4be1dc702323f2b07ee1fcf5657361e250ccbe93bb403abd857eee4335e454e8485a3b055c908c957dca3f9a288299729216103089910386fb994285602ce12b04be1819a2c80394b2410767d9aabdb591e4c4dcd08d1d5bc1bcb532496ff1fc968ac3ff59bc7266d8ecbb67f34b681331685a99b781c9752dfe83d145bd4f3c8ec634f028e850e246aa81f1d03aef40d000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a0bf32b9037b600aae3ecd3dd1838bc9f18ae1661f615cf3d70bc270b6c31f55fb80808080808080a0a2381991afea644ece5cba0d8d69f838f7b123d2e0057a54509e0c61e8b293028080808080808080b8b2f8b030b8adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a0529f2d89256fc038782a4d70b40bf127de906cbe211e7acaa3e928e0fd5cf11d80808080808080a0b4f4d0be01c65da5308bab41d52d8a7c93a1693c170c44d1f619b8364d40e3428080808080808080b90190f9018d30b90189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa50000000000000000000000000000000000000000000000c080a0ae5e67673b90f2d6802e8dba26aadb2e8b81e059d1611afd1908e743e3c0b75da004886b0ac3a810519aa2395bffdd94fbcfe4a2de989ec95d1aea0fcd09afd931b9235302f9234f83aa36a7830137d664748315f42594ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000007777000000000000000000000000000000010012f20d5ba20a09e185d452c999c129d712b83c75480e2e029fc895986d361a781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000004f9456000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000bbe20eedcc0216c615d3a0550a5507bdb2f9912eba7b608300486e871a4e42491dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000007777000000000000000000000000000000014852ab81d236f35c396d4836a6f82239f5672a4b6136ab9ebdd8669a9f9e831b87a26944e5c04f16b79426135ac11b155922c14178bf3d1ecbb1fb12ccc8119a22df5003de2d5956c745f9e825a8f0ca1bb1e265d4d431781b00765e0fe37280000000000004a00000000000800000020400004002001000000000000000010000000002800000000000100009000000000000a000000050000010004020000000000000000412000008002900000000000000000000000000000000820000000000000002000000400000000000080000000000000800000000001000040c0400000000000000010000000001400000000081000001800800008280000000001200002000000000000008440000000000001000000000004000000000000200200040028000000000000000000200000000000000000010000000020200290004100000000000000902080400010000001000000008000000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc100000000000000000000000000000000000000000000000000000000005364e600000000000000000000000000000000000000000000000000000000004456ed000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000002e0781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b21ad05b7c1eb0d208d17426c52831c6347a8db75b12bfeb2970c4dc6666e4eba0492d2ec318089b11ee7ec6087ab6a3df335770526cc0c1679b764d847b4ec1e303d400c12e690aa26a3771e5676e7ac95e2dc7a1b33be698f077c598f880d4203defa26ad36b84573e923af347475c7c7671be245e9859ca1db3c047faeee4b1c0e81d8a92915c2b94ff300e18f77f70ffec15631161e0bc3cdc9143c43422c208187652c1ec83c5d282e10587216eaf56689e5fe236f72c13eb9574afabc622a739cefbbe11aaa4e2e3d4c5415818914fe554a07be374f565d9bcebc0134940e8921b87bd4f6b42a6432e6e176be5ec82bb8eb6bdb7e4acc1f1e99725bd3ab2e3fa52e02c2741dfe6eddf5a3846dfd57f6a72e834faa048cb007826a293d9e163d47f9ea635871b25afcc3561dfce77b3a2604b3c8de90aa24916f41aed62d2e0c0d18f9c259bf614f1321c5b7cf7b5bd73cec408dd85f046bf36302e20f3603b7832071796022e893386de4e3b170135a591b1a44117240ba85876dba586b1f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f12f7e30e74b0329222f6067cad3b4324a80f570506985d729f7780955333f40e615f065023fb607d975d7a2b9f234137e72260d8f6b586baecf42819f8328dfb3304441f2c9e97d1fab9a3625073ac3d2bff6ba2f8d659cbc6f66e8d9afde1ef229ff39bac1ecd65eddc4953e2726a72daefa76f00d58e11c9a9ba3448fbe0d3a03db78d70ed9c574ddc45de5c73efdf3113ee70a4b42cea9884f85c1b995516912800abeb70f3022d5de6d9f49469161a36a6a309099ca43e388908635ed4ae825a14b7cf5213454a1f345497008ed417e5d33ef84c4934368b36f27606072192a1b43396f89647f0541dd25f55b42c5295d3ab2a22355664608b8dfec3c9d76045b27d8c2bdba7f376a44826bbf4044aed0d57068489fd32a2bf52f8613aa150185aafe655d2b86bf8867a6f7728c4133fb95776545b19767a0d7144f60f5ef038eac390d1cac6f9882211d7302137efc82b93b8f9c55db629f47a2c61931c21d01d5ad967c9dc6c1abfd496a74df2ac4714cfb027bc4d8c0153543ca663ded2af64f7396ed3b2ebd1976386814e94b7f7fcc3a19a4dd876288b905c381bc8f008de145083d6404890a863e1af1dd897aeef2516b20df50befb6c708c9728a22cb31d80b0e953aa71230d2462bb0668dd8701e11bc5240d85184f9298e2c5a3257b5dcc3e138df8b7d4162d6253fb5c21a65e952600c8764c613c6f43d22c861d4380cd688c286e9ffad6bb8582421fcab96b075769cf48b3160f056dfac4041b08287533a769bed0f08fdee9a16c5c8f414eb35830793c7b64341fef79dbc529a7b99f85d4e2e88b64954be967c5ee6386f9131b80b454ce70209f78f2101d0ca71da273735bcbcdc5ea5d3d54b607820b9bc852abb1b733cb7bb5018276d30c4c0a7f9ffcd318499a2041043494b82456ca8ac6f07678a8b770329b7c00f31e70e97ce48bc796570be27577e8986ee4c7fa51da44bdecfddfcf18686cbddc02ca206d9132d451ab55cce8069f631412ad2ae02b1a8245d31c0a65854d07370259f632fe253b2412c5a785148248d660d7cb6bef5240749d6ac4a4ac59384b27e7019c6cae15ef7c82e5a952f4da079b6205f9e16f3d3c84e94b490530c5b602d4bf5e9d34f2a785cdb7f7755d6d467a9d88071bbdf8c79195730db7d0b7872cbdcdabab02bd4b8487b726c5ce6492344ae7e900a21893e7b840b46380ba99278ce95322dc23daa97995d1149d425952913428c8ef8659dd2cc2895f12b08e0532a254fd5674fcac1b0992472ef75337d8d77f6fef3720d4b7b17302478c7d2e3b8dec7af4c681aba5e25d8aa3f4382b0082066c3f7a0b4e42c4637df90d9a1e2f3fd1cffa7e0d5577f5da89353521ed02cb1c39eb5746cef10ceb74c3fdba13199b42516ebfe29af40da64ad81b46b7bf04bf25994255c7a51f6839848810025bb52fe7500cf1ef628a07747894e3b73d53e6b2997d0654f1ffd0c070455400fd7e9d670984ac807a0f8131977ed1806fd3c0927c34b7b4dabf011d31e86b1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5020d266b1ccea774955484405f58ad161251d879a87c43d5dbaecd976ac5d04dd2586d70031a86b0dcade14028f36a04508494c7a20e98b3b21f7765e7b3ef68f10960709e63eea35a26ff47424e18df8cc271ff3049262c855d6a131695a395f2ba2f1b039012ac8a2abdf6d9f6b0c432f0ae78b9bccb99f89759434477257ce1f44cc61e95b9c9843ec8efb17c640fc4c837ec125fb25323d3f0644615d21721607fee4d68e2dc9bd29f5b13fafe39b0710d0365dccda35e3c937aed1b6949b2a0a7523011eb706357b85e174376ea7cadbd01ed0dd1bc6a8e5a5a11bc6131f0661dd6365b13c6e2de50b98cba1cde58a921d19936c711424eb625b7c35cba01a0f7dfa8d6f86a2a02425ab48e2c28f8f2f61adbb744c221b9c4f35b16c749c227bcee1202e87537c7441f421c855ce87d858a679f09dcf814bfa1f26f7d9ce18f723d2f84d4b25ec60adbb6367e92270836d03c71ed43413767342a4fb8d6801b8755bf65e7947ed4459ad6486fc1cca1f1cc89df3d307f01d8ac68aa1d08d18aa35a46bf245589c599eddc6337e764c36426f7b7f5d2afde0a76fd3aa536d1a165f9f23cfc65866f574f2289aa5be056dd32c72a204ba8328dd9b0b4643790463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea09160db3fa7477a2fff436ecee95aa2d51ff42ca9d4fcf021b6e501410fd41098a1a8f6021636ece98c27bd74740b7280d3a5e13d9850fcf7f2118c4c91572ba5826fcc4b0837d0b394f6683cba38fa35a5e2bd242041533bd25939cc873d1f5852a2f57cb172eb17c2e3c351240a0b2b334978b90ac18041b09aead26649b1c1c019e41731e77c6b2211d7da94630507bad027561dc625b7e84094378e599a57b09eb32c2a67cf5f2f0bf9250e6da07b165f97dca10517e9f3fe3561d02ec83a722b544bd6e25ef27d9825d13651443c4d984d7e5d0fd70c2a7f983b3ae8c698d27a2a0bf2d35655f477adc99c56f48773922831746f8af58de941a020986ad7c23fb7d31c2f17f305174db26b40447e64c66216dce98e7a8316dd91dee468e602206a4d1d18fa7827f733037fa87dfc9c74c9df0960867087c776382b94db9420a19e5338e17e8a68cb7621f0b56984610bedd3d9b77dc5447cdb129ecc33596079cf206e93904368cae07f0d449e2095f8abd95f26603d2db047647babc8342200be0095aa5489fd18cd00a52f59b70ff04c4b1e572db76d08bad419abbabb00b9e485e3f017807c12b427b5e0e648cf7b16065e313c1c073ce354a5fc6812c02b8d4b6aa1168c575dad9875087fe9f61702309febfb99b895387cc1104c35e123b713019b5e51c320fc2521cdb5cfca20f617773fd46d3872128b87df6f66a21fb3fa16711245ab65eef629c5e6073efaff5b707657f4442f2eb2637fa71000f14fc691a71aacf902c0c1a1a5d7d8d351b8b3cad57acd0a9e47a1abdcaf2b70aed8b7370a6bb2bb4f3d679c4f9793e4b256deefaef1e6dbcdbb648b917e34822d833d2ac1614aebcf360d328d9271f27c52c93de4a9455ce6cd8d2140ebf6b21c9b172cf47556efc5dff9afb913e328a708292bfb65c96d668f4d0b3a9a21b222039156cba9980d6bf11efbd8dd893378e5dc1b323c57d8f702076c22d125d1489bab2553c5521631c35f7b5236007ce8f37012cace78d6eb39718904b5dc31ddcb6f4f175e52bcf6c6008f6f5a572925600194b9af7ae074dbf85119e3afd141b2ff2652a58f043e97f11b77997a9da1c96c18b5254a107f24e997a3ea61c2069b9d04d49bd1bcd2495b19bc71848f28bfb4f0346b682a1b474e040b056e60a32b5e8aa532103101cb45ca41c6a690c8688523b8566d507f29eb44fe2d2490e81f4343ca61c8783b83e40e3ce66532f186e9d09bd2667cf974a763072a910121aa5e86e151d92a868508b680f795bc30b4502769f41e3afef5f321be9ce2f1cff3eb3308d65aa0ed780cc889f605f35eb5e02ba772d08db2579f8561c61fa09a8e23ea1416fb95ca0c7e139ddd16f04b0c872499e44cb5a03868d6c5fa1300c19a96b8586b8f33bd760c6350713696b7d3236acb0eb35bde2e6378e9ef9b117b02290ead7824d42452e332f6ec95a7f871da9ebdf6ad02c959a1a36ba33ff0089a4f5217b7bfa5379a507b1e994fb7b8fef489f1f2cf6fdedf0e530635ef31faaa1a37457c445836376dc5cdefc7770fbbad8c326955655efe4ecde89bd2f1dc62a2551a45206fd7d42605aa1c0fc80476b741bd7df1f0f2db0fc387614240e78427bb3a8cbbaf9bb112da06ea6942335f88c65d42d17816136509ec39b51079b5eb2a8cd15c3d1fbc56dd72c3499c101e2fc9126e8f194c6c8006faef30917c5e535439c6b0d78be52a4d17a3a25d0878649b668db027eecbbafcfac7a612138c77d1511f9cc5e763eaddbad6d9d8770705ef7b4d062b4c6dc72f30d1d272dca8700ae03a4c6d2cc6a0a03f9bfb2615b2b294515ca80827ec9cbaa7746112530f5e70f236a641c05bbc8647dd130f02db3561f9dfaa1d687235bccb0498202af478a6070dfa49df99785a61eb5fe5f18777569c18b08d2042ae8639abbc225b832a2fbcd95ff43a3fee4fb2962983af8304ef995716110a7ad35c538697c109c01c427ca6cefef3a842fcf74b1c49a3f2da88b85fdb1d05e20cd567538942fa2f0ffbb5d2ff73d60d562d9a0a6894bec3d85a709b43e42ab64e2306cb96919e078b899f3155af56390d06ddc662afe8d2c91fc091e2c5cbbfab3fdb3f49423a5a5f7741f2d70c6736adc66e7c2caa89c6bbc678bb4b445a8a63d120867f01f164dc87adc853633ca7bd4b9d585c2a637d1469da612b5210476fc8d66f90029bdbf7fa5eddc8335cd23deb4bb47e1582e64a03dd021292d34435419af80af178cdfab0fb9374fa0fade48108cd3a571b814231784ac37c9f6071fc6ac0bb018595c9d8afbfcd6f31832b2581f7f7ce7c45d22817aab8ac6df0e0995e12dbd1595c3377b707b816c96ceb1893b9e7c747a577bb7540b89eb3ff7cac878a7a121a37b38fcd3248abfd24b50e25948dcaeff8c1c7ab8b745a93adb87cd54fca223dd940ef4d7eca9dd69243c74ea128ed624e52c7a2257f3950d0c7409d665d912495f8a8a2cf2482c1d51cd7793d3d31f32ffc24374d8606daa2a423931d97019ba2fd3ba773645b7fd01cf75e8201dd29f694a72136b585d940bff8867654223c28d0603d85fe4472d93ee30e35f46e27b8f40f9a9ad03992d9ff23305fc062c7d95971baae1ab074df88d41e09ec9752efff012c482e0cf9aea2b78cc26db146a278d584575ed615f5d168e6df7a832322da093f0aea706cee594207427d3005fd910843f3dc54b14f8b187e3b495b7474792743fc2e43f62bbc7fd50a76513f1fa4073b15a42d1e78a708134238f2521c749d086deeef512823b514aa64122b365efd51e11415de40826971c234d571c3e2a0507226c6ccc540e43a9aa32244b29784ac824c20d3d1b72dc7262f61cce4eefbe9a4ea4cb1061e4a71925aa13f31d6ce80bb7c56bf47b91cf107ab17168dd4fb60614757d7c7f4ebe0320692235fb502621ed9b15b9b3fa23aa1bf266a2a2c3f2386b52625e42e0cd85c37319e3266185419bcf6dea997e52ec8fca5887a68530002fcc5b3619e88d4dc9a918cc36bac2416ffa9b9734ac4e67a93a800f36d7aba4ecfed8d65f62cf6ad13d184a8c6406e3ba17b8aee6af0721ed091e1d225d044629a4ef5153c294a3e87e243e03bdcf6eaf7ee56d9d969a1f054d5774a7e2c363b160386b909c89717aa7015385f4ab8b6c97805c12c37d981ca945134cb1306d39a4d136b42c36d8aacd2c37575a11b17fa50ede8072d667f64bb55e3b54aff2c3c61782e442e088db7c1ce62287477132bef00c17e9992dd42f35b5e098eb97724fc4e697d75812635203abe8f96000d9553012be065980fb16d6d1c0c80457585c6eb699b0e8a6e36c1cd518dd1ffc517afcb9114a4ff629d06cd2f0be1495c4ee09243e96529e6c3a228c923ca2a703930ea94f7a5803645324ba9ea1a08e6c3241fe57a80bd24f780566342561189baed15e85ba9257b701d651754ff534e51279961ff379974e34010d80773b169a140e0ee7c5e2c0312c9dee46fb7b309710d448a43805c7eab513e84e346411b7145f77ff4ced7b32eb641528f78d88af0fe88e0840e9c16f2210e18c1da605bb04a4c963441c06fa839f722b0c67345168bc0fbb1c826f20472c7551a1327eae9eddbc24e63814fb81320cbc6f03488d64587f3e5f53c03db02cb15412e622f9ec9944643d4b5530b0cd4d577489d8ee499ecf2b74fb72423412aca8530fe53c3fc584ed8e39f900843ac73e36fb113c343cc197cd689a09e12f29203c1dfe839630f6932f3a29de81ba787f6044e70dff8981b71fe82f8a4d01f45770a53b090026a003b3e639eca0e6a1e5bdd0aad456e89d83012ea1f53e1a5fe848b33528f7195a7b0c36d4315f1b96b62d5603e87a13e12a97ec335e3922d4339d9575cb26d5691da78a738aa5c84aecc22a93033a6912f84360d13e2e23b0185bdc2cd331bd26ababcc91894935db5c7e1800b8a10db884a7614ceea91f38bbf623c5e7e7238eef06cd9fc9e43507c56e8d6212b7d03ef2db0dfceb040c0b206e1b7eee6ae564b15e4c02e9c3e4179d78bc68a9fbc2166cb8458342f218dc631705602b2ef1c6716dbc08f30810c9e2ab3ac7a03e300e9c21cd2a0240025ed5eda13e6daa246241669acfae65302dbca5c579d3b5c3a4c16a976209e22845337f9ca033329f849f3ccebc69ff01b301d99dbe9e79058fade67bf881c70283f41eaca130d1423e733ccd520f26ebbe8d304cbb8fa2f4bf67e2e041e5e90e840d5510d33a9f700219fbead699901ea3b3f8aa3d5ff0c028ceee5b5e711c29e7740bc98f4b78f15f2aa1e01449f1f15e68023861f540d2ae0541273c641914ea0e6abadbb2f11618bb678c8b7abff1f6d4e9f789706cdbd8dcc1acd4bbd506e42e928d134366d3f32d8caa4b86736bb065b1a3f89354835b7ba5ae1e53cc1bd9f5dfa3e0d49c0a0a8d32670c382712e30f8f4cb8fc980785fb6012df752e02c923d3f56f5764a41629646f9fd7641c8365f0917f85a64d0ba36179e2c2b3045d7b3c6ccfdb60cd5c365c43d88e231465c6616f7d2cab0db88cd79268e5ba0cecb98875958ee3827af7842e35d9cc89c3776e5640f2433a6afccf0e6fff9321e31802746639bf2bf77f375dd6799baa184b48815f24d3fca5d534dfe61d1306d15e97d3a320457ddd2239cc52fb31dbf98709cf090ae59afabbda6da75f4e1373a28bcadc2405e0a7f6dbf9a3e26511fc600a496b4623593213283a1fd33f000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a04dd5a916917c46969db2e2093e73972daa52d5582e183eb0bd08362e7aca1dc280808080808080a03605d0d2c4765be29883abb71f1c4b162f9d6786835ccabb068a243ff819909f8080808080808080b8b2f8b030b8adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a087eef6c6fab228bc280138441d870592a3910f042806b16f257faf5f1542f9a280808080808080a00ac60a3a5bafa4560edb7bd978a6b8980fa818c5edea7c010986328de4d9b4ba8080808080808080b90190f9018d30b90189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d67440000000000000000000000000000000000000000000000c080a0d86a71e8e531bae3b2a2e70d98e516ccf31b6583d936ffa31c3772ac265db828a0420f5a8067c7eec5214117647da149eaa4e7c78a10d8ee6fa62001ee1b680f9fb9060002f905fc83aa36a7823d3f647482a9c494bac000000000000000000000000000000000000380b905930001536cb8da3dd105e94414690798c7f100000000057b78da8ccffb3bd38b03c0f12199bb964b426dd6b091efd7dc3ad1a9d321d1713b2ea1189d39280b4791c5c858729090c3b6182ac75951eef74b38191686b35c4669656ca9dc5a0ce7e9399f7efffc03afe7fd6e7485887f6264e97e9856a6978b65c5db3b4ce57cf4812abeba0de10d0d6ee5a2cbc9885a2163a58d1895524adbfd86d795eac74ec74d783b599861bf4b7b3e6daf70b3ae0e5740c88a4dc15b893f76fe074a718bcead52fb2a06d6e5f1cf3ca344ad05dcf5ca10bd9bc2809cd8ecd40a2dd0e03200dadd8f921f0e9953a7e6d8c7dc99e60cf6fe81465175e0cf99b702ac6a13706e64ac349a1119796eb0b6e7d5ae48ad74a5c997d679ef9c637c619587cb98ecf88e620dacdc57701500c74e087533f978831a78bf3857cb6044a8c66e41645cdee74ac7cdac69a8484083eb003827ccfd6b92c77b7097a15f38a419f6f0578f3568465e6fb639f1a8d6e52e9d17a0413100ca8d08b210a2e5adb2bead3dfaada14b2513113802f3996daccac89014dafd1368700300053ad7daeea2a4d4d9e8502aa44337c6ff91165a25de84fe5273b2e5b7f4dda3a0410900125e7778d5c2a59a2ca2ce36bacc9e95812ae1b69a478fc7ecf5ded14b68a80a010d6e03e07137d5de8082773f8a422390cd0a592d81e6e623a42bc69547e6b343e1d9a14e64ac3486116e29a8315486a2324d93d3e33a8344ffdbc2655b76dbf72077e43c13961a6a52f0565f2000881576c7a113e7aa6e9a6ed4679014533f8d1bf80ff44ae5599813e80d2c1f2fd0a03400864952137916724a4504bb118ccaf9236f217a1e43c97e471397a3f86672226dd0e02e00d4dcbfe4dd250a97d0c830b3d93213fd048fed38ea8378018c726be68728e22c687037000e3bb6d2858fba82db877c2e28fa1e2cca4ce57b6bdfdba7513dcd2649da93544083d06f85c8f4d21559e8e7651dcaa0c3aafc4a691fdfb27f2f39ea08ea62feff43cf0d80061500b0b00cb246f3641d83f5c934c477ca641a5c545da8aa0e4662c4c5f26ee70525a04125006cf268fbdcaddb151168bf24d3fa2e09f7445d859ff9e5ba2fe71e7ef8861ba61834a80280ebddf1bc99e8d00ae5d2a0893d64774d4cea1bad7146fc964526b6c4617cd70a68500d00f7e8131b976b9537ab4e2b9c9cf086fcfd82e235cf6c6eabbf8030cc3fd1e395071a840120bfbd7fd4a54397eca0c0f7adc1231dd539950f508f92e237e3aeb91468c38d4083ea0068a89abd38178e2e9f67559758419b6908d48d58967547c9edfe98ba016e050734a809807957936c079272b238748593ee3a73f5c7647d0ece20a5c208769c484474aa2f192b6dcc780a770c9b40b42348219a34a746cb495f3f1efb710a816ac142121461c6f7bf82fb00b0dec5bfbcaa2e32983075c84989e439154bfc7df1d0549680a6c1a4999c18aa010dee074028fcade2995b7daec4562449ccbced0caf7a660f49ac4ea07d485b22348948a0415d001ce8e16f70ca5813141f7f7544586da1364d2f77dd8fbb7cc937c6d46136f93d68f000009a72d59e5a9bdf1de5e60bbb17358bc65e8ff1566fabad6d6eb42ef2781f6d6d40837000bce21c64847942319b4ac1c92b2ee02fe2bfbf43b685908b92a0c3cd25f21641a0417d0084138599419cf73489312bda0d53e1fa748e1f7927380961470ec9fda73b36978c953661c8065aaafe09fb847fb54e35b3c68f771b6953941b2b4e619b486d81761ee187bf828700301cd34529763c60738c12e1ccce6ddff8b8338cda8fda245e5d8d5613d20734408306df96bd65c7b8d5c27299269dd9335ef7cb1f3357145983f365ec2f933686fc6d77d0a01100ca3a3773d3f0a52559ee691776b714fedc8c7b2cd672c7065c295693d0616d37408318007c18e9a9f6e4929e20d8efd4c2428065720ed1938af8e5348c14b373b0a845d1063468d2f96f000000ffff86f9aa5001c001a08f785a1c8e4c549c415dd948da80f86e3aaabc4e7a784604b6362208e0fb6b85a011d366d57b6ad95cda2eb6b618704859b4d433ad7557cad177eff6f6bae578cbc0f90200df8345de7e8203e494e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de7f8203e594e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de8082062294388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de8182062394388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de828201949425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de838201979425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de848201999425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8582019a9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8682019b9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8782019e9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de888201a29425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de898201a59425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8a8201a89425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8b8201a99425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8c8201aa9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8d8201ac9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08" +} +``` + + + +### `debug_getRawHeader` + +Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) of the header of specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - RLP-encoded block header or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawHeader","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_getRawHeader", + "params": ["0x32026E"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xf90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9b" +} +``` + + + +### `debug_metrics` + +Returns metrics providing information on the internal operation of Besu. + +The available metrics might change over time. The JVM metrics might vary based on the JVM implementation used. + +The metric types are: + +- Timer + +- Counter + +- Gauge + +#### Parameters + +None + +#### Returns + +`result`: _object_ - metrics object + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_metrics","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_metrics", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "jvm": { + "memory_bytes_init": { + "heap": 268435456, + "nonheap": 2555904 + }, + "threads_current": 41, + "memory_bytes_used": { + "heap": 696923976, + "nonheap": 63633456 + }, + "memory_pool_bytes_used": { + "PS Eden Space": 669119360, + "Code Cache": 19689024, + "Compressed Class Space": 4871144, + "PS Survivor Space": 2716320, + "PS Old Gen": 25088296, + "Metaspace": 39073288 + }, + ... + }, + "process": { + "open_fds": 546, + "cpu_seconds_total": 67.148992, + "start_time_seconds": 1543897699.589, + "max_fds": 10240 + }, + "rpc": { + "request_time": { + "debug_metrics": { + "bucket": { + "+Inf": 2, + "0.01": 1, + "0.075": 2, + "0.75": 2, + "0.005": 1, + "0.025": 2, + "0.1": 2, + "1.0": 2, + "0.05": 2, + "10.0": 2, + "0.25": 2, + "0.5": 2, + "5.0": 2, + "2.5": 2, + "7.5": 2 + }, + "count": 2, + "sum": 0.015925392 + } + } + }, + "blockchain": { + "difficulty_total": 3533501, + "announcedBlock_ingest": { + "bucket": { + "+Inf": 0, + "0.01": 0, + "0.075": 0, + "0.75": 0, + "0.005": 0, + "0.025": 0, + "0.1": 0, + "1.0": 0, + "0.05": 0, + "10.0": 0, + "0.25": 0, + "0.5": 0, + "5.0": 0, + "2.5": 0, + "7.5": 0 + }, + "count": 0, + "sum": 0 + }, + "height": 1908793 + }, + "peers": { + "disconnected_total": { + "remote": { + "SUBPROTOCOL_TRIGGERED": 5 + }, + "local": { + "TCP_SUBSYSTEM_ERROR": 1, + "SUBPROTOCOL_TRIGGERED": 2, + "USELESS_PEER": 3 + } + }, + "peer_count_current": 2, + "connected_total": 10 + } + } +} +``` + + + +### `debug_replayBlock` + +Re-imports the block matching the specified block number, by rolling the head of the local chain back to the block right before the specified block, then importing the specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_replayBlock","params":["0x1"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_replayBlock", "params": ["0x1"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `debug_resyncWorldstate` + +Triggers a re-synchronization of the world state while retaining imported blocks. This is useful if there are world state database inconsistencies (for example, Bonsai database issues). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"debug_resyncWorldstate","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_resyncWorldstate", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `debug_setHead` + +Sets the current head of the local chain to the block matching the specified block number. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_setHead","params":["0x1"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_setHead", "params": ["0x1"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `debug_standardTraceBlockToFile` + +Generates files containing the block trace. A separate file is generated for each transaction in the block. + +You can also specify a trace file for a specific transaction in a block. + +Use [`debug_standardTraceBadBlockToFile`](#debug_standardtracebadblocktofile) to view the trace for an invalid block. + +#### Parameters + +`blockHash`: _string_ - block hash + +`txHash`: _string_ - (optional) transaction hash; if omitted, a trace file is generated for each transaction in the block. + +`disableMemory`: _boolean_ - (optional) specifies whether to capture EVM memory during the trace; defaults to `true` + +#### Returns + +`result`: _string_ - location of the generated trace files + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBlockToFile","params":["0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", { +"txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", "disableMemory": false}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_standardTraceBlockToFile", + "params": [ + "0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", + { + "txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", + "disableMemory": false + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "/Users/me/mynode/goerli/data/traces/block_0x2dc0b6c4-4-0x4ff04c4a-1612820117332" + ] +} +``` + + + +### `debug_standardTraceBadBlockToFile` + +Generates files containing the block trace of invalid blocks. A separate file is generated for each transaction in the block. + +Use [`debug_standardTraceBlockToFile`](#debug_standardtraceblocktofile) to view the trace for a valid block. + +#### Parameters + +`blockHash`: _string_ - block hash + +#### Returns + +`result`: _string_ - location of the generated trace files + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBadBlockToFile","params":["0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_standardTraceBadBlockToFile", + "params": [ + "0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "/Users/me/mynode/goerli/data/traces/block_0x53741e9e-0-0x407ec43d-1600951088172" + ] +} +``` + + + +### `debug_storageRangeAt` + +[Remix](https://remix.ethereum.org/) uses `debug_storageRangeAt` to implement debugging. Use the _Debugger_ tab in Remix instead of calling `debug_storageRangeAt` directly. + +Returns the contract storage for the specified range. + +#### Parameters + +- `blockHash`: _string_ - block hash + +- `txIndex`: _number_ - transaction index from which to start + +- `address`: _string_ - contract address + +- `startKey`: _string_ - start key + +- `limit`: _number_ - number of storage entries to return + +#### Returns + +`result`: _object_ - [range object](objects.md#range-object). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_storageRangeAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c",0,"0x0e0d2c8f7794e82164f11798276a188147fbd415","0x0000000000000000000000000000000000000000000000000000000000000000",1], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_storageRangeAt", + "params": [ + "0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", + 0, + "0x0e0d2c8f7794e82164f11798276a188147fbd415", + "0x0000000000000000000000000000000000000000000000000000000000000000", + 1 + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "storage": { + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": { + "key": null, + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + }, + "nextKey": "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6" + } +} +``` + +::: + +### `debug_traceTransaction` + +[Remix](https://remix.ethereum.org/) uses `debug_traceTransaction` to implement debugging. Use the _Debugger_ tab in Remix instead of calling `debug_traceTransaction` directly. + +Reruns the transaction with the same state as when the transaction executed. + +#### Parameters + +- `transactionHash`: _string_ - transaction hash + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _object_ - [trace object](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e",{"disableStorage":true}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceTransaction", + "params": [ + "0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e", + { "disableStorage": true } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null + } + ] + } +} +``` + + + +### `debug_traceBlock` + +Returns full trace of all invoked opcodes of all transactions included in the block. + +#### Parameters + +- `block`: _string_ - RLP of the block + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _object_ - [trace object](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlock","params":["0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlock", + "params": [ + "0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null + } + ] + } +} +``` + + + +### `debug_traceBlockByHash` + +Returns full trace of all invoked opcodes of all transactions included in the block. + +#### Parameters + +- `blockHash`: _string_ - block hash + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _array_ of _objects_ - list of [trace objects](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByHash","params":["0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlockByHash", + "params": [ + "0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": {}, + "reason": null + } + ] + } + ] +} +``` + + + +### `debug_traceBlockByNumber` + +Returns full trace of all invoked opcodes of all transactions included in the block. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _array_ of _objects_ - list of [trace objects](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByNumber","params":["0x7224",{"disableStorage":true}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlockByNumber", + "params": ["0x7224", { "disableStorage": true }], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null, + "reason": null + } + ] + } + ] +} +``` + + + +## `ETH` methods + +The `ETH` API methods allow you to interact with the blockchain. + +:::note + +Methods with an equivalent [GraphQL](../../how-to/use-besu-api/graphql.md) query include a GraphQL request and result in the method example. The parameter and result descriptions apply to the JSON-RPC requests. The GraphQL specification is defined in the [schema]. + +::: + +### `eth_accounts` + +Returns a list of account addresses a client owns. + +:::note + +This method returns an empty object because Besu [doesn't support key management](../../how-to/send-transactions.md) inside the client. + +To provide access to your key store and and then sign transactions, use [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu. + +::: + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - list of 20-byte account addresses owned by the client + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_accounts", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": [] +} +``` + + + +### `eth_blockNumber` + +Returns the index corresponding to the block number of the current chain head. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - hexadecimal integer representing the index corresponding to the block number of the current chain head + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 51 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x2377" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{number}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + number + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 16221 + } + } +} +``` + + + +### `eth_call` + +Invokes a contract function locally and does not change the state of the blockchain. + +You can interact with contracts using [`eth_sendRawTransaction`](#eth_sendrawtransaction) or `eth_call`. + +If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the `eth_call` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + +#### Parameters + +`call`: _object_ - [transaction call object](objects.md#transaction-call-object) + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +:::note + +By default, `eth_call` does not fail if the sender account has an insufficient balance. This is done by setting the balance of the account to a large amount of ether. To enforce balance rules, set the [`strict` parameter](objects.md#transaction-call-object) in the transaction call object to `true`. + +::: + +#### Returns + +`result`: _string_ - return value of the executed contract + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","value":"0x1"}, "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_call", + "params": [ + { "to": "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", "value": "0x1" }, + "latest" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + number + call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { + data + status + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17449, + "call": { + "data": "0x", + "status": 1 + } + } + } +} +``` + + + +:::info Example of a simulated contract creation + +The following example creates a simulated contract by not including the `to` parameter from the [transaction call object](objects.md#transaction-call-object) in the `call` parameter. Besu simulates the data to create the contract. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "data":"0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005057600080fd5b5061021e806100606000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032","gas":"0x439cf","gasPrice":"0x0"},"latest"],"id":53}' http://127.0.0.1:8545 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032" +} +``` + + + +::: + +### `eth_chainId` + +Returns the [chain ID](../../concepts/network-and-chain-id.md). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - chain ID in hexadecimal + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_chainId", "params": [], "id": 51 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x7e2" +} +``` + + + +### `eth_coinbase` + +Returns the client coinbase address. The coinbase address is the account to pay mining rewards to. + +To set a coinbase address, start Besu with the `--miner-coinbase` option set to a valid Ethereum account address. You can get the Ethereum account address from a client such as MetaMask or Etherscan. For example: + +```bash title="Example" +besu --miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" --rpc-http-enabled +``` + +#### Parameters + +None + +#### Returns + +`result`: _string_ - coinbase address + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_coinbase", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +} +``` + + + +### `eth_createAccessList` + +Creates an [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) access list that you can [include in a transaction](../../concepts/transactions/types.md#access_list-transactions). + +#### Parameters + +`transaction`: _object_ - [transaction call object](objects.md#transaction-call-object) + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). + +#### Returns + +`result`: _object_ - access list object with the following fields: + +- `accessList`: _array_ of _objects_ - list of objects with the following fields: + - `address`: _string_ - addresses to be accessed by the transaction + - `storageKeys`: _array_ - storage keys to be accessed by the transaction +- `gasUsed`: _string_ - approximate gas cost for the transaction if the access list is included + + + +# curl HTTP + +```bash +curl -X POST --data '{"method":"eth_createAccessList","params":[{"from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", "data": "0x608060806080608155"}, "pending"],"id":1,"jsonrpc":"2.0"}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "method": "eth_createAccessList", + "params": [ + { + "from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", + "data": "0x608060806080608155" + }, + "pending" + ], + "id": 1, + "jsonrpc": "2.0" +} +``` + +# JSON result + +```json +{ + "accessList": [ + { + "address": "0xa02457e5dfd32bda5fc7e1f1b008aa5979568150", + "storageKeys": [ + "0x0000000000000000000000000000000000000000000000000000000000000081", + ] + } + ] + "gasUsed": "0x125f8" +} +``` + + + +### `eth_estimateGas` + +Returns an estimate of the gas required for a transaction to complete. The estimation process does not use gas and the transaction is not added to the blockchain. The resulting estimate can be greater than the amount of gas the transaction ends up using, for reasons including EVM mechanics and node performance. + +The `eth_estimateGas` call does not send a transaction. You must call [`eth_sendRawTransaction`](#eth_sendrawtransaction) to execute the transaction. + +If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the `eth_estimateGas` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + +#### Parameters + +For `eth_estimateGas`, all fields are optional because setting a gas limit is irrelevant to the estimation process (unlike transactions, in which gas limits apply). + +`call`: _object_ - [transaction call object](objects.md#transaction-call-object) + +#### Returns + +`result`: _string_ - amount of gas used + +The following example returns an estimate of 21000 wei (`0x5208`) for the transaction. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"from":"0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73","to":"0x44Aa93095D6749A706051658B970b941c72c1D53","value":"0x1"}],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_estimateGas", + "params": [ + { + "from": "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "to": "0x44Aa93095D6749A706051658B970b941c72c1D53", + "value": "0x1" + } + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5208" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{estimateGas (data: {from :\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", to :\"0x8888f1f195afa192cfee860698584c030f4c9db1\"})}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + estimateGas(data: {from: "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f", to: "0x8888f1f195afa192cfee860698584c030f4c9db1"}) + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "estimateGas": 21000 + } + } +} +``` + + + +The following example request estimates the cost of deploying a simple storage smart contract to the network. The data field contains the hash of the compiled contract you want to deploy. (You can get the compiled contract hash from your IDE, for example, **Remix > Compile tab > details > WEB3DEPLOY**.) The result is 113355 wei. + + + +# curl HTTP request + +```bash +curl -X POST \ +http://127.0.0.1:8545 \ +-H 'Content-Type: application/json' \ +-d '{ + "jsonrpc": "2.0", + "method": "eth_estimateGas", + "params": [{ + "from": "0x8bad598904ec5d93d07e204a366d084a80c7694e", + "data": "0x608060405234801561001057600080fd5b5060e38061001f6000396000f3fe6080604052600436106043576000357c0100000000000000000000000000000000000000000000000000000000900480633fa4f24514604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b806000819055505056fea165627a7a7230582020d7ad478b98b85ca751c924ef66bcebbbd8072b93031073ef35270a4c42f0080029" + }], + "id": 1 +}' +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1bacb" +} +``` + + + +### `eth_feeHistory` + +Returns base fee per gas and transaction effective priority fee per gas history for the requested block range, allowing you to track trends over time. + +#### Parameters + +- `blockCount`: _integer_ or _string_ - Number of blocks in the requested range. Between 1 and 1024 blocks can be requested in a single query. If blocks in the specified block range are not available, then only the fee history for available blocks is returned. Accepts hexadecimal or integer values. + +- `newestBlock`: _string_ - Integer representing the highest number block of the requested range or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). + +- `array` of `integers` - (optional) A monotonically increasing list of percentile values to sample from each block's effective priority fees per gas in ascending order, weighted by gas used. + +#### Returns + +`result`: _object_ - [Fee history results object](objects.md#fee-history-results-object). + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_feeHistory","params": ["0x5", "latest", [20,30]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_feeHistory", + "params": ["0x5", "latest", [20, 30]], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "baseFeePerGas": [ + "0x3da8e7618", + "0x3e1ba3b1b", + "0x3dfd72b90", + "0x3d64eee76", + "0x3d4da2da0", + "0x3ccbcac6b" + ], + "gasUsedRatio": [ + 0.5290747666666666, 0.49240453333333334, 0.4615576, 0.49407083333333335, + 0.4669053 + ], + "oldestBlock": "0xfab8ac", + "reward": [ + ["0x59682f00", "0x59682f00"], + ["0x59682f00", "0x59682f00"], + ["0x3b9aca00", "0x59682f00"], + ["0x510b0870", "0x59682f00"], + ["0x3b9aca00", "0x59682f00"] + ] + }, + "id": 1 +} +``` + + + +### `eth_gasPrice` + +Returns a percentile gas unit price for the most recent blocks, in Wei. By default, the last 100 blocks are examined and the 50th percentile gas unit price (that is, the median value) is returned. + +If there are no blocks, the value for [`--min-gas-price`](../cli/options.md#min-gas-price) is returned. The value returned is restricted to values between [`--min-gas-price`](../cli/options.md#min-gas-price) and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max). By default, 1000 Wei and 500GWei. + +Use the [`--api-gas-price-blocks`](../cli/options.md#api-gas-price-blocks), [`--api-gas-price-percentile`](../cli/options.md#api-gas-price-percentile) , and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max) command line options to configure the `eth_gasPrice` default values. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - percentile gas unit price for the most recent blocks, in Wei, as a hexadecimal value + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_gasPrice", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x3e8" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{gasPrice}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + gasPrice +} +``` + +# GraphQL result + +```json +{ + "data": { + "gasPrice": "0x3e8" + } +} +``` + + + +### `eth_getBalance` + +Returns the account balance of the specified address. + +#### Parameters + +- `address`: _string_ - 20-byte account address from which to retrieve the balance + +- `blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - current balance, in Wei, as a hexadecimal value + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBalance", + "params": ["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x1cfe56f3795885980000" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account ( address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") { balance } }"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + balance + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "balance": "0x1ce96a1ffe7620d00000" + } + } +} +``` + + + +### `eth_getBlockByHash` + +Returns information about the block matching the specified block hash. + +#### Parameters + +- `hash`: _string_ - 32-byte hash of a block + +- `verbose`: _boolean_ - if `true`, returns the full [transaction objects](objects.md#transaction-object); if `false`, returns the transaction hashes + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object), or `null` when there is no block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", false],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockByHash", + "params": [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + false + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": { + "number": "0x68b3", + "hash": "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "mixHash": "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", + "parentHash": "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", + "nonce": "0x378da40ff335b070", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", + "transactionsRoot": "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", + "stateRoot": "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", + "receiptsRoot": "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", + "miner": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "difficulty": "0x66e619a", + "totalDifficulty": "0x1e875d746ae", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "size": "0x334", + "gasLimit": "0x47e7c4", + "gasUsed": "0x37993", + "timestamp": "0x5835c54d", + "uncles": [], + "transactions": [ + "0xa0807e117a8dd124ab949f460f08c36c72b710188f01609595223b325e58e0fc", + "0xeae6d797af50cb62a596ec3939114d63967c374fa57de9bc0f4e2b576ed6639d" + ], + "baseFeePerGas": "0x7" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (hash : \"0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92\") {number transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92") { + number + transactions { + hash + } + timestamp + difficulty + totalDifficulty + gasUsed + gasLimit + hash + nonce + ommerCount + logsBloom + mixHash + ommerHash + extraData + stateRoot + receiptsRoot + transactionCount + transactionsRoot + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17607, + "transactions": [], + "timestamp": "0x5cdbdfb5", + "difficulty": "0x1", + "totalDifficulty": "0x44c8", + "gasUsed": 0, + "gasLimit": 4700000, + "hash": "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92", + "nonce": "0x0000000000000000", + "ommerCount": 0, + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b841fae6d25da0b91e3e88669d0a765c98479d86d53e9ea1f3fb6b36d7ff22fa622a3da0c49c20e5562c774e90acae8ad487936f6b6019cd8a782db684693cba1e9800", + "stateRoot": "0xa7086c266aed46cd3bc45579178f8acb36d9d147de575a3ecbf8c7e6f1c737fc", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "transactionCount": 0, + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "baseFeePerGas": "0x7" + } + } +} +``` + + + +### `eth_getBlockByNumber` + +Returns information about the block matching the specified block number. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, `pending`, `finalized`, or `safe` as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `verbose`: _boolean_ - if `true`, returns the full [transaction objects](objects.md#transaction-object); if `false`, returns only the hashes of the transactions. + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object), or `null` when there is no block. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x68B3", true],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": ["0x68B3", true], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "number": "0x68b3", + "hash": "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "mixHash": "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", + "parentHash": "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", + "nonce": "0x378da40ff335b070", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", + "transactionsRoot": "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", + "stateRoot": "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", + "receiptsRoot": "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", + "miner": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "difficulty": "0x66e619a", + "totalDifficulty": "0x1e875d746ae", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "size": "0x334", + "gasLimit": "0x47e7c4", + "gasUsed": "0x37993", + "timestamp": "0x5835c54d", + "uncles": [], + "transactions": [], + "baseFeePerGas": "0x7" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (number : 100) {transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot ommers{hash} ommerAt(index : 1){hash} miner{address} account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){balance} parent{hash} }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 100) { + transactions { + hash + } + timestamp + difficulty + totalDifficulty + gasUsed + gasLimit + hash + nonce + ommerCount + logsBloom + mixHash + ommerHash + extraData + stateRoot + receiptsRoot + transactionCount + transactionsRoot + ommers { + hash + } + ommerAt(index: 1) { + hash + } + miner { + address + } + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + balance + } + parent { + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactions": [], + "timestamp": "0x5cd10933", + "difficulty": "0x1", + "totalDifficulty": "0x65", + "gasUsed": 0, + "gasLimit": 4700000, + "hash": "0x63b3ea2bc37fec8f82680eb823652da6af8acebb4f6c4d0ff659c55be473c8b0", + "nonce": "0x0000000000000000", + "ommerCount": 0, + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8414d877d8d0ced37ea138fab55a978f3740367a24a31731322ecdc3368f11e0d4966c9ce17ae59a76fb94eb436e8a386868f6bd6b0a5678e58daf49f5dd940558b00", + "stateRoot": "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "transactionCount": 0, + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "ommers": [], + "ommerAt": null, + "miner": { + "address": "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + }, + "account": { + "balance": "0xad0f47f269cbf31ac" + }, + "parent": { + "hash": "0x7bca25e1fa5e395fd6029eb496a70b6b5495843976bf9e49b993c723ded29d9e" + }, + "baseFeePerGas": "0x7" + } + } +} +``` + + + +### `eth_getBlockTransactionCountByHash` + +Returns the number of transactions in the block matching the specified block hash. + +#### Parameters + +`hash`: _string_ - 32-byte block hash + +#### Returns + +`result`: _number_ - integer representing the number of transactions in the specified block, or `null` if no matching block hash is found + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockTransactionCountByHash", + "params": [ + "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": null +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097\"){transactionCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097") { + transactionCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionCount": 1 + } + } +} +``` + + + +### `eth_getBlockTransactionCountByNumber` + +Returns the number of transactions in a block matching the specified block number. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - integer representing the number of transactions in the specified block, or `null` if no matching block number is found + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0xe8"],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockTransactionCountByNumber", + "params": ["0xe8"], + "id": 51 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x8" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:232){transactionCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 232) { + transactionCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionCount": 1 + } + } +} +``` + + + +### `eth_getCode` + +Returns the code of the smart contract at the specified address. Besu stores compiled smart contract code as a hexadecimal value. + +#### Parameters + +`address`: _string_ - 20-byte contract address + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _data_ - code stored at the specified address + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getCode", + "params": ["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{account(address: \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\"){ code }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xa50a51c09a5c451c52bb714527e1974b686d8e77") { + code + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "code": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" + } + } +} +``` + + + +### `eth_getFilterChanges` + +Polls the specified filter and returns an array of changes that have occurred since the last poll. + +#### Parameters + +`filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _strings_ or _objects_ - if nothing changed since the last poll, an empty list; otherwise: + +- For filters created with `eth_newBlockFilter`, returns block hashes. + +- For filters created with `eth_newPendingTransactionFilter`, returns transaction hashes. + +- For filters created with `eth_newFilter`, returns [log objects](objects.md#log-object). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0xf8bf5598d9e04fbe84523d42640b9b0e"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getFilterChanges", + "params": ["0xf8bf5598d9e04fbe84523d42640b9b0e"], + "id": 1 +} +``` + +# JSON result + +```json title="Example result from a filter created with eth_newBlockFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0xda2bfe44bf85394f0d6aa702b5af89ae50ae22c0928c18b8903d9269abe17e0b", + "0x88cd3a37306db1306f01f7a0e5b25a9df52719ad2f87b0f88ee0e6753ed4a812", + "0x4d4c731fe129ff32b425e6060d433d3fde278b565bbd1fd624d5a804a34f8786" + ] +} +``` + +```json title="Example result from a filter created with eth_newPendingTransactionFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x1e977049b6db09362da09491bee3949d9362080ce3f4fc19721196d508580d46", + "0xa3abc4b9a4e497fd58dc59cdff52e9bb5609136bcd499e760798aa92802769be" + ] +} +``` + +```json title="Example result from a filter created with eth_newFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x233", + "blockHash": "0xfc139f5e2edee9e9c888d8df9a2d2226133a9bd87c88ccbd9c930d3d4c9f9ef5", + "transactionHash": "0x66e7a140c8fa27fe98fde923defea7562c3ca2d6bb89798aabec65782c08f63d", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000004", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x238", + "blockHash": "0x98b0ec0f9fea0018a644959accbe69cd046a8582e89402e1ab0ada91cad644ed", + "transactionHash": "0xdb17aa1c2ce609132f599155d384c0bc5334c988a6c368056d7e167e23eee058", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000007", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + + + +### `eth_getFilterLogs` + +Returns an array of [logs](../../concepts/events-and-logs.md) for the specified filter. + +Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option at the default value of `true` to improve log retrieval performance. + +:::note + +`eth_getFilterLogs` is only used for filters created with `eth_newFilter`. To specify a filter object and get logs without creating a filter, use `eth_getLogs`. + +::: + +#### Parameters + +`filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](objects.md#log-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x5ace5de3985749b6a1b2b0d3f3e1fb69"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getFilterLogs", + "params": ["0x5ace5de3985749b6a1b2b0d3f3e1fb69"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb3", + "blockHash": "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", + "transactionHash": "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000003", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb6", + "blockHash": "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", + "transactionHash": "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + + + +### `eth_getLogs` + +Returns an array of [logs](../../concepts/events-and-logs.md) matching a specified filter object. + +Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option at the default value of `true` to improve log retrieval performance. + +:::caution + +Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from its genesis block, might cause Besu to hang for an indeterminable amount of time while generating the response. We recommend setting a range limit using the [`--rpc-max-logs-range`](../cli/options.md#rpc-max-logs-range) option (or leaving it at its default value of 1000). + +::: + +#### Parameters + +`filterOptions`: _object_ - [filter options object](objects.md#filter-options-object) + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](objects.md#log-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":"earliest", "toBlock":"latest", "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", "topics":[]}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "topics": [] + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb3", + "blockHash": "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", + "transactionHash": "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000003", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb6", + "blockHash": "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", + "transactionHash": "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{logs(filter:{fromBlock: 1486000, toBlock: 1486010, addresses: [\"0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d\"], topics: [[\"0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d\"]]}) {index topics data account{address} transaction{hash} }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + logs(filter: {fromBlock: 1486000, toBlock: 1486010, addresses: ["0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d"], topics: [["0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d"]]}) { + index + topics + data + account { + address + } + transaction { + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "logs": [ + { + "index": 0, + "topics": [ + "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000508918" + ], + "data": "0xa5a04999ec29a8bd19ce32b859280ef9dbb464d846be06f64a1b1012ec08ab03", + "account": { + "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" + }, + "transaction": { + "hash": "0x36a2186344c6a32760e7700fdf3685936220876c51ff39d071eb48c17f7e802f" + } + }, + { + "index": 0, + "topics": [ + "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000648c72" + ], + "data": "0x0ee96b660ad82c8010c90760a03edfbb40b4af5e3634a8c214e4ac7fa1f61492", + "account": { + "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" + }, + "transaction": { + "hash": "0x9e2cc9e84a9e78839d6f4b591dfd98cc7a454a8ee3cd6ccd0a18e662e22d3818" + } + } + ] + } +} +``` + + + +### `eth_getMinerDataByBlockHash` + +Returns miner data for the specified block. + +#### Parameters + +`hash`: _string_ - 32-byte block hash + +#### Returns + +`result`: _object_ - [miner data object](objects.md#miner-data-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockHash","params": ["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getMinerDataByBlockHash", + "params": [ + "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "netBlockReward": "0x47c6f3739f3da800", + "staticBlockReward": "0x4563918244f40000", + "transactionFee": "0x38456548220800", + "uncleInclusionReward": "0x22b1c8c1227a000", + "uncleRewards": [ + { + "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", + "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" + } + ], + "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "difficulty": "0x7348c20", + "totalDifficulty": "0xa57bcfdd96" + } +} +``` + + + +### `eth_getMinerDataByBlockNumber` + +Returns miner data for the specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _object_ - [miner data object](objects.md#miner-data-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockNumber","params": ["0x7689D2"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getMinerDataByBlockNumber", + "params": ["0x7689D2"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "netBlockReward": "0x47c6f3739f3da800", + "staticBlockReward": "0x4563918244f40000", + "transactionFee": "0x38456548220800", + "uncleInclusionReward": "0x22b1c8c1227a000", + "uncleRewards": [ + { + "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", + "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" + } + ], + "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "difficulty": "0x7348c20", + "totalDifficulty": "0xa57bcfdd96" + } +} +``` + + + +### `eth_getProof` + +Returns the account and storage values of the specified account, including the Merkle proof. + +The API allows IoT devices or mobile apps which are unable to run light clients to verify responses from untrusted sources, by using a trusted block hash. + +#### Parameters + +`address`: _string_ - 20-byte address of the account or contract + +`keys`: _array_ of _strings_ - list of 32-byte storage keys to generate proofs for + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _object_ - account details object with the following fields: + +- `balance`: _string_ - account balance + +- `codeHash`: _string_ - 32-byte hash of the account code + +- `nonce`: _string_ - number of transactions sent from the account + +- `storageHash`: _string_ - 32-byte SHA3 of the `storageRoot` + +- `accountProof`: _array_ of _strings_ - list of RLP-encoded Merkle tree nodes, starting with the `stateRoot` + +- `storageProof`: _array_ of _objects_ - list of storage entry objects with the following fields: + + - `key`: _string_ - storage key + + - `value`: _string_ - storage value + + - `proof`: _array_ of _strings_ - list of RLP-encoded Merkle tree nodes, starting with the `storageHash` + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getProof","params": [ +"0a8156e7ee392d885d10eaa86afd0e323afdcd95", ["0x0000000000000000000000000000000000000000000000000000000000000347"], "latest"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getProof", + "params": [ + "0a8156e7ee392d885d10eaa86afd0e323afdcd95", + ["0x0000000000000000000000000000000000000000000000000000000000000347"], + "latest" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "accountProof": [ + "0xf90211a0...608d898380", + "0xf90211a0...ec33f19580", + "0xf901d1a0...9e55584480", + "0xf8718080...18e5777142" + ], + "address": "0x0a8156e7ee392d885d10eaa86afd0e323afdcd95", + "balance": "0x0", + "codeHash": "0x2b6975dcaf69f9bb9a3b30bb6a37b305ce440250bf0dd2f23338cb18e5777142", + "nonce": "0x5f", + "storageHash": "0x917688de43091589aa58c1dfd315105bc9de4478b9ba7471616a4d8a43d46203", + "storageProof": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000347", + "value": "0x0", + "proof": [ + "0xf90211a0...5176779280", + "0xf901f1a0...c208d86580", + "0xf8d180a0...1ce6808080" + ] + } + ] + } +} +``` + + + +### `eth_getStorageAt` + +Returns the value of a storage position at a specified address. + +#### Parameters + +`address`: _string_ - 20-byte storage address + +`index`: _string_ - integer index of the storage position + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result` : _string_ - value at the specified storage position + +Calculating the correct position depends on the storage you want to retrieve. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getStorageAt","params": ["0x‭3B3F3Eâ€Ŧ","0x0","latest"],"id": 53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getStorageAt", + "params": ["0x‭3B3F3Eâ€Ŧ", "0x0", "latest"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") {storage(slot: \"0x04\")}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + storage(slot: "0x04") + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "storage": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } +} +``` + + + +### `eth_getTransactionByBlockHashAndIndex` + +Returns transaction information for the specified block hash and transaction index position. + +#### Parameters + +`block`: _string_ - 32-byte hash of a block + +`index`: _string_ - integer representing the transaction index position + +#### Returns + +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", "0x2"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByBlockHashAndIndex", + "params": [ + "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "0x2" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "blockNumber": "0x1442e", + "chainId": 2018, + "from": "0x70c9217d814985faef62b124420f8dfbddd96433", + "gas": "0x3d090", + "gasPrice": "0x57148a6be", + "hash": "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", + "input": "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", + "nonce": "0x2cb2", + "to": "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", + "transactionIndex": "0x2", + "value": "0x0", + "v": "0x2a", + "r": "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", + "s": "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{ block(hash: \"0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69\") { transactionAt(index: 0) {block{hash} hash } } }"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69") { + transactionAt(index: 0) { + block { + hash + } + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionAt": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" + } + } + } +} +``` + + + +### `eth_getTransactionByBlockNumberAndIndex` + +Returns transaction information for the specified block number and transaction index position. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +`index`: _string_ - transaction index position + +#### Returns + +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +This request returns the third transaction in the 82990 block on the Ropsten testnet. You can also view this [block](https://ropsten.etherscan.io/txs?block=82990) and [transaction] on Etherscan. + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["82990", "0x2"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByBlockNumberAndIndex", + "params": ["82990", "0x2"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "blockNumber": "0x1442e", + "chainId": 2018, + "from": "0x70c9217d814985faef62b124420f8dfbddd96433", + "gas": "0x3d090", + "gasPrice": "0x57148a6be", + "hash": "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", + "input": "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", + "nonce": "0x2cb2", + "to": "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", + "transactionIndex": "0x2", + "value": "0x0", + "v": "0x2a", + "r": "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", + "s": "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{block(number:20303) {transactionAt(index: 0) {block{hash} hash}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 20303) { + transactionAt(index: 0) { + block { + hash + } + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionAt": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" + } + } + } +} +``` + + + +### `eth_getTransactionByHash` + +Returns transaction information for the specified transaction hash. + +#### Parameters + +`transaction`: _string_ - 32-byte transaction hash + +#### Returns + +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByHash", + "params": [ + "0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": { + "blockHash": "0x510efccf44a192e6e34bcb439a1947e24b86244280762cbb006858c237093fda", + "blockNumber": "0x422", + "chainId": 2018, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0x3b9aca00", + "hash": "0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44", + "input": "0x", + "nonce": "0x1", + "to": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "transactionIndex": "0x0", + "value": "0x4e1003b28d9280000", + "v": "0xfe7", + "r": "0x84caf09aefbd5e539295acc67217563438a4efb224879b6855f56857fa2037d3", + "s": "0x5e863be3829812c81439f0ae9d8ecb832b531d651fb234c848d1bf45e62be8b9" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash : \"0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d\") { block{hash} gas gasPrice hash nonce value from {address} to {address} status}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + transaction(hash: "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d") { + block { + hash + } + gas + gasPrice + hash + nonce + value + from { + address + } + to { + address + } + status + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "transaction": { + "block": { + "hash": "0xb1ef35744bade6980c3a933024b2557a8c724a19e5fdd2116bac712aa5e57198" + }, + "gas": 21000, + "gasPrice": "0x2540be400", + "hash": "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d", + "nonce": 6, + "value": "0x8ac7230489e80000", + "from": { + "address": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + }, + "to": { + "address": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" + }, + "status": 1 + } + } +} +``` + + + +### `eth_getTransactionCount` + +Returns the number of transactions sent from a specified address. Use the `pending` tag to get the next account nonce not used by any pending transactions. + +#### Parameters + +`address`: _string_ - 20-byte account address + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - integer representing the number of transactions sent from the specified address + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xc94770007dda54cF92009BFF0dE90c06F603a09f","latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionCount", + "params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f", "latest"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account (address:\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){transactionCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + transactionCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "transactionCount": 5 + } + } +} +``` + + + +### `eth_getTransactionReceipt` + +Returns the receipt of a transaction by transaction hash. Receipts for pending transactions are not available. + +If you enabled [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md), the receipt includes available revert reasons in the response. + +#### Parameters + +`transaction`: _string_ - 32-byte hash of a transaction + +#### Returns + +`result`: _object_ - [transaction receipt object](objects.md#transaction-receipt-object), or `null` when there is no receipt + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionReceipt", + "params": [ + "0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": null, + "cumulativeGasUsed": "0x5208", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gasUsed": "0x5208", + "effectiveGasPrice": "0x1", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", + "transactionIndex": "0x0" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash: \"0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86\") {block{hash logsBloom} hash createdContract{address} cumulativeGasUsed gas gasUsed logs{topics} from{address} to{address} index}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + transaction(hash: "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86") { + block { + hash + logsBloom + } + hash + createdContract { + address + } + cumulativeGasUsed + gas + gasUsed + logs { + topics + } + from { + address + } + to { + address + } + index + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "transaction": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86", + "createdContract": null, + "cumulativeGasUsed": 21000, + "gas": 21000, + "gasUsed": 21000, + "effectiveGasPrice": "0x1", + "logs": [], + "from": { + "address": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + }, + "to": { + "address": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" + }, + "index": 0 + } + } +} +``` + + + +### `eth_getUncleByBlockHashAndIndex` + +Returns uncle specified by block hash and index. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +`uncleIndex`: _string_ - index of the uncle + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object) + +:::note + +Uncles don't contain individual transactions. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", "0x0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleByBlockHashAndIndex", + "params": [ + "0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", + "0x0" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x76b123df93230", + "extraData": "0x50505945206e616e6f706f6f6c2e6f7267", + "gasLimit": "0x7a121d", + "gasUsed": "0x7a0175", + "hash": "0xc20189c0b1a4a23116ab3b177e929137f6e826f17fc4c2e880e7258c620e9817", + "logsBloom": "0x890086c024487ca422be846a201a10e41bc2882902312116c1119609482031e9c000e2a708004a10281024028020c505727a12570c4810121c59024490b040894406a1c23c37a0094810921da3923600c71c03044b40924280038d07ab91964a008084264a01641380798840805a284cce201a8026045451002500113a00de441001320805ca2840037000111640d090442c11116d2112948084240242340400236ce81502063401dcc214b9105194d050884721c1208800b20501a4201400276004142f118e60808284506979a86e050820101c170c185e2310005205a82a2100382422104182090184800c02489e033440218142140045801c024cc1818485", + "miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", + "mixHash": "0xf557cc827e058862aa3ea1bd6088fb8766f70c0eac4117c56cf85b7911f82a14", + "nonce": "0xd320b48904347cdd", + "number": "0x768964", + "parentHash": "0x98d752708b3677df8f439c4529f999b94663d5494dbfc08909656db3c90f6255", + "receiptsRoot": "0x0f838f0ceb73368e7fc8d713a7761e5be31e3b4beafe1a6875a7f275f82da45b", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "size": "0x21a", + "stateRoot": "0xa0c7d4fca79810c89c517eff8dadb9c6d6f4bcc27c2edfb301301e1cf7dec642", + "timestamp": "0x5cdcbba6", + "totalDifficulty": "0x229ad33cabd4c40d23d", + "transactionsRoot": "0x866e38e91d01ef0387b8e07ccf35cd910224271ccf2b7477b8c8439e8b70f365", + "uncles": [] + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\"){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7") { + ommerAt(index: 0) { + difficulty + extraData + gasLimit + gasUsed + hash + logsBloom + mixHash + nonce + number + receiptsRoot + stateRoot + timestamp + totalDifficulty + transactionsRoot + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "difficulty": "0x1", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8418e98ef756acdae1e510b1df4b507b7af04eb3802db7fa0f3e73e7d0721b3645e76f4eb3d0dbf0de75620c4405bd5a663247cdd9616482c883053856d857f884a01", + "gasLimit": 4700000, + "gasUsed": 0, + "hash": "0x0efe67972b982eb6be5df84e5238eb07475f86afa8a7de708f6a13ac0ff60d6c", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "nonce": "0x0000000000000000", + "number": 200, + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", + "timestamp": "0x5cd109fb", + "totalDifficulty": "0xc9", + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" + } + } +} +``` + + + +### `eth_getUncleByBlockNumberAndIndex` + +Returns uncle specified by block number and index. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `uncleIndex`: _string_ - index of the uncle + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object) + +:::note + +Uncles do not contain individual transactions. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x7689D2", "0x0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleByBlockNumberAndIndex", + "params": ["0x7689D2", "0x0"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x77daec467bf93", + "extraData": "0x50505945206e616e6f706f6f6c2e6f7267", + "gasLimit": "0x7a121d", + "gasUsed": "0x7a0f7b", + "hash": "0x42d83ae9c0743f4b1f9c61ff7ea8b164c1bab3627decd49233760680be006ecf", + "logsBloom": "0x888200800000340120220008640200500408006100038400100581c000080240080a0014e8002010080004088040004022402a000c18010001400100002a041141a0610a0052900600041018c0002a0003090020404c00206010010513d00020005380124e08050480710000000108401012b0901c1424006000083a10a8c1040100a0440081050210124400040044304070004001100000012600806008061d0320800000b40042160600002480000000800000c0002100200940801c000820800048024904710000400640490026000a44300309000286088010c2300060003011380006400200812009144042204810209020410a84000410520c08802941", + "miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", + "mixHash": "0xf977fcdb52868be410b75ef2becc35cc312f13ab0a6ce400ecd9d445f66fa3f2", + "nonce": "0x628b28403bf1e3d3", + "number": "0x7689d0", + "parentHash": "0xb32cfdfbf4adb05d30f02fcc6fe039cc6666402142954051c1a1cb9cc91aa11e", + "receiptsRoot": "0x9c7c8361d1a24ea2841432234c81974a9920d3eba2b2b1c496b5f925a95cb4ac", + "sha3Uncles": "0x7d972aa1b182b7e93f1db043f03fbdbfac6874fe7e67e162141bcc0aefa6336b", + "size": "0x21a", + "stateRoot": "0x74e97b77813146344d75acb5a52a006cc6dfaca678a10fb8a484a8443e919272", + "timestamp": "0x5cdcc0a7", + "totalDifficulty": "0x229b0583b4bd2698ca0", + "transactionsRoot": "0x1d21626afddf05e5866de66ca3fcd98f1caf5357eba0cc6ec675606e116a891b", + "uncles": [] + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:2587){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 2587) { + ommerAt(index: 0) { + difficulty + extraData + gasLimit + gasUsed + hash + logsBloom + mixHash + nonce + number + receiptsRoot + stateRoot + timestamp + totalDifficulty + transactionsRoot + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerAt": null + } + } +} +``` + + + +### `eth_getUncleCountByBlockHash` + +Returns the number of uncles in a block from a block matching the given block hash. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +#### Returns + +`result`: _string_ - integer representing the number of uncles in the specified block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleCountByBlockHash", + "params": [ + "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 0x0 +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426\"){ommerCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426") { + ommerCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerCount": 2 + } + } +} +``` + + + +### `eth_getUncleCountByBlockNumber` + +Returns the number of uncles in a block matching the specified block number. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - integer representing the number of uncles in the specified block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleCountByBlockNumber", + "params": ["0xe8"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:\"0x59fd\"){ommerCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: "0x59fd") { + ommerCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerCount": 0 + } + } +} +``` + + + +### `eth_getWork` + +Returns the hash of the current block, the seed hash, and the required target boundary condition. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - array with the following items: + +- `header`: _string_ - 32-byte hash of the current block header (PoW-hash) + +- `seed`: _string_ - 32-byte seed hash used for the DAG + +- `target`: _string_ - 32-byte required target boundary condition: 2^256 / difficulty + +- `blockNumber`: _string_ - hexadecimal integer representing the current block number + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getWork","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_getWork", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0xce5e32ca59cb86799a1879e90150b2c3b882852173e59865e9e79abb67a9d636", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3", + "0x42" + ] +} +``` + + + +### `eth_hashrate` + +Returns the number of hashes per second with which the node is mining. + +When the stratum server is enabled, this method returns the cumulative hashrate of all sealers reporting their hashrate. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - number of hashes per second + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x12b" +} +``` + + + +### `eth_mining` + +Whether the client is actively mining new blocks. Besu pauses mining while the client synchronizes with the network regardless of command settings or methods called. + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - indicates if the client is actively mining new blocks + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_mining", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": true +} +``` + + + +### `eth_newBlockFilter` + +Creates a filter to retrieve new block hashes. To poll for new blocks, use [`eth_getFilterChanges`](#eth_getfilterchanges). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_newBlockFilter", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x9d78b6780f844228b96ecc65a320a825" +} +``` + + + +### `eth_newFilter` + +Creates a [log filter](../../concepts/events-and-logs.md). To poll for logs associated with the created filter, use [`eth_getFilterChanges`](#eth_getfilterchanges). To get all logs associated with the filter, use [`eth_getFilterLogs`](#eth_getfilterlogs). + +#### Parameters + +`filterOptions`: _object_ - [filter options object](objects.md#filter-options-object) + +:::note + +`fromBlock` and `toBlock` in the filter options object default to `latest`. + +::: + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"fromBlock":"earliest", "toBlock":"latest", "topics":[]}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_newFilter", + "params": [{ "fromBlock": "earliest", "toBlock": "latest", "topics": [] }], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1ddf0c00989044e9b41cc0ae40272df3" +} +``` + + + +### `eth_newPendingTransactionFilter` + +Creates a filter to retrieve new pending transactions hashes. To poll for new pending transactions, use [`eth_getFilterChanges`](#eth_getfilterchanges). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_newPendingTransactionFilter", + "params": [], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x443d6a77c4964707a8554c92f7e4debd" +} +``` + + + +### `eth_protocolVersion` + +Returns current Ethereum protocol version. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - Ethereum protocol version + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_protocolVersion", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x3f" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{protocolVersion}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + protocolVersion +} +``` + +# GraphQL result + +```json +{ + "data": { + "protocolVersion": 63 + } +} +``` + + + +### `eth_sendRawTransaction` + +Sends a [signed transaction](../../how-to/send-transactions.md). A transaction can send ether, deploy a contract, or interact with a contract. Set the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../cli/options.md#rpc-tx-feecap) CLI option. + +You can interact with contracts using `eth_sendRawTransaction` or [`eth_call`](#eth_call). + +To avoid exposing your private key, create signed transactions offline and send the signed transaction data using `eth_sendRawTransaction`. + +:::info + +Besu doesn't implement [`eth_sendTransaction`](../../how-to/send-transactions.md). + +[EthSigner](https://docs.ethsigner.consensys.net/) provides transaction signing and implements [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). + +::: + +#### Parameters + +`transaction`: _string_ - signed transaction serialized to hexadecimal format + +:::note + +[Creating and sending transactions](../../how-to/send-transactions.md) includes examples of creating signed transactions using the [web3.js](https://github.com/ethereum/web3.js/) library. + +::: + +#### Returns + +`result`: _string_ - 32-byte transaction hash + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_sendRawTransaction", + "params": [ + "0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation {sendRawTransaction(data: \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\")}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +mutation { + sendRawTransaction(data: "0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833") +} +``` + +# GraphQL result + +```json +{ + "data": { + "sendRawTransaction": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" + } +} +``` + + + +### `eth_submitHashrate` + +Submits the mining hashrate. This is used by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer). + +#### Parameters + +- `hashrate`: _string_ - 32-byte hexadecimal string representation of the hashrate + +- `id`: _string_ - 32-byte random hexadecimal ID identifying the client + +#### Returns + +`result`: _boolean_ - indicates if submission is successful + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitHashrate", "params":["0x0000000000000000000000000000000000000000000000000000000000500000", "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_submitHashrate", + "params": [ + "0x0000000000000000000000000000000000000000000000000000000000500000", + "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `eth_submitWork` + +Submits a proof of work (Ethash) solution. This is used by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer). + +#### Parameters + +- `nonce`: _string_ - retrieved 8-byte nonce + +- `header`: _string_ - 32-byte hash of the block header (PoW-hash) + +- `digest`: _string_ - 32-bytes mix digest + +#### Returns + +`result`: _boolean_ - indicates if the provided solution is valid + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":73} +``` + +# JSON result + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": true +} +``` + + + +### `eth_syncing` + +Returns an object with data about the synchronization status, or `false` if not synchronizing. + +:::note + +Once the node reaches the head of the chain, `eth_syncing` returns false, indicating that there is no active syncing target. + +::: + +#### Parameters + +None + +#### Returns + +`result`: _object_ or _boolean_ - synchronization status data object with the following fields, or `false` if not synchronizing: + +- `startingBlock`: _string_ - index of the highest block on the blockchain when the network synchronization starts + +- `currentBlock`: _string_ - index of the latest block (also known as the best block) for the current node (this is the same index that [`eth_blockNumber`](#eth_blocknumber) returns.) + +- `highestBlock`: _string_ - index of the highest known block in the peer network (that is, the highest block so far discovered among peer nodes. This is the same value as `currentBlock` if the current node has no peers.) + +- `pulledStates`: _string_ - if fast synchronizing, the number of state entries fetched so far, or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, this field is not returned.) + +- `knownStates`: _string_ - if fast synchronizing, the number of states the node knows of so far, or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, this field is not returned.) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_syncing", "params": [], "id": 51 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x1518", + "highestBlock": "0x9567a3", + "pulledStates": "0x203ca", + "knownStates": "0x200636" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock pulledStates knownStates}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + syncing { + startingBlock + currentBlock + highestBlock + pulledStates + knownStates + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "syncing": { + "startingBlock": 0, + "currentBlock": 5400, + "highestBlock": 9791395, + "pullStates": 132042, + "knownStates": 2098742 + } + } +} +``` + + + +### `eth_uninstallFilter` + +Uninstalls a filter with the specified ID. When a filter is no longer required, call this method. + +Filters time out when not requested by [`eth_getFilterChanges`](#eth_getfilterchanges) or [`eth_getFilterLogs`](#eth_getfilterlogs) for 10 minutes. + +#### Parameters + +`filterId`: _string_ - filter ID + +#### Returns + +`result`: _boolean_ - indicates if the filter is successfully uninstalled + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0x70355a0b574b437eaa19fe95adfedc0a"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_uninstallFilter", + "params": ["0x70355a0b574b437eaa19fe95adfedc0a"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `MINER` methods + +The `MINER` API methods allow you to control the node’s mining operation. + +:::note + +The `MINER` API methods are not enabled by default for JSON-RPC. To enable the `MINER` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `miner_changeTargetGasLimit` + +Updates the target gas limit set using the [`--target-gas-limit`](../cli/options.md#target-gas-limit) command line option. + +#### Parameters + +`gasPrice`: _number_ - target gas price in Wei + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_changeTargetGasLimit","params":[800000], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "miner_changeTargetGasLimit", + "params": [800000], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `miner_setCoinbase` + +Sets the coinbase, the address for the mining rewards. + +:::note + +You can also use `miner_setEtherbase` as an alternative method. They both work the same way. Etherbase is a historic name for coinbase. + +::: + +#### Parameters + +`coinbase`: _string_ - Account address you pay mining rewards to + +#### Returns + +`result`: _boolean_ - `true` when address is set + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_setCoinbase","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "miner_setCoinbase", + "params": ["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `miner_start` + +Starts the mining process. To start mining, you must first specify a miner coinbase using the [`--miner-coinbase`](../cli/options.md#miner-coinbase) command line option or using [`miner_setCoinbase`](#miner_setcoinbase). + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - `true` if mining starts, or if the node is already mining + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_start","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "miner_start", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `miner_stop` + +Stops the mining process on the client. + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - `true` if mining stops, or if the node is not mining + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_stop","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "miner_stop", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `NET` methods + +The `NET` API methods provide network-related information. + +### `net_enode` + +Returns the [enode URL](../../concepts/node-keys.md#enode-url). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of the node + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_enode","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"net_enode","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "enode://6a63160d0ccef5e4986d270937c6c8d60a9a4d3b25471cda960900d037c61988ea14da67f69dbfb3497c465d0de1f001bb95598f74b68a39a5156a608c42fa1b@127.0.0.1:30303" +} +``` + + + +### `net_listening` + +Whether the client is actively listening for network connections. + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - indicates if the client is actively listening for network connections + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"net_listening","params":[],"id":53} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": true +} +``` + + + +### `net_peerCount` + +Returns the number of peers currently connected to the client. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - number of connected peers in hexadecimal + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "net_peerCount", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5" +} +``` + + + +### `net_services` + +Returns enabled services (for example, `jsonrpc`) and the host and port for each service. + +:::note + +The [`--nat-method`](../cli/options.md#nat-method) setting affects the JSON-RPC and P2P host and port values, but not the metrics host and port values. + +::: + +#### Parameters + +None + +#### Returns + +`result`: _object_ - enabled services + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_services","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"net_services","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "jsonrpc": { + "host": "127.0.0.1", + "port": "8545" + }, + "p2p": { + "host": "127.0.0.1", + "port": "30303" + }, + "metrics": { + "host": "127.0.0.1", + "port": "9545" + } + } +} +``` + + + +### `net_version` + +Returns the [network ID](../../concepts/network-and-chain-id.md). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - current network ID + +| Network ID | Chain | Network | Description | +| ---------- | ----- | ------- | ----------------------------- | +| `1` | ETH | Mainnet | Main Ethereum network | +| `5` | ETH | Goerli | PoS test network | +| `11155111` | ETH | Sepolia | PoS test network | +| `2018` | ETH | Dev | PoW development network | +| `1` | ETC | Classic | Main Ethereum Classic network | +| `7` | ETC | Mordor | PoW test network | +| `6` | ETC | Kotti | PoA test network using Clique | +| `212` | ETC | Astor | PoW test network | + +:::note + +For almost all networks, network ID and chain ID are the same. + +The only networks in the table above with different network and chain IDs are Classic with a chain ID of `61` and Mordor with a chain ID of `63`. + +::: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "net_version", "params": [], "id": 53 } +``` + +# JSON result for Mainnet + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "1" +} +``` + +# JSON result for Goerli + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "5" +} +``` + + + +## `PLUGINS` methods + +The `PLUGINS` API methods provide plugin-related functionality. + +:::note + +The `PLUGINS` API methods are not enabled by default for JSON-RPC. To enable the `PLUGINS` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `plugins_reloadPluginConfig` + +Reloads specified plugin configuration. + +#### Parameters + +`plugin`: _string_ - plugin + +#### Returns + +`result`: _string_ - `Success` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"plugins_reloadPluginConfig","params":["tech.pegasys.plus.plugin.kafka.KafkaPlugin"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "plugins_reloadPluginConfig", + "params": ["tech.pegasys.plus.plugin.kafka.KafkaPlugin"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +## `TRACE` methods + +The `TRACE` API is a more concise alternative to the [`DEBUG` API](#debug-methods). + +:::note + +The `TRACE` API methods are not enabled by default for JSON-RPC. To enable the `TRACE` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `trace_block` + +Provides transaction processing of [type `trace`](../trace-types.md#trace) for the specified block. + +:::tip + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_block","params":["0x6"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "trace_block", "params": ["0x6"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad82", + "input": "0x0000000000000000000000000000000000000999", + "to": "0x0020000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": { + "gasUsed": "0x7536", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "call" + }, + { + "action": { + "address": "0x0020000000000000000000000000000000000000", + "balance": "0x300", + "refundAddress": "0x0000000000000999000000000000000000000000" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": null, + "subtraces": 0, + "traceAddress": [0], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "suicide" + }, + { + "action": { + "author": "0x0000000000000000000000000000000000000000", + "rewardType": "block", + "value": "0x1bc16d674ec80000" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": null, + "subtraces": 0, + "traceAddress": [], + "transactionHash": null, + "transactionPosition": null, + "type": "reward" + } + ], + "id": 1 +} +``` + + + +### `trace_call` + +Executes the given call and returns a number of possible traces for it. + +:::info + +The requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `call`: _object_ - [transaction call object](objects.md#transaction-call-object) + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73","to":"0x0010000000000000000000000000000000000000","gas":"0xfffff2","gasPrice":"0xef","value":"0x0","data":"0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002","nonce":"0x0"},["trace"],"latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_call", + "params": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "to": "0x0010000000000000000000000000000000000000", + "gas": "0xfffff2", + "gasPrice": "0xef", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002", + "nonce": "0x0" + }, + ["trace"], + "latest" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas" : "0xffabba", + "input" : "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002", + "to" : "0x0010000000000000000000000000000000000000", + "value" : "0x0" + }, + "result" : { + "gasUsed" : "0x9c58", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, +"id" : 2 +}, +``` + + + +### `trace_callMany` + +Performs multiple call traces on top of the same block. You can trace dependent transactions. + +:::info + +The requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "gas" : "0x1dcd12f8", + "input" : "0x", + "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "0x186a0" + }, + "result" : { + "gasUsed" : "0x0", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, + { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "gas" : "0x1dcd12f8", + "input" : "0x", + "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "0x186a0" + }, + "result" : { + "gasUsed" : "0x0", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, + ], +"id" : 1 +}, +``` + + + +### `trace_filter` + +Returns traces matching the specified filter. + +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +`traceFilterOptions`: _object_ - [trace filter options object](objects.md#trace-filter-options-object) + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_filter","params":[{"fromBlock":"0x1","toBlock":"0x21","after":2,"count":2,"fromAddress":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"]}],"id":415}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_filter", + "params": [ + { + "fromBlock": "0x1", + "toBlock": "0x21", + "after": 2, + "count": 2, + "fromAddress": ["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"] + } + ], + "id": 415 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad82", + "input": "0x0000000000000000000000000000000000000999", + "to": "0x0020000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0xcd5d9c7acdcbd3fb4b24a39e05a38e32235751bb0c9e4f1aa16dc598a2c2a9e4", + "blockNumber": 6, + "result": { + "gasUsed": "0x7536", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "call" + }, + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad52", + "input": "0xf000000000000000000000000000000000000000000000000000000000000001", + "to": "0x0030000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0xeed85fe57db751442c826cfe4fdf43b10a5c2bc8b6fd3a8ccced48eb3fb35885", + "blockNumber": 7, + "result": { + "gasUsed": "0x1b", + "output": "0xf000000000000000000000000000000000000000000000000000000000000002" + }, + "subtraces": 0, + "traceAddress": [], + "transactionHash": "0x47f4d445ea1812cb1ddd3464ab23d2bfc6ed408a8a9db1c497f94e8e06e85286", + "transactionPosition": 0, + "type": "call" + } + ], + "id": 415 +} +``` + + + +### `trace_get` + +Returns trace at given position. + +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `transaction`: _string_ - transaction hash + +- `indexPositions`: _array_ - Index positions of the traces + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_get","params":["0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3",["0x0"]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_get", + "params": [ + "0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3", + ["0x0"] + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "action" : { + "callType" : "call", + "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", + "gas" : "0x13e99", + "input" : "0x16c72721", + "to" : "0x2bd2326c993dfaef84f696526064ff22eba5b362", + "value" : "0x0" + }, + "blockHash" : "0x7eb25504e4c202cf3d62fd585d3e238f592c780cca82dacb2ed3cb5b38883add" + "blockNumber": 3068185, + "result": { + "gasUsed": "0x183", + "output" : "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "subtraces" : 0, + "traceAddress" : [ + 0 + ], + "transactionHash": "0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3", + "transactionPosition": 2, + "type" : "call" + }, +"id" : 1 +}, +``` + + + +### `trace_rawTransaction` + +Traces a call to `eth_sendRawTransaction` without making the call, returning the traces. + +:::info + +The requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `data` - _string_ - Raw transaction data + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_rawTransaction","params":["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",["trace"]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_rawTransaction", + "params": [ + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", + ["trace"] + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "output" : "0x" + "stateDiff": null, + "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", + "trace": [{ + "action": { ... }, + "result": { + "gasUsed": "0x0", + "output": "0x" + } + "subtraces": 0, + "traceAddress": [], + "type": "call" + }], + "vmTrace": null + }, +"id" : 1 +}, +``` + + + +### `trace_replayBlockTransactions` + +Provides transaction processing tracing per block. + +:::info + +When using [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries), the requested block must be within the number of [blocks retained](../cli/options.md#bonsai-historical-block-limit) (by default, 512 from the head of the chain). + +When using [Forest](../../concepts/data-storage-formats.md#forest-of-tries), the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024 from head of the chain). + +::: + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +#### Returns + +`result`: _array_ of _objects_ - list of [transaction trace objects](objects.md#transaction-trace-object) containing one object per transaction, in transaction execution order; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the [`trace`](../trace-types.md#trace) list items in the returned transaction trace object include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_replayBlockTransactions","params": ["0x12",["trace","vmTrace","stateDiff"]],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_replayBlockTransactions", + "params": ["0x12", ["trace", "vmTrace", "stateDiff"]], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result":[ + { + "output":"0x", + "vmTrace":{ + "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", + "ops":[ + { + "cost":3, + "ex":{ + "mem":null, + "push":[ + "0x8" + ], + "store":null, + "used":16756175 + }, + "pc":72, + "sub":null + }, + ... + ] + }, + "trace":[ + { + "action":{ + "callType":"call", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0xffadea", + "input":"0x", + "to":"0x0100000000000000000000000000000000000000", + "value":"0x0" + }, + "result":{ + "gasUsed":"0x1e", + "output":"0x" + }, + "subtraces":0, + "traceAddress":[ + ], + "type":"call" + } + ], + "stateDiff":{ + "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ + "balance":{ + "*":{ + "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", + "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" + } + }, + "code":"=", + "nonce":{ + "*":{ + "from":"0x14", + "to":"0x15" + } + }, + "storage":{ + } + } + }, + "transactionHash":"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd", + }, + {...} + ] +} +``` + + + +### `trace_transaction` + +Provides transaction processing of [type `trace`](../trace-types.md#trace) for the specified transaction. + +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +`transaction`: _string_ - transaction hash + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_transaction","params": ["0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_transaction", + "params": [ + "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "creationMethod": "create", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gas": "0xff2e26", + "init": "0x60006000600060006000732c2b9c9a4a25e24b174f26114e8926a9f2128fe45af2600060006000600060007300a00000000000000000000000000000000000005af2", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "address": "0x30753e4a8aad7f8597332e813735def5dd395028", + "code": "0x", + "gasUsed": "0x1c39" + }, + "subtraces": 2, + "traceAddress": [], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "create" + }, + { + "action": { + "callType": "callcode", + "from": "0x30753e4a8aad7f8597332e813735def5dd395028", + "gas": "0xfb2ea9", + "input": "0x", + "to": "0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "gasUsed": "0x138e", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [0], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "call" + }, + { + "action": { + "address": "0x30753e4a8aad7f8597332e813735def5dd395028", + "balance": "0x0", + "refundAddress": "0x0000000000000000000000000000000000000000" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": null, + "subtraces": 0, + "traceAddress": [0, 0], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "suicide" + }, + { + "action": { + "callType": "callcode", + "from": "0x30753e4a8aad7f8597332e813735def5dd395028", + "gas": "0xfb18a5", + "input": "0x", + "to": "0x00a0000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "gasUsed": "0x30b", + "output": "0x" + }, + "subtraces": 0, + "traceAddress": [1], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "call" + } + ], + "id": 1 +} +``` + + + +## `TXPOOL` methods + +The `TXPOOL` API methods allow you to inspect the contents of the transaction pool. + +:::note + +The `TXPOOL` API methods are not enabled by default for JSON-RPC. To enable the `TXPOOL` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `txpool_besuPendingTransactions` + +Lists pending transactions that match the supplied filter conditions. + +#### Parameters + +- `numResults`: _number_ - integer representing the maximum number of results to return + +- `fields`: _object_ - object of fields used to create the filter condition + +Each field in the object corresponds to a field name containing an operator, and a value for the operator. A field name can only be specified once, and can only contain one operator. For example, you cannot query transactions with a gas price between 8 and 9 Gwei by using both the `gt` and `lt` operator in the same field name instance. + +All filters must be satisfied for a transaction to be returned. + +| Field name | Value | Value type | Supported operators | +| --- | --- | :-: | --- | +| `from` | Address of the sender. | _Data_, 20 bytes | `eq` | +| `to` | Address of the receiver, or `"contract_creation"`. | _Data_, 20 bytes | `eq`, `action` | +| `gas` | Gas provided by the sender. | _Quantity_ | `eq`, `gt`, `lt` | +| `gasPrice` | Gas price, in wei, provided by the sender. | _Quantity_ | `eq`, `gt`, `lt` | +| `value` | Value transferred, in wei. | _Quantity_ | `eq`, `gt`, `lt` | +| `nonce` | Number of transactions made by the sender. | _Quantity_ | `eq`, `gt`, `lt` | + +Supported operators: + +- `eq` (equal to) + +- `lt` (less than) + +- `gt` (greater than) + +- `action` + +:::note + +The only supported `action` is `"contract_creation"`. + +::: + +#### Returns + +`result`: _array_ of _objects_ - list of objects with [details of the pending transaction](objects.md#pending-transaction-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuPendingTransactions","params":[2,{"from":{"eq":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"},"gas":{"lt":"0x5209"},"nonce":{"gt":"0x1"}}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "txpool_besuPendingTransactions", + "params": [ + 2, + { + "from": { "eq": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" }, + "gas": { "lt": "0x5209" }, + "nonce": { "gt": "0x1" } + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0xab5d04c00", + "hash": "0xb7b2f4306c1c228ec94043da73b582594007091a7dfe024b1f8d6d772284e54b", + "input": "0x", + "nonce": "0x2", + "to": "0xf8be4ebda7f62d79a665294ec1263bfdb59aabf2", + "value": "0x0", + "v": "0xfe8", + "r": "0x5beb711e652c6cf0a589d3cea904eefc4f45ce4372652288701d08cc4412086d", + "s": "0x3af14a56e63aa5fb7dcb444a89708363a9d2c1eba1f777c67690288415080ded" + } + ] +} +``` + + + +### `txpool_besuStatistics` + +Lists statistics about the node transaction pool. + +#### Parameters + +None + +#### Returns + +`result`: _object_ - transaction pool statistics object with the following fields: + +- `maxSize`: _number_ - maximum number of transactions kept in the transaction pool; use the [`--tx-pool-max-size`](../cli/options.md#tx-pool-max-size) option to configure the maximum size. + +- `localCount`: _number_ - number of transactions submitted directly to this node + +- `remoteCount`: _number_ - number of transactions received from remote nodes + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "maxSize": 4096, + "localCount": 1, + "remoteCount": 0 + } +} +``` + + + +### `txpool_besuTransactions` + +Lists transactions in the node transaction pool. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _objects_ - list of transactions + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuTransactions","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "txpool_besuTransactions", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "hash": "0x8a66830098be4006a3f63a03b6e9b67aa721e04bd6b46d420b8f1937689fb4f1", + "isReceivedFromLocalSource": true, + "addedToPoolAt": "2019-03-21T01:35:50.911Z" + }, + { + "hash": "0x41ee803c3987ceb5bcea0fad7a76a8106a2a6dd654409007d9931032ea54579b", + "isReceivedFromLocalSource": true, + "addedToPoolAt": "2019-03-21T01:36:00.374Z" + } + ] +} +``` + + + +## `WEB3` methods + +The `WEB3` API methods provide functionality for the Ethereum ecosystem. + +### `web3_clientVersion` + +Returns the current client version. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - current client version + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "web3_clientVersion", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "besu/" +} +``` + + + +### `web3_sha3` + +Returns a [SHA3](https://en.wikipedia.org/wiki/SHA-3) hash of the specified data. The result value is a [Keccak-256](https://keccak.team/keccak.html) hash, not the standardized SHA3-256. + +#### Parameters + +`data`: _string_ - data to convert to a SHA3 hash + +#### Returns + +`result`: _string_ - SHA3 result of the input data + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c00"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "web3_sha3", + "params": ["0x68656c6c6f20776f726c00"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5e39a0a66544c0668bde22d61c47a8710000ece931f13b84d3b2feb44ec96d3f" +} +``` + + + +## Miscellaneous methods + +### `rpc_modules` + +Lists [enabled APIs](../../how-to/use-besu-api/json-rpc.md#api-methods-enabled-by-default) and the version of each. + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _strings_ - enabled APIs and their versions + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "web3": "1.0", + "eth": "1.0", + "net": "1.0" + } +} +``` + + + + + +[schema]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/ethereum/api/src/main/resources/schema.graphqls +[eth_sendRawTransaction or eth_call]: ../../how-to/send-transactions.md#eth_call-or-eth_sendrawtransaction +[transaction]: https://ropsten.etherscan.io/tx/0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6 diff --git a/versioned_docs/version-23.4.1/public-networks/reference/api/objects.md b/versioned_docs/version-23.4.1/public-networks/reference/api/objects.md new file mode 100644 index 00000000000..1694463f148 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/api/objects.md @@ -0,0 +1,265 @@ +--- +title: Objects +description: Hyperledger Besu API objects reference +tags: + - public networks + - private networks +--- + +# Besu API objects + +The following objects are parameters for or returned by Besu API methods. + +:::info + +This reference contains API objects that apply to both public and private networks. For private-network-specific API objects, see the [private network API object reference](../../../private-networks/reference/api/objects.md). + +::: + +## Block object + +Returned by [`eth_getBlockByHash`](index.md#eth_getblockbyhash) and [`eth_getBlockByNumber`](index.md#eth_getblockbynumber). + +| Key | Type | Value | +| --- | :-: | --- | +| `number` | _Quantity_, Integer | Block number. `null` when block is pending. | +| `hash` | _Data_, 32 bytes | Hash of the block. `null` when block is pending. | +| `parentHash` | _Data_, 32 bytes | Hash of the parent block. | +| `nonce` | _Data_, 8 bytes | Hash of the generated proof of work. `null` when block is pending. | +| `sha3Uncles` | _Data_, 32 bytes | SHA3 of the uncle's data in the block. | +| `logsBloom` | _Data_, 256 bytes | Bloom filter for the block logs. `null` when block is pending. | +| `transactionsRoot` | _Data_, 32 bytes | Root of the transaction trie for the block. | +| `stateRoot` | Data, 32 bytes | Root of the final state trie for the block. | +| `receiptsRoot` | Data, 32 bytes | Root of the receipts trie for the block. | +| `miner` | Data, 20 bytes | Address to pay mining rewards to. | +| `difficulty` | Quantity, Integer | Difficulty for this block. | +| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. This value will always be `0` for an uncle block. | +| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. Stores extra data when used with [Clique](../../../private-networks/how-to/configure/consensus/clique.md#genesis-file) and [IBFT](../../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | +| `size` | Quantity, Integer | Size of block in bytes. | +| `gasLimit` | Quantity | Maximum gas allowed in this block. | +| `gasUsed` | Quantity | Total gas used by all transactions in this block. | +| `timestamp` | Quantity | Unix timestamp (milliseconds) for block assembly. | +| `transactions` | Array | Array of [transaction objects](#transaction-object), or 32 byte transaction hashes depending on the specified boolean parameter. | +| `uncles` | Array | Array of uncle hashes. | +| `baseFeePerGas` | Quantity | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | + +## Fee history results object + +Returned by [`eth_feeHistory`](index.md#eth_feehistory) for the requested block range. If blocks in the specified block range are not available, then only the fee history for available blocks is returned. + +| Key | Type | Value | +| --- | :-: | --- | +| `oldestBlock` | Quantity, Integer | Lowest number block of the returned range. | +| `baseFeePerGas` | Array | Array of block base fees per gas, including an extra block value. The extra value is the next block after the newest block in the returned range. Returns zeroes for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | +| `gasUsedRatio` | Array | Array of block gas used ratios. These are calculated as the ratio of `gasUsed` and `gasLimit`. | +| `reward` | Array | Array of effective priority fee per gas data points from a single block. All zeroes are returned if the block is empty. | + +## Filter options object + +Parameter for [`eth_newFilter`](index.md#eth_newfilter), [`eth_getLogs`](index.md#eth_getlogs), and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). Used to [`filter logs`](../../how-to/use-besu-api/access-logs.md). + +| Key | Type | Required/Optional | Value | +| --- | :-: | :-: | --- | +| `fromBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | +| `toBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | +| `address` | Data | Array | Optional | Contract address or array of addresses from which [logs](../../concepts/events-and-logs.md) originate. | +| `topics` | Array of Data, 32 bytes each | Optional | Array of topics by which to [filter logs](../../concepts/events-and-logs.md#topic-filters). | + +[`eth_getLogs`](index.md#eth_getlogs) and [`priv_getLogs`](index.md#priv_getlogs) have an extra key. + +| Key | Type | Required/Optional | Value | +| --- | :-: | :-: | --- | +| `blockHash` | Data, 32 bytes | Optional. | Hash of block for which to return logs. If you specify `blockHash`, you cannot specify `fromBlock` and `toBlock`. | + +## Log object + +Returned by [`eth_getFilterChanges`](index.md#eth_getfilterchanges) and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). [`Transaction receipt objects`](#transaction-receipt-object) can contain an array of log objects. + +| Key | Type | Value | +| --- | :-: | --- | +| `removed` | Tag | `true` if log removed because of a chain reorganization. `false` if a valid log. | +| `logIndex` | Quantity, Integer | Log index position in the block. `null` when log is pending. | +| `transactionIndex` | Quantity, Integer | Index position of the starting transaction for the log. `null` when log is pending. | +| `transactionHash` | Data, 32 bytes | Hash of the starting transaction for the log. `null` when log is pending. | +| `blockHash` | Data, 32 bytes | Hash of the block that includes the log. `null` when log is pending. | +| `blockNumber` | Quantity | Number of block that includes the log. `null` when log is pending. | +| `address` | Data, 20 bytes | Address the log originated from. | +| `data` | Data | Non-indexed arguments of the log. | +| `topics` | Array of Data, 32 bytes each | [Event signature hash](../../concepts/events-and-logs.md#event-signature-hash) and 0 to 3 [indexed log arguments](../../concepts/events-and-logs.md#event-parameters). | + +## Miner data object + +Returned by [`eth_getMinerDataByBlockHash`](index.md#eth_getminerdatabyblockhash) and [`eth_getMinerDataByBlockNumber`](index.md#eth_getminerdatabyblocknumber). + +| Key | Type | Value | +| --- | :-: | --- | +| `netBlockReward` | Quantity, Integer | The net block reward, in Wei, is `staticBlockReward + transactionFee + uncleInclusionReward`. | +| `staticBlockReward` | Quantity, Integer | The static block reward, in Wei, is preset on a hard fork. | +| `transactionFee` | Quantity, Integer | The transaction fee, in Wei, is `sum of upfront cost - refund amount for all transactions`. | +| `uncleInclusionReward` | Quantity, Integer | The uncle inclusion reward, in Wei, is `static block reward * number of ommers/32`. | +| `uncleRewards` | Map | Map of uncle block hashes and uncle miner coinbase addresses. | +| `coinbase` | Data, 20 bytes | Coinbase address. | +| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. | +| `difficulty` | Quantity, Integer | Difficulty of this block. | +| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. | + +## Pending transaction object + +Returned by [`txpool_besuPendingTransactions`](index.md#txpool_besupendingtransactions). + +| Key | Type | Value | +| --- | :-: | --- | +| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Not used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `hash` | Data, 32 bytes | Hash of the transaction. | +| `input` | Data | Data sent with the transaction to create or invoke a contract. | +| `nonce` | Quantity | Number of transactions made by the sender before this one. | +| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `value` | Quantity | Value transferred, in Wei. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | + +## Range object + +Returned by [`debug_storageRangeAt`](index.md#debug_storagerangeat). + +| Key | Type | Value | +| --- | :-: | --- | +| `storage` | Object | Key hash and value. Pre-image key is `null` if it falls outside the cache. | +| `nextKey` | Hash | Hash of next key if further storage in range. Otherwise, not included. | + +### Structured log object + +Log information returned as part of the [Trace object](#trace-object). + +| Key | Type | Value | +| --- | :-: | --- | +| `pc` | Integer | Current program counter. | +| `op` | String | Current OpCode. | +| `gas` | Integer | Gas remaining. | +| `gasCost` | Integer | Cost in wei of each gas unit. | +| `depth` | Integer | Execution depth. | +| `exceptionalHaltReasons` | Array | One or more strings representing an error condition causing the EVM execution to terminate. These strings suggest that EVM execution terminated for reasons such as running out of gas or attempting to execute an unknown instruction. Generally a single exceptional halt reason returns but it's possible for more than one to occur at once. | +| `stack` | Array of 32 byte arrays | EVM execution stack before executing current operation. | +| `memory` | Array of 32 byte arrays | Memory space of the contract before executing current operation. | +| `storage` | Object | Storage entries changed by the current transaction. | + +## Trace object + +Returned by [`debug_traceBlock`](index.md#debug_traceblock), [`debug_traceBlockByHash`](index.md#debug_traceblockbyhash), [`debug_traceBlockByNumber`](index.md#debug_traceblockbynumber), and [`debug_traceTransaction`](index.md#debug_tracetransaction). + +| Key | Type | Value | +| --- | :-: | --- | +| `gas` | Integer | Gas used by the transaction. | +| `failed` | Boolean | True if transaction failed, otherwise, false. | +| `returnValue` | String | Bytes returned from transaction execution (without a `0x` prefix). | +| `structLogs` | Array | Array of structured log objects. | + +## Trace filter options object + +Parameter for [`trace_filter`](index.md#trace_filter). All parameters are optional. + +| Key | Type | Value | +| --- | :-: | --- | +| `fromBLock` | String | Tag | Trace starts at this block. | +| `toBlock` | String | Tag | Trace stops at this block. | +| `fromAddress` | String | Include only traces sent from this address. | +| `toAddress` | String | Include only traces with this destination address. | +| `after` | Quantity | The offset trace number. | +| `count` | Integer | Number of traces to display in a batch. | + +## Transaction object + +Returned by [`eth_getTransactionByHash`](index.md#eth_gettransactionbyhash), [`eth_getTransactionByBlockHashAndIndex`](index.md#eth_gettransactionbyblockhashandindex), and [`eth_getTransactionByBlockNumberAndIndex`](index.md#eth_gettransactionbyblocknumberandindex). + +| Key | Type | Value | +| --- | :-: | --- | +| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `blockHash` | Data, 32 bytes | Hash of the block containing this transaction. `null` when transaction is pending. | +| `blockNumber` | Quantity | Block number of the block containing this transaction. `null` when transaction is pending. | +| `chainId` | Quantity | [Chain ID](../../concepts/network-and-chain-id.md). | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | +| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `hash` | Data, 32 bytes | Hash of the transaction. | +| `input` | Data | Data sent with the transaction to create or invoke a contract. For [private transactions](../../../private-networks/concepts/privacy/index.md), it's a pointer to the transaction location in [Tessera](https://docs.tessera.consensys.net/). | +| `nonce` | Quantity | Number of transactions made by the sender before this one. | +| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | +| `transactionIndex` | Quantity, Integer | Index position of the transaction in the block. `null` when transaction is pending. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `value` | Quantity | Value transferred, in Wei. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | + +## Transaction call object + +Parameter for [`eth_call`](index.md#eth_call), [`eth_createAccessList`](index.md#eth_createAccessList), and [`eth_estimateGas`](index.md#eth_estimategas). + +All transaction call object parameters are optional. + +| Key | Type | Value | +| --- | :-: | --- | +| `from` | Data, 20 bytes | Address of the sender. | +| `to` | Data, 20 bytes | Address of the action receiver. | +| `gas` | Quantity, Integer | Gas provided by the sender. `eth_call` consumes zero gas, but other executions might need this parameter. `eth_estimateGas` ignores this value. | +| `gasPrice` | Quantity, Integer | Gas price, in Wei, provided by the sender. The default is `0`. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | +| `maxPriorityFeePerGas` | Quantity, Integer | Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxFeePerGas`. | +| `maxFeePerGas` | Quantity, Integer | Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxPriorityFeePerGas`. | +| `value` | Quantity, Integer | Value transferred, in Wei. | +| `data` | Data | Hash of the method signature and encoded parameters. For details, see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html). | +| `accessList` | Array | List of addresses and storage keys that the transaction plans to access. Used only in non-[`FRONTIER`](../../concepts/transactions/types.md#frontier-transactions) transactions. | +| `strict` | Tag | If `true`, checks that the `from` account’s ether balance is sufficient to cover the transaction and gas fee. If `false`, the `gasPrice` and `baseFee` are set to zero, in order to simulate a transaction without enforcing a balance check. The default is `false`. | + +## Transaction receipt object + +Returned by [`eth_getTransactionReceipt`](index.md#eth_gettransactionreceipt). + +| Key | Type | Value | +| --- | :-: | --- | +| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | +| `blockNumber` | Quantity | Block number of block containing this transaction. | +| `contractAddress` | Data, 20 bytes | Contract address created, if contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | +| `cumulativeGasUsed` | Quantity | Total amount of gas used by previous transactions in the block and this transaction. | +| `effectiveGasPrice` | Quantity | The [actual value per gas deducted](../../concepts/transactions/types.md#eip1559-transactions) from the sender's account. | +| `from` | Data, 20 bytes | Address of the sender. | +| `gasUsed` | Quantity | Amount of gas used by this specific transaction. | +| `logs` | Array | Array of [log objects](#log-object) generated by this transaction. | +| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | +| `status` | Quantity | Either `0x0` (failure), `0x1` (success), or `0x2` (invalid). | +| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | +| `transactionHash` | Data, 32 bytes | Hash of the transaction. | +| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | +| `type` | Quantity | Transaction type, `0x00` for legacy transactions, `0x01` for access list types, `0x02` for dynamic fees. | + +:::note + +For pre-Byzantium transactions, the transaction receipt object includes the following instead of `status`: + +| Key | Type | Value | +| ------ | :-----------------: | --------------------------- | +| `root` | Data, 32 bytes | Post-transaction state root | + +::: + +## Transaction trace object + +Returned by [`trace_replayBlockTransactions`](index.md#trace_replayblocktransactions). + +| Key | Type | Value | +| --- | :-: | --- | +| `output` | Boolean | Transaction result. 1 for success and 0 for failure. | +| `stateDiff` | Object | [State changes in the requested block](../trace-types.md#statediff). | +| `trace` | Array | [Ordered list of calls to other contracts](../trace-types.md#trace). | +| `vmTrace` | Object | [Ordered list of EVM actions](../trace-types.md#vmtrace). | +| `transactionHash` | Data, 32 bytes | Hash of the replayed transaction. | diff --git a/versioned_docs/version-23.4.1/public-networks/reference/cli/_category_.json b/versioned_docs/version-23.4.1/public-networks/reference/cli/_category_.json new file mode 100644 index 00000000000..e94b0c9a474 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/cli/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu command line", + "position": 1 +} diff --git a/versioned_docs/version-23.4.1/public-networks/reference/cli/options.md b/versioned_docs/version-23.4.1/public-networks/reference/cli/options.md new file mode 100644 index 00000000000..63a2367a32e --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/cli/options.md @@ -0,0 +1,3943 @@ +--- +title: Options +description: Hyperledger Besu command line interface reference +sidebar_position: 1 +tags: + - public networks + - private networks +--- + +# Command line options + +This reference describes the syntax of the Hyperledger Besu command line interface (CLI) options. + +:::info + +This reference contains options that apply to both public and private networks. For private-network-specific options, see the [private network options reference](../../../private-networks/reference/cli/options.md). + +::: + +## Specify options + +You can specify Besu options: + +- On the command line. + + ```bash + besu [OPTIONS] [SUBCOMMAND] + ``` + +- As an environment variable. For each command line option, the equivalent environment variable is: + + - Uppercase. + - `_` replaces `-`. + - Has a `BESU_` prefix. + + For example, set `--miner-coinbase` using the `BESU_MINER_COINBASE` environment variable. + +- In a [configuration file](../../how-to/configuration-file.md). + +If you specify an option in more than one place, the order of priority is command line, environment variable, configuration file. + +If using Bash or Z shell, you can view option suggestions by entering `--` and pressing the Tab key twice. + +```bash +besu --Tab+Tab +``` + +:::caution + +Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em hyphens. + +::: + +## Options + +### `api-gas-price-blocks` + + + +# Syntax + +```bash +--api-gas-price-blocks= +``` + +# Example + +```bash +--api-gas-price-blocks=50 +``` + +# Environment variable + +```bash +BESU_API_GAS_PRICE_BLOCKS=50 +``` + +# Example configuration file + +```bash +api-gas-price-blocks=50 +``` + + + +Number of blocks back from the head block to examine for [`eth_gasPrice`](../api/index.md#eth_gasprice). The default is `100`. + +### `api-gas-price-max` + + + +# Syntax + +```bash +--api-gas-price-max= +``` + +# Example + +```bash +--api-gas-price-max=20000 +``` + +# Environment variable + +```bash +BESU_API_GAS_PRICE_MAX=20000 +``` + +# Example configuration file + +```bash +api-gas-price-max=20000 +``` + + + +Maximum gas price to return for [`eth_gasPrice`](../api/index.md#eth_gasprice), regardless of the percentile value measured. The default is `500000000000` (500 GWei). + +### `api-gas-price-percentile` + + + +# Syntax + +```bash +--api-gas-price-percentile= +``` + +# Example + +```bash +--api-gas-price-percentile=75 +``` + +# Environment variable + +```bash +BESU_API_GAS_PRICE_PERCENTILE=75 +``` + +# Example configuration file + +```bash +api-gas-price-percentile=75 +``` + + + +Percentile value to measure for [`eth_gasPrice`](../api/index.md#eth_gasprice). The default is `50.0`. + +For [`eth_gasPrice`](../api/index.md#eth_gasprice), to return the: + +- Highest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `100`. +- Lowest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `0`. + +### `auto-log-bloom-caching-enabled` + + + +# Syntax + +```bash +--auto-log-bloom-caching-enabled[=] +``` + +# Example + +```bash +--auto-log-bloom-caching-enabled=false +``` + +# Environment variable + +```bash +BESU_AUTO_LOG_BLOOM_CACHING_ENABLED=false +``` + +# Example configuration file + +```bash +auto-log-bloom-caching-enabled=false +``` + + + +Enables or disables automatic log bloom caching. APIs such as [`eth_getLogs`](../api/index.md#eth_getlogs) and [`eth_getFilterLogs`](../api/index.md#eth_getfilterlogs) use the cache for improved performance. The default is `true`. + +If automatic log bloom caching is enabled and a log bloom query reaches the end of the cache, Besu performs an uncached query for logs not yet written to the cache. + +Automatic log bloom caching has a small impact on performance. If you are not querying logs blooms for a large number of blocks, you might want to disable automatic log bloom caching. + +### `banned-node-ids` + + + +# Syntax + +```bash +--banned-node-ids=[,...]... +``` + +# Example + +```bash +--banned-node-ids=0xc35c3...d615f,0xf42c13...fc456 +``` + +# Environment variable + +```bash +BESU_BANNED_NODE_IDS=0xc35c3...d615f,0xf42c13...fc456 +``` + +# Configuration file + +```bash +banned-node-ids=["0xc35c3...d615f","0xf42c13...fc456"] +``` + + + +A list of node IDs with which this node will not peer. The node ID is the public key of the node. You can specify the banned node IDs with or without the `0x` prefix. + +:::tip + +The singular `--banned-node-id` and plural `--banned-node-ids` are available and are two names for the same option. + +::: + +### `bonsai-historical-block-limit` + + + +# Syntax + +```bash +--bonsai-historical-block-limit=256 +``` + +# Example + +```bash +--bonsai-historical-block-limit=256 +``` + +# Environment variable + +```bash +BESU_BONSAI_MAXIMUM_BACK_LAYERS_TO_LOAD=256 +``` + +# Example configuration file + +```bash +bonsai-historical-block-limit=256 +``` + + + +When using [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries), the [maximum number of previous blocks](../../concepts/data-storage-formats.md#accessing-data) for which Bonsai can reconstruct a historical state. The default is 512. + +### `bootnodes` + + + +# Syntax + +```bash +--bootnodes[=[,...]...] +``` + +# Example + +```bash +--bootnodes=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` + +# Environment variable + +```bash +BESU_BOOTNODES=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` + +# Example configuration file + +```bash +bootnodes=["enode://c35c3...d615f@1.2.3.4:30303","enode://f42c13...fc456@1.2.3.5:30303"] +``` + + + +A list of comma-separated [enode URLs](../../concepts/node-keys.md#enode-url) for [P2P discovery bootstrap](../../../private-networks/how-to/configure/bootnodes.md). + +When connecting to Mainnet or public testnets, the default is a predefined list of enode URLs. + +In private networks defined using [`--genesis-file`](#genesis-file) or when using [`--network=dev`](#network), the default is an empty list of bootnodes. + +### `color-enabled` + + + +# Syntax + +```bash +--color-enabled[=] +``` + +# Example + +```bash +--color-enabled=false +``` + +# Environment variable + +```bash +BESU_COLOR_ENABLED=false +``` + +# Example configuration file + +```bash +color-enabled=false +``` + + + +Enables or disables color output to console. The default is `true`. + +### `compatibility-eth64-forkid-enabled` + + + +# Syntax + +```bash +--compatibility-eth64-forkid-enabled[=] +``` + +# Example + +```bash +--compatibility-eth64-forkid-enabled=true +``` + +# Environment variable + +```bash +BESU_COMPATIBILITY_ETH64_FORKID_ENABLED=true +``` + +# Example configuration file + +```bash +compatibility-eth64-forkid-enabled=true +``` + + + +Enables or disables the legacy Eth/64 fork ID. For any networks with nodes using Besu v1.4 or earlier and nodes using Besu v20.10.1 or later, either: + +- All nodes must be upgraded to v20.10.1 or later. +- All nodes using v20.10.1 or later must have `--compatibility-eth64-forkid-enabled` set to `true`. + +The default is `false`. + +:::caution + +If networks have Besu nodes using v1.4 or earlier and other Besu nodes using v20.10.1 or later, the nodes on different versions cannot communicate unless `--compatibility-eth64-forkid-enabled` is set to `true`. + +::: + +### `config-file` + + + +# Syntax + +```bash +--config-file= +``` + +# Example + +```bash +--config-file=/home/me/me_node/config.toml +``` + +# Environment variable + +```bash +BESU_CONFIG_FILE=/home/me/me_node/config.toml +``` + + + +The path to the [TOML configuration file](../../how-to/configuration-file.md). The default is `none`. + +### `data-path` + + + +# Syntax + +```bash +--data-path= +``` + +# Example + +```bash +--data-path=/home/me/me_node +``` + +# Environment variable + +```bash +BESU_DATA_PATH=/home/me/me_node +``` + +# Configuration file + +```bash +data-path="/home/me/me_node" +``` + + + +The path to the Besu data directory. The default is the directory you installed Besu in, or `/opt/besu/database` if using the [Besu Docker image](../../get-started/install/run-docker-image.md). + +### `data-storage-format` + + + +# Syntax + +```bash +--data-storage-format= +``` + +# Example + +```bash +--data-storage-format=BONSAI +``` + +# Environment variable + +```bash +BESU_DATA_STORAGE_FORMAT=BONSAI +``` + +# Configuration file + +```bash +data-storage-format="BONSAI" +``` + + + +The [data storage format](../../concepts/data-storage-formats.md) to use. Set to `BONSAI` for Bonsai Tries or `FOREST` for Forest of Tries. The default is `FOREST`. + +### `discovery-dns-url` + + + +# Syntax + +```bash +--discovery-dns-url= +``` + +# Environment variable + +```bash +BESU_DISCOVERY_DNS_URL=enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org +``` + +# Example configuration file + +```bash +discovery-dns-url="enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" +``` + + + +The `enrtree` URL of the DNS node list for [node discovery via DNS](https://eips.ethereum.org/EIPS/eip-1459). The default is `null`. + +### `discovery-enabled` + + + +# Syntax + +```bash +--discovery-enabled[=] +``` + +# Example + +```bash +--discovery-enabled=false +``` + +# Environment variable + +```bash +BESU_DISCOVERY_ENABLED=false +``` + +# Example configuration file + +```bash +discovery-enabled=false +``` + + + +Enables or disables P2P discovery. The default is `true`. + +:::note + +You can override the default DNS server if it's unreliable or doesn't serve TCP DNS requests, using the [early access option](#xhelp) `--Xp2p-dns-discovery-server=`. + +::: + +### `engine-host-allowlist` + + + +# Syntax + +```bash +--engine-host-allowlist=[,...]... or "*" +``` + +# Example + +```bash +--engine-host-allowlist=localhost,127.0.0.1 +``` + +# Environment variable + +```bash +BESU_ENGINE_HOST_ALLOWLIST=localhost,127.0.0.1 +``` + +# Configuration file + +```bash +engine-host-allowlist=["localhost","127.0.0.1"] +``` + + + +A comma-separated list of hostnames to allow for Engine API access (applies to both HTTP and WebSocket). + +:::tip + +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames in production environments. + +::: + +### `engine-jwt-disabled` + + + +# Syntax + +```bash +--engine-jwt-disabled[=] +``` + +# Example + +```bash +--engine-jwt-disabled=true +``` + +# Environment variable + +```bash +BESU_ENGINE_JWT_DISABLED=true +``` + +# Configuration file + +```bash +engine-jwt-disabled=true +``` + + + +Disables or enables [authentication](../../how-to/use-engine-api.md#authentication) for Engine APIs. The default is `false` (authentication is enabled by default). + +### `engine-jwt-secret` + + + +# Syntax + +```bash +--engine-jwt-secret= +``` + +# Example + +```bash +--engine-jwt-secret=jwt.hex +``` + +# Environment variable + +```bash +BESU_ENGINE_JWT_SECRET="jwt.hex" +``` + +# Configuration file + +```bash +engine-jwt-secret="jwt.hex" +``` + + + +Shared secret used to authenticate [consensus clients](../../concepts/the-merge.md) when using the Engine JSON-RPC API (both HTTP and WebSocket). Contents of file must be at least 32 hex-encoded bytes and not begin with `0x`. May be a relative or absolute path. See an [example of how to generate this](../../get-started/connect/mainnet.md#1-generate-the-shared-secret). + +### `engine-rpc-enabled` + + + +# Syntax + +```bash +--engine-rpc-enabled[= +``` + +# Example + +```bash +--engine-rpc-enabled +``` + +# Environment variable + +```bash +BESU_ENGINE_RPC_ENABLED=true +``` + +# Configuration file + +```bash +engine-rpc-enabled=true +``` + + + +Enables or disables the [Engine API](../engine-api/index.md). The default is `false`. + +### `engine-rpc-port` + + + +# Syntax + +```bash +--engine-rpc-port= +``` + +# Example + +```bash +--engine-rpc-port=8551 +``` + +# Environment variable + +```bash +BESU_ENGINE_RPC_PORT=8551 +``` + +# Configuration file + +```bash +engine-rpc-port="8551" +``` + + + +The listening port for the Engine API calls (`ENGINE`, `ETH`) for JSON-RPC over HTTP and WebSocket. The default is `8551`. + +### `ethstats` + + + +# Syntax + +```bash +--ethstats= +``` + +# Example + +```bash +--ethstats=Dev-Node-1:secret@127.0.0.1:3001 +``` + +# Environment variable + +```bash +BESU_ETHSTATS=Dev-Node-1:secret@127.0.0.1:3001 +``` + +# Configuration file + +```bash +ethstats="Dev-Node-1:secret@127.0.0.1:3001" +``` + + + +Reporting URL of an [Ethstats](../../../private-networks/how-to/deploy/ethstats.md) server. If specified without a port, the default port is 443 for SSL connections and 80 for non-SSL connections. + +### `ethstats-cacert-file` + + + +# Syntax + +```bash +--ethstats-cacert-file= +``` + +# Example + +```bash +--ethstats-cacert-file=./root.cert +``` + +# Environment variable + +```bash +BESU_ETHSTATS_CACERT_FILE=./root.cert +``` + +# Configuration file + +```bash +ethstats-cacert-file="./root.cert" +``` + + + +Path to the root certificate authority (CA) certificate file of the Ethstats server specified by [`--ethstats`](#ethstats). This option is useful in non-production environments. + +### `ethstats-contact` + + + +# Syntax + +```bash +--ethstats-contact= +``` + +# Example + +```bash +--ethstats-contact=contact@mail.com +``` + +# Environment variable + +```bash +BESU_ETHSTATS_CONTACT=contact@mail.com +``` + +# Configuration file + +```bash +ethstats-contact="contact@mail.com" +``` + + + +Contact email address to send to the Ethstats server specified by [`--ethstats`](#ethstats). + +### `fast-sync-min-peers` + + + +# Syntax + +```bash +--fast-sync-min-peers= +``` + +# Example + +```bash +--fast-sync-min-peers=8 +``` + +# Environment variable + +```bash +BESU_FAST_SYNC_MIN_PEERS=8 +``` + +# Example configuration file + +```bash +fast-sync-min-peers=8 +``` + + + +The minimum number of peers required before starting [fast synchronization](../../get-started/connect/sync-node.md#fast-synchronization) in [proof of work](../../how-to/use-pow/mining.md) networks. The default is 5. + +:::info + +This option only applies to proof of work networks. + +::: + +### `genesis-file` + + + +# Syntax + +```bash +--genesis-file= +``` + +# Example + +```bash +--genesis-file=/home/me/me_node/customGenesisFile.json +``` + +# Environment variable + +```bash +BESU_GENESIS_FILE=/home/me/me_node/customGenesisFile.json +``` + +# Configuration file + +```bash +genesis-file="/home/me/me_node/customGenesisFile.json" +``` + + + +The path to the [genesis file](../../concepts/genesis-file.md). + +:::caution + +You can't use the [`--genesis-file`](#genesis-file) and [`--network`](#network) options at the same time. + +::: + +### `graphql-http-cors-origins` + + + +# Syntax + +```bash +--graphql-http-cors-origins= +``` + +# Example + +```bash +--graphql-http-cors-origins="http://medomain.com","https://meotherdomain.com" +``` + +# Environment variable + +```bash +BESU_GRAPHQL_HTTP_CORS_ORIGINS="http://medomain.com","https://meotherdomain.com" +``` + +# Configuration file + +```bash +graphql-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] +``` + + + +A list of comma-separated origin domain URLs for CORS validation. The default is none. + +### `graphql-http-enabled` + + + +# Syntax + +```bash +--graphql-http-enabled[=] +``` + +# Example + +```bash +--graphql-http-enabled +``` + +# Environment variable + +```bash +BESU_GRAPHQL_HTTP_ENABLED=true +``` + +# Configuration file + +```bash +graphql-http-enabled=true +``` + + + +Enables or disables the GraphQL HTTP service. The default is `false`. + +The default GraphQL HTTP service endpoint is `http://127.0.0.1:8547/graphql` if set to `true`. + +### `graphql-http-host` + + + +# Syntax + +```bash +--graphql-http-host= +``` + +# Example + +```bash +# to listen on all interfaces +--graphql-http-host=0.0.0.0 +``` + +# Environment variable + +```bash +# to listen on all interfaces +BESU_GRAPHQL_HTTP_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +graphql-http-host="0.0.0.0" +``` + + + +The host on which GraphQL HTTP listens. The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0`. + +### `graphql-http-port` + + + +# Syntax + +```bash +--graphql-http-port= +``` + +# Example + +```bash +# to listen on port 6175 +--graphql-http-port=6175 +``` + +# Environment variable + +```bash +# to listen on port 6175 +BESU_GRAPHQL_HTTP_PORT=6175 +``` + +# Configuration file + +```bash +graphql-http-port="6175" +``` + + + +The port (TCP) on which GraphQL HTTP listens. The default is `8547`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `help` + + + +# Syntax + +```bash +-h, --help +``` + + + +Show the help message and exit. + +### `host-allowlist` + + + +# Syntax + +```bash +--host-allowlist=[,...]... or "*" +``` + +# Example + +```bash +--host-allowlist=medomain.com,meotherdomain.com +``` + +# Environment variable + +```bash +BESU_HOST_ALLOWLIST=medomain.com,meotherdomain.com +``` + +# Configuration file + +```bash +host-allowlist=["medomain.com", "meotherdomain.com"] +``` + + + +A comma-separated list of hostnames to [access the JSON-RPC API](../../how-to/use-besu-api/index.md#host-allowlist) and [pull Besu metrics](../../how-to/monitor/metrics.md). By default, Besu accepts requests from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the API, we recommend using the [Besu authentication mechanism](../../how-to/use-besu-api/authenticate.md) with username and password authentication or JWT public key authentication. + +::: + +:::note + +If using [Prometheus](https://prometheus.io/) to pull metrics from a node, you must specify all the other nodes you want to pull metrics from in the list of allowed hostnames. + +::: + +:::tip + +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames for production environments. + +::: + +### `identity` + + + +# Syntax + +```bash +--identity= +``` + +# Example + +```bash +--identity=MyNode +``` + +# Environment variable + +```bash +BESU_IDENTITY=MyNode +``` + +# Configuration file + +```bash +identity="MyNode" +``` + + + +The name for the node. If specified, it's the second section of the client ID provided by some Ethereum network explorers. For example, in the client ID `besu/MyNode/v1.3.4/linux-x86_64/oracle_openjdk-java-11`, the node name is `MyNode`. + +If a name is not specified, the name section is not included in the client ID. For example, `besu/v1.3.4/linux-x86_64/oracle_openjdk-java-11`. + +### `key-value-storage` + + + +# Syntax + +```bash +--key-value-storage= +``` + +# Example + +```bash +--key-value-storage=rocksdb +``` + +# Environment variable + +```bash +BESU_KEY_VALUE_STORAGE=rocksdb +``` + +# Configuration file + +```bash +key-value-storage="rocksdb" +``` + + + +The key-value storage to use. Use this option only if using a storage system provided with a plugin. The default is `rocksdb`. + +For development use only, the `memory` option provides ephemeral storage for sync testing and debugging. + +### `logging` + + + +# Syntax + +```bash +-l, --logging= +``` + +# Example + +```bash +--logging=DEBUG +``` + +# Environment variable + +```bash +BESU_LOGGING=DEBUG +``` + +# Example configuration file + +```bash +logging="DEBUG" +``` + + + +Sets logging verbosity. Log levels are `OFF`, `FATAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. The default is `INFO`. + +### `max-peers` + + + +# Syntax + +```bash +--max-peers= +``` + +# Example + +```bash +--max-peers=42 +``` + +# Environment variable + +```bash +BESU_MAX_PEERS=42 +``` + +# Configuration file + +```bash +max-peers=42 +``` + + + +The maximum number of P2P connections you can establish. The default is 25. + +:::caution + +The minimum number of peers is set by the early access option `--Xp2p-peer-lower-bound`, which also has a default of 25. If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` option to the same value or lower. For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. + +::: + +### `metrics-category` + + + +# Syntax + +```bash +--metrics-category=[,metrics-category...]... +``` + +# Example + +```bash +--metrics-category=BLOCKCHAIN,PEERS,PROCESS +``` + +# Environment variable + +```bash +BESU_METRICS_CATEGORY=BLOCKCHAIN,PEERS,PROCESS +``` + +# Configuration file + +```bash +metrics-category=["BLOCKCHAIN","PEERS","PROCESS"] +``` + + + +A comma-separated list of categories for which to track metrics. The defaults are `BLOCKCHAIN`, `ETHEREUM`, `EXECUTORS`, `JVM`, `NETWORK`, `PEERS`, `PERMISSIONING`, `PROCESS`, `PRUNER`, `RPC`, `STRATUM`, `SYNCHRONIZER`, and `TRANSACTION_POOL`. + +Other categories are `KVSTORE_ROCKSDB`, `KVSTORE_PRIVATE_ROCKSDB`, `KVSTORE_ROCKSDB_STATS`, and `KVSTORE_PRIVATE_ROCKSDB_STATS`. + +Categories containing `PRIVATE` track metrics when you enable [private transactions](../../../private-networks/concepts/privacy/index.md). + +### `metrics-enabled` + + + +# Syntax + +```bash +--metrics-enabled[=] +``` + +# Example + +```bash +--metrics-enabled +``` + +# Environment variable + +```bash +BESU_METRICS_ENABLED=true +``` + +# Configuration file + +```bash +metrics-enabled=true +``` + + + +Enables or disables the [metrics exporter](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The default is `false`. + +You can't specify `--metrics-enabled` with [`--metrics-push-enabled`](#metrics-push-enabled). That is, you can enable either Prometheus polling or Prometheus push gateway support, but not both at once. + +### `metrics-host` + + + +# Syntax + +```bash +--metrics-host= +``` + +# Example + +```bash +--metrics-host=127.0.0.1 +``` + +# Environment variable + +```bash +BESU_METRICS_HOST=127.0.0.1 +``` + +# Configuration file + +```bash +metrics-host="127.0.0.1" +``` + + + +The host on which [Prometheus](https://prometheus.io/) accesses [Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The metrics server respects the [`--host-allowlist` option](#host-allowlist). + +The default is `127.0.0.1`. + +### `metrics-port` + + + +# Syntax + +```bash +--metrics-port= +``` + +# Example + +```bash +--metrics-port=6174 +``` + +# Environment variable + +```bash +BESU_METRICS_PORT=6174 +``` + +# Configuration file + +```bash +metrics-port="6174" +``` + + + +The port (TCP) on which [Prometheus](https://prometheus.io/) accesses [Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The default is `9545`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `metrics-protocol` + + + +# Syntax + +```bash +--metrics-protocol= +``` + +# Example + +```bash +--metrics-protocol=OPENTELEMETRY +``` + +# Environment variable + +```bash +BESU_METRICS_PROTOCOL=OPENTELEMETRY +``` + +# Configuration file + +```bash +metrics-protocol="OPENTELEMETRY" +``` + + + +Metrics protocol to use: `PROMETHEUS`, `OPENTELEMETRY`, or `NONE`. The default is `PROMETHEUS`. + +### `metrics-push-enabled` + + + +# Syntax + +```bash +--metrics-push-enabled[=] +``` + +# Example + +```bash +--metrics-push-enabled=true +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_ENABLED=true +``` + +# Configuration file + +```bash +metrics-push-enabled=true +``` + + + +Enables or disables [push gateway integration]. + +You can't specify `--metrics-push-enabled` with [`--metrics-enabled`](#metrics-enabled). That is, you can enable either Prometheus polling or Prometheus push gateway support, but not both at once. + +### `metrics-push-host` + + + +# Syntax + +```bash +--metrics-push-host= +``` + +# Example + +```bash +--metrics-push-host=127.0.0.1 +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_HOST=127.0.0.1 +``` + +# Configuration file + +```bash +metrics-push-host="127.0.0.1" +``` + + + +The host of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The default is `127.0.0.1`. The metrics server respects the [`--host-allowlist` option](#host-allowlist). + +:::note + +When pushing metrics, ensure you set `--metrics-push-host` to the machine on which the push gateway is. Generally, this is a different machine to the machine on which Besu is running. + +::: + +### `metrics-push-interval` + + + +# Syntax + +```bash +--metrics-push-interval= +``` + +# Example + +```bash +--metrics-push-interval=30 +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_INTERVAL=30 +``` + +# Configuration file + +```bash +metrics-push-interval=30 +``` + + + +The interval, in seconds, to push metrics when in `push` mode. The default is 15. + +### `metrics-push-port` + + + +# Syntax + +```bash +--metrics-push-port= +``` + +# Example + +```bash +--metrics-push-port=6174 +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_PORT=6174 +``` + +# Configuration file + +```bash +metrics-push-port="6174" +``` + + + +The port (TCP) of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The default is `9001`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `metrics-push-prometheus-job` + + + +# Syntax + +```bash +--metrics-push-prometheus-job= +``` + +# Example + +```bash +--metrics-push-prometheus-job="my-custom-job" +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_PROMETHEUS_JOB="my-custom-job" +``` + +# Configuration file + +```bash +metrics-push-prometheus-job="my-custom-job" +``` + + + +The job name when in `push` mode. The default is `besu-client`. + +### `min-block-occupancy-ratio` + + + +# Syntax + +```bash +--min-block-occupancy-ratio= +``` + +# Example + +```bash +--min-block-occupancy-ratio=0.5 +``` + +# Environment variable + +```bash +BESU_MIN_BLOCK_OCCUPANCY_RATIO=0.5 +``` + +# Configuration file + +```bash +min-block-occupancy-ratio="0.5" +``` + + + +Minimum occupancy ratio for a mined block if the transaction pool is not empty. When filling a block during mining, the occupancy ratio indicates the threshold at which the node stops waiting for smaller transactions to fill the remaining space. The default is 0.8. + +### `miner-coinbase` + + + +# Syntax + +```bash +--miner-coinbase= +``` + +# Example + +```bash +--miner-coinbase=fe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + +# Environment variable + +```bash +BESU_MINER_COINBASE=fe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + +# Configuration file + +```bash +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +``` + + + +The account you pay mining rewards to. You must specify a valid coinbase when you enable mining using the [`--miner-enabled`](#miner-enabled) option or the [`miner_start`](../api/index.md#miner_start) JSON-RPC API method. + +:::note + +Besu ignores this option in networks using [Clique](../../../private-networks/how-to/configure/consensus/clique.md), [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md), or [QBFT](../../../private-networks/how-to/configure/consensus/qbft.md) consensus protocols. + +::: + +### `miner-enabled` + + + +# Syntax + +```bash +--miner-enabled[=] +``` + +# Example + +```bash +--miner-enabled=true +``` + +# Environment variable + +```bash +BESU_MINER_ENABLED=true +``` + +# Configuration file + +```bash +miner-enabled=true +``` + + + +Enables or disables mining when you start the node. The default is `false`. + +### `miner-extra-data` + + + +# Syntax + +```bash +--miner-extra-data= +``` + +# Example + +```bash +--miner-extra-data=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 +``` + +# Environment variable + +```bash +BESU_MINER_EXTRA_DATA=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 +``` + +# Configuration file + +```bash +miner-extra-data="0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021" +``` + + + +A hex string representing the 32 bytes included in the extra data field of a mined block. The default is 0x. + +### `miner-stratum-enabled` + + + +# Syntax + +```bash +--miner-stratum-enabled +``` + +# Environment variable + +```bash +BESU_MINER_STRATUM_ENABLED=true +``` + +# Configuration file + +```bash +miner-stratum-enabled=true +``` + + + +Enables a node to perform stratum mining. The default is `false`. + +### `miner-stratum-host` + + + +# Syntax + +```bash +--miner-stratum-host= +``` + +# Example + +```bash +--miner-stratum-host=192.168.1.132 +``` + +# Environment variable + +```bash +BESU_MINER_STRATUM_HOST=192.168.1.132 +``` + +# Configuration file + +```bash +miner-stratum-host="192.168.1.132" +``` + + + +The host of the stratum mining service. The default is `0.0.0.0`. + +### `miner-stratum-port` + + + +# Syntax + +```bash +--miner-stratum-port= +``` + +# Example + +```bash +--miner-stratum-port=8010 +``` + +# Environment variable + +```bash +BESU_MINER_STRATUM_PORT=8010 +``` + +# Configuration file + +```bash +miner-stratum-port="8010" +``` + + + +The port of the stratum mining service. The default is `8008`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `min-gas-price` + + + +# Syntax + +```bash +--min-gas-price= +``` + +# Example + +```bash +--min-gas-price=1337 +``` + +# Environment variable + +```bash +BESU_MIN_GAS_PRICE=1337 +``` + +# Configuration file + +```bash +min-gas-price=1337 +``` + + + +The minimum price a transaction offers to include it in a mined block. The minimum gas price is the lowest value [`eth_gasPrice`](../api/index.md#eth_gasprice) can return. The default is 1000 Wei. + +:::tip + +In a [free gas network](../../../private-networks/how-to/configure/free-gas.md), ensure the minimum gas price is set to zero for every node. Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. You can query a node's gas configuration using [`eth_gasPrice`](../api/index.md#eth_gasprice). + +::: + +### `nat-method` + + + +# Syntax + +```bash +--nat-method=UPNP +``` + +# Example configuration file + +```bash +nat-method="UPNP" +``` + + + +Specify the method for handling [NAT environments](../../how-to/connect/specify-nat.md). The options are: + +- [`UPNP`](../../how-to/connect/specify-nat.md#upnp) +- [`UPNPP2PONLY`](../../how-to/connect/specify-nat.md#upnp) +- [`KUBERNETES`](../../how-to/connect/specify-nat.md#kubernetes) +- [`DOCKER`](../../how-to/connect/specify-nat.md#docker) +- [`AUTO`](../../how-to/connect/specify-nat.md#auto) +- [`NONE`](../../how-to/connect/specify-nat.md#none). + +The default is `AUTO`. `NONE` disables NAT functionality. + +:::tip + +UPnP support is often disabled by default in networking firmware. If disabled by default, explicitly enable UPnP support. + +::: + +:::tip + +Use `UPNPP2PONLY` if you wish to enable UPnP for p2p traffic but not JSON-RPC. + +::: + +:::note + +Specifying `UPNP` might introduce delays during node startup, especially on networks without a UPnP gateway device. + +You must specify `DOCKER` when using the [Besu Docker image](../../get-started/install/run-docker-image.md). + +::: + +### `network` + + + +# Syntax + +```bash +--network= +``` + +# Example + +```bash +--network=goerli +``` + +# Environment variable + +```bash +BESU_NETWORK=goerli +``` + +# Configuration file + +```bash +network="goerli" +``` + + + +The predefined network configuration. The default is `mainnet`. + +Possible values are: + +| Network | Chain | Type | Default Sync Mode | Description | +| :-- | :-- | :-- | :-- | :-- | +| `mainnet` | ETH | Production | [FAST](#sync-mode) | The main network | +| `goerli` | ETH | Test | [FAST](#sync-mode) | A PoA network using Clique | +| `sepolia` | ETH | Test | [FAST](#sync-mode) | A PoW network | +| `dev` | ETH | Development | [FULL](#sync-mode) | A PoW network with a low difficulty to enable local CPU mining | +| `classic` | ETC | Production | [FAST](#sync-mode) | The main Ethereum Classic network | +| `mordor ` | ETC | Test | [FAST](#sync-mode) | A PoW network | +| `kotti` | ETC | Test | [FAST](#sync-mode) | A PoA network using Clique | +| `astor` | ETC | Test | [FAST](#sync-mode) | A PoW network | + +:::tip + +Values are case insensitive, so either `mainnet` or `MAINNET` works. + +::: + +:::info + +- You can't use the `--network` and [`--genesis-file`](#genesis-file) options at the same time. + +- The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: + +### `network-id` + + + +# Syntax + +```bash +--network-id= +``` + +# Example + +```bash +--network-id=8675309 +``` + +# Environment variable + +```bash +BESU_NETWORK_ID=8675309 +``` + +# Configuration file + +```bash +network-id="8675309" +``` + + + +The [P2P network identifier](../../concepts/network-and-chain-id.md). + +Use this option to override the default network ID. The default value is the same as the chain ID defined in the genesis file. + +### `node-private-key-file` + + + +# Syntax + +```bash +--node-private-key-file= +``` + +# Example + +```bash +--node-private-key-file=/home/me/me_node/myPrivateKey +``` + +# Environment variable + +```bash +BESU_NODE_PRIVATE_KEY_FILE=/home/me/me_node/myPrivateKey +``` + +# Configuration file + +```bash +node-private-key-file="/home/me/me_node/myPrivateKey" +``` + + + +The private key file for the node. The default is the key file in the [data directory](#data-path). If no key file exists, Besu creates a key file containing the generated private key, otherwise, the existing key file specifies the node private key. + +:::danger + +The private key is not encrypted. + +::: + +This option is ignored if [`--security-module`](#security-module) is set to a non-default value. + +### `p2p-enabled` + + + +# Syntax + +```bash +--p2p-enabled[=] +``` + +# Example + +```bash +--p2p-enabled=false +``` + +# Environment variable + +```bash +BESU_P2P_ENABLED=false +``` + +# Configuration file + +```bash +p2p-enabled=false +``` + + + +Enables or disables all P2P communication. The default is `true`. + +### `p2p-host` + + + +# Syntax + +```bash +--p2p-host= +``` + +# Example + +```bash +# to listen on all interfaces +--p2p-host=0.0.0.0 +``` + +# Environment variable + +```bash +# to listen on all interfaces +BESU_P2P_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +p2p-host="0.0.0.0" +``` + + + +The advertised host that can be used to access the node from outside the network in [P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). The default is `127.0.0.1`. + +:::info + +If [`--nat-method`](#nat-method) is set to [`NONE`](../../how-to/connect/specify-nat.md), `--p2p-host` is not overridden and must be specified for the node to be accessed from outside the network. + +::: + +### `p2p-interface` + + + +Syntax + +```bash +--p2p-interface= +``` + +# Example + +```bash +--p2p-interface=192.168.1.132 +``` + +# Environment variable + +```bash +BESU_P2P_INTERFACE=192.168.1.132 +``` + +# Configuration file + +```bash +p2p-interface="192.168.1.132" +``` + + + +The network interface on which the node listens for [P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). Use the option to specify the required network interface when the device that Besu is running on has multiple network interfaces. The default is 0.0.0.0 (all interfaces). + +### `p2p-port` + + + +# Syntax + +```bash +--p2p-port= +``` + +# Example + +```bash +# to listen on port 1789 +--p2p-port=1789 +``` + +# Environment variable + +```bash +# to listen on port 1789 +BESU_P2P_PORT=1789 +``` + +# Configuration file + +```bash +p2p-port="1789" +``` + + + +The P2P listening ports (UDP and TCP). The default is `30303`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `pruning-block-confirmations` + + + +# Syntax + +```bash +--pruning-block-confirmations= +``` + +# Example + +```bash +--pruning-block-confirmations=5 +``` + +# Environment variable + +```bash +BESU_PRUNING_BLOCK_CONFIRMATIONS=5 +``` + +# Configuration file + +```bash +pruning-block-confirmations=5 +``` + + + +The minimum number of confirmations on a block before marking of newly-stored or in-use state trie nodes that cannot be pruned. The default is 10. + +:::info + +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) is not supported. + +::: + +### `pruning-blocks-retained` + + + +# Syntax + +```bash +--pruning-blocks-retained= +``` + +# Example + +```bash +--pruning-blocks-retained=10000 +``` + +# Environment variable + +```bash +BESU_PRUNING_BLOCKS_RETAINED=10000 +``` + +# Configuration file + +```bash +pruning-blocks-retained=10000 +``` + + + +The minimum number of recent blocks to keep the entire world state for. The default is 1024. + +:::info + +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. + +::: + +### `pruning-enabled` + + + +# Syntax + +```bash +--pruning-enabled +``` + +# Example + +```bash +--pruning-enabled=true +``` + +# Environment variable + +```bash +BESU_PRUNING_ENABLED=true +``` + +# Configuration file + +```bash +pruning-enabled=true +``` + + + +Enables [pruning](../../concepts/data-storage-formats.md#pruning) to reduce storage required for the world state. The default is `false`. + +:::info + +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. + +::: + +:::note + +Pruning is being deprecated for [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries) and is currently not being updated. + +::: + +### `random-peer-priority-enabled` + + + +# Syntax + +```bash +--random-peer-priority-enabled[=] +``` + +# Example + +```bash +--random-peer-priority-enabled=true +``` + +# Environment variable + +```bash +BESU_RANDOM_PEER_PRIORITY_ENABLED=true +``` + +# Configuration file + +```bash +random-peer-priority-enabled=true +``` + + + +Enables or disables random prioritization of incoming connections. Enable in small, stable networks to prevent closed groups of peers forming. The default is `false`. + +### `remote-connections-limit-enabled` + + + +# Syntax + +```bash +--remote-connections-limit-enabled[=] +``` + +# Example + +```bash +--remote-connections-limit-enabled=false +``` + +# Environment variable + +```bash +BESU_REMOTE_CONNECTIONS_LIMIT_ENABLED=false +``` + +# Configuration file + +```bash +remote-connections-limit-enabled=false +``` + + + +Enables or disables using the [`--remote-connections-max-percentage`](#remote-connections-max-percentage) option to limit the percentage of remote P2P connections initiated by peers. The default is `true`. + +:::tip + +In private and permissioned networks with a level of trust between peers, disabling the remote connection limits may increase the speed at which nodes can join the network. + +::: + +:::danger + +To prevent eclipse attacks, ensure you enable the remote connections limit when connecting to any public network, and especially when using [`--sync-mode`](#sync-mode) and [`--fast-sync-min-peers`](#fast-sync-min-peers). + +::: + +### `remote-connections-max-percentage` + + + +# Syntax + +```bash +--remote-connections-max-percentage= +``` + +# Example + +```bash +--remote-connections-max-percentage=25 +``` + +# Environment variable + +```bash +BESU_REMOTE_CONNECTIONS_MAX_PERCENTAGE=25 +``` + +# Configuration file + +```bash +remote-connections-max-percentage=25 +``` + + + +The percentage of remote P2P connections you can establish with the node. Must be between 0 and 100, inclusive. The default is 60. + +### `reorg-logging-threshold` + + + +# Syntax + +```bash +--reorg-logging-threshold= +``` + +# Example + +```bash +--reorg-logging-threshold=3 +``` + +# Environment variable + +```bash +BESU_REORG_LOGGING_THRESHOLD=3 +``` + +# Configuration file + +```bash +reorg-logging-threshold=3 +``` + + + +Minimum depth of chain reorganizations to log. The default is 6. + +### `required-block` + + + +# Syntax + +```bash +--required-block, --required-blocks[=BLOCK=HASH[,BLOCK=HASH...]...] +``` + +# Example + +```bash +--required-block=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 +``` + +# Environment variable + +```bash +BESU_REQUIRED_BLOCK=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 +``` + +# Configuration file + +```bash +required-block=["6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80"] +``` + + + +Requires a peer with the specified block number to have the specified hash when connecting, or Besu rejects that peer. + +### `revert-reason-enabled` + + + +# Syntax + +```bash +--revert-reason-enabled[=] +``` + +# Example + +```bash +--revert-reason-enabled=true +``` + +# Environment variable + +```bash +BESU_REVERT_REASON_ENABLED=true +``` + +# Configuration file + +```bash +revert-reason-enabled=true +``` + + + +Enables or disables including the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md) in the transaction receipt, [`eth_estimateGas`](../api/index.md#eth_estimategas) error response, [`eth_call`](../api/index.md#eth_call) error response, and [`trace`](../trace-types.md#trace) response. The default is `false`. + +:::caution + +Enabling revert reason may use a significant amount of memory. We don't recommend enabling revert reason when connected to public Ethereum networks. + +::: + +### `rpc-http-api` + + + +# Syntax + +```bash +--rpc-http-api=[,...]... +``` + +# Example + +```bash +--rpc-http-api=ETH,NET,WEB3 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_API=ETH,NET,WEB3 +``` + +# Configuration file + +```bash +rpc-http-api=["ETH","NET","WEB3"] +``` + + + +A comma-separated list of APIs to enable on the HTTP JSON-RPC channel. When you use this option you must also specify the `--rpc-http-enabled` option. The available API options are: `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, `TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. + +:::tip + +The singular `--rpc-http-api` and plural `--rpc-http-apis` are available and are two names for the same option. + +::: + +### `rpc-http-authentication-credentials-file` + + + +# Syntax + +```bash +--rpc-http-authentication-credentials-file= +``` + +# Example + +```bash +--rpc-http-authentication-credentials-file=/home/me/me_node/auth.toml +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml +``` + +# Configuration file + +```bash +rpc-http-authentication-credentials-file="/home/me/me_node/auth.toml" +``` + + + +The [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). + +### `rpc-http-authentication-enabled` + + + +# Syntax + +```bash +--rpc-http-authentication-enabled[=] +``` + +# Example + +```bash +--rpc-http-authentication-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_AUTHENTICATION_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-authentication-enabled=true +``` + + + +Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the HTTP JSON-RPC service. + +### `rpc-http-authentication-jwt-public-key-file` + + + +# Syntax + +```bash +--rpc-http-authentication-jwt-public-key-file= +``` + +# Example + +```bash +--rpc-http-authentication-jwt-public-key-file=publicKey.pem +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" +``` + +# Configuration file + +```bash +rpc-http-authentication-jwt-public-key-file="publicKey.pem" +``` + + + +The [JWT provider's public key file] used for JSON-RPC HTTP authentication with an external JWT. + +### `rpc-http-cors-origins` + + + +# Syntax + +```bash +--rpc-http-cors-origins=[,...]... or all or "*" +``` + +# Example + +```bash + +$# You can allow one or more domains with a comma-separated list. + +--rpc-http-cors-origins=http://medomain.com,https://meotherdomain.com +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_CORS_ORIGINS=http://medomain.com,https://meotherdomain.com +``` + +# Configuration file + +```bash +rpc-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] +``` + +# Remix example + +```bash + +$# The following allows Remix to interact with your Besu node. + +--rpc-http-cors-origins=http://remix.ethereum.org +``` + + + +A list of domain URLs for CORS validation. + +Listed domains can access the node using JSON-RPC. If your client interacts with Besu using a browser app (such as Remix or a block explorer), add the client domain to the list. + +The default value is `"none"`. If you do not list any domains, browser apps cannot interact with your Besu node. + +:::note + +To run a local Besu node with MetaMask, set `--rpc-http-cors-origins` to `chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn`. + +Remember to also include the dapp domain MetaMask interacts with, for example if your app is deployed on Remix and you're using MetaMask to interact with the contract, use `--rpc-http-cors-origins=chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn,http://remix.ethereum.org` + +::: + +:::tip + +For testing and development purposes, use `"all"` or `"*"` to accept requests from any domain. We don't recommend accepting requests from any domain for production environments. + +::: + +### `rpc-http-enabled` + + + +# Syntax + +```bash +--rpc-http-enabled[=] +``` + +# Example + +```bash +--rpc-http-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-enabled=true +``` + + + +Enables or disables the HTTP JSON-RPC service. The default is `false`. + +### `rpc-http-host` + + + +# Syntax + +```bash +--rpc-http-host= +``` + +# Example + +```bash +# to listen on all interfaces +--rpc-http-host=0.0.0.0 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +rpc-http-host="0.0.0.0" +``` + + + +The host on which HTTP JSON-RPC listens. The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0`. + +:::caution + +Setting the host to `0.0.0.0` exposes the RPC connection on your node to any remote connection. In a production environment, ensure you are using a firewall to avoid exposing your node to the internet. + +::: + +### `rpc-http-max-active-connections` + + + +# Syntax + +```bash +--rpc-http-max-active-connections= +``` + +# Example + +```bash +--rpc-http-max-active-connections=100 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_MAX_ACTIVE_CONNECTIONS=100 +``` + +# Configuration file + +```toml +rpc-http-max-active-connections=100 +``` + + + +The maximum number of allowed HTTP JSON-RPC connections. Once this limit is reached, incoming connections are rejected. The default is 80. + +### `rpc-http-max-batch-size` + + + +# Syntax + +```bash +--rpc-http-max-batch-size= +``` + +# Example + +```bash +--rpc-http-max-batch-size=1200 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_MAX_BATCH_SIZE=1200 +``` + +# Configuration file + +```toml +rpc-http-max-batch-size=1200 +``` + + + +The maximum number of allowed requests in a [RPC batch request](../../how-to/use-besu-api/json-rpc.md#http). The default limit is `1024`, and `-1` specifies no limit. + +### `rpc-http-port` + + + +# Syntax + +```bash +--rpc-http-port= +``` + +# Example + +```bash +# to listen on port 3435 +--rpc-http-port=3435 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_PORT=3435 +``` + +# Configuration file + +```bash +rpc-http-port="3435" +``` + + + +The port (TCP) on which HTTP JSON-RPC listens. The default is `8545`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `rpc-http-tls-ca-clients-enabled` + + + +# Syntax + +```bash +--rpc-http-tls-ca-clients-enabled[=] +``` + +# Example + +```bash +--rpc-http-tls-ca-clients-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_CA_CLIENTS_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-tls-ca-clients-enabled=true +``` + + + +Enables or disables clients with trusted CA certificates to connect. The default is `false`. + +:::note + +You must enable client authentication using the [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. + +::: + +### `rpc-http-tls-client-auth-enabled` + + + +# Syntax + +```bash +--rpc-http-tls-client-auth-enabled[=] +``` + +# Example + +```bash +--rpc-http-tls-client-auth-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_CLIENT_AUTH_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-tls-client-auth-enabled=true +``` + + + +Enables or disables TLS client authentication for the JSON-RPC HTTP service. The default is `false`. + +:::note + +You must specify [`--rpc-http-tls-ca-clients-enabled`](#rpc-http-tls-ca-clients-enabled) and/or [`rpc-http-tls-known-clients-file`](#rpc-http-tls-known-clients-file). + +::: + +### `rpc-http-tls-cipher-suite` + + + +# Syntax + +```bash +--rpc-http-tls-cipher-suite=[, ...] +``` + +# Example + +```bash +--rpc-http-tls-cipher-suite=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_CIPHER_SUITE=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +``` + +# Configuration file + +```bash +rpc-http-tls-cipher-suite=["TLS_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"] +``` + + + +A list of comma-separated TLS cipher suites to support. + +:::tip + +The singular `--rpc-http-tls-cipher-suite` and plural `--rpc-http-tls-cipher-suites` are available and are two names for the same option. + +::: + +### `rpc-http-tls-enabled` + + + +# Syntax + +```bash +--rpc-http-tls-enabled[=] +``` + +# Example + +```bash +--rpc-http-tls-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-tls-enabled=true +``` + + + +Enables or disables TLS for the JSON-RPC HTTP service. The default is `false`. + +:::note + +[`--rpc-http-enabled`](#rpc-http-enabled) must be enabled. + +::: + +### `rpc-http-tls-keystore-file` + + + +# Syntax + +```bash +--rpc-http-tls-keystore-file= +``` + +# Example + +```bash +--rpc-http-tls-keystore-file=/home/me/me_node/keystore.pfx +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_KEYSTORE_FILE=/home/me/me_node/keystore.pfx +``` + +# Configuration file + +```bash +rpc-http-tls-keystore-file="/home/me/me_node/keystore.pfx" +``` + + + +The Keystore file (in PKCS #12 format) that contains private key and the certificate presented to the client during authentication. + +### `rpc-http-tls-keystore-password-file` + + + +# Syntax + +```bash +--rpc-http-tls-keystore-password-file= +``` + +# Example + +```bash +--rpc-http-tls-keystore-password-file=/home/me/me_node/password +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password +``` + +# Configuration file + +```bash +rpc-http-tls-keystore-password-file="/home/me/me_node/password" +``` + + + +The path to the file containing the password to decrypt the keystore. + +### `rpc-http-tls-known-clients-file` + + + +# Syntax + +```bash +--rpc-http-tls-known-clients-file= +``` + +# Example + +```bash +--rpc-http-tls-known-clients-file=/home/me/me_node/knownClients +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_KNOWN_CLIENTS_FILE=/home/me/me_node/knownClients +``` + +# Configuration file + +```bash +rpc-http-tls-known-clients-file="/home/me/me_node/knownClients" +``` + + + +The path to the file used to [authenticate clients](../../../private-networks/how-to/configure/tls/client-and-server.md#create-the-known-clients-file) using self-signed certificates or non-public certificates. + +Must contain the certificate's Common Name, and SHA-256 fingerprint in the format ` `. + +:::note + +You must enable client authentication using the [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. + +::: + +### `rpc-http-tls-protocol` + + + +# Syntax + +```bash +--rpc-http-tls-protocol=[, ...] +``` + +# Example + +```bash +--rpc-http-tls-protocol=TLSv1.3,TLSv1.2 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_PROTOCOL=TLSv1.3,TLSv1.2 +``` + +# Configuration file + +```bash +rpc-http-tls-protocol=["TLSv1.3","TLSv1.2"] +``` + + + +A list of comma-separated TLS protocols to support. The default is `DEFAULT_TLS_PROTOCOLS`, a list which includes `TLSv1.3` and `TLSv1.2`. + +:::tip + +The singular `--rpc-http-tls-protocol` and plural `--rpc-http-tls-protocols` are available and are two names for the same option. + +::: + +### `rpc-max-logs-range` + + + +# Syntax + +```bash +--rpc-max-logs-range= +``` + +# Example + +```bash +--rpc-max-logs-range=500 +``` + +# Environment variable + +```bash +BESU_RPC_MAX_LOGS_RANGE=500 +``` + +# Configuration file + +```bash +rpc-max-logs-range=500 +``` + + + +When using [`eth_getLogs`](../api/index.md#eth_getlogs), the maximum number of blocks to retrieve logs from. Set to 0 to specify no limit. The default is 5000. + +:::caution + +Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from its genesis block, might cause Besu to hang for an indeterminable amount of time while generating the response. + +We recommend setting a range limit or leaving this option at its default value. + +::: + +### `rpc-tx-feecap` + + + +# Syntax + +```bash +--rpc-tx-feecap= +``` + +# Example + +```bash +--rpc-tx-feecap=1200000000000000000 +``` + +# Environment variable + +```bash +BESU_RPC_TX_FEECAP=1200000000000000000 +``` + +# Configuration file + +```bash +rpc-tx-feecap=1200000000000000000 +``` + + + +The maximum transaction fee (in Wei) accepted for transactions submitted through the [`eth_sendRawTransaction`](../api/index.md#eth_sendrawtransaction) RPC. The default is 1000000000000000000 (1 ether). + +If set to 0, then this option is ignored and no cap is applied. + +### `rpc-ws-api` + + + +# Syntax + +```bash +--rpc-ws-api=[,...]... +``` + +# Example + +```bash +--rpc-ws-api=ETH,NET,WEB3 +``` + +# Environment variable + +```bash +BESU_RPC_WS_API=ETH,NET,WEB3 +``` + +# Configuration file + +```bash +rpc-ws-api=["ETH","NET","WEB3"] +``` + + + +A comma-separated list of APIs to enable on the WebSockets channel. When you use this option you must also specify the `--rpc-ws-enabled` option. The available API options are: `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, `TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. + +:::tip + +The singular `--rpc-ws-api` and plural `--rpc-ws-apis` options are available and are two names for the same option. + +::: + +### `rpc-ws-authentication-credentials-file` + + + +# Syntax + +```bash +--rpc-ws-authentication-credentials-file= +``` + +# Example + +```bash +--rpc-ws-authentication-credentials-file=/home/me/me_node/auth.toml +``` + +# Environment variable + +```bash +BESU_RPC_WS_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml +``` + +# Configuration file + +```bash +rpc-ws-authentication-credentials-file="/home/me/me_node/auth.toml" +``` + + + +The path to the [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). + +### `rpc-ws-authentication-enabled` + + + +# Syntax + +```bash +--rpc-ws-authentication-enabled[=] +``` + +# Example + +```bash +--rpc-ws-authentication-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_WS_AUTHENTICATION_ENABLED=true +``` + +# Configuration file + +```bash +rpc-ws-authentication-enabled=true +``` + + + +Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the WebSocket JSON-RPC service. + +:::note + +`wscat` doesn't support headers. [Authentication](../../how-to/use-besu-api/authenticate.md) requires you to pass an authentication token in the request header. To use authentication with WebSockets, you need an app that supports headers. + +::: + +### `rpc-ws-authentication-jwt-public-key-file` + + + +# Syntax + +```bash +--rpc-ws-authentication-jwt-public-key-file= +``` + +# Example + +```bash +--rpc-ws-authentication-jwt-public-key-file=publicKey.pem +``` + +# Environment variable + +```bash +BESU_RPC_WS_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" +``` + +# Configuration file + +```bash +rpc-ws-authentication-jwt-public-key-file="publicKey.pem" +``` + + + +The [JWT provider's public key file] used for JSON-RPC WebSocket authentication with an external JWT. + +### `rpc-ws-enabled` + + + +# Syntax + +```bash +--rpc-ws-enabled[=] +``` + +# Example + +```bash +--rpc-ws-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_WS_ENABLED=true +``` + +# Configuration file + +```bash +rpc-ws-enabled=true +``` + + + +Enables or disables the WebSocket JSON-RPC service. The default is `false`. + +### `rpc-ws-host` + + + +# Syntax + +```bash +--rpc-ws-host= +``` + +# Example + +```bash +# to listen on all interfaces +--rpc-ws-host=0.0.0.0 +``` + +# Environment variable + +```bash +BESU_RPC_WS_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +rpc-ws-host="0.0.0.0" +``` + + + +The host on which WebSocket JSON-RPC listens. +The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0` + +### `rpc-ws-max-active-connections` + + + +# Syntax + +```bash +--rpc-ws-max-active-connections= +``` + +# Example + +```bash +--rpc-ws-max-active-connections=100 +``` + +# Environment variable + +```bash +BESU_RPC_WS_MAX_ACTIVE_CONNECTIONS=100 +``` + +# Configuration file + +```toml +rpc-ws-max-active-connections=100 +``` + + + +The maximum number of WebSocket connections allowed for JSON-RPC. Once this limit is reached, incoming connections are rejected. The default is 80. + +### `rpc-ws-max-frame-size` + + + +# Syntax + +```bash +--rpc-ws-max-frame-size= +``` + +# Example + +```bash +--rpc-ws-max-frame-size=65536 +``` + +# Environment variable + +```bash +BESU_RPC_WS_MAX_FRAME_SIZE=65536 +``` + +# Configuration file + +```toml +rpc-ws-max-frame-size=65536 +``` + + + +The maximum size in bytes for JSON-RPC WebSocket frames. If this limit is exceeded, the WebSocket disconnects. The default is 1048576 (or 1 MB). + +### `rpc-ws-port` + + + +# Syntax + +```bash +--rpc-ws-port= +``` + +# Example + +```bash +# to listen on port 6174 +--rpc-ws-port=6174 +``` + +# Environment variable + +```bash +BESU_RPC_WS_PORT=6174 +``` + +# Configuration file + +```bash +rpc-ws-port="6174" +``` + + + +The port (TCP) on which WebSocket JSON-RPC listens. The default is `8546`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `security-module` + + + +# Syntax + +```bash +--security-module= +``` + +# Example + +```bash +--security-module=security_module +``` + +# Environment variable + +```bash +BESU_SECURITY_MODULE=security_module +``` + +# Configuration file + +```bash +security-module="security_module" +``` + + + +Name of the security module plugin to use. For example, a Hardware Security Module (HSM) or V3 filestore plugin. + +The default is the node's local private key file specified using [`--node-private-key-file`](#node-private-key-file). + +### `static-nodes-file` + + + +# Syntax + +```bash +--static-nodes-file= +``` + +# Example + +```bash +--static-nodes-file=~/besudata/static-nodes.json +``` + +# Environment variable + +```bash +BESU_STATIC_NODES_FILE=~/besudata/static-nodes.json +``` + +# Configuration file + +```bash +static-nodes-file="~/besudata/static-nodes.json" +``` + + + +Static nodes JSON file containing the [static nodes](../../how-to/connect/static-nodes.md) for this node to connect to. The default is `datapath/static-nodes.json`. + +### `strict-tx-replay-protection-enabled` + + + +# Syntax + +```bash +--strict-tx-replay-protection-enabled[=] +``` + +# Example + +```bash +--strict-tx-replay-protection-enabled=false +``` + +# Environment variable + +```bash +STRICT_TX_REPLAY_PROTECTION_ENABLED=false +``` + +# Configuration file + +```bash +strict-tx-replay-protection-enabled=false +``` + + + +Enables or disables replay protection, in accordance with [EIP-155](https://eips.ethereum.org/EIPS/eip-155), on transactions submitted using JSON-RPC. The default is `false`. + +### `sync-mode` + + + +# Syntax + +```bash +--sync-mode=X_SNAP +``` + +# Example + +```bash +--sync-mode=X_SNAP +``` + +# Environment variable + +```bash +BESU_SYNC_MODE=X_SNAP +``` + +# Configuration file + +```bash +sync-mode="X_SNAP" +``` + + + +The synchronization mode. Use `X_SNAP` for [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), `X_CHECKPOINT` for [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), `FAST` for [fast sync](../../get-started/connect/sync-node.md#fast-synchronization), and `FULL` for [full sync](../../get-started/connect/sync-node.md#run-an-archive-node). + +- The default is `FULL` when connecting to a private network by not using the [`--network`](#network) option and specifying the [`--genesis-file`](#genesis-file) option. +- The default is `FAST` when using the [`--network`](#network) option with named networks, except for the `dev` development network. `FAST` is also the default if running Besu on the default network (Ethereum Mainnet) by specifying neither [network](#network) nor [genesis file](#genesis-file). + +:::tip + +- We recommend using snap sync over fast sync because snap sync can be faster by several days. +- Checkpoint sync is an early access feature. +- It might become impossible to sync Ethereum Mainnet using fast sync in the future. Update Besu to a version that supports newer sync methods. +- When synchronizing in a mode other than `FULL`, most historical world state data is unavailable. Any methods attempting to access unavailable world state data return `null`. + +::: + +### `target-gas-limit` + + + +# Syntax + +```bash +--target-gas-limit= +``` + +# Example + +```bash +--target-gas-limit=8000000 +``` + +# Environment variable + +```bash +BESU_TARGET_GAS_LIMIT=8000000 +``` + +# Configuration file + +```bash +target-gas-limit="8000000" +``` + + + +The gas limit toward which Besu will gradually move on an existing network, if enough miners are in agreement. To change the block gas limit set in the genesis file without creating a new network, use `target-gas-limit`. The gas limit between blocks can change only 1/1024th, so the target tells the block creator how to set the gas limit in its block. If the values are the same or within 1/1024th, Besu sets the limit to the specified value. Otherwise, the limit moves as far as it can within that constraint. + +If a value for `target-gas-limit` is not specified, the block gas limit remains at the value specified in the [genesis file](../genesis-items.md#genesis-block-parameters). + +Use the [`miner_changeTargetGasLimit`](../api/index.md#miner_changetargetgaslimit) API to update the `target-gas-limit` while Besu is running. Alternatively restart Besu with an updated `target-gas-limit` value. + +### `tx-pool-disable-locals` + + + +# Syntax + +```bash +--tx-pool-disable-locals[=] +``` + +# Example + +```bash +--tx-pool-disable-locals=true +``` + +# Environment variable + +```bash +BESU_TX_POOL_DISABLE_LOCALS=true +``` + +# Configuration file + +```bash +tx-pool-disable-locals=true +``` + + + +If this option is set to true, transactions received via RPC must have the same checks, and should not be prioritized +over remote transactions. The default is `false`. + +### `tx-pool-enable-save-restore` + + + +# Syntax + +```bash +--tx-pool-enable-save-restore[=] +``` + +# Example + +```bash +--tx-pool-enable-save-restore=true +``` + +# Environment variable + +```bash +BESU_TX_POOL_ENABLE_SAVE_RESTORE=true +``` + +# Configuration file + +```bash +tx-pool-enable-save-restore=true +``` + + + +Enables or disables saving the transaction pool contents to a file on shutdown and reloading it at startup. +The default is `false`. + +You can define a custom path to the transaction pool file using the [`--tx-pool-save-file`](#tx-pool-save-file) option. + +### `tx-pool-limit-by-account-percentage` + + + +# Syntax + +```bash +--tx-pool-limit-by-account-percentage= +``` + +# Example + +```bash +--tx-pool-limit-by-account-percentage=0.1 +``` + +# Environment variable + +```bash +BESU_TX_POOL_LIMIT_BY_ACCOUNT_PERCENTAGE=0.1 +``` + +# Configuration file + +```bash +tx-pool-limit-by-account-percentage=0.4 +``` + + + +The maximum percentage of future transactions kept in the transaction pool, per account. Accepted values are in the range (0–1]. The default is .001 or 0.1% of transactions from a single account to be kept in the pool. + +:::caution + +The default value is often unsuitable for [private networks](../../../private-networks/index.md). This feature mitigates future-nonce transactions from filling the pool without ever being executable by Besu. This is important for Mainnet, but may cause issues on private networks. Please update this value or set to 1 if you know the nodes gossiping transactions in your network. + +::: + +### `tx-pool-max-size` + + + +# Syntax + +```bash +--tx-pool-max-size= +``` + +# Example + +```bash +--tx-pool-max-size=2000 +``` + +# Environment variable + +```bash +BESU_TX_POOL_MAX_SIZE=2000 +``` + +# Configuration file + +```bash +tx-pool-max-size="2000" +``` + + + +The maximum number of transactions kept in the transaction pool. The default is 4096. + +### `tx-pool-price-bump` + + + +# Syntax + +```bash +--tx-pool-price-bump= +``` + +# Example + +```bash +--tx-pool-price-bump=25 +``` + +# Environment variable + +```bash +BESU_TX_POOL_PRICE_BUMP=25 +``` + +# Configuration file + +```bash +tx-pool-price-bump=25 +``` + + + +The price bump percentage to replace an existing transaction. The default is 10. + +### `tx-pool-retention-hours` + + + +# Syntax + +```bash +--tx-pool-retention-hours= +``` + +# Example + +```bash +--tx-pool-retention-hours=5 +``` + +# Environment variable + +```bash +BESU_TX_POOL_RETENTION_HOURS=5 +``` + +# Configuration file + +```bash +tx-pool-retention-hours=5 +``` + + + +The maximum period, in hours, to hold pending transactions in the transaction pool. The default is 13. + +### `tx-pool-save-file` + + + +# Syntax + +```bash +--tx-pool-save-file= +``` + +# Example + +```bash +--tx-pool-save-file=/home/me/me_node/node_txpool.dump +``` + +# Environment variable + +```bash +BESU_TX_POOL_SAVE_FILE=/home/me/me_node/node_txpool.dump +``` + +# Configuration file + +```bash +tx-pool-save-file="/home/me/me_node/node_txpool.dump" +``` + + + +Path to the file that stores the transaction pool's content if the save and restore functionality is enabled +using [`--tx-pool-enable-save-restore`](#tx-pool-enable-save-restore). The +file is created on shutdown and reloaded during startup. The default file name is `txpool.dump` in the +[data directory](#data-path). + +### `Xhelp` + + + +# Syntax + +```bash +-X, --Xhelp +``` + + + +Displays the early access options and their descriptions, and exit. + +:::caution + +The displayed options are unstable and may change between releases. + +::: + +### `version` + + + +# Syntax + +```bash +-V, --version +``` + + + +Prints version information and exit. + + + +[push gateway integration]: ../../how-to/monitor/metrics.md#running-prometheus-with-besu-in-push-mode +[JWT provider's public key file]: ../../how-to/use-besu-api/authenticate.md#jwt-public-key-authentication diff --git a/versioned_docs/version-23.4.1/public-networks/reference/cli/subcommands.md b/versioned_docs/version-23.4.1/public-networks/reference/cli/subcommands.md new file mode 100644 index 00000000000..1a9798376bc --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/cli/subcommands.md @@ -0,0 +1,262 @@ +--- +title: Subcommands +description: Hyperledger Besu command line interface subcommands +sidebar_position: 2 +tags: + - public networks + - private networks +--- + +# Subcommands + +This reference describes the syntax of the Hyperledger Besu command line interface (CLI) subcommands. + +:::note + +This reference contains subcommands that apply to both public and private networks. For private-network-specific subcommands, see the [private network subcommands reference](../../../private-networks/reference/cli/subcommands.md). + +::: + +To start a Besu node using subcommands, run: + +```bash +besu [OPTIONS] [SUBCOMMAND] [SUBCOMMAND OPTIONS] +``` + +If using Bash or Z shell, you can view subcommand suggestions by pressing the Tab key twice. + +```bash +besu Tab+Tab +``` + +## `blocks` + +Provides blocks related actions. + +### `import` + + + +# Syntax + +```bash +besu blocks import [--skip-pow-validation-enabled] [--start-block=] [--end-block=] --from= +``` + +# Example + +```bash +besu blocks import --skip-pow-validation-enabled --start-block=100 --end-block=300 --from=/home/me/me_project/mainnet.blocks +``` + + + +Imports a block or range of blocks from the specified file into the blockchain database. + +You can specify the starting index of the block range to import with `--start-block`. If omitted, the default start block is 0 (the beginning of the chain). + +You can specify the ending index (exclusive) of the block range to import with `--end-block`. If omitted, all blocks after the start block will be imported. + +Including `--skip-pow-validation-enabled` skips validation of the `mixHash` when importing blocks. + +:::note + +Use `--skip-pow-validation-enabled` when performing [Ethereum Foundation hive testing](https://github.com/ethereum/hive). + +::: + +### `export` + + + +# Syntax + +```bash +besu blocks export [--start-block=] [--end-block=] --to= +``` + +# Example + +```bash +besu --network=goerli --data-path=/home/data/ blocks export --start-block=100 --end-block=300 --to=/home/exportblock.bin +``` + + + +Exports a block or range of blocks from storage to a file in RLP format. + +If you omit `--start-block`, the default start block is 0 (the beginning of the chain), and if you omit `--end-block`, the default end block is the current chain head. + +If you are not running the command against the default network (Mainnet), specify the `--network` or `--genesis-file` parameter. + +## `public-key` + +Provides node public key related actions. + +:::caution + +To get the public key or address of a node, ensure you use the [`--data-path`](options.md#data-path) or [`--node-private-key-file`](options.md#node-private-key-file) option with the `public-key` command. Otherwise, a new [node key](../../concepts/node-keys.md) is silently generated when starting Besu. + +::: + +### `export` + + + +# Syntax + +```bash +besu public-key export [--node-private-key-file=] [--to=] [--ec-curve=] +``` + +# Example (to standard output) + +```bash +besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 +``` + +# Example (to file) + +```bash +besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/not_precious_pub_key --ec-curve=secp256k1 +``` + + + +Outputs the node public key to standard output or to the file specified by `--to=`. You can output the public key associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between `secp256k1` or `secp256r1`. + +### `export-address` + + + +# Syntax + +```bash +besu public-key export-address [--node-private-key-file=] [--to=] [--ec-curve=] +``` + +# Example (to standard output) + +```bash +besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 +``` + +# Example (to file) + +```bash +besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/me_node_address --ec-curve=secp256k1 +``` + + + +Outputs the node address to standard output or to the file specified by `--to=`. You can output the address associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between `secp256k1` or `secp256r1`. + +## `password` + +Provides password related actions. + +### `hash` + + + +# Syntax + +```bash +besu password hash --password= +``` + +# Example + +```bash +besu password hash --password=myPassword123 +``` + + + +Generates the hash of a given password. Include the hash in the [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). + +## `operator` + +Provides operator actions. + +### `generate-log-bloom-cache` + + + +# Syntax + +```bash +besu operator generate-log-bloom-cache [--start-block=] [--end-block=] +``` + +# Example + +```bash +besu --network=goerli --data-path=/project/goerli operator generate-log-bloom-cache --start-block=0 --end-block=100000 +``` + + + +:::tip + +Manually executing `generate-log-bloom-cache` is not required unless you set the [`--auto-log-bloom-caching-enabled`](options.md#auto-log-bloom-caching-enabled) command line option to false. + +::: + +Generates cached log bloom indexes for blocks. APIs use the cached indexes for improved log query performance. + +:::note + +Each index file contains 100000 blocks. The last fragment of blocks less that 100000 are not indexed. + +::: + +To generate cached log bloom indexes while the node is running, use the [`admin_generateLogBloomCache`](../api/index.md#admin_generatelogbloomcache) API. + +## `retesteth` + + + +# Syntax + +```bash +besu retesteth [--data-path=] [--rpc-http-host=] [--rpc-http-port=] [-l=] [--host-allowlist=[,â€Ļ]â€Ļ or * or all] +``` + +# Example + +```bash +besu retesteth --data-path=/home/me/me_node --rpc-http-port=8590 --host-allowlist=* +``` + + + +Runs a Retesteth-compatible server. [Retesteth](https://github.com/ethereum/retesteth/wiki) is a developer tool that can generate and run consensus tests against any Ethereum client running such a server. + +The command accepts the following command line options: + +- [`--data-path`](options.md#data-path) +- [`--host-allowlist`](options.md#host-allowlist) +- [`--rpc-http-host`](options.md#rpc-http-host) +- [`--rpc-http-port`](options.md#rpc-http-port) +- [`--logging`](options.md#logging) + +## `validate-config` + + + +# Syntax + +```bash +besu validate-config --config-file +``` + +# Example + +```bash +besu validate-config --config-file ../besu-local-nodes/config/besu/besu1.conf +``` + + + +Performs basic syntax validation of the specified [TOML configuration file](../../how-to/configuration-file.md). Checks TOML syntax (for example, valid format and unmatched quotes) and flags unknown options. Doesn't check data types, and doesn't check dependencies between options (this is done at Besu startup). diff --git a/versioned_docs/version-23.4.1/public-networks/reference/disclosure.md b/versioned_docs/version-23.4.1/public-networks/reference/disclosure.md new file mode 100644 index 00000000000..3182278df61 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/disclosure.md @@ -0,0 +1,14 @@ +--- +title: Security disclosure policy +sidebar_position: 8 +description: Hyperledger Besu responsible disclosure statement +tags: + - public networks + - private networks +--- + +# Security disclosure policy + +At Hyperledger Besu, security is a priority. But regardless of how much effort we put into system security, there might still be vulnerabilities present. If you discover a vulnerability, we need to know about it so we can take steps to address it as quickly as possible. We would like you to help us better protect our clients and our systems. + +Please follow the process explained on [Hyperledger defect response wiki page](https://wiki.hyperledger.org/display/SEC/Defect+Response). diff --git a/versioned_docs/version-23.4.1/public-networks/reference/engine-api/_category_.json b/versioned_docs/version-23.4.1/public-networks/reference/engine-api/_category_.json new file mode 100644 index 00000000000..0ea3b53ab2e --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/engine-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Engine API", + "position": 3 +} diff --git a/versioned_docs/version-23.4.1/public-networks/reference/engine-api/index.md b/versioned_docs/version-23.4.1/public-networks/reference/engine-api/index.md new file mode 100644 index 00000000000..0d44ea08603 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/engine-api/index.md @@ -0,0 +1,488 @@ +--- +title: Engine API +description: Engine API methods reference +tags: + - public networks +--- + +# Engine API methods + +[Consensus and execution clients](../../concepts/the-merge.md#execution-and-consensus-clients) communicate with each other using the Engine API. When running Besu as an execution client, [use these API calls](../../how-to/use-engine-api.md) to communicate with a consensus client. + +:::info + +Ensure you enable the Engine API methods with the [`--engine-rpc-enabled`](../cli/options.md#engine-rpc-enabled) CLI option. + +::: + +See the [Ethereum Engine API specification](https://github.com/ethereum/execution-apis/blob/0b965fb714ccd3faa3c939fdce1726e56679cdec/src/engine/specification.md) for more information. Not all changes to the Engine API are documented on this page. + +## Methods + +### `engine_exchangeCapabilities` + +Exchanges a list of supported Engine API methods between the consensus client and Besu. + +#### Parameters + +`remoteCapabilities`: _array_ of _strings_ - Engine API method names that the consensus client supports + +#### Returns + +`localCapabilities`: _array_ of _strings_ - Engine API method names that Besu supports + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeCapabilities","params":[["engine_exchangeTransitionConfigurationV1","engine_forkchoiceUpdatedV1","engine_getPayloadBodiesByHash","engine_getPayloadBodiesByRangeV1","engine_getPayloadV1","engine_newPayloadV1"]],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_exchangeCapabilities", + "params": [ + [ + "engine_exchangeTransitionConfigurationV1", + "engine_forkchoiceUpdatedV1", + "engine_getPayloadBodiesByHash", + "engine_getPayloadBodiesByRangeV1", + "engine_getPayloadV1", + "engine_newPayloadV1" + ] + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [ + "engine_getPayloadV1", + "engine_getPayloadV2", + "engine_executePayloadV1", + "engine_newPayloadV1", + "engine_newPayloadV2", + "engine_forkchoiceUpdatedV1", + "engine_forkchoiceUpdatedV2", + "engine_exchangeTransitionConfigurationV1", + "engine_getPayloadBodiesByHashV1", + "engine_getPayloadBodiesByRangeV1" + ] +} +``` + + + +### `engine_exchangeTransitionConfigurationV1` + +Sends the transition configuration to the consensus client to verify the configuration between both clients. + +:::note + +The execution client runs this call every 60 seconds in the background. The log displays a warning message if the call hasn't been sent in 120 seconds. + +::: + +#### Parameters + +`transitionConfiguration`: _object_ - [Transition configuration object](objects.md#transition-configuration-object) + +#### Returns + +`transitionConfiguration`: _object_ - [Transition configuration object](objects.md#transition-configuration-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeTransitionConfigurationV1","params":[{"terminalTotalDifficulty": 0, "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "terminalBlockNumber": "0x1"}],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_exchangeTransitionConfigurationV1", + "params": [ + { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + } + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + }, + "payloadId": null +} +``` + + + +### `engine_forkchoiceUpdatedV1` + +Updates the fork choice with the consensus client. + +#### Parameters + +- `forkchoiceState`: _object_ - [Fork choice state object](objects.md#fork-choice-state-object) + +- `payloadAttributes`: _object_ - [Payload attribute object](objects.md#payload-attributes-object). Can be `null`. + +#### Returns + +- `payloadStatus`: _object_ - [Payload status object](objects.md#payload-status-object) + +- `payloadId`: _data_ - identifier of the payload build process or `null` + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_forkchoiceUpdatedV1", + "params": [ + { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + }, + null + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": null + } +} +``` + + + +### `engine_getPayloadBodiesByHashV1` + +Returns the bodies of the execution payloads corresponding to the specified block hashes. + +#### Parameters + +`blockHashes`: **array** of **strings** - Block hashes + +#### Returns + +`engineGetPayloadBodiesResultV1`: **array** of **objects** - Execution payload body objects + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByHashV1","params":[["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c","0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553"]],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadBodiesByHashV1", + "params": [ + [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553" + ] + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [{ + "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], + "withdrawals": [{ + "index" : "0xf0", + "validatorIndex" : "0xf0", + "address" : "0x00000000000000000000000000000000000010f0", + "amount" : "0x1" + }, { + "index" : "0xf1", + "validatorIndex" : "0xf1", + "address" : "0x00000000000000000000000000000000000010f1", + "amount" : "0x1" + }] + }, { + "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], + "withdrawals": [{ + "index" : "0xf2", + "validatorIndex" : "0xf2", + "address" : "0x00000000000000000000000000000000000010f2", + "amount" : "0x1" + }, { + "index" : "0xf3", + "validatorIndex" : "0xf3", + "address" : "0x00000000000000000000000000000000000010f3", + "amount" : "0x1" + }] + }] +} +``` + + + +### `engine_getPayloadBodiesByRangeV1` + +Returns the bodies of the execution payloads corresponding to the specified range of block numbers. + +#### Parameters + +- `startBlockNumber`: _string_ - Number of the starting block of the range, as a hexadecimal string + +- `count`: _string_ - Number of blocks in the range (including the starting block), as a hexadecimal string + +#### Returns + +`engineGetPayloadBodiesResultV1`: _array_ of _objects_ - Execution payload body objects + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByRangeV1","params":["0x20", "0x2"],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadBodiesByRangeV1", + "params": ["0x20", "0x2"], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [{ + "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], + "withdrawals": [{ + "index" : "0xf0", + "validatorIndex" : "0xf0", + "address" : "0x00000000000000000000000000000000000010f0", + "amount" : "0x1" + }, { + "index" : "0xf1", + "validatorIndex" : "0xf1", + "address" : "0x00000000000000000000000000000000000010f1", + "amount" : "0x1" + }] + }, { + "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], + "withdrawals": [{ + "index" : "0xf2", + "validatorIndex" : "0xf2", + "address" : "0x00000000000000000000000000000000000010f2", + "amount" : "0x1" + }, { + "index" : "0xf3", + "validatorIndex" : "0xf3", + "address" : "0x00000000000000000000000000000000000010f3", + "amount" : "0x1" + }] + }] +} +``` + + + +### `engine_getPayloadV1` + +Prepares the payload to send to the consensus client. + +#### Parameters + +`payloadId`: _data_ - Identifier of the payload build process + +#### Returns + +`executionPayload`: _object_ - [Execution payload object](objects.md#execution-payload-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x0000000021f32cc1"],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadV1", + "params": ["0x0000000021f32cc1"], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +} +``` + + + +### `engine_newPayloadV1` + +Executes the payload with the consensus client. + +#### Parameters + +`executionPayload`: _object_ - [Execution payload object](objects.md#execution-payload-object) + +#### Returns + +- `payloadStatus`: _object_ - [Payload status object](objects.md#payload-status-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_newPayloadV1", + "params": [ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } +} +``` + + diff --git a/versioned_docs/version-23.4.1/public-networks/reference/engine-api/objects.md b/versioned_docs/version-23.4.1/public-networks/reference/engine-api/objects.md new file mode 100644 index 00000000000..ecd40054d9f --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/engine-api/objects.md @@ -0,0 +1,71 @@ +--- +title: Objects +description: Engine API objects reference +tags: + - public networks +--- + +# Engine API objects + +The following objects are parameters for or returned by the [Engine API methods](index.md). + +## Execution payload object + +Parameter for [`engine_newPayloadV1`](index.md#engine_newpayloadv1). Returned by [`engine_getPayloadV1`](index.md#engine_getpayloadv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `parentHash` | _Data_, 32 Bytes | Hash of the parent block. | +| `feeRecipient` | _Data_, 20 Bytes | Beneficiary of the fee. | +| `stateRoot` | _Data_, 32 Bytes | Root of the final state trie for the block. | +| `receiptsRoot` | _Data_, 32 Bytes | Root of the receipts trie for the block. | +| `logsBloom` | _Data_, 256 Bytes | Bloom filter for light clients to quickly retrieve related logs. | +| `prevRandao` | _Data_, 32 Bytes | Difficulty for this block. | +| `blockNumber` | _Quantity_, 64 Bits | Block number of block containing this transaction. | +| `gasLimit` | _Quantity_, 64 Bits | Maximum gas allowed in this block. | +| `gasUsed` | _Quantity_, 64 Bits | Total gas used by all transactions in this block. | +| `timestamp` | _Quantity_, 64 Bits | Unix timestamp (milliseconds) for block assembly. | +| `extraData` | _Data_, 0 to 32 Bytes | Extra data field for this block. | +| `baseFeePerGas` | _Quantity_, 256 Bits | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | +| `blockHash` | _Data_, 32 Bytes | Hash of the execution block. | +| `transactions` | _Array_ | Array of transaction objects, each object is a list representing `TransactionType`, `TransactionPayload`, or `LegacyTransaction` as defined in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). | + +## Fork choice state object + +Parameter for [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `headBlockHash` | _Data_, 32 Bytes | Block hash of the head of the canonical chain. | +| `safeBlockHash` | _Data_, 32 Bytes | "Safe" block hash of the canonical chain under certain synchrony and honesty assumptions. This value MUST be either equal to or an ancestor of `headBlockHash`. | +| `finalizedBlockHash` | _Data_, 32 Bytes | Block hash of the most recent finalized block. | + +## Payload attributes object + +Parameter for [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `timestamp` | _Quantity_, 64 Bits | Value for the `timestamp` field of the new payload. | +| `prevRandao` | _Data_, 32 Bytes | Value for the `prevRandao` field of the new payload. | +| `suggestedFeeRecipient` | _Data_, 20 Bytes | Suggested value for the `feeRecipient` field of the new payload. | + +## Payload status object + +Returned by [`engine_newPayloadV1`](index.md#engine_newpayloadv1) and [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `status` | _Enumeration_ | Either `"VALID"`, `"INVALID"`, `"SYNCING"`, `"ACCEPTED"`, `"INVALID_BLOCK_HASH"`, or `"INVALID_TERMINAL_BLOCK"`. | +| `latestValidHash` | _Data_, 32 Bytes | Hash of the most recent valid block in the branch defined by payload and its ancestors. | +| `validationError` | _String_ | Message providing additional details on the validation error if the payload is classified as `INVALID`, `INVALID_BLOCK_HASH` or `INVALID_TERMINAL_BLOCK`. | + +## Transition configuration object + +Parameter for and returned by [`engine_exchangeTransitionConfigurationV1`](index.md#engine_exchangetransitionconfigurationv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `terminalTotalDifficulty` | _Quantity_, 256 Bits | Maps on the `TERMINAL_TOTAL_DIFFICULTY` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | +| `terminalBlockHash` | _Data_, 32 Bytes | Maps on the `TERMINAL_BLOCK_HASH` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | +| `terminalBlockNumber` | _Quantity_, 64 Bits | Maps on the `TERMINAL_BLOCK_NUMBER` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | diff --git a/versioned_docs/version-23.4.1/public-networks/reference/evm-tool.md b/versioned_docs/version-23.4.1/public-networks/reference/evm-tool.md new file mode 100644 index 00000000000..37c8b88ea02 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/evm-tool.md @@ -0,0 +1,562 @@ +--- +title: EVM tool options +sidebar_position: 5 +description: Besu EVM tool options reference +tags: + - public networks + - private networks +--- + +# EVM tool reference + +This reference describes options for running the following [using the EVM tool](../how-to/troubleshoot/evm-tool.md): + +- [Arbitrary EVM programs](#run-options) +- [Ethereum state tests](#state-test-options) +- [Ethereum object formatted code](#eof-code-validation) + +:::note + +Option names that include `trace`, such as [`--trace`](#json-trace) and [`--trace.[no]memory`](#nomemory-tracenomemory) exist to support [`t8ntool`](https://ethereum-tests.readthedocs.io/en/latest/t8ntool.html) reference testing, and are interchangeable with their standard option names. + +::: + +## Run options + +The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. Command line options specify the code and other contextual information. + +### `code` + + + +# Syntax + +```bash +--code= +``` + +# Example + +```bash +--code=5B600080808060045AFA50600056 +``` + + + +The code to be executed, in compiled hex code form. Execution fails if this is not set. + +### `gas` + + + +# Syntax + +```bash +--gas= +``` + +# Example + +```bash +--gas=100000000 +``` + + + +Amount of gas to make available to the EVM. The default is 10 billion, a number unlikely to be seen in any production blockchain. + +### `price` + + + +# Syntax + +```bash +--price= +``` + +# Example + +```bash +--price=10 +``` + + + +Price of gas in Gwei. The default is `0`. If set to a non-zero value, the sender account must have enough value to cover the gas fees. + +### `sender` + + + +# Syntax + +```bash +--sender=
+``` + +# Example + +```bash +--sender=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + + + +The account the invocation is sent from. The specified account must exist in the world state, which, unless specified by [`--genesis`](#genesis), is the set of [accounts used for testing](../../private-networks/reference/accounts-for-testing.md). + +### `receiver` + + + +# Syntax + +```bash +--receiver=
+``` + +# Example + +```bash +--receiver=0x588108d3eab34e94484d7cda5a1d31804ca96fe7 +``` + + + +The account the invocation is sent to. The specified account does not need to exist. + +### `input` + + + +# Syntax + +```bash +--input= +``` + +# Example + +```bash +--input=9064129300000000000000000000000000000000000000000000000000000000 +``` + + + +The data passed into the call. Corresponds to the `data` field of the transaction and is returned by the `CALLDATA` and related opcodes. + +### `value` + + + +# Syntax + +```bash +--value= +``` + +# Example + +```bash +--value=1000000000000000000 +``` + + + +The value, in wei, attached to this transaction. For operations that query the value or transfer it to other accounts this is the amount that is available. The amount is not reduced to cover intrinsic cost and gas fees. + +### `json`, `trace` + + + +# Syntax + +```bash +--json +``` + + + +Provides an operation-by-operation trace of the command in JSON. + +`--trace` is an alias for `--json`. + +### `json-alloc` + + + +# Syntax + +```bash +--json-alloc +``` + + + +Outputs a JSON summary of the post-execution world state and allocations. + +### `[no]memory`, `trace.[no]memory` + + + +# Syntax + +```bash +--nomemory, --memory +``` + + + +Setting `--nomemory` disables tracing the memory output for each operation. Setting `--memory` enables it. Memory traces are disabled by default. + +For memory heavy scripts, disabling memory traces may reduce the volume of JSON output. + +`--trace.[no]memory` is an alias for `--[no]memory`. + +### `trace.[no]stack` + + + +# Syntax + +```bash +--trace.nostack, --trace.stack +``` + + + +Setting `--trace.nostack` disables tracing the operand stack for each operation. Setting `--trace.stack` enables it. Stack traces are enabled by default. + +### `trace.[no]returndata` + + + +# Syntax + +```bash +--trace.noreturndata, --trace.returndata +``` + + + +Setting `--trace.noreturndata` disables tracing the return data for each operation. Setting `--trace.returndata` enables it. Return data traces are enabled by default. + +### `[no]time` + + + +# Syntax + +```bash +--notime, --time +``` + + + +Setting `--notime` disables including time data in the summary output. Setting `--time` enables it. + +This is useful for testing and differential evaluations. + +### `genesis` + + + +# Syntax + +```bash +--genesis= +``` + +# Example + +```bash +--genesis=/opt/besu/genesis.json +``` + + + +The [Besu genesis file](genesis-items.md) to use when evaluating the EVM. Most useful are the `alloc` items that set up accounts and their stored memory states. + +`--prestate` is a deprecated alias for `--genesis`. + +### `chain` + + + +# Syntax + +```bash +--chain= +``` + +# Example + +```bash +--chain=goerli +``` + + + +The well-known network genesis file to use when evaluating the EVM. These values are an alternative to the [`--genesis`](#genesis) option for well-known networks. + +### `repeat` + + + +# Syntax + +```bash +--repeat= +``` + +# Example + +```bash +--repeat=1000 +``` + + + +Number of times to repeat the contract before gathering timing information. This is useful when benchmarking EVM operations. The default is `0`. + +### `revert-reason-enabled` + + + +# Syntax + +```bash +--revert-reason-enabled +``` + + + +Enables tracing the reason included in `REVERT` operations. The revert reason is enabled by default. + +### `fork` + + + +# Syntax + +```bash +--fork= +``` + +# Example + +```bash +--fork=FutureEips +``` + + + +Specific fork to evaluate, overriding network settings. + +### `key-value-storage` + + + +# Syntax + +```bash +--key-value-storage= +``` + +# Example + +```bash +--key-value-storage=rocksdb +``` + + + +Kind of key value storage to use. + +It might be useful to execute isolated EVM calls in the context of an actual world state. The default is `memory`, which executes the call only in the context of the world provided by [`--genesis`](#genesis) or [`--chain`](#chain) at block zero. + +When set to `rocksdb` and combined with [`--data-path`](#data-path), [`--block-number`](#block-number), and [`--genesis`](#genesis), a Besu node that isn't currently running can be used to provide the appropriate world state for a transaction. This is useful when evaluating consensus failures. + +### `data-path` + + + +# Syntax + +```bash +--data-path= +``` + +# Example + +```bash +--data-path=/opt/besu/data +``` + + + +When [`--key-value-storage`](#key-value-storage) is set to `rocksdb`, specifies the location of the database on disk. + +### `block-number` + + + +# Syntax + +```bash +--block-number= +``` + +# Example + +```bash +--block-number=10000000 +``` + + + +The block number to evaluate the code against. Used to ensure that the EVM is evaluating the code against the correct fork, or to specify the world state when [`--key-value-storage`](#key-value-storage) is set to `rocksdb`. + +### `version` + + + +# Syntax + +```bash +--version +``` + + + +Displays the version information. + +`-v` is an alias for `--version`. + +## State test options + +The `state-test` subcommand allows the [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) to be evaluated. The only applicable options are `--json` and `--nomemory`. + +### `json`, `trace` + + + +# Syntax + +```bash +--json +``` + + + +Provides an operation-by-operation trace of the command in JSON. + +Set this option for EVM Lab Fuzzing. Whether or not `--json` is set, a summary JSON object is printed to standard output for each state test executed. + +`--trace` is an alias for `--json`. + +### `[no]memory`, `trace.[no]memory` + + + +# Syntax + +```bash +--[no]memory +``` + + + +Setting `--nomemory` disables tracing the memory output for each operation. Setting `--memory` enables it. Memory traces are disabled by default. + +For memory heavy scripts, disabling memory traces may reduce the volume of JSON output. + +`--trace.[no]memory` is an alias for `--[no]memory`. + +### Use command arguments + +If you use command arguments, you can list one or more state tests. All the state tests are evaluated in the order they are specified. + + + +# Docker example + +```bash +docker run --rm -v ${PWD}:/opt/referencetests hyperledger/besu-evmtool:develop --json state-test /opt/referencetests/GeneralStateTests/stExample/add11.json +``` + +# CLI example + +```bash +evm --json state-test stExample/add11.json +``` + + + +### Use standard input + +If no reference tests are passed in using the command line, the EVM tool loads one complete JSON object from standard input and executes that state test. + + + +# Docker example + +```bash +docker run --rm -i hyperledger/besu-evmtool:develop --json state-test < stExample/add11.json +``` + +# CLI example + +```bash +evm --json state-test < stExample/add11.json +``` + + + +## EOF code validation + +The `code-validate` subcommand allows [Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. It accepts candidate EOF containers or EVM bytecode using the `--file` option, command arguments, or standard input. + +### `file` + + + +# Syntax + +```bash +--file= +``` + +# Example + +```bash +--file=eof.txt +``` + + + +File containing one or more EOF containers or EVM bytecode. Each line in the file is considered a separate program. + +### Use command arguments + +If you use command arguments, each argument is considered a separate program. If a code segment includes spaces, it must be contained in quotes. + + + +# Docker example + +```bash +docker run --rm hyperledger/besu-evmtool:develop code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 +``` + +# CLI example + +```bash +evm code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 +``` + + + +### Use standard input + +If no reference tests are passed in using the command line, the EVM tool loads and validates code from standard input. Each line is considered a separate program. Comment lines and blanks are ignored. diff --git a/versioned_docs/version-23.4.1/public-networks/reference/genesis-items.md b/versioned_docs/version-23.4.1/public-networks/reference/genesis-items.md new file mode 100644 index 00000000000..dbf4089990c --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/genesis-items.md @@ -0,0 +1,151 @@ +--- +title: Genesis file items +sidebar_position: 4 +description: Genesis file configuration items reference +tags: + - public networks + - private networks +--- + +# Genesis file items + +The [Besu genesis file](../concepts/genesis-file.md) contains [network configuration items](#configuration-items) and [genesis block parameters](#genesis-block-parameters). + +## Configuration items + +Network configuration items are specified in the genesis file in the `config` object. + +| Item | Description | +| --- | --: | +| Milestone blocks | [Milestone blocks for the network](#milestone-blocks). | +| `chainID` | [Chain ID for the network](../concepts/network-and-chain-id.md). | +| `ethash` | Specifies network uses [Ethash](../../private-networks/how-to/configure/consensus/index.md) and contains [`fixeddifficulty`](#fixed-difficulty). | +| `clique` | Specifies network uses [Clique](../../private-networks/how-to/configure/consensus/clique.md) and contains [Clique configuration items](../../private-networks/how-to/configure/consensus/clique.md#genesis-file). | +| `ibft2` | Specifies network uses [IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md) and contains [IBFT 2.0 configuration items](../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | +| `qbft` | Specifies network uses [QBFT](../../private-networks/how-to/configure/consensus/qbft.md) and contains [QBFT configuration items](../../private-networks/how-to/configure/consensus/qbft.md#genesis-file). | +| `transitions` | Specifies block at which to [change IBFT 2.0 or QBFT validators](../../private-networks/how-to/configure/consensus/add-validators-without-voting.md). | +| `contractSizeLimit` | Maximum contract size in bytes. Specify in [free gas networks](../../private-networks/how-to/configure/free-gas.md). The default is `24576` and the maximum size is `2147483647`. | +| `evmStackSize` | Maximum stack size. Specify to increase the maximum stack size in private networks with complex smart contracts. The default is `1024`. | +| `ecCurve` | Specifies [the elliptic curve to use](../../private-networks/how-to/configure/curves.md). Default is `secp256k1`. | +| `discovery` | Specifies [discovery configuration items](#discovery-configuration-items). The `discovery` object can be left empty. | + +## Genesis block parameters + +The purpose of some genesis block parameters varies depending on the consensus protocol (Ethash, [Clique](../../private-networks/how-to/configure/consensus/clique.md), [IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md), or [QBFT](../../private-networks/how-to/configure/consensus/qbft.md)). These parameters include: + +- `difficulty`. +- `extraData`. +- `mixHash`. + +The following table describes the genesis block parameters with the same purpose across all consensus protocols. + +| Item | Description | +| --- | --: | +| `coinbase` | Address to pay mining rewards to. Can be any value in the genesis block (commonly set to `0x0000000000000000000000000000000000000000`). | +| `gasLimit` | Block gas limit. Total gas limit for all transactions in a block. | +| `nonce` | Used in block computation. Can be any value in the genesis block (commonly set to `0x0`). | +| `timestamp` | Creation date and time of the block. Must be before the next block so we recommend specifying `0x0` in the genesis file. | +| `alloc` | Defines [accounts with balances](../../private-networks/reference/accounts-for-testing.md) or [contracts](../../private-networks/how-to/configure/contracts.md). | + +:::caution + +If a `Supplied genesis block does not match stored chain data` error occurs, use the genesis file matching the genesis block of the data directory, or use the [`--data-path`](../reference/cli/options.md#data-path) option to specify a different data directory. + +::: + +## Milestone blocks + +In public networks, the milestone blocks specify the blocks at which the network changed protocol. See a [full list of Ethereum protocol releases](https://github.com/ethereum/execution-specs#ethereum-protocol-releases) and their corresponding milestone blocks. + +```json title="Ethereum Mainnet milestone blocks" +{ + "config": { + ... + "homesteadBlock": 1150000, + "daoForkBlock": 1920000, + "daoForkSupport": true, + "eip150Block": 2463000, + "eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0", + "eip155Block": 2675000, + "eip158Block": 2675000, + "byzantiumBlock": 4370000, + "constantinopleBlock": 7280000, + "constantinopleFixBlock": 7280000, + "muirGlacierBlock": 9200000, + "berlinBlock": 12244000, + "londonBlock": 12965000, + "arrowGlacierBlock": 13773000, + "grayGlacierBlock": 15050000, + ... + }, +} +``` + +:::caution + +Ensure you include a milestone far enough in advance in the genesis file. Not doing so can lead to unexpected and inconsistent behavior without specific errors. + +::: + +In private networks, the milestone block defines the protocol version for the network. + +```json title="Private network milestone block" +{ + "config": { + ... + "berlinBlock": 0, + ... + }, +} +``` + +:::note + +In private networks, we recommend specifying the latest milestone block. It's implied this includes the preceding milestones. This ensures you use the most up-to-date protocol and have access to the most recent opcodes. + +::: + +## Fixed difficulty + +Use `fixeddifficulty` to specify a fixed difficulty in private networks using Ethash. This will keep the network's difficulty constant and override the `difficulty` parameter from the genesis file. + +```json +{ + "config": { + ... + "ethash": { + "fixeddifficulty": 1000 + }, + + }, + ... +} +``` + +:::tip + +Using `fixeddifficulty` is not recommended for use with Ethash outside of test environments. For production networks using Ethash, we recommend setting a low `difficulty` value in the genesis file instead. Ethash will adjust the difficulty of the network based on hashrate to produce blocks at the targeted frequency. + +::: + +## Discovery configuration items + +Use the `discovery` configuration items to specify the [`bootnodes`](cli/options.md#bootnodes) and [`discovery-dns-url`](cli/options.md#discovery-dns-url) in the genesis file, in place of using CLI options or listing them in the configuration file. If either CLI option is used, it takes precedence over the genesis file. Anything listed in the configuration file also takes precedence. + +```json +{ + "config": { + "discovery": { + "bootnodes": [ + "enode://c35c3...d615f@1.2.3.4:30303", + "enode://f42c13...fc456@1.2.3.5:30303" + ], + "dns": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" + } + } +} +``` + + + +[GoQuorum clients]: https://consensys.net/docs/goquorum/en/stable/ diff --git a/versioned_docs/version-23.4.1/public-networks/reference/projects-using-besu.md b/versioned_docs/version-23.4.1/public-networks/reference/projects-using-besu.md new file mode 100644 index 00000000000..7684be3a024 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/projects-using-besu.md @@ -0,0 +1,18 @@ +--- +title: Projects using Besu +sidebar_position: 7 +description: List of projects using Besu +tags: + - public networks + - private networks +--- + +# Projects using Besu + +## Block explorers + +The following block explorers are compatible with Besu: + +- [BlockScout](https://github.com/blockscout/blockscout#readme) - See the [project documentation](https://docs.blockscout.com/) for setup instructions. + +- [Sirato Blockchain Explorer](https://www.web3labs.com/sirato) - See how to [use Sirato with privacy-enabled networks](../../private-networks/how-to/monitor/sirato-explorer.md). diff --git a/versioned_docs/version-23.4.1/public-networks/reference/trace-types.md b/versioned_docs/version-23.4.1/public-networks/reference/trace-types.md new file mode 100644 index 00000000000..2ea2b785ce9 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/reference/trace-types.md @@ -0,0 +1,160 @@ +--- +title: Transaction trace types +sidebar_position: 6 +description: Transaction trace types reference +tags: + - public networks + - private networks +--- + +# Transaction trace types + +When [tracing transactions](../how-to/troubleshoot/trace-transactions.md), the trace type options are [`trace`](#trace), [`vmTrace`](#vmtrace), and [`stateDiff`](#statediff). + +## `trace` + +An ordered list of calls to other contracts, excluding precompiled contracts. + +```json title="trace example" +"trace":[ + { + "action":{ + "callType":"call", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0xffadea", + "input":"0x", + "to":"0x0100000000000000000000000000000000000000", + "value":"0x0" + }, + "result":{ + "gasUsed":"0x1e", + "output":"0x" + }, + "subtraces":0, + "traceAddress":[ + ], + "type":"call" + } +] +``` + +| Key | Value | +| --- | --- | +| `action` | Transaction details. | +| `callType` | Whether the transaction is `call` or `create`. | +| `from` | Address of the transaction sender. | +| `gas` | Gas provided by sender. | +| `input` | Transaction data. | +| `to` | Target of the transaction. | +| `value` | Value transferred in the transaction. | +| `result` | Transaction result. | +| `gasUsed` | Gas used by the transaction. Includes any refunds of unused gas. | +| `output` | Return value of the contract call. Contains only the actual value sent by a `RETURN` operation. If a `RETURN` was not executed, the output is empty bytes. | +| `subTraces` | Traces of contract calls made by the transaction. | +| `traceAddress` | Tree list address of where the call occurred, address of the parents, and order of the current sub call. | +| `type` | Whether the transaction is a `CALL` or `CREATE` series operation. | + +## `vmTrace` + +An ordered list of EVM actions when processing the transaction. + +`vmTrace` only reports actual data returned from a `RETURN` opcode and does not return the contents of the reserved output space for the call operations. As a result: + +- `vmTrace` reports `null` when a call operation ends because of a `STOP`, `HALT`, `REVERT`, running out of instructions, or any exceptional halts. +- When a `RETURN` operation returns data of a different length to the space reserved by the call, `vmTrace` reports only the data passed to the `RETURN` operation and does not include pre-existing memory data or trim the returned data. + +For out of gas operations, `vmTrace` reports the operation that caused the out of gas exception, including the calculated gas cost. `vmTrace` does not report `ex` values because the operation is not executed. + +```json title="vmTrace example" +"vmTrace":{ + "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", + "ops":[ + { + "cost":3, + "ex":{ + "mem":null, + "push":[ + "0x8" + ], + "store":null, + "used":16756175 + }, + "pc":72, + "sub":null + }, + ... + ] +} +``` + +| Key | Value | +| --- | --- | +| `code` | Code executed by the EVM. | +| `ops` | Sequence of EVM operations (opcodes) executed in the transaction. | +| `cost` | Gas cost of the opcode. Includes memory expansion costs but not gas refunds. For precompiled contract calls, reports only the actual cost. | +| `ex` | Executed operations. | +| `mem` | Memory read or written by the operation. | +| `push` | Adjusted stack items. For swap, includes all intermediate values and the result. Otherwise, is the value pushed onto the stack. | +| `store` | Account storage written by the operation. | +| `used` | Remaining gas taking into account the all but 1/64th rule for calls. | +| `pc` | Program counter. | +| `sub` | Sub call operations. | + +## `stateDiff` + +State changes in the requested block for each transaction represented as a map of accounts to an object. Besu lists the balance, code, nonce, and storage changes from immediately before the transaction to after the transaction. For the `key:value` pairs: + +- `+` indicates the field didn’t exist before and now has the specified value +- `-` indicates a deleted value +- `*` has a `from` and a `to` value. + +An absent value is distinct from zero when creating accounts or clearing storage. + +```json title="stateDiff example" +"stateDiff":{ + "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ + "balance":{ + "*":{ + "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", + "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" + } + }, + "code":"=", + "nonce":{ + "*":{ + "from":"0x14", + "to":"0x15" + } + }, + "storage":{ + } + } +} +``` + +| Key | Value | +| -------------- | ----------------------------------------- | +| `balance` | Change of balance event. | +| `balance.from` | Balance before the transaction. | +| `balance.to` | Balance after the transaction. | +| `code` | Changes to code. None in this example. | +| `nonce` | Change of nonce. | +| `nonce.from` | Nonce before the transaction. | +| `nonce.to` | Nonce after the transaction. | +| `storage` | Changes to storage. None in this example. | + +## Applicable API methods + +The trace options `trace`, `vmTrace`, and `stateDiff` are available for the following [ad-hoc tracing API methods](../how-to/troubleshoot/trace-transactions.md#ad-hoc-tracing-apis): + +- [`trace_call`](api/index.md#trace_call) +- [`trace_callMany`](api/index.md#trace_callmany) +- [`trace_rawTransaction`](api/index.md#trace_rawtransaction) +- [`trace_replayBlockTransactions`](api/index.md#trace_replayblocktransactions) + +Only the `trace` option is available for the following [transaction-trace filtering API methods](../how-to/troubleshoot/trace-transactions.md#transaction-trace-filtering-apis): + +- [`trace_block`](api/index.md#trace_block) +- [`trace_filter`](api/index.md#trace_filter) +- [`trace_get`](api/index.md#trace_get) +- [`trace_transaction`](api/index.md#trace_transaction) diff --git a/versioned_docs/version-23.4.1/public-networks/tutorials/_category_.json b/versioned_docs/version-23.4.1/public-networks/tutorials/_category_.json new file mode 100644 index 00000000000..f72790313cd --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/tutorials/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Tutorials", + "position": 5, + "link": { + "type": "generated-index", + "slug": "public-networks/tutorials" + } +} diff --git a/versioned_docs/version-23.4.1/public-networks/tutorials/besu-teku-mainnet.md b/versioned_docs/version-23.4.1/public-networks/tutorials/besu-teku-mainnet.md new file mode 100644 index 00000000000..56fa7eaaa14 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/tutorials/besu-teku-mainnet.md @@ -0,0 +1,182 @@ +--- +title: Run Besu and Teku on Mainnet +sidebar_position: 1 +description: Run Besu and Teku on Ethereum Mainnet. +tags: + - public networks +--- + +# Run Besu and Teku on Mainnet + +Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and [Teku](https://docs.teku.consensys.net/) as a [consensus client](../concepts/the-merge.md#consensus-clients) on Ethereum Mainnet. + +## 1. Install Besu and Teku + +Install [Besu](../get-started/install/binary-distribution.md) and [Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). + +Ensure you meet the prerequisites for the installation option you use. For example, you must have Java 17+ if using the Besu and Teku binary distributions. + +Ensure you meet the [system requirements for Besu on public networks](../get-started/system-requirements.md). + +## 2. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and Teku. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../how-to/use-engine-api.md). + +## 3. Generate validator keys + +If you're running Teku as a beacon node only, skip to the [next step](#4-start-besu). + +If you're also running Teku as a validator client, have a funded Ethereum address ready (32 ETH and gas fees for each validator). + +Generate validator keys and stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. + +You should also have a `.json` file for each validator key pair. + +::: + +## 4. Start Besu + +Run the following command or specify the options in a [configuration file](../how-to/configuration-file.md): + +```bash +besu \ + --sync-mode=X_SNAP \ + --data-storage-format=BONSAI \ + --rpc-http-enabled=true \ + --rpc-http-host="0.0.0.0" \ + --rpc-ws-enabled=true \ + --rpc-ws-host="0.0.0.0" \ + --host-allowlist=,127.0.0.1,localhost \ + --engine-host-allowlist=,127.0.0.1,localhost \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. +- The IP address of your Besu node using the [`--host-allowlist`](../reference/cli/options.md#host-allowlist) and [`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) options. + +Also, in the command: + +- [`--sync-mode`](../reference/cli/options.md#sync-mode) specifies using [snap sync](../get-started/connect/sync-node.md#snap-synchronization). +- [`--data-storage-format`](../reference/cli/options.md#data-storage-format) specifies using [Bonsai Tries](../concepts/data-storage-formats.md#bonsai-tries). +- [`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC service. +- [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--rpc-ws-enabled`](../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC service. +- [`--rpc-ws-host`](../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--engine-rpc-enabled`](../reference/cli/options.md#engine-rpc-enabled) enables the [Engine API](../reference/engine-api/index.md). + +You can modify the option values and add other [command line options](../reference/cli/options.md) as needed. + +## 5. Start Teku + +Open a new terminal window. + +### Beacon node only + +To run Teku as a beacon node only (without validator duties), run the following command or specify the options in the [Teku configuration file]: + +```bash +teku \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. + +Also, in the command: + +- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) is set to the default URL of Besu's Engine API. +- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) enables Teku's metrics exporter. +- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) enables Teku's REST API service. + +You can modify the option values and add other [Teku command line options] as needed. + +### Beacon node and validator client + +To run Teku as a beacon node and validator in a single process, run the following command or specify the options in the [Teku configuration file]: + +```bash +teku \ + --ee-endpoint http://localhost:8551 \ + --ee-jwt-secret-file \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --validators-proposer-default-fee-recipient= \ + --validator-keys=:[,:,...] +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. +- An Ethereum address you own as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 3](#3-generate-validator-keys) for each validator using the [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. + +Also, in the command: + +- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) is set to the default URL of Besu's Engine API. +- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) enables Teku's metrics exporter. +- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) enables Teku's REST API service. + +You can modify the option values and add other [Teku command line options] as needed. + +## 6. Wait for Besu and Teku to sync + +After starting Besu and Teku, your node starts syncing and connecting to peers. + + + +# Besu logs + +```json +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running Teku as a beacon node only, you're all set. If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. + +## 7. Stake ETH + +Stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +You can check your validator status by searching your Ethereum address on the [Beacon Chain explorer](https://beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + + + +[Teku configuration file]: https://docs.teku.consensys.net/HowTo/Configure/Use-Configuration-File/ +[Teku command line options]: https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/ diff --git a/versioned_docs/version-23.4.1/public-networks/tutorials/besu-teku-testnet.md b/versioned_docs/version-23.4.1/public-networks/tutorials/besu-teku-testnet.md new file mode 100644 index 00000000000..c270a234b58 --- /dev/null +++ b/versioned_docs/version-23.4.1/public-networks/tutorials/besu-teku-testnet.md @@ -0,0 +1,218 @@ +--- +title: Run Besu and Teku on a testnet +sidebar_position: 2 +description: Run Besu and Teku on Goerli or Sepolia testnet. +tags: + - public networks +--- + +# Run Besu and Teku on a testnet + +Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and [Teku](https://docs.teku.consensys.net/) as a [consensus client](../concepts/the-merge.md#consensus-clients) on the [Goerli](https://github.com/eth-clients/goerli) and [Sepolia](https://github.com/eth-clients/sepolia) Ethereum testnets. + +:::note + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. You can connect your consensus client using the beacon node only, without any validator duties. + +::: + +## 1. Install Besu and Teku + +Install [Besu](../get-started/install/binary-distribution.md) and [Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). + +Ensure you meet the prerequisites for the installation option you use. For example, you must have Java 17+ if using the Besu and Teku binary distributions. + +Ensure you meet the [system requirements for Besu on public networks](../get-started/system-requirements.md). + +## 2. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and Teku. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../how-to/use-engine-api.md). + +## 3. Generate validator keys + +If you're running Teku as a beacon node only, skip to the [next step](#4-start-besu). + +If you're also running Teku as a validator client, create a test Ethereum address (you can do this in [MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and [Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). + +:::note + +If you can't get ETH using the faucet, you can ask for help on the [EthStaker Discord](https://discord.io/ethstaker). + +::: + +Generate validator keys for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or [request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: + +## 4. Start Besu + +Run the following command or specify the options in a [configuration file](../how-to/configuration-file.md): + + + +# Goerli + +```bash +besu \ + --network=goerli \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +# Sepolia + +```bash +besu \ + --network=sepolia \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. + +You can modify the option values and add other [command line options](../reference/cli/options.md) as needed. + +## 5. Start Teku + +Open a new terminal window. + +### Beacon node only + +To run Teku as a beacon node only (without validator duties), run the following command or specify the options in the [Teku configuration file]: + + + +# Goerli + +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + +# Sepolia + +```bash +teku \ + --network=sepolia \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. + +You can modify the option values and add other [Teku command line options] as needed. + +### Beacon node and validator client + +To run Teku as a beacon node and validator in a single process, run the following command or specify the options in the [Teku configuration file]: + + + +# Goerli + +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --validators-proposer-default-fee-recipient= \ + --validator-keys=:[,:,...] +``` + +# Sepolia + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. + + + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. +- The test Ethereum address created in [step 3](#3-generate-validator-keys) as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 3](#3-generate-validator-keys) for each validator using the [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. + +You can modify the option values and add other [Teku command line options] as needed. + +## 6. Wait for Besu and Teku to sync + +After starting Besu and Teku, your node starts syncing and connecting to peers. + + + +# Besu logs + +```json +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running Teku as a beacon node only, you're all set. If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. + +## 7. Stake ETH + +Stake your testnet ETH for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). + +You can check your validator status by searching your Ethereum address on the [Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + + + +[Teku configuration file]: https://docs.teku.consensys.net/HowTo/Configure/Use-Configuration-File/ +[Teku command line options]: https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/ diff --git a/versioned_docs/version-stable/assets/images/Besu-Tessera-High-Availability.png b/versioned_docs/version-stable/assets/images/Besu-Tessera-High-Availability.png new file mode 100644 index 00000000000..12c9f0c36f6 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/Besu-Tessera-High-Availability.png differ diff --git a/versioned_docs/version-stable/assets/images/Besu_TLS.png b/versioned_docs/version-stable/assets/images/Besu_TLS.png new file mode 100644 index 00000000000..fafefc057b4 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/Besu_TLS.png differ diff --git a/versioned_docs/version-stable/assets/images/Bonsai_tries.png b/versioned_docs/version-stable/assets/images/Bonsai_tries.png new file mode 100644 index 00000000000..7e15f349bc4 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/Bonsai_tries.png differ diff --git a/versioned_docs/version-stable/assets/images/CliqueOneIntialSigner.png b/versioned_docs/version-stable/assets/images/CliqueOneIntialSigner.png new file mode 100644 index 00000000000..a04c660f776 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/CliqueOneIntialSigner.png differ diff --git a/versioned_docs/version-stable/assets/images/CliqueTwoIntialSigners.png b/versioned_docs/version-stable/assets/images/CliqueTwoIntialSigners.png new file mode 100644 index 00000000000..57831af0240 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/CliqueTwoIntialSigners.png differ diff --git a/versioned_docs/version-stable/assets/images/EnodeStartup.png b/versioned_docs/version-stable/assets/images/EnodeStartup.png new file mode 100644 index 00000000000..a0aea823b83 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/EnodeStartup.png differ diff --git a/versioned_docs/version-stable/assets/images/Execution-Consensus-Clients.png b/versioned_docs/version-stable/assets/images/Execution-Consensus-Clients.png new file mode 100644 index 00000000000..97c7962619c Binary files /dev/null and b/versioned_docs/version-stable/assets/images/Execution-Consensus-Clients.png differ diff --git a/versioned_docs/version-stable/assets/images/GraphiQL.png b/versioned_docs/version-stable/assets/images/GraphiQL.png new file mode 100644 index 00000000000..3a8f9705ff1 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/GraphiQL.png differ diff --git a/versioned_docs/version-stable/assets/images/Hyperledger-Besu-Client-Libraries.png b/versioned_docs/version-stable/assets/images/Hyperledger-Besu-Client-Libraries.png new file mode 100644 index 00000000000..85bb59af754 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/Hyperledger-Besu-Client-Libraries.png differ diff --git a/versioned_docs/version-stable/assets/images/Hyperledger-Besu-Plugin-API.png b/versioned_docs/version-stable/assets/images/Hyperledger-Besu-Plugin-API.png new file mode 100644 index 00000000000..b5c4e56ac98 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/Hyperledger-Besu-Plugin-API.png differ diff --git a/versioned_docs/version-stable/assets/images/JWT.png b/versioned_docs/version-stable/assets/images/JWT.png new file mode 100644 index 00000000000..069e6488897 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/JWT.png differ diff --git a/versioned_docs/version-stable/assets/images/KibanaQuickstart.png b/versioned_docs/version-stable/assets/images/KibanaQuickstart.png new file mode 100644 index 00000000000..395337842c8 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/KibanaQuickstart.png differ diff --git a/versioned_docs/version-stable/assets/images/LoadBalancer.png b/versioned_docs/version-stable/assets/images/LoadBalancer.png new file mode 100644 index 00000000000..4c4c4aaf5f4 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/LoadBalancer.png differ diff --git a/versioned_docs/version-stable/assets/images/Multi-tenancy.png b/versioned_docs/version-stable/assets/images/Multi-tenancy.png new file mode 100644 index 00000000000..cbc3b537074 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/Multi-tenancy.png differ diff --git a/versioned_docs/version-stable/assets/images/OrionNodes.png b/versioned_docs/version-stable/assets/images/OrionNodes.png new file mode 100644 index 00000000000..a8fd413ccff Binary files /dev/null and b/versioned_docs/version-stable/assets/images/OrionNodes.png differ diff --git a/versioned_docs/version-stable/assets/images/PermissioningFlow.png b/versioned_docs/version-stable/assets/images/PermissioningFlow.png new file mode 100644 index 00000000000..dafa2f6a94e Binary files /dev/null and b/versioned_docs/version-stable/assets/images/PermissioningFlow.png differ diff --git a/versioned_docs/version-stable/assets/images/PortConfiguration.png b/versioned_docs/version-stable/assets/images/PortConfiguration.png new file mode 100644 index 00000000000..7522147db46 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/PortConfiguration.png differ diff --git a/versioned_docs/version-stable/assets/images/PrivacyGroups.png b/versioned_docs/version-stable/assets/images/PrivacyGroups.png new file mode 100644 index 00000000000..8d01cfa2720 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/PrivacyGroups.png differ diff --git a/versioned_docs/version-stable/assets/images/PrivateTransactionProcessing.png b/versioned_docs/version-stable/assets/images/PrivateTransactionProcessing.png new file mode 100644 index 00000000000..d8a2eecaa5f Binary files /dev/null and b/versioned_docs/version-stable/assets/images/PrivateTransactionProcessing.png differ diff --git a/versioned_docs/version-stable/assets/images/TesseraNodes.png b/versioned_docs/version-stable/assets/images/TesseraNodes.png new file mode 100644 index 00000000000..5e195f403c5 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/TesseraNodes.png differ diff --git a/versioned_docs/version-stable/assets/images/alethio-light-explorer-screenshot.png b/versioned_docs/version-stable/assets/images/alethio-light-explorer-screenshot.png new file mode 100644 index 00000000000..b3bf1125004 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/alethio-light-explorer-screenshot.png differ diff --git a/versioned_docs/version-stable/assets/images/besu-cpu-pattern-during-sync.png b/versioned_docs/version-stable/assets/images/besu-cpu-pattern-during-sync.png new file mode 100644 index 00000000000..e345bb212dc Binary files /dev/null and b/versioned_docs/version-stable/assets/images/besu-cpu-pattern-during-sync.png differ diff --git a/versioned_docs/version-stable/assets/images/block-time.png b/versioned_docs/version-stable/assets/images/block-time.png new file mode 100644 index 00000000000..914c186237d Binary files /dev/null and b/versioned_docs/version-stable/assets/images/block-time.png differ diff --git a/versioned_docs/version-stable/assets/images/create-resource-button-screenshot.png b/versioned_docs/version-stable/assets/images/create-resource-button-screenshot.png new file mode 100644 index 00000000000..85de6d9eced Binary files /dev/null and b/versioned_docs/version-stable/assets/images/create-resource-button-screenshot.png differ diff --git a/versioned_docs/version-stable/assets/images/dapp-explorer-tx.png b/versioned_docs/version-stable/assets/images/dapp-explorer-tx.png new file mode 100644 index 00000000000..700f5c47e74 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/dapp-explorer-tx.png differ diff --git a/versioned_docs/version-stable/assets/images/dapp-metamask-tx.png b/versioned_docs/version-stable/assets/images/dapp-metamask-tx.png new file mode 100644 index 00000000000..766a6eb59a5 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/dapp-metamask-tx.png differ diff --git a/versioned_docs/version-stable/assets/images/dapp-ui.png b/versioned_docs/version-stable/assets/images/dapp-ui.png new file mode 100644 index 00000000000..fc730254492 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/dapp-ui.png differ diff --git a/versioned_docs/version-stable/assets/images/dashboard.png b/versioned_docs/version-stable/assets/images/dashboard.png new file mode 100644 index 00000000000..761579ac613 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/dashboard.png differ diff --git a/versioned_docs/version-stable/assets/images/deployment-complete-screenshot.png b/versioned_docs/version-stable/assets/images/deployment-complete-screenshot.png new file mode 100644 index 00000000000..d16683d37bc Binary files /dev/null and b/versioned_docs/version-stable/assets/images/deployment-complete-screenshot.png differ diff --git a/versioned_docs/version-stable/assets/images/enterprise-ethereum-account-permissioning.png b/versioned_docs/version-stable/assets/images/enterprise-ethereum-account-permissioning.png new file mode 100644 index 00000000000..684e01ccd8c Binary files /dev/null and b/versioned_docs/version-stable/assets/images/enterprise-ethereum-account-permissioning.png differ diff --git a/versioned_docs/version-stable/assets/images/ethstats.png b/versioned_docs/version-stable/assets/images/ethstats.png new file mode 100644 index 00000000000..c491b24398a Binary files /dev/null and b/versioned_docs/version-stable/assets/images/ethstats.png differ diff --git a/versioned_docs/version-stable/assets/images/explorer.png b/versioned_docs/version-stable/assets/images/explorer.png new file mode 100644 index 00000000000..6a3eb733ea5 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/explorer.png differ diff --git a/versioned_docs/version-stable/assets/images/fastsync.png b/versioned_docs/version-stable/assets/images/fastsync.png new file mode 100644 index 00000000000..7ab329c8769 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/fastsync.png differ diff --git a/versioned_docs/version-stable/assets/images/forest_of_tries.png b/versioned_docs/version-stable/assets/images/forest_of_tries.png new file mode 100644 index 00000000000..e6e73bbb954 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/forest_of_tries.png differ diff --git a/versioned_docs/version-stable/assets/images/grafana.png b/versioned_docs/version-stable/assets/images/grafana.png new file mode 100644 index 00000000000..c9339f249a7 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/grafana.png differ diff --git a/versioned_docs/version-stable/assets/images/grafana_loki.png b/versioned_docs/version-stable/assets/images/grafana_loki.png new file mode 100644 index 00000000000..7fcdbc9637d Binary files /dev/null and b/versioned_docs/version-stable/assets/images/grafana_loki.png differ diff --git a/versioned_docs/version-stable/assets/images/io-utilization.png b/versioned_docs/version-stable/assets/images/io-utilization.png new file mode 100644 index 00000000000..fab930dd5d6 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/io-utilization.png differ diff --git a/versioned_docs/version-stable/assets/images/kuberenetes-genesis-secrets.png b/versioned_docs/version-stable/assets/images/kuberenetes-genesis-secrets.png new file mode 100644 index 00000000000..8b2b52441a9 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kuberenetes-genesis-secrets.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-1.jpeg b/versioned_docs/version-stable/assets/images/kubernetes-1.jpeg new file mode 100644 index 00000000000..18ede0c091f Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-1.jpeg differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-2.jpeg b/versioned_docs/version-stable/assets/images/kubernetes-2.jpeg new file mode 100644 index 00000000000..1e2c856f3c7 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-2.jpeg differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-3.png b/versioned_docs/version-stable/assets/images/kubernetes-3.png new file mode 100644 index 00000000000..8621c72f83d Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-3.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-bootnode-logs.png b/versioned_docs/version-stable/assets/images/kubernetes-bootnode-logs.png new file mode 100644 index 00000000000..a11a61f2df0 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-bootnode-logs.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-elastic.png b/versioned_docs/version-stable/assets/images/kubernetes-elastic.png new file mode 100644 index 00000000000..46c99465e65 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-elastic.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-explorer-contracts-1.png b/versioned_docs/version-stable/assets/images/kubernetes-explorer-contracts-1.png new file mode 100644 index 00000000000..d27681af61b Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-explorer-contracts-1.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-explorer-contracts-set.png b/versioned_docs/version-stable/assets/images/kubernetes-explorer-contracts-set.png new file mode 100644 index 00000000000..530c68deb13 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-explorer-contracts-set.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-explorer-explorer.png b/versioned_docs/version-stable/assets/images/kubernetes-explorer-explorer.png new file mode 100644 index 00000000000..9b169a4b7af Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-explorer-explorer.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-explorer-validators.png b/versioned_docs/version-stable/assets/images/kubernetes-explorer-validators.png new file mode 100644 index 00000000000..58fb91cd849 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-explorer-validators.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-explorer-wallet.png b/versioned_docs/version-stable/assets/images/kubernetes-explorer-wallet.png new file mode 100644 index 00000000000..2f9eba7b253 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-explorer-wallet.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-explorer.png b/versioned_docs/version-stable/assets/images/kubernetes-explorer.png new file mode 100644 index 00000000000..ecde2ef11c0 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-explorer.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-genesis-configmaps.png b/versioned_docs/version-stable/assets/images/kubernetes-genesis-configmaps.png new file mode 100644 index 00000000000..71318e36c65 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-genesis-configmaps.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-grafana.png b/versioned_docs/version-stable/assets/images/kubernetes-grafana.png new file mode 100644 index 00000000000..545dfd89bd7 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-grafana.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-ingress-ip.png b/versioned_docs/version-stable/assets/images/kubernetes-ingress-ip.png new file mode 100644 index 00000000000..f14f4d895d2 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-ingress-ip.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-monitoring.png b/versioned_docs/version-stable/assets/images/kubernetes-monitoring.png new file mode 100644 index 00000000000..185e8b0f6f7 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-monitoring.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-tx-Besu-logs.png b/versioned_docs/version-stable/assets/images/kubernetes-tx-Besu-logs.png new file mode 100644 index 00000000000..8227a8a11e2 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-tx-Besu-logs.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-tx-tessera-logs.png b/versioned_docs/version-stable/assets/images/kubernetes-tx-tessera-logs.png new file mode 100644 index 00000000000..a146712cdf2 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-tx-tessera-logs.png differ diff --git a/versioned_docs/version-stable/assets/images/kubernetes-validator-logs.png b/versioned_docs/version-stable/assets/images/kubernetes-validator-logs.png new file mode 100644 index 00000000000..3b815e96012 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/kubernetes-validator-logs.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_0_landing.png b/versioned_docs/version-stable/assets/images/mp_0_landing.png new file mode 100644 index 00000000000..4b44acaf580 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_0_landing.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_10_ssh.png b/versioned_docs/version-stable/assets/images/mp_10_ssh.png new file mode 100644 index 00000000000..1229060dba3 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_10_ssh.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_1_basics.png b/versioned_docs/version-stable/assets/images/mp_1_basics.png new file mode 100644 index 00000000000..ed6e98a9d24 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_1_basics.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_2_size.png b/versioned_docs/version-stable/assets/images/mp_2_size.png new file mode 100644 index 00000000000..f0f41a0cafe Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_2_size.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_4_deployment.png b/versioned_docs/version-stable/assets/images/mp_4_deployment.png new file mode 100644 index 00000000000..858b2a4b53d Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_4_deployment.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_5_deployment_complete.png b/versioned_docs/version-stable/assets/images/mp_5_deployment_complete.png new file mode 100644 index 00000000000..b10380c738b Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_5_deployment_complete.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_6_resource.png b/versioned_docs/version-stable/assets/images/mp_6_resource.png new file mode 100644 index 00000000000..8307edc60ae Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_6_resource.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_7_vm.png b/versioned_docs/version-stable/assets/images/mp_7_vm.png new file mode 100644 index 00000000000..b9519fa6fa0 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_7_vm.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_8_block_explorer.png b/versioned_docs/version-stable/assets/images/mp_8_block_explorer.png new file mode 100644 index 00000000000..c898b1ba5de Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_8_block_explorer.png differ diff --git a/versioned_docs/version-stable/assets/images/mp_9_grafana.png b/versioned_docs/version-stable/assets/images/mp_9_grafana.png new file mode 100644 index 00000000000..e37c0b9bade Binary files /dev/null and b/versioned_docs/version-stable/assets/images/mp_9_grafana.png differ diff --git a/versioned_docs/version-stable/assets/images/node-permissioning-bad-actor.png b/versioned_docs/version-stable/assets/images/node-permissioning-bad-actor.png new file mode 100644 index 00000000000..b5e8952b51f Binary files /dev/null and b/versioned_docs/version-stable/assets/images/node-permissioning-bad-actor.png differ diff --git a/versioned_docs/version-stable/assets/images/postman-logo.svg b/versioned_docs/version-stable/assets/images/postman-logo.svg new file mode 100644 index 00000000000..8ca967adafd --- /dev/null +++ b/versioned_docs/version-stable/assets/images/postman-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/versioned_docs/version-stable/assets/images/private-architecture.jpeg b/versioned_docs/version-stable/assets/images/private-architecture.jpeg new file mode 100644 index 00000000000..3d31c1a325f Binary files /dev/null and b/versioned_docs/version-stable/assets/images/private-architecture.jpeg differ diff --git a/versioned_docs/version-stable/assets/images/public-architecture.jpeg b/versioned_docs/version-stable/assets/images/public-architecture.jpeg new file mode 100644 index 00000000000..f96066ee909 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/public-architecture.jpeg differ diff --git a/versioned_docs/version-stable/assets/images/sampleNetworks-poa.png b/versioned_docs/version-stable/assets/images/sampleNetworks-poa.png new file mode 100644 index 00000000000..64ecea2a8c8 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sampleNetworks-poa.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-block-details.png b/versioned_docs/version-stable/assets/images/sirato-block-details.png new file mode 100644 index 00000000000..6b8922515fd Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-block-details.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-blocks.png b/versioned_docs/version-stable/assets/images/sirato-blocks.png new file mode 100644 index 00000000000..9d90941ce7e Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-blocks.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-contract-details.png b/versioned_docs/version-stable/assets/images/sirato-contract-details.png new file mode 100644 index 00000000000..a662d4da7ab Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-contract-details.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-contracts.png b/versioned_docs/version-stable/assets/images/sirato-contracts.png new file mode 100644 index 00000000000..a46eecbfb6d Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-contracts.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-dashboard.png b/versioned_docs/version-stable/assets/images/sirato-dashboard.png new file mode 100644 index 00000000000..5a2effaadd2 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-dashboard.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-events.png b/versioned_docs/version-stable/assets/images/sirato-events.png new file mode 100644 index 00000000000..ad40a9fdfcc Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-events.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-loading.png b/versioned_docs/version-stable/assets/images/sirato-loading.png new file mode 100644 index 00000000000..e15bf4cc6d8 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-loading.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-network.png b/versioned_docs/version-stable/assets/images/sirato-network.png new file mode 100644 index 00000000000..5d649b5eb5f Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-network.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-token-details.png b/versioned_docs/version-stable/assets/images/sirato-token-details.png new file mode 100644 index 00000000000..d2b125df12e Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-token-details.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-tokens.png b/versioned_docs/version-stable/assets/images/sirato-tokens.png new file mode 100644 index 00000000000..ba7d1fc5b48 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-tokens.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-transaction-details.png b/versioned_docs/version-stable/assets/images/sirato-transaction-details.png new file mode 100644 index 00000000000..abbb4f650ab Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-transaction-details.png differ diff --git a/versioned_docs/version-stable/assets/images/sirato-transactions.png b/versioned_docs/version-stable/assets/images/sirato-transactions.png new file mode 100644 index 00000000000..49ec42ae607 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/sirato-transactions.png differ diff --git a/versioned_docs/version-stable/assets/images/splunk-ui.png b/versioned_docs/version-stable/assets/images/splunk-ui.png new file mode 100644 index 00000000000..d40b2b32ac8 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/splunk-ui.png differ diff --git a/versioned_docs/version-stable/assets/images/system-load.png b/versioned_docs/version-stable/assets/images/system-load.png new file mode 100644 index 00000000000..f3b15ec8e09 Binary files /dev/null and b/versioned_docs/version-stable/assets/images/system-load.png differ diff --git a/versioned_docs/version-stable/assets/images/transaction-validation.png b/versioned_docs/version-stable/assets/images/transaction-validation.png new file mode 100644 index 00000000000..523139d8f9d Binary files /dev/null and b/versioned_docs/version-stable/assets/images/transaction-validation.png differ diff --git a/versioned_docs/version-stable/assets/postman/postman_collection.json b/versioned_docs/version-stable/assets/postman/postman_collection.json new file mode 100644 index 00000000000..55bfdfcf814 --- /dev/null +++ b/versioned_docs/version-stable/assets/postman/postman_collection.json @@ -0,0 +1,5780 @@ +{ + "info": { + "_postman_id": "f334929f-c8c3-43ed-bb73-69a6f0d728d8", + "name": "Hyperledger Besu JSON-RPC API", + "description": "Hyperledger Besu JSON-RPC API enables interaction with a Besu Ethereum node.\n\nRefer to [Besu documentation how to page](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API/) to learn how to use this API.\n", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "ADMIN", + "item": [ + { + "name": "admin_addPeer", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Result should be true\", () => {", + " //parse the response json", + " const responseJson = pm.response.json();", + " pm.expect(responseJson.id).to.eql(1);", + " pm.expect(responseJson.result).is.true;", + "});" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "content-length": true, + "host": true + } + }, + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_addPeer\",\n \"params\": [\n \"enode://c93f69ddd83d3db3e93e5165d60b4f5d93a9731df776beee94c5f8a0c770e41bdea69094136402db0cef7af63f0aa636ff676d4a88c6d37276dfa4160c21ed5f@127.0.0.1:30303\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Adds a static node\n\n> **Caution**\n>\n> If connections are timing out, ensure the node ID in the enode URL is correct.\n\n#### Parameters\n\n`string` : Enode URL of peer to add\n\n#### Returns\n\n`result` : `boolean` - `true` if peer added or `false` if peer already a static node." + }, + "response": [ + { + "name": "admin_addPeer", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_addPeer\",\n \"params\": [\n \"enode://c93f69ddd83d3db3e93e5165d60b4f5d93a9731df776beee94c5f8a0c770e41bdea69094136402db0cef7af63f0aa636ff676d4a88c6d37276dfa4160c21ed5f@127.0.0.1:30303\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "admin_changeLogLevel", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_changeLogLevel\",\n \"params\": [\n \"DEBUG\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Changes the log level without restarting Besu. You can change the log level for all logs, or you\ncan change the log level for specific packages or classes.\n\nYou can specify only one log level per RPC call.\n\n#### Parameters\n\n`level` - [Log level](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#logging)\n\n`log_filter`: `Array` - Packages or classes to change the log level for. Optional.\n\n#### Returns\n\n`result` : `Success` if the log level has changed, otherwise `error`." + }, + "response": [ + { + "name": "admin_changeLogLevel", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_changeLogLevel\",\n \"params\": [\n \"DEBUG\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "admin_generateLogBloomCache", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_generateLogBloomCache\",\n \"params\": [\n \"0x0\",\n \"0x10000\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Generates cached log bloom indexes for blocks. APIs such as [`eth_getLogs`](#eth_getlogs) and\n[`eth_getFilterLogs`](#eth_getfilterlogs) use the cache for improved performance.\n\n> **note**\n>\n> Each index file contains 100000 blocks. The last fragment of blocks less than 100000 are not indexed.\n\n> **tip**\n>\n> Manually executing `admin_generateLogBloomCache` is not required unless the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#auto-log-bloom-caching-enabled) command line option was set to false.\n\n#### Parameters\n\n`integer` - Block to start generating indexes.\n\n`integer` - Block to stop generating indexes.\n\n#### Returns\n\n`result` : *object* - Log bloom index details:\n\n* `quantity` : `startBlock` - Starting block for the last requested cache generation.\n* `quantity` : `endBlock` - Ending block for the last requested cache generation.\n* `quantity` : `currentBlock` - The most recent block added to the cache.\n* `boolean` : `indexing` - `true` if indexing is in progress.\n* `boolean` : `true` indicates acceptance of the request from this call to generate the cache." + }, + "response": [ + { + "name": "admin_generateLogBloomCache", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_generateLogBloomCache\",\n \"params\": [\n \"0x0\",\n \"0x10000\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"startBlock\": \"0x0\",\n \"endBlock\": \"0x10000\",\n \"currentBlock\": \"0x0\",\n \"indexing\": true,\n \"requestAccepted\": true\n }\n}" + } + ] + }, + { + "name": "admin_logsRepairCache", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_logsRepairCache\",\n \"params\": [\n \"1200\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Repairs cached logs by fixing all segments starting with the specified block number.\n\n#### Parameters\n\n`quantity` - Decimal index of the starting block to fix. If left empty, the head block\nis used as the starting point.\n\n#### Returns\n\n`result` - Status of the repair request. Either `Started`, or `Already running`." + }, + "response": [ + { + "name": "admin_logsRepairCache", + "originalRequest": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_logsRepairCache\",\n \"params\": [\n \"1200\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"Status\": \"Started\"\n }\n}" + } + ] + }, + { + "name": "admin_nodeInfo", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_nodeInfo\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns networking information about the node. The information includes general information about\nthe node and specific information from each running Ethereum sub-protocol (for example, `eth`).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : Node object\n\nProperties of the node object are:\n\n* `enode` - [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of the node.\n* `listenAddr` - Host and port for the node.\n* `name` - Client name.\n* `id` - [Node public key](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#node-public-key).\n* `ports` - Peer discovery and listening\n [ports](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Managing-Peers#port-configuration).\n* `protocols` - List of objects containing information for each Ethereum sub-protocol.\n\n> **note**\n>\n> If the node is running locally, the host of the `enode` and `listenAddr` display as `[::]` in the result. When advertising externally, the external address displayed for the `enode` and `listenAddr` is defined by [`--nat-method`](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Specifying-NAT).\n" + }, + "response": [ + { + "name": "admin_nodeInfo", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_nodeInfo\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"enode\": \"enode://87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3@[::]:30303\",\n \"listenAddr\": \"[::]:30303\",\n \"name\": \"besu/v1.0.1-dev-0d2294a5/osx-x86_64/oracle-java-1.8\",\n \"id\": \"87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3\",\n \"ports\": {\n \"discovery\": 30303,\n \"listener\": 30303\n },\n \"protocols\": {\n \"eth\": {\n \"config\": {\n \"chainId\": 2018,\n \"homesteadBlock\": 0,\n \"daoForkBlock\": 0,\n \"daoForkSupport\": true,\n \"eip150Block\": 0,\n \"eip155Block\": 0,\n \"eip158Block\": 0,\n \"byzantiumBlock\": 0,\n \"constantinopleBlock\": 0,\n \"constantinopleFixBlock\": 0,\n \"ethash\": {\n \"fixeddifficulty\": 100\n }\n },\n \"difficulty\": 78536,\n \"genesis\": \"0x43ee12d45470e57c86a0dfe008a5b847af9e372d05e8ba8f01434526eb2bea0f\",\n \"head\": \"0xc6677651f16d07ae59cab3a5e1f0b814ed2ec27c00a93297b2aa2e29707844d9\",\n \"network\": 2018\n }\n }\n }\n}" + } + ] + }, + { + "name": "admin_peers", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_peers\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns networking information about connected remote nodes.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *array* of *objects* - Object returned for each remote node.\n\nProperties of the remote node object are:\n\n* `version` - P2P protocol version.\n* `name` - Client name.\n* `caps` - List of Ethereum sub-protocol capabilities.\n* `network` - Local and remote addresses established at time of bonding with the peer. The remote\n address might not match the hex value for `port`. The remote address depends on which node\n initiated the connection.\n* `port` - Port on the remote node on which P2P discovery is listening.\n* `id` - Node public key. Excluding the `0x` prefix, the node public key is the ID in the enode\n URL `enode://@:`.\n* `protocols` - [Current state of peer](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Managing-Peers#monitoring-peer-connections)\n including `difficulty` and `head`. `head` is the hash of the highest known block for the peer." + }, + "response": [ + { + "name": "admin_peers", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_peers\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"version\": \"0x5\",\n \"name\": \"besu/v20.10.4-dev-0905d1b2/osx-x86_64/adoptopenjdk-java-11\",\n \"caps\": [\n \"eth/62\",\n \"eth/63\",\n \"eth/64\",\n \"eth/65\",\n \"IBF/1\"\n ],\n \"network\": {\n \"localAddress\": \"192.168.1.229:50115\",\n \"remoteAddress\": \"168.61.153.255:40303\"\n },\n \"port\": \"0x765f\",\n \"id\": \"0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc\",\n \"protocols\": {\n \"eth\": {\n \"difficulty\": \"0x1ac\",\n \"head\": \"0x964090ae9277aef43f47f1b8c28411f162243d523118605f0b1231dbfdf3611a\",\n \"version\": 65\n }\n }\n }\n ]\n}" + } + ] + }, + { + "name": "admin_removePeer", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_removePeer\",\n \"params\": [\n \"enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Removes a [static node](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Static-Nodes).\n\n#### Parameters\n\n`string` : [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of peer to remove.\n\n#### Returns\n\n`result` : `boolean` - `true` if peer removed or `false` if peer not a\n[static node](https://besu.hyperledger.org/en/stable/HowTo/Find-and-Connect/Static-Nodes))." + }, + "response": [ + { + "name": "admin_removePeer", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"admin_removePeer\",\n \"params\": [\n \"enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `ADMIN` API methods are not enabled by default for JSON-RPC. To enable the `ADMIN` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or\n[`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options.", + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [""] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [""] + } + } + ] + }, + { + "name": "CLIQUE", + "item": [ + { + "name": "clique_discard", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_discard\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Discards a proposal to [add or remove a signer with the specified address].\n\n#### Parameters\n\n`data` - 20-byte address of proposed signer.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "clique_discard", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_discard\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "clique_getSignerMetrics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides validator metrics for the specified range:\n\n* Number of blocks from each validator.\n* Block number of the last block proposed by each validator (if any proposed in the specified\n range).\n* All validators present in the last block.\n\n#### Parameters\n\n`fromBlockNumber` - Integer representing a block number or the string tag `earliest`, as described\nin [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`toBlockNumber` - Integer representing a block number or one of the string tags `latest` or\n`pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter)\n\nIf you specify:\n\n* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less\n than 100 blocks.\n* Only the first parameter, the call provides metrics for all blocks from the block specified to\n the latest block.\n\n#### Returns\n\n`result`: _object_ - List of validator objects.\n\n> **Note**\n>\n> The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`." + }, + "response": [ + { + "name": "clique_getSignerMetrics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"address\": \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x61\"\n },\n {\n \"address\": \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x63\"\n },\n {\n \"address\": \"0xb279182d99e65703f0076e4812653aab85fca0f0\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x62\"\n }\n ]\n}" + } + ] + }, + { + "name": "clique_getSigners", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSigners\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists [signers for the specified block].\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result: array of data` - List of 20-byte addresses of signers." + }, + "response": [ + { + "name": "clique_getSigners", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSigners\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"0xb279182d99e65703f0076e4812653aab85fca0f0\"\n ]\n}" + } + ] + }, + { + "name": "clique_getSignersAtHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignersAtHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists signers for the specified block.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result: array of data` - List of 20-byte addresses of signers." + }, + "response": [ + { + "name": "clique_getSignersAtHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_getSignersAtHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"0xb279182d99e65703f0076e4812653aab85fca0f0\"\n ]\n}" + } + ] + }, + { + "name": "clique_proposals", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_proposals\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns\n[current proposals](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/Clique#adding-and-removing-signers).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`:_object_ - Map of account addresses to corresponding boolean values indicating the\nproposal for each account.\n\nIf the boolean value is `true`, the proposal is to add a signer. If `false`, the proposal is to\nremove a signer." + }, + "response": [ + { + "name": "clique_proposals", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_proposals\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"0x42eb768f2244c8811c63729a21a3569731535f07\": false,\n \"0x12eb759f2222d7711c63729a45c3585731521d01\": true\n }\n}" + } + ] + }, + { + "name": "clique_propose", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_propose\",\n \"params\": [\n \"0x12eb759f2222d7711c63729a45c3585731521d01\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Propose to [add or remove a signer with the specified address].\n\n#### Parameters\n\n`data` - 20-byte address.\n\n`boolean` - `true` to propose adding signer or `false` to propose removing signer.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "clique_propose", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"clique_propose\",\n \"params\": [\n \"0x12eb759f2222d7711c63729a45c3585731521d01\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> Note\n>\n> The `CLIQUE` API methods are not enabled by default for JSON-RPC.\n>\n> To enable the `CLIQUE` API methods use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "DEBUG", + "item": [ + { + "name": "debug_accountRange", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_accountRange\",\n \"params\": [\n \"12345\",\n 0,\n \"0\",\n 5\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "[Retesteth](https://github.com/ethereum/retesteth/wiki/Retesteth-Overview) uses\n`debug_accountRange` to implement debugging.\n\nReturns the accounts for a specified block.\n\n#### Parameters\n\n`blockHashOrNumber` : `data` - Block hash or number.\n\n`txIndex` : `integer` - Transaction index from which to start.\n\n`address` : `data` - Address hash from which to start.\n\n`limit` : `integer` - Maximum number of account entries to return.\n\n#### Returns\n\n`result`:`object` - Account details:\n\n* `addressMap`:`object` - List of address hashes and account addresses.\n* `nextKey`:`data` - Hash of the next address if any addresses remain in the state, otherwise\n zero.\n" + }, + "response": [ + { + "name": "debug_accountRange", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_accountRange\",\n \"params\": [\n \"12345\",\n 0,\n \"0\",\n 5\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"addressMap\": {\n \"0x005e5...86960\": \"0x0000000000000000000000000000000000000000\",\n \"0x021fe...6ffe3\": \"0x0000000000000000000000000000000000000000\",\n \"0x028e6...ab776\": \"0x0000000000000000000000000000000000000000\",\n \"0x02cb5...bc4d8\": \"0x0000000000000000000000000000000000000000\",\n \"0x03089...23fd5\": \"0x0000000000000000000000000000000000000000\"\n },\n \"nextKey\": \"0x04242954a5cb9748d3f66bcd4583fd3830287aa585bebd9dd06fa6625976be49\"\n }\n}" + } + ] + }, + { + "name": "debug_metrics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_metrics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns metrics providing information on the internal operation of Besu.\n\nThe available metrics might change over time. The JVM metrics might vary based on the JVM\nimplementation used.\n\nThe metric types are:\n\n* Timer\n* Counter\n* Gauge.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`:`object`" + }, + "response": [ + { + "name": "debug_metrics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_metrics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"jvm\": {\n \"memory_bytes_init\": {\n \"heap\": 268435456,\n \"nonheap\": 2555904\n },\n \"threads_current\": 41,\n \"memory_bytes_used\": {\n \"heap\": 696923976,\n \"nonheap\": 63633456\n },\n \"memory_pool_bytes_used\": {\n \"PS Eden Space\": 669119360,\n \"Code Cache\": 19689024,\n \"Compressed Class Space\": 4871144,\n \"PS Survivor Space\": 2716320,\n \"PS Old Gen\": 25088296,\n \"Metaspace\": 39073288\n },\n \"other properties...\":\"values...\"\n },\n \"process\": {\n \"open_fds\": 546,\n \"cpu_seconds_total\": 67.148992,\n \"start_time_seconds\": 1543897699.589,\n \"max_fds\": 10240\n },\n \"rpc\": {\n \"request_time\": {\n \"debug_metrics\": {\n \"bucket\": {\n \"+Inf\": 2,\n \"0.01\": 1,\n \"0.075\": 2,\n \"0.75\": 2,\n \"0.005\": 1,\n \"0.025\": 2,\n \"0.1\": 2,\n \"1.0\": 2,\n \"0.05\": 2,\n \"10.0\": 2,\n \"0.25\": 2,\n \"0.5\": 2,\n \"5.0\": 2,\n \"2.5\": 2,\n \"7.5\": 2\n },\n \"count\": 2,\n \"sum\": 0.015925392\n }\n }\n },\n \"blockchain\": {\n \"difficulty_total\": 3533501,\n \"announcedBlock_ingest\": {\n \"bucket\": {\n \"+Inf\": 0,\n \"0.01\": 0,\n \"0.075\": 0,\n \"0.75\": 0,\n \"0.005\": 0,\n \"0.025\": 0,\n \"0.1\": 0,\n \"1.0\": 0,\n \"0.05\": 0,\n \"10.0\": 0,\n \"0.25\": 0,\n \"0.5\": 0,\n \"5.0\": 0,\n \"2.5\": 0,\n \"7.5\": 0\n },\n \"count\": 0,\n \"sum\": 0\n },\n \"height\": 1908793\n },\n \"peers\": {\n \"disconnected_total\": {\n \"remote\": {\n \"SUBPROTOCOL_TRIGGERED\": 5\n },\n \"local\": {\n \"TCP_SUBSYSTEM_ERROR\": 1,\n \"SUBPROTOCOL_TRIGGERED\": 2,\n \"USELESS_PEER\": 3\n }\n },\n \"peer_count_current\": 2,\n \"connected_total\": 10\n }\n }\n}" + } + ] + }, + { + "name": "debug_storageRangeAt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_storageRangeAt\",\n \"params\": [\n \"0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c\",\n 0,\n \"0x0e0d2c8f7794e82164f11798276a188147fbd415\",\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n 1\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "[Remix](https://remix.ethereum.org/) uses `debug_storageRangeAt` to implement debugging. Use the\n_Debugger_ tab in Remix instead of calling `debug_storageRangeAt` directly.\n\nReturns the contract storage for the specified range.\n\n#### Parameters\n\n`blockHash` : `data` - Block hash.\n\n`txIndex` : `integer` - Transaction index from which to start.\n\n`address` : `data` - Contract address.\n\n`startKey` : `hash` - Start key.\n\n`limit` : `integer` - Number of storage entries to return.\n\n#### Returns\n\n`result`:`object` - [Range object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#range-object).\n" + }, + "response": [ + { + "name": "debug_storageRangeAt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_storageRangeAt\",\n \"params\": [\n \"0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c\",\n 0,\n \"0x0e0d2c8f7794e82164f11798276a188147fbd415\",\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n 1\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"storage\": {\n \"0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563\": {\n \"key\": null,\n \"value\": \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n }\n },\n \"nextKey\": \"0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6\"\n }\n}" + } + ] + }, + { + "name": "debug_traceBlock", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlock\",\n \"params\": [\n \"0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`Block` : `data` - RLP of the block.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`object` - [Trace object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object).\n" + }, + "response": [ + { + "name": "debug_traceBlock", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlock\",\n \"params\": [\n \"0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": null\n }\n ]\n }\n}" + } + ] + }, + { + "name": "debug_traceBlockByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByHash\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`block hash` : `data` - Block hash.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`array of objects` - [Trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object)." + }, + "response": [ + { + "name": "debug_traceBlockByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByHash\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": {},\n \"reason\": null\n }\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "debug_traceBlockByNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByNumber\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns full trace of all invoked opcodes of all transactions included in the block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`array of objects` - [Trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object)." + }, + "response": [ + { + "name": "debug_traceBlockByNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBlockByNumber\",\n \"params\": [\n \"0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": null,\n \"reason\": null\n }\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "debug_traceTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceTransaction\",\n \"params\": [\n \"0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e\",\n {\n \"disableStorage\": true\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "[Remix](https://remix.ethereum.org/) uses `debug_traceTransaction` to implement debugging. Use the\n_Debugger_ tab in Remix instead of calling `debug_traceTransaction` directly.\n\nReruns the transaction with the same state as when the transaction executed.\n\n#### Parameters\n\n`transactionHash` : `data` - Transaction hash.\n\n`Object` - request options (all optional and default to `false`):\n\n* `disableStorage` : `boolean` - `true` disables storage capture.\n* `disableMemory` : `boolean` - `true` disables memory capture.\n* `disableStack` : `boolean` - `true` disables stack capture.\n\n#### Returns\n\n`result`:`object` - [Trace object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#trace-object).\n" + }, + "response": [ + { + "name": "debug_traceTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceTransaction\",\n \"params\": [\n \"0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e\",\n {\n \"disableStorage\": true\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"gas\": 21000,\n \"failed\": false,\n \"returnValue\": \"\",\n \"structLogs\": [\n {\n \"pc\": 0,\n \"op\": \"STOP\",\n \"gas\": 0,\n \"gasCost\": 0,\n \"depth\": 1,\n \"stack\": [],\n \"memory\": [],\n \"storage\": null\n }\n ]\n }\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `DEBUG` API methods are not enabled by default for JSON-RPC. To enable the `DEBUG` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options.\n\nThe DEBUG API is a more verbose alternative to the TRACE API whose main purpose is compatibility with tools such as [Remix](https://remix.ethereum.org/). We recommend using the TRACE API for production use over the DEBUG API." + }, + { + "name": "EEA", + "item": [ + { + "name": "eea_sendRawTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eea_sendRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Distributes the\n[private transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions),\ngenerates the [privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing)\nand submits it to the transaction pool, and returns the transaction hash of the\n[privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing).\n\nThe signed transaction passed as an input parameter includes the `privateFrom`,\n[`privateFor` or `privacyGroupId`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions#eea-compliant-or-besu-extended-privacy),\nand `restriction` fields.\n\nThe `gas` and `gasPrice` are used by the [privacy marker transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing)\nnot the private transaction itself.\n\nTo avoid exposing your private key, create signed transactions offline and send the signed\ntransaction data using `eea_sendRawTransaction`.\n\n> **Important**\n>\n> For production systems requiring private transactions, use a network with a consensus mechanism\n> supporting transaction finality to make sure the private state does not become inconsistent\n> with the chain. For example, [IBFT 2.0](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT)\n> provides the required finality.\n>\n> Using private transactions with [pruning](https://besu.hyperledger.org/en/stable/Concepts/Pruning) or\n> [fast sync](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#sync-mode) is not supported.\n> \n> Besu does not implement\n> [`eea_sendTransaction`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management).\n> \n> [EthSigner](https://docs.ethsigner.consensys.net/en/latest/) provides transaction signing and\n>implements [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction).\n\n#### Parameters\n\n`data` - Signed RLP-encoded private transaction. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n#### Returns\n\n`result` : `data` - 32-byte transaction hash of the\n[Privacy Marker Transaction](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing).\n\n> **Tip**\n>\n> If creating a contract, use [priv_getTransactionReceipt](#priv_gettransactionreceipt) to\n> retrieve the contract address after the transaction is finalized." + }, + "response": [ + { + "name": "eea_sendRawTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eea_sendRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"result\": \"0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331\"\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `EEA` API methods are not enabled by default for JSON-RPC. To enable the `EEA` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "ETH", + "item": [ + { + "name": "eth_accounts", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_accounts\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a list of account addresses a client owns.\n\n> **note**\n> \n> This method returns an empty object because Besu [doesn't support key management](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management) inside the client.\n> \n> To provide access to your key store and and then sign transactions, use [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`Array of data` : List of 20-byte account addresses owned by the client.\n" + }, + "response": [ + { + "name": "eth_accounts", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_accounts\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": []\n}" + } + ] + }, + { + "name": "eth_blockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_blockNumber\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the index corresponding to the block number of the current chain head.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *QUANTITY* - Hexadecimal integer representing the index corresponding to the block\nnumber of the current chain head.\n" + }, + "response": [ + { + "name": "eth_blockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_blockNumber\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": \"0x2377\"\n}" + } + ] + }, + { + "name": "eth_call", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_call\",\n \"params\": [\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Invokes a contract function locally and does not change the state of the blockchain.\n\nYou can interact with contracts using `eth_sendRawTransaction` or `eth_call`.\n\n#### Parameters\n\n*OBJECT* - [Transaction call object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object).\n\n*QUANTITY|TAG* - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` - `data` - Return value of the executed contract.\n" + }, + "response": [ + { + "name": "eth_call", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_call\",\n \"params\": [\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x\"\n}" + } + ] + }, + { + "name": "eth_chainId", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_chainId\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the [chain ID](https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *quantity* - Chain ID, in hexadecimal." + }, + "response": [ + { + "name": "eth_chainId", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_chainId\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": \"0x7e2\"\n}" + } + ] + }, + { + "name": "eth_coinbase", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_coinbase\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the client coinbase address. The coinbase address is the account to pay mining rewards to.\n\nTo set a coinbase address, start Besu with the `--miner-coinbase` option set to a valid Ethereum\naccount address. You can get the Ethereum account address from a client such as MetaMask or\nEtherscan. For example:\n\n**Example**\n\n```bash\nbesu --miner-coinbase=\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\" --rpc-http-enabled\n```\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *data* - Coinbase address." + }, + "response": [ + { + "name": "eth_coinbase", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_coinbase\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"\n}" + } + ] + }, + { + "name": "eth_estimateGas", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_estimateGas\",\n \"params\": [\n {\n \"from\": \"0x687422eea2cb73b5d3e242ba5456b782919afc85\",\n \"to\": \"0xdd37f65db31c107f773e82a4f85c693058fef7a9\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an estimate of the gas required for a transaction to complete. The estimation process\ndoes not use gas and the transaction is not added to the blockchain. The resulting estimate can be\ngreater than the amount of gas the transaction ends up using, for reasons including EVM mechanics\nand node performance.\n\nThe `eth_estimateGas` call does not send a transaction. You must call\n[`eth_sendRawTransaction`](#eth_sendrawtransaction) to execute the transaction.\n\n#### Parameters\n\nThe transaction call object parameters are the same as those for [`eth_call`](#eth_call) except for the\n[`strict` parameter](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object). If `strict` is set to `true`, the sender\naccount balance is checked for value transfer and transaction fees. The default for `strict` is `false`.\n\nFor `eth_estimateGas`, all fields are optional because setting a gas limit\nis irrelevant to the estimation process (unlike transactions, in which gas limits apply).\n\n`object` - [Transaction call object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-call-object).\n\n#### Returns\n\n`result` : `quantity` - Amount of gas used." + }, + "response": [ + { + "name": "eth_estimateGas", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_estimateGas\",\n \"params\": [\n {\n \"from\": \"0x687422eea2cb73b5d3e242ba5456b782919afc85\",\n \"to\": \"0xdd37f65db31c107f773e82a4f85c693058fef7a9\",\n \"value\": \"0x1\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x5208\"\n}" + } + ] + }, + { + "name": "eth_gasPrice", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_gasPrice\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a percentile gas unit price for the most recent blocks, in Wei. By default,\nthe last 100 blocks are examined and the 50th percentile gas unit price (that is, the median value)\nis returned.\n\nIf there are no blocks, the value for [`--min-gas-price`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#min-gas-price) is returned.\nThe value returned is restricted to values between [`--min-gas-price`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#min-gas-price)\nand [`--api-gas-price-max`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-max). By default, 1000 Wei and\n500GWei.\n\nUse the [`--api-gas-price-blocks`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-blocks), [`--api-gas-price-percentile`](CLI/CLI-Syntax#api-gas-price-percentile)\n, and [`--api-gas-price-max`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#api-gas-price-max) command line\noptions to configure the `eth_gasPrice` default values.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `quantity` - Percentile gas unit price for the most recent blocks, in Wei, as a hexadecimal value." + }, + "response": [ + { + "name": "eth_gasPrice", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_gasPrice\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x3e8\"\n}" + } + ] + }, + { + "name": "eth_getBalance", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBalance\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the account balance of the specified address.\n\n#### Parameters\n\n`DATA` - 20-byte account address from which to retrieve the balance.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Current balance, in wei, as a hexadecimal value." + }, + "response": [ + { + "name": "eth_getBalance", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBalance\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x1cfe56f3795885980000\"\n}" + } + ] + }, + { + "name": "eth_getBlockByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByHash\",\n \"params\": [\n \"0xaf5526fcb88b2f0d163c9a78ee678bf95b20115dc3d4e2b7b1f5fc4a308724a0\",\n false\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns information about the block by hash.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a block.\n\n`Boolean` - If `true`, returns the full [transaction objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object);\nif `false`, returns the transaction hashes.\n\n#### Returns\n\n`result` : *OBJECT* - [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object) , or `null` when there is no block." + }, + "response": [ + { + "name": "eth_getBlockByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByHash\",\n \"params\": [\n \"0xaf5526fcb88b2f0d163c9a78ee678bf95b20115dc3d4e2b7b1f5fc4a308724a0\",\n false\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": {\n \"number\": \"0x68b3\",\n \"hash\": \"0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c\",\n \"mixHash\": \"0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d\",\n \"parentHash\": \"0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d\",\n \"nonce\": \"0x378da40ff335b070\",\n \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n \"logsBloom\": \"0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000\",\n \"transactionsRoot\": \"0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126\",\n \"stateRoot\": \"0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233\",\n \"receiptsRoot\": \"0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a\",\n \"miner\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"difficulty\": \"0x66e619a\",\n \"totalDifficulty\": \"0x1e875d746ae\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"size\": \"0x334\",\n \"gasLimit\": \"0x47e7c4\",\n \"gasUsed\": \"0x37993\",\n \"timestamp\": \"0x5835c54d\",\n \"uncles\": [],\n \"transactions\": [\n \"0xa0807e117a8dd124ab949f460f08c36c72b710188f01609595223b325e58e0fc\",\n \"0xeae6d797af50cb62a596ec3939114d63967c374fa57de9bc0f4e2b576ed6639d\"\n ]\n }\n}" + } + ] + }, + { + "name": "eth_getBlockByNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByNumber\",\n \"params\": [\n \"0xF\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns information about a block by block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`Boolean` - If `true`, returns the full [transaction objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object);\nif `false`, returns only the hashes of the transactions.\n\n#### Returns\n\n`result` : *OBJECT* - [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object) , or `null` when there is no\nblock." + }, + "response": [ + { + "name": "eth_getBlockByNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockByNumber\",\n \"params\": [\n \"0xF\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"number\": \"0x68b3\",\n \"hash\": \"0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c\",\n \"mixHash\": \"0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d\",\n \"parentHash\": \"0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d\",\n \"nonce\": \"0x378da40ff335b070\",\n \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n \"logsBloom\": \"0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000\",\n \"transactionsRoot\": \"0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126\",\n \"stateRoot\": \"0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233\",\n \"receiptsRoot\": \"0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a\",\n \"miner\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"difficulty\": \"0x66e619a\",\n \"totalDifficulty\": \"0x1e875d746ae\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"size\": \"0x334\",\n \"gasLimit\": \"0x47e7c4\",\n \"gasUsed\": \"0x37993\",\n \"timestamp\": \"0x5835c54d\",\n \"uncles\": [],\n \"transactions\": []\n }\n}" + } + ] + }, + { + "name": "eth_getBlockTransactionCountByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of transactions in the block matching the given block hash.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result` : `quantity` - Integer representing the number of transactions in the specified block." + }, + "response": [ + { + "name": "eth_getBlockTransactionCountByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "eth_getBlockTransactionCountByNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByNumber\",\n \"params\": [\n \"0xe8\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of transactions in a block matching the specified block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of transactions in the specified block." + }, + "response": [ + { + "name": "eth_getBlockTransactionCountByNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getBlockTransactionCountByNumber\",\n \"params\": [\n \"0xe8\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": \"0x8\"\n}" + } + ] + }, + { + "name": "eth_getCode", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getCode\",\n \"params\": [\n \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the code of the smart contract at the specified address. Besu stores compiled smart\ncontract code as a hexadecimal value.\n\n#### Parameters\n\n`DATA` - 20-byte contract address.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *DATA* - Code stored at the specified address." + }, + "response": [ + { + "name": "eth_getCode", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getCode\",\n \"params\": [\n \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029\"\n}" + } + ] + }, + { + "name": "eth_getFilterChanges", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Polls the specified filter and returns an array of changes that have occurred since the last poll.\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`result` : `Array of Object` - If nothing changed since the last poll, an empty list. Otherwise:\n\n* For filters created with `eth_newBlockFilter`, returns block hashes.\n* For filters created with `eth_newPendingTransactionFilter`, returns transaction hashes.\n* For filters created with `eth_newFilter`, returns [log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "filter created with eth_newPendingTransactionFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x1e977049b6db09362da09491bee3949d9362080ce3f4fc19721196d508580d46\",\n \"0xa3abc4b9a4e497fd58dc59cdff52e9bb5609136bcd499e760798aa92802769be\"\n ]\n}" + }, + { + "name": "Filter created with eth_newFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x233\",\n \"blockHash\": \"0xfc139f5e2edee9e9c888d8df9a2d2226133a9bd87c88ccbd9c930d3d4c9f9ef5\",\n \"transactionHash\": \"0x66e7a140c8fa27fe98fde923defea7562c3ca2d6bb89798aabec65782c08f63d\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x42699a7612a82f1d9c36148af9c77354759b210b\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000004\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x238\",\n \"blockHash\": \"0x98b0ec0f9fea0018a644959accbe69cd046a8582e89402e1ab0ada91cad644ed\",\n \"transactionHash\": \"0xdb17aa1c2ce609132f599155d384c0bc5334c988a6c368056d7e167e23eee058\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x42699a7612a82f1d9c36148af9c77354759b210b\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000007\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n }\n ]\n}" + }, + { + "name": "Filter created with eth_newBlockFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0xf8bf5598d9e04fbe84523d42640b9b0e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0xda2bfe44bf85394f0d6aa702b5af89ae50ae22c0928c18b8903d9269abe17e0b\",\n \"0x88cd3a37306db1306f01f7a0e5b25a9df52719ad2f87b0f88ee0e6753ed4a812\",\n \"0x4d4c731fe129ff32b425e6060d433d3fde278b565bbd1fd624d5a804a34f8786\"\n ]\n}" + } + ] + }, + { + "name": "eth_getFilterLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterLogs\",\n \"params\": [\n \"0x5ace5de3985749b6a1b2b0d3f3e1fb69\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for the specified filter.\n\nLeave the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\ncommand line option at the default value of `true` to improve log retrieval performance.\n\n> **note**\n\n `eth_getFilterLogs` is only used for filters created with `eth_newFilter`. To specify a filter\n object and get logs without creating a filter, use `eth_getLogs` .\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "eth_getFilterLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterLogs\",\n \"params\": [\n \"0x5ace5de3985749b6a1b2b0d3f3e1fb69\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb3\",\n \"blockHash\": \"0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998\",\n \"transactionHash\": \"0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000003\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb6\",\n \"blockHash\": \"0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc\",\n \"transactionHash\": \"0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000005\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "eth_getLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getLogs\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) matching a specified filter object.\n\nLeave the [`--auto-log-bloom-caching-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\ncommand line option at the default value of `true` to improve log retrieval performance.\n\n> **Attention**\n>\n> Using `eth_getLogs` to get the logs from a large range of blocks, especially an entire chain from its genesis block, can cause Besu to hang and never return a response. We recommend splitting one large query into multiple ones for better performance.\n\n#### Parameters\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "eth_getLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getLogs\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb3\",\n \"blockHash\": \"0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998\",\n \"transactionHash\": \"0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000003\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0xb6\",\n \"blockHash\": \"0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc\",\n \"transactionHash\": \"0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x2e1f232a9439c3d459fceca0beef13acc8259dd8\",\n \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000005\",\n \"topics\": [\n \"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "eth_getMinerDataByBlockHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockHash\",\n \"params\": [\n \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns miner data for the specified block.\n\n#### Parameters\n\n`data` - 32 byte block hash.\n\n#### Returns\n\n`result`: `object` - [Miner data](https://besu.hyperledger.org/en/stable/Reference/API-Objects#miner-data-object)." + }, + "response": [ + { + "name": "eth_getMinerDataByBlockHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockHash\",\n \"params\": [\n \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"netBlockReward\": \"0x47c6f3739f3da800\",\n \"staticBlockReward\": \"0x4563918244f40000\",\n \"transactionFee\": \"0x38456548220800\",\n \"uncleInclusionReward\": \"0x22b1c8c1227a000\",\n \"uncleRewards\": [\n {\n \"hash\": \"0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974\",\n \"coinbase\": \"0x0c062b329265c965deef1eede55183b3acb8f611\"\n }\n ],\n \"coinbase\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"difficulty\": \"0x7348c20\",\n \"totalDifficulty\": \"0xa57bcfdd96\"\n }\n}" + } + ] + }, + { + "name": "eth_getMinerDataByBlockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockNumber\",\n \"params\": [\n \"0x7689D2\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns miner data for the specified block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result`: `object` - [Miner data](https://besu.hyperledger.org/en/stable/Reference/API-Objects#miner-data-object)." + }, + "response": [ + { + "name": "eth_getMinerDataByBlockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getMinerDataByBlockHash\",\n \"params\": [\n \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"netBlockReward\": \"0x47c6f3739f3da800\",\n \"staticBlockReward\": \"0x4563918244f40000\",\n \"transactionFee\": \"0x38456548220800\",\n \"uncleInclusionReward\": \"0x22b1c8c1227a000\",\n \"uncleRewards\": [\n {\n \"hash\": \"0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974\",\n \"coinbase\": \"0x0c062b329265c965deef1eede55183b3acb8f611\"\n }\n ],\n \"coinbase\": \"0xb42b6c4a95406c78ff892d270ad20b22642e102d\",\n \"extraData\": \"0xd583010502846765746885676f312e37856c696e7578\",\n \"difficulty\": \"0x7348c20\",\n \"totalDifficulty\": \"0xa57bcfdd96\"\n }\n}" + } + ] + }, + { + "name": "eth_getProof", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"params\": [\n \"0a8156e7ee392d885d10eaa86afd0e323afdcd95\",\n [\n \"0x0000000000000000000000000000000000000000000000000000000000000347\"\n ],\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the account and storage values of the specified account, including the Merkle proof.\n\nThe API allows IoT devices or mobile apps which are unable to run light clients to verify responses\nfrom untrusted sources, by using a trusted block hash.\n\n#### Parameters\n\n`DATA` - 20-byte address of the account or contract.\n\n`ARRAY` - Array of 32-byte storage keys to generate proofs for.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result`: *Object* - Account details:\n\n* `balance`:`Quantity` - Account balance.\n* `codeHash`:`Data, 32-byte` - Hash of the account code.\n* `nonce`:`Quantity` - Number of transactions sent from the account.\n* `storageHash`:`Data, 32-byte` - SHA3 of the `storageRoot`.\n* `accountProof`:`Array` - RLP-encoded Merkle tree nodes, starting with the `stateRoot`.\n* `storageProof`:`Array`- Storage entries. Each entry is an object that displays:\n * `key`:`Quantity` - Storage key.\n * `value`:`Quantity` - Storage value.\n * `proof`:`Array` - RLP-encoded Merkle tree nodes, starting with the `storageHash`." + }, + "response": [ + { + "name": "eth_getProof", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"params\": [\n \"0a8156e7ee392d885d10eaa86afd0e323afdcd95\",\n [\n \"0x0000000000000000000000000000000000000000000000000000000000000347\"\n ],\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"accountProof\": [\n \"0xf90211a0...608d898380\",\n \"0xf90211a0...ec33f19580\",\n \"0xf901d1a0...9e55584480\",\n \"0xf8718080...18e5777142\"\n ],\n \"address\": \"0x0a8156e7ee392d885d10eaa86afd0e323afdcd95\",\n \"balance\": \"0x0\",\n \"codeHash\": \"0x2b6975dcaf69f9bb9a3b30bb6a37b305ce440250bf0dd2f23338cb18e5777142\",\n \"nonce\": \"0x5f\",\n \"storageHash\": \"0x917688de43091589aa58c1dfd315105bc9de4478b9ba7471616a4d8a43d46203\",\n \"storageProof\": [\n {\n \"key\": \"0x0000000000000000000000000000000000000000000000000000000000000347\",\n \"value\": \"0x0\",\n \"proof\": [\n \"0xf90211a0...5176779280\",\n \"0xf901f1a0...c208d86580\",\n \"0xf8d180a0...1ce6808080\"\n ]\n }\n ]\n }\n}" + } + ] + }, + { + "name": "eth_getStorageAt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getStorageAt\",\n \"params\": [\n \"0x3B3F3E\",\n \"0x0\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the value of a storage position at a specified address.\n\n#### Parameters\n\n`DATA` - A 20-byte storage address.\n\n`QUANTITY` - Integer index of the storage position.\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *DATA* - The value at the specified storage position." + }, + "response": [ + { + "name": "eth_getStorageAt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getStorageAt\",\n \"params\": [\n \"0x3B3F3E\",\n \"0x0\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n}" + } + ] + }, + { + "name": "eth_getTransactionByBlockHashAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockHashAndIndex\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\",\n \"0x1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns transaction information for the specified block hash and transaction index position.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a block.\n\n`QUANTITY` - Integer representing the transaction index position.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." + }, + "response": [ + { + "name": "eth_getTransactionByBlockHashAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockHashAndIndex\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\",\n \"0x1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"blockHash\": \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\",\n \"blockNumber\": \"0x1442e\",\n \"from\": \"0x70c9217d814985faef62b124420f8dfbddd96433\",\n \"gas\": \"0x3d090\",\n \"gasPrice\": \"0x57148a6be\",\n \"hash\": \"0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6\",\n \"input\": \"0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000\",\n \"nonce\": \"0x2cb2\",\n \"to\": \"0xcfdc98ec7f01dab1b67b36373524ce0208dc3953\",\n \"transactionIndex\": \"0x2\",\n \"value\": \"0x0\",\n \"v\": \"0x2a\",\n \"r\": \"0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a\",\n \"s\": \"0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484\"\n }\n}" + } + ] + }, + { + "name": "eth_getTransactionByBlockNumberAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockNumberAndIndex\",\n \"params\": [\n \"latest\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns transaction information for the specified block number and transaction index position.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`QUANTITY` - The transaction index position.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." + }, + "response": [ + { + "name": "eth_getTransactionByBlockNumberAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByBlockNumberAndIndex\",\n \"params\": [\n \"latest\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"blockHash\": \"0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7\",\n \"blockNumber\": \"0x1442e\",\n \"from\": \"0x70c9217d814985faef62b124420f8dfbddd96433\",\n \"gas\": \"0x3d090\",\n \"gasPrice\": \"0x57148a6be\",\n \"hash\": \"0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6\",\n \"input\": \"0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000\",\n \"nonce\": \"0x2cb2\",\n \"to\": \"0xcfdc98ec7f01dab1b67b36373524ce0208dc3953\",\n \"transactionIndex\": \"0x2\",\n \"value\": \"0x0\",\n \"v\": \"0x2a\",\n \"r\": \"0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a\",\n \"s\": \"0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484\"\n }\n}" + } + ] + }, + { + "name": "eth_getTransactionByHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByHash\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns transaction information for the specified transaction hash.\n\n#### Parameters\n\n`DATA` - 32-byte transaction hash.\n\n#### Returns\n\nObject - [Transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-object), or `null` when there is no\ntransaction." + }, + "response": [ + { + "name": "eth_getTransactionByHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionByHash\",\n \"params\": [\n \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": {\n \"blockHash\": \"0x510efccf44a192e6e34bcb439a1947e24b86244280762cbb006858c237093fda\",\n \"blockNumber\": \"0x422\",\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\": \"0x5208\",\n \"gasPrice\": \"0x3b9aca00\",\n \"hash\": \"0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44\",\n \"input\": \"0x\",\n \"nonce\": \"0x1\",\n \"to\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n \"transactionIndex\": \"0x0\",\n \"value\": \"0x4e1003b28d9280000\",\n \"v\": \"0xfe7\",\n \"r\": \"0x84caf09aefbd5e539295acc67217563438a4efb224879b6855f56857fa2037d3\",\n \"s\": \"0x5e863be3829812c81439f0ae9d8ecb832b531d651fb234c848d1bf45e62be8b9\"\n }\n}" + } + ] + }, + { + "name": "eth_getTransactionCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionCount\",\n \"params\": [\n \"0x9d8f8572f345e1ae53db1dFA4a7fce49B467bD7f\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of transactions sent from a specified address. Use the `pending` tag to get the\nnext account nonce not used by any pending transactions.\n\n#### Parameters\n\n`data` - 20-byte account address.\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *quantity* - Integer representing the number of transactions sent from the specified\naddress." + }, + "response": [ + { + "name": "eth_getTransactionCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionCount\",\n \"params\": [\n \"0x9d8f8572f345e1ae53db1dFA4a7fce49B467bD7f\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "eth_getTransactionReceipt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionReceipt\",\n \"params\": [\n \"0x96c6830efd87a70020d4d1647c93402d747c05ecf6beeb068dee621f8d13d8d1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the receipt of a transaction by transaction hash. Receipts for pending transactions are not\navailable.\n\nIf you enabled [revert reason](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Revert-Reason), the receipt includes\navailable revert reasons in the response.\n\n#### Parameters\n\n`DATA` - 32-byte hash of a transaction.\n\n#### Returns\n\n`Object` - [Transaction receipt object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-receipt-object), or `null` when\nthere is no receipt." + }, + "response": [ + { + "name": "eth_getTransactionReceipt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getTransactionReceipt\",\n \"params\": [\n \"0x96c6830efd87a70020d4d1647c93402d747c05ecf6beeb068dee621f8d13d8d1\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"blockHash\": \"0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a\",\n \"blockNumber\": \"0x50\",\n \"contractAddress\": null,\n \"cumulativeGasUsed\": \"0x5208\",\n \"from\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n \"gasUsed\": \"0x5208\",\n \"logs\": [],\n \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n \"status\": \"0x1\",\n \"to\": \"0xf17f52151ebef6c7334fad080c5704d77216b732\",\n \"transactionHash\": \"0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3\",\n \"transactionIndex\": \"0x0\"\n }\n}" + } + ] + }, + { + "name": "eth_getUncleByBlockHashAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockHashAndIndex\",\n \"params\": [\n \"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns uncle specified by block hash and index.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n`quantity` - Index of the uncle.\n\n#### Returns\n\n`result` : [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object)\n\n> **note**\n>\n> Uncles do not contain individual transactions." + }, + "response": [ + { + "name": "eth_getUncleByBlockHashAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockHashAndIndex\",\n \"params\": [\n \"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"difficulty\": \"0x76b123df93230\",\n \"extraData\": \"0x50505945206e616e6f706f6f6c2e6f7267\",\n \"gasLimit\": \"0x7a121d\",\n \"gasUsed\": \"0x7a0175\",\n \"hash\": \"0xc20189c0b1a4a23116ab3b177e929137f6e826f17fc4c2e880e7258c620e9817\",\n \"logsBloom\": \"0x890086c024487ca422be846a201a10e41bc2882902312116c1119609482031e9c000e2a708004a10281024028020c505727a12570c4810121c59024490b040894406a1c23c37a0094810921da3923600c71c03044b40924280038d07ab91964a008084264a01641380798840805a284cce201a8026045451002500113a00de441001320805ca2840037000111640d090442c11116d2112948084240242340400236ce81502063401dcc214b9105194d050884721c1208800b20501a4201400276004142f118e60808284506979a86e050820101c170c185e2310005205a82a2100382422104182090184800c02489e033440218142140045801c024cc1818485\",\n \"miner\": \"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5\",\n \"mixHash\": \"0xf557cc827e058862aa3ea1bd6088fb8766f70c0eac4117c56cf85b7911f82a14\",\n \"nonce\": \"0xd320b48904347cdd\",\n \"number\": \"0x768964\",\n \"parentHash\": \"0x98d752708b3677df8f439c4529f999b94663d5494dbfc08909656db3c90f6255\",\n \"receiptsRoot\": \"0x0f838f0ceb73368e7fc8d713a7761e5be31e3b4beafe1a6875a7f275f82da45b\",\n \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n \"size\": \"0x21a\",\n \"stateRoot\": \"0xa0c7d4fca79810c89c517eff8dadb9c6d6f4bcc27c2edfb301301e1cf7dec642\",\n \"timestamp\": \"0x5cdcbba6\",\n \"totalDifficulty\": \"0x229ad33cabd4c40d23d\",\n \"transactionsRoot\": \"0x866e38e91d01ef0387b8e07ccf35cd910224271ccf2b7477b8c8439e8b70f365\",\n \"uncles\": []\n }\n}" + } + ] + }, + { + "name": "eth_getUncleByBlockNumberAndIndex", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockNumberAndIndex\",\n \"params\": [\n \"0x7689D2\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns uncle specified by block number and index.\n\n#### Parameters\n\n`quantity|tag` - Index of the block, or one of the string tags `latest`, `earliest`, or `pending`,\nas described in [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`quantity` - Index of the uncle.\n\n#### Returns\n\n`result` : [Block object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#block-object)\n\n> **note**\n>\n> Uncles do not contain individual transactions." + }, + "response": [ + { + "name": "eth_getUncleByBlockNumberAndIndex", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleByBlockNumberAndIndex\",\n \"params\": [\n \"0x7689D2\",\n \"0x0\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"difficulty\": \"0x77daec467bf93\",\n \"extraData\": \"0x50505945206e616e6f706f6f6c2e6f7267\",\n \"gasLimit\": \"0x7a121d\",\n \"gasUsed\": \"0x7a0f7b\",\n \"hash\": \"0x42d83ae9c0743f4b1f9c61ff7ea8b164c1bab3627decd49233760680be006ecf\",\n \"logsBloom\": \"0x888200800000340120220008640200500408006100038400100581c000080240080a0014e8002010080004088040004022402a000c18010001400100002a041141a0610a0052900600041018c0002a0003090020404c00206010010513d00020005380124e08050480710000000108401012b0901c1424006000083a10a8c1040100a0440081050210124400040044304070004001100000012600806008061d0320800000b40042160600002480000000800000c0002100200940801c000820800048024904710000400640490026000a44300309000286088010c2300060003011380006400200812009144042204810209020410a84000410520c08802941\",\n \"miner\": \"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5\",\n \"mixHash\": \"0xf977fcdb52868be410b75ef2becc35cc312f13ab0a6ce400ecd9d445f66fa3f2\",\n \"nonce\": \"0x628b28403bf1e3d3\",\n \"number\": \"0x7689d0\",\n \"parentHash\": \"0xb32cfdfbf4adb05d30f02fcc6fe039cc6666402142954051c1a1cb9cc91aa11e\",\n \"receiptsRoot\": \"0x9c7c8361d1a24ea2841432234c81974a9920d3eba2b2b1c496b5f925a95cb4ac\",\n \"sha3Uncles\": \"0x7d972aa1b182b7e93f1db043f03fbdbfac6874fe7e67e162141bcc0aefa6336b\",\n \"size\": \"0x21a\",\n \"stateRoot\": \"0x74e97b77813146344d75acb5a52a006cc6dfaca678a10fb8a484a8443e919272\",\n \"timestamp\": \"0x5cdcc0a7\",\n \"totalDifficulty\": \"0x229b0583b4bd2698ca0\",\n \"transactionsRoot\": \"0x1d21626afddf05e5866de66ca3fcd98f1caf5357eba0cc6ec675606e116a891b\",\n \"uncles\": []\n }\n}" + } + ] + }, + { + "name": "eth_getUncleCountByBlockHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of uncles in a block from a block matching the given block hash.\n\n#### Parameters\n\n`DATA` - 32-byte block hash.\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of uncles in the specified block." + }, + "response": [ + { + "name": "eth_getUncleCountByBlockHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockHash\",\n \"params\": [\n \"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x0\"\n}" + } + ] + }, + { + "name": "eth_getUncleCountByBlockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockNumber\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of uncles in a block matching the specified block number.\n\n#### Parameters\n\n`QUANTITY|TAG` - Integer representing either the index of the block within the blockchain, or one\nof the string tags `latest`, `earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : *QUANTITY* - Integer representing the number of uncles in the specified block." + }, + "response": [ + { + "name": "eth_getUncleCountByBlockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getUncleCountByBlockNumber\",\n \"params\": [\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "eth_getWork", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getWork\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the hash of the current block, the seed hash, and the required target boundary condition.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : Array with the following fields:\n\n* `DATA`, 32 Bytes - Hash of the current block header (pow-hash).\n* `DATA`, 32 Bytes - The seed hash used for the DAG.\n* `DATA`, 32 Bytes - The required target boundary condition: 2^256 / difficulty.\n* `QUANTITY` - Hexadecimal integer representing the current block number." + }, + "response": [ + { + "name": "eth_getWork", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getWork\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0xce5e32ca59cb86799a1879e90150b2c3b882852173e59865e9e79abb67a9d636\",\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n \"0x00a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3\",\n \"0x42\"\n ]\n}" + } + ] + }, + { + "name": "eth_hashrate", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_hashrate\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of hashes per second with which the node is mining.\n\nWhen the stratum server is enabled, this method returns the cumulative hashrate of all sealers\nreporting their hashrate.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `quantity` - Number of hashes per second.\n" + }, + "response": [ + { + "name": "eth_hashrate", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_hashrate\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x12b\"\n}" + } + ] + }, + { + "name": "eth_mining", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_mining\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Whether the client is actively mining new blocks. Besu pauses mining while the client synchronizes\nwith the network regardless of command settings or methods called.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` (*BOOLEAN*) - `true` if the client is actively mining new blocks, otherwise `false`." + }, + "response": [ + { + "name": "eth_mining", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_mining\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": true\n}" + } + ] + }, + { + "name": "eth_newBlockFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newBlockFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a filter to retrieve new block hashes. To poll for new blocks, use\n[`eth_getFilterChanges`](#eth_getfilterchanges).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`data` - Filter ID." + }, + "response": [ + { + "name": "eth_newBlockFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newBlockFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x9d78b6780f844228b96ecc65a320a825\"\n}" + } + ] + }, + { + "name": "eth_newFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newFilter\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a [log filter](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs). To poll for logs associated with the\ncreated filter, use [`eth_getFilterChanges`](#eth_getfilterchanges). To get all logs associated with\nthe filter, use [`eth_getFilterLogs`](#eth_getfilterlogs).\n\n#### Parameters\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n> **note**\n>\n> `fromBlock` and `toBlock` in the filter options object default to `latest`.\n\n#### Returns\n\n`data` - Filter ID." + }, + "response": [ + { + "name": "eth_newFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newFilter\",\n \"params\": [\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"topics\": []\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1ddf0c00989044e9b41cc0ae40272df3\"\n}" + } + ] + }, + { + "name": "eth_newPendingTransactionFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newPendingTransactionFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a filter to retrieve new pending transactions hashes. To poll for new pending transactions,\nuse [`eth_getFilterChanges`](#eth_getfilterchanges).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`data` - Filter ID." + }, + "response": [ + { + "name": "eth_newPendingTransactionFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_newPendingTransactionFilter\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x443d6a77c4964707a8554c92f7e4debd\"\n}" + } + ] + }, + { + "name": "eth_protocolVersion", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_protocolVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns current Ethereum protocol version.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *quantity* - Ethereum protocol version." + }, + "response": [ + { + "name": "eth_protocolVersion", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_protocolVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x3f\"\n}" + } + ] + }, + { + "name": "eth_sendRawTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_sendRawTransaction\",\n \"params\": [\n \"0xf86a018203e882520894f17f52151ebef6c7334fad080c5704d77216b732896c6b935b8bbd400000801ba093129415f03b4794fd1512e79ee7f097e4271f66721020f8407aac92179893a5a0451b875d89721ec98be55201092980b0a87bb1c48507fccb86da713596b2a09e\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Sends a [signed transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Transactions).\nA transaction can send ether, deploy a contract, or interact with a contract.\nSet the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-tx-feecap) CLI option.\n\nYou can interact with contracts using [`eth_sendRawTransaction` or `eth_call`].\n\nTo avoid exposing your private key, create signed transactions offline and send the signed\ntransaction data using `eth_sendRawTransaction`.\n\n> **important**\n>\n> Besu does not implement [`eth_sendTransaction`](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Account-Management).\n>\n> [EthSigner](https://docs.ethsigner.consensys.net/) provides transaction signing and implements\n> [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction).\n\n#### Parameters\n\n`data` - Signed transaction serialized to hexadecimal format. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n> **note**\n>\n> [Creating and Sending Transactions](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Transactions) includes examples of creating signed transactions using the [web3.js](https://github.com/ethereum/web3.js/) library.\n\n#### Returns\n\n`result` : `data` - 32-byte transaction hash." + }, + "response": [ + { + "name": "eth_sendRawTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendRawTransaction\",\"params\" :[\"0xf85f808203e8832dc6c08080914f785b6f626a656374204f626a6563745d1ba004193142058b4fe6802677a939e76f93e7fa30e91835a911e206f9855330929ca055ce11a262c804a168c8a801e55a68b3d578a4b52b9dfbed98c4aa47f88a0adf\"], \"id\":1}" + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Length", + "value": "118", + "name": "Content-Length", + "description": "The length of the response body in octets (8-bit bytes)" + }, + { + "key": "Content-Type", + "value": "application/json", + "name": "Content-Type", + "description": "The mime type of this content" + } + ], + "cookie": [], + "body": "{\n \"jsonrpc\" : \"2.0\",\n \"id\" : 1,\n \"result\" : \"0xac182cc23bb94696217aa17ca15bd466106af9ba7ea7420aae24ff37338d6e3b\"\n}" + } + ] + }, + { + "name": "eth_submitHashrate", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitHashrate\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000500000\",\n \"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Submits the mining hashrate.\n\nUsed by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer).\n\n#### Parameters\n\n* DATA, 32 Bytes - Hexadecimal string representation of the hash rate.\n* DATA, 32 Bytes - Random hexadecimal ID identifying the client.\n\n#### Returns\n\n`result: Boolean`, `true` if submission is successful, otherwise `false`." + }, + "response": [ + { + "name": "eth_submitHashrate", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitHashrate\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000500000\",\n \"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "eth_submitWork", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitWork\",\n \"params\": [\n \"0x0000000000000001\",\n \"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n \"0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Submits a Proof of Work (Ethash) solution.\n\nUsed by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer).\n\n#### Parameters\n\n* DATA, 8 Bytes - Retrieved nonce.\n* DATA, 32 Bytes - Hash of the block header (PoW-hash).\n* DATA, 32 Bytes - Mix digest.\n\n#### Returns\n\n`result: Boolean`, `true` if the provided solution is valid, otherwise `false`." + }, + "response": [ + { + "name": "eth_submitHashrate", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_submitHashrate\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000500000\",\n \"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"result\": true\n}" + } + ] + }, + { + "name": "eth_syncing", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_syncing\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an object with data about the synchronization status, or `false` if not synchronizing.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *Object|Boolean* - Object with synchronization status data or `false` if not\nsynchronizing:\n\n* `startingBlock` : *quantity* - Index of the highest block on the blockchain when the network\n synchronization starts.\n* `currentBlock` : *quantity* - Index of the latest block (also known as the best block) for the\n current node. This is the same index that [`eth_blockNumber`](#eth_blocknumber) returns.\n* `highestBlock`: *quantity* - Index of the highest known block in the peer network (that is, the\n highest block so far discovered among peer nodes). This is the same value as `currentBlock` if\n the current node has no peers.\n* `pulledStates`: *quantity* - If fast synchronizing, the number of state entries fetched so far,\n or `null` if this is not known or not relevant. If full synchronizing or fully synchronized, this\n field is not returned.\n* `knownStates`: *quantity* - If fast synchronizing, the number of states the node knows of so\n far, or `null` if this is not known or not relevant. If full synchronizing or fully synchronized,\n this field is not returned." + }, + "response": [ + { + "name": "eth_syncing", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_syncing\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 51,\n \"result\": {\n \"startingBlock\": \"0x0\",\n \"currentBlock\": \"0x1518\",\n \"highestBlock\": \"0x9567a3\",\n \"pulledStates\": \"0x203ca\",\n \"knownStates\": \"0x200636\"\n }\n}" + } + ] + }, + { + "name": "eth_uninstallFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_uninstallFilter\",\n \"params\": [\n \"0x70355a0b574b437eaa19fe95adfedc0a\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Uninstalls a filter with the specified ID. When a filter is no longer required, call this method.\n\nFilters time out when not requested by [`eth_getFilterChanges`](#eth_getfilterchanges) or [`eth_getFilterLogs`](#eth_getfilterlogs) for 10\nminutes.\n\n#### Parameters\n\n`data` - Filter ID.\n\n#### Returns\n\n`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`." + }, + "response": [ + { + "name": "eth_uninstallFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_uninstallFilter\",\n \"params\": [\n \"0x70355a0b574b437eaa19fe95adfedc0a\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> Methods with an equivalent [GraphQL](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/GraphQL) query include a GraphQL\n request and result in the method example. The parameter and result descriptions apply to the\n JSON-RPC requests. The GraphQL specification is defined in the [schema](https://github.com/hyperledger/besu/blob/master/ethereum/api/src/main/resources/schema.graphqls)." + }, + { + "name": "IBFT", + "item": [ + { + "name": "ibft_discardValidatorVote", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_discardValidatorVote\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Discards a proposal to [add or remove a validator] with the specified address.\n\n#### Parameters\n\n`data` - 20-byte address of proposed validator.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "ibft_discardValidatorVote", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_discardValidatorVote\",\n \"params\": [\n \"0x42eb768f2244c8811c63729a21a3569731535f06\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "ibft_getPendingVotes", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getPendingVotes\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns [votes](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT#adding-and-removing-validators)\ncast in the current [epoch](https://besu.hyperledger.org/en/stable/HowTo/Configure/Consensus-Protocols/IBFT#genesis-file).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result`: `object` - Map of account addresses to corresponding boolean values indicating the vote\nfor each account.\n\nIf the boolean value is `true`, the vote is to add a validator. If `false`, the proposal is to\nremove a validator." + }, + "response": [ + { + "name": "ibft_getPendingVotes", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getPendingVotes\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"0xef1bfb6a12794615c9b0b5a21e6741f01e570185\": true,\n \"0x42d4287eac8078828cf5f3486cfe601a275a49a5\": true\n }\n}" + } + ] + }, + { + "name": "ibft_getSignerMetrics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides validator metrics for the specified range:\n\n* Number of blocks from each validator.\n* Block number of the last block proposed by each validator (if any proposed in the specified\n range).\n* All validators present in the last block of the range.\n\n#### Parameters\n\n`fromBlockNumber` - Integer representing a block number or the string tag `earliest` as described\nin [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`toBlockNumber` - Integer representing a block number or one of the string tags `latest` or\n`pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter)\n\nIf you specify:\n\n* No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less\n than 100 blocks.\n* Only the first parameter, the call provides metrics for all blocks from the block specified to\n the latest block.\n\n#### Returns\n\n`result`: _object_ - List of validator objects\n\n> **Note**\n>\n> The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`." + }, + "response": [ + { + "name": "ibft_getSignerMetrics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getSignerMetrics\",\n \"params\": [\n \"1\",\n \"100\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"address\": \"0x7ffc57839b00206d1ad20c69a1981b489f772031\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x61\"\n },\n {\n \"address\": \"0x42eb768f2244c8811c63729a21a3569731535f06\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x63\"\n },\n {\n \"address\": \"0xb279182d99e65703f0076e4812653aab85fca0f0\",\n \"proposedBlockCount\": \"0x21\",\n \"lastProposedBlockNumber\": \"0x62\"\n }\n ]\n}" + } + ] + }, + { + "name": "ibft_getValidatorsByBlockHash", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists the validators defined in the specified block.\n\n#### Parameters\n\n`data` - 32-byte block hash.\n\n#### Returns\n\n`result: array of data` - List of validator addresses." + }, + "response": [ + { + "name": "ibft_getValidatorsByBlockHash", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockHash\",\n \"params\": [\n \"0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42d4287eac8078828cf5f3486cfe601a275a49a5\",\n \"0xb1b2bc9582d2901afdc579f528a35ca41403fa85\",\n \"0xef1bfb6a12794615c9b0b5a21e6741f01e570185\"\n ]\n}" + } + ] + }, + { + "name": "ibft_getValidatorsByBlockNumber", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockNumber\",\n \"params\": [\n \"0x09\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists the validators defined in the specified block.\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result: array of data` - List of validator addresses." + }, + "response": [ + { + "name": "ibft_getValidatorsByBlockNumber", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_getValidatorsByBlockNumber\",\n \"params\": [\n \"0x09\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x42d4287eac8078828cf5f3486cfe601a275a49a5\",\n \"0xb1b2bc9582d2901afdc579f528a35ca41403fa85\",\n \"0xef1bfb6a12794615c9b0b5a21e6741f01e570185\"\n ]\n}" + } + ] + }, + { + "name": "ibft_proposeValidatorVote", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_proposeValidatorVote\",\n \"params\": [\n \"42d4287eac8078828cf5f3486cfe601a275a49a5\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Propose to [add or remove a validator] with the specified address.\n\n#### Parameters\n\n`data` - Account address\n\n`boolean` - `true` to propose adding validator or `false` to propose removing validator.\n\n#### Returns\n\n`result: boolean` - `true`" + }, + "response": [ + { + "name": "ibft_proposeValidatorVote", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ibft_proposeValidatorVote\",\n \"params\": [\n \"42d4287eac8078828cf5f3486cfe601a275a49a5\",\n true\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `IBFT` API methods are not enabled by default for JSON-RPC. To enable the `IBFT` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "MINER", + "item": [ + { + "name": "miner_start", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_start\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Starts the mining process. To start mining, you must first specify a miner coinbase using the\n[`--miner-coinbase`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#miner-coinbase) command line option.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `boolean` - `true` if mining starts, or if the node was already mining." + }, + "response": [ + { + "name": "miner_start", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_start\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + }, + { + "name": "miner_stop", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_stop\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Stops the mining process on the client.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `boolean` - `true` if mining stops, or if the node was not mining.\n" + }, + "response": [ + { + "name": "miner_stop", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"miner_stop\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `MINER` API methods are not enabled by default for JSON-RPC. To enable the `MINER` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "Miscellaneous", + "item": [ + { + "name": "rpc_modules", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"rpc_modules\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists [enabled APIs](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#api-methods-enabled-by-default)\nand the version of each.\n\n#### Parameters\n\nNone\n\n#### Returns\n\nEnabled APIs." + }, + "response": [ + { + "name": "rpc_modules", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"rpc_modules\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"web3\": \"1.0\",\n \"eth\": \"1.0\",\n \"net\": \"1.0\"\n }\n}" + } + ] + } + ] + }, + { + "name": "NET", + "item": [ + { + "name": "net_version", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_version\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the [network ID](https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - Current network ID.\n\n| Network ID | Chain | Network | Description\n|------------|-------|---------|-------------------------------|\n| `1` | ETH | Mainnet | Main Ethereum network |\n| `3` | ETH | Ropsten | PoW test network |\n| `4` | ETH | Rinkeby | PoA test network using Clique |\n| `5` | ETH | Goerli | PoA test network using Clique |\n| `2018` | ETH | Dev | PoW development network |\n| `1` | ETC | Classic | Main Ethereum Classic network |\n| `6` | ETC | Kotti | PoA test network using Clique |\n| `7` | ETC | Mordor | PoW test network |\n\n> **note**\n>\n> For almost all networks network ID and chain ID are the same.\nThe only networks in the table above with different network and chain IDs are\nClassic with a chain ID of `61` and Mordor with a chain ID of `63`." + }, + "response": [ + { + "name": "net_version", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_version\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"3\"\n}" + } + ] + }, + { + "name": "net_listening", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_listening\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Whether the client is actively listening for network connections.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` (*BOOLEAN*) - `true` if the client is actively listening for network connections;\notherwise `false`." + }, + "response": [ + { + "name": "net_listening", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_listening\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": true\n}" + } + ] + }, + { + "name": "net_peerCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_peerCount\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the number of peers currently connected to the client.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *integer* - Number of connected peers in hexadecimal." + }, + "response": [ + { + "name": "net_peerCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_peerCount\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://127.0.0.1:8545", + "protocol": "http", + "host": ["127", "0", "0", "1"], + "port": "8545" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x5\"\n}" + } + ] + }, + { + "name": "net_enode", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_enode\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the [enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - [Enode URL](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of the node." + }, + "response": [ + { + "name": "net_enode", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_enode\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"enode://6a63160d0ccef5e4986d270937c6c8d60a9a4d3b25471cda960900d037c61988ea14da67f69dbfb3497c465d0de1f001bb95598f74b68a39a5156a608c42fa1b@127.0.0.1:30303\"\n}" + } + ] + }, + { + "name": "net_services", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_services\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns enabled services (for example, `jsonrpc`) and the host and port for each service.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *objects* - Enabled services." + }, + "response": [ + { + "name": "net_services", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"net_services\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"jsonrpc\": {\n \"host\": \"127.0.0.1\",\n \"port\": \"8545\"\n },\n \"p2p\": {\n \"host\": \"127.0.0.1\",\n \"port\": \"30303\"\n },\n \"metrics\": {\n \"host\": \"127.0.0.1\",\n \"port\": \"9545\"\n }\n }\n}" + } + ] + } + ] + }, + { + "name": "PERM (permissioning)", + "item": [ + { + "name": "perm_addAccountsToAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addAccountsToAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Adds accounts (participants) to the\n[accounts permission list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\n`list of strings` - List of account addresses.\n\n> **Note**\n>\n> The parameters list contains a list which is why the account addresses are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to add accounts already on the\nallowlist or including invalid account addresses.\n" + }, + "response": [ + { + "name": "perm_addAccountsToAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addAccountsToAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_addNodesToAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addNodesToAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Adds nodes to the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\n`list of strings` - List of [enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url).\n\n> **Note**\n>\n> The parameters list contains a list which is why the enode URLs are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to add nodes already on the allowlist or\nincluding invalid enode URLs." + }, + "response": [ + { + "name": "perm_addNodesToAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_addNodesToAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_getAccountsAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getAccountsAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists accounts (participants) in the\n[accounts permissions list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result: list` - Accounts (participants) in the accounts allowlist." + }, + "response": [ + { + "name": "perm_getAccountsAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getAccountsAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"0x0000000000000000000000000000000000000009\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462033\"\n ]\n}" + } + ] + }, + { + "name": "perm_getNodesAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getNodesAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists nodes in the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result: list` - [Enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url) of nodes in the nodes allowlist." + }, + "response": [ + { + "name": "perm_getNodesAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_getNodesAllowlist\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n \"enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n}" + } + ] + }, + { + "name": "perm_reloadPermissionsFromFile", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_reloadPermissionsFromFile\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Reloads the accounts and nodes allowlists from the [permissions configuration file].\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - `Success`, or `error` if the permissions configuration file is not valid." + }, + "response": [ + { + "name": "perm_reloadPermissionsFromFile", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_reloadPermissionsFromFile\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_removeAccountsFromAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeAccountsFromAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Removes accounts (participants) from the\n[accounts permissions list](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#account-permissioning).\n\n#### Parameters\n\n`list of strings` - List of account addresses.\n\n> **Note**\n>\n> The parameters list contains a list which is why the account addresses are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to remove accounts not on the allowlist\nor including invalid account addresses." + }, + "response": [ + { + "name": "perm_removeAccountsFromAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeAccountsFromAllowlist\",\n \"params\": [\n [\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462032\",\n \"0xb9b81ee349c3807e46bc71aa2632203c5b462034\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + }, + { + "name": "perm_removeNodesFromAllowlist", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeNodesFromAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Removes nodes from the\n[nodes allowlist](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning#node-allowlisting).\n\n#### Parameters\n\n`list of strings` - List of [enode URLs](https://besu.hyperledger.org/en/stable/Concepts/Node-Keys#enode-url)\n\n> **Note**\n>\n> The parameters list contains a list which is why the enode URLs are enclosed by double square brackets.\n\n#### Returns\n\n`result` - `Success` or `error`. Errors include attempting to remove nodes not on the allowlist\nor including invalid enode URLs." + }, + "response": [ + { + "name": "perm_removeNodesFromAllowlist", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"perm_removeNodesFromAllowlist\",\n \"params\": [\n [\n \"enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303\",\n \"enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + } + ], + "description": "Use the permissioning API methods for [local](https://besu.hyperledger.org/en/stable/HowTo/Limit-Access/Local-Permissioning)\npermissioning only.\n\n> **Note**\n>\n>The `PERM` API methods are not enabled by default for JSON-RPC. To enable the `PERM` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) CLI options." + }, + { + "name": "PLUGINS", + "item": [ + { + "name": "plugins_reloadPluginConfig", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"plugins_reloadPluginConfig\",\n \"params\": [\n \"tech.pegasys.plus.plugin.kafka.KafkaPlugin\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": null, + "description": "Reloads specified plugin configuration.\n\n#### Parameters\n\n`string` - Plugin\n\n#### Returns\n\n`string` - `Success`" + }, + "response": [ + { + "name": "plugins_reloadPluginConfig", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"plugins_reloadPluginConfig\",\n \"params\": [\n \"tech.pegasys.plus.plugin.kafka.KafkaPlugin\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": null + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"Success\"\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `PLUGINS` API methods are not enabled by default for JSON-RPC. To enable the `PLUGINS` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "PRIV", + "item": [ + { + "name": "priv_call", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_call\",\n \"params\": [\n \"tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=\",\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"data\": \"0x3fa4f245\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "response": [ + { + "name": "priv_call", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_call\",\n \"params\": [\n \"tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=\",\n {\n \"to\": \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\",\n \"data\": \"0x3fa4f245\"\n },\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n}" + } + ] + }, + { + "name": "priv_createPrivacyGroup", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_createPrivacyGroup\",\n \"params\": [\n {\n \"addresses\": [\n \"sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=\",\n \"quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=\"\n ],\n \"name\": \"Group A\",\n \"description\": \"Description Group A\"\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a group of nodes, specified by their [Tessera](https://docs.tessera.consensys.net/) public key.\n\n#### Parameters\n\n`Object` - Request options:\n\n* `addresses`: `array of data` - Array of nodes, specified by\n [Tessera](https://docs.tessera.consensys.net/) public keys.\n* `name`: `string` - Privacy group name. Optional.\n* `description`: `string` - Privacy group description. Optional.\n\n#### Returns\n\nPrivacy group ID" + }, + "response": [ + { + "name": "priv_createPrivacyGroup", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_createPrivacyGroup\",\n \"params\": [\n {\n \"addresses\": [\n \"sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=\",\n \"quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=\"\n ],\n \"name\": \"Group A\",\n \"description\": \"Description Group A\"\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n}" + } + ] + }, + { + "name": "priv_deletePrivacyGroup", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_deletePrivacyGroup\",\n \"params\": [\n \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Deletes the specified privacy group.\n\n#### Parameters\n\n`data` - Privacy group ID\n\n#### Returns\n\nPrivacy group ID that was deleted." + }, + "response": [ + { + "name": "priv_deletePrivacyGroup", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_deletePrivacyGroup\",\n \"params\": [\n \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=\"\n}" + } + ] + }, + { + "name": "priv_distributeRawTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_distributeRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Distributes a signed, RLP encoded\n[private transaction](https://besu.hyperledger.org/en/stable/HowTo/Send-Transactions/Creating-Sending-Private-Transactions).\n\n> **tip**\n\n If you want to sign the Privacy Marker Transaction outside of Besu,\n use [`priv_distributeRawTransaction`](https://besu.hyperledger.org/en/stable//HowTo/Send-Transactions/Creating-Sending-Private-Transactions#priv_distributerawtransaction)\n instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction).\n\n#### Parameters\n\n`data` - Signed RLP-encoded private transaction. For example:\n\n`params: [\"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"]`\n\n#### Returns\n\n`result` : `data` - 32-byte enclave key. The enclave key is a pointer to the private transaction in\n[Tessera](https://docs.tessera.consensys.net/)." + }, + "response": [ + { + "name": "priv_distributeRawTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_distributeRawTransaction\",\n \"params\": [\n \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b\"\n}" + } + ] + }, + { + "name": "priv_findPrivacyGroup", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_findPrivacyGroup\",\n \"params\": [\n [\n \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a list of privacy groups containing only the listed members. For example, if the listed\nmembers are A and B, a privacy group containing A, B, and C is not returned.\n\n#### Parameters\n\n`array of data` - Members specified by [Tessera](https://docs.tessera.consensys.net/) public keys.\n\n#### Returns\n\nPrivacy groups containing only the specified members. Privacy groups are\n[EEA-compliant](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups#enterprise-ethereum-alliance-privacy)\nor [Besu-extended](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups#besu-extended-privacy) with types:\n\n* `LEGACY` for EEA-compliant groups.\n* `PANTHEON` for Besu-extended groups." + }, + "response": [ + { + "name": "priv_findPrivacyGroup", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_findPrivacyGroup\",\n \"params\": [\n [\n \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"privacyGroupId\": \"GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=\",\n \"name\": \"Group B\",\n \"description\": \"Description of Group B\",\n \"type\": \"PANTHEON\",\n \"members\": [\n \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getCode", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getCode\",\n \"params\": [\n \"1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=\",\n \"0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the code of the private smart contract at the specified address. Compiled smart contract code\nis stored as a hexadecimal value.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - 20-byte contract address.\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`, `earliest`,\nor `pending`, as described in [Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` : `data` - Code stored at the specified address." + }, + "response": [ + { + "name": "priv_getCode", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getCode\",\n \"params\": [\n \"1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=\",\n \"0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201\",\n \"latest\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029\"\n}" + } + ] + }, + { + "name": "priv_getEeaTransactionCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getEeaTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=\",\n [\n \"KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=\",\n \"eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the private transaction count for the specified account and\n[group of sender and recipients].\n\n> **Important**\n\n> If sending more than one transaction to be mined in the same block (that is, you are not\n> waiting for the transaction receipt), you must calculate the private transaction nonce outside\n> Besu instead of using `priv_getEeaTransactionCount`.\n\n#### Parameters\n\n`data` - Account address.\n\n`data` - Base64 encoded Tessera address of the sender.\n\n`array of data` - Base64 encoded Tessera addresses of recipients.\n\n#### Returns\n\n`quantity` - Integer representing the number of private transactions sent from the address to the\nspecified group of sender and recipients.\n" + }, + "response": [ + { + "name": "priv_getEeaTransactionCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getEeaTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=\",\n [\n \"KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=\",\n \"eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg=\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "priv_getFilterChanges", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterChanges\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Polls the specified filter for a private contract and returns an array of changes that have occurred\nsince the last poll.\n\nFilters for private contracts can only be created by [`priv_newFilter`](#priv_newfilter) so unlike\n[`eth_getFilterChanges`](#eth_getfilterchanges), `priv_getFilterChanges` always returns an array\nof log objects or an empty list.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object). If nothing has changed since the last poll, an\nempty list." + }, + "response": [ + { + "name": "priv_getFilterChanges", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterChanges\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x4d0\",\n \"blockHash\": \"0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb\",\n \"transactionHash\": \"0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x991cc548c154b2953cc48c02f782e1314097dfbb\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000002\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getFilterLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterLogs\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for the specified filter for a private\ncontract.\n\nFor private contracts, `priv_getFilterLogs` is the same as [`eth_getFilterLogs`](#eth_getfilterlogs)\nfor public contracts except there is no [automatic log bloom caching](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\nfor private contracts.\n\n> **Note**\n>\n> `priv_getFilterLogs` is only used for filters created with [`priv_newFilter`](#priv_newfilter).\n> To specify a filter object and get logs without creating a filter, use [`priv_getLogs`](#priv_getlogs).\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "priv_getFilterLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getFilterLogs\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x493\",\n \"blockHash\": \"0xd9cb3a852e1e02c95f035a2e32d57f82c10cab61faa3e8f5c010adf979bb4786\",\n \"transactionHash\": \"0x78866dc51fdf189d8cca74f6a8fe54f172348fbd2163bbe80fa8b106cfc7deb4\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x991cc548c154b2953cc48c02f782e1314097dfbb\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x4d0\",\n \"blockHash\": \"0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb\",\n \"transactionHash\": \"0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x991cc548c154b2953cc48c02f782e1314097dfbb\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000002\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getLogs", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getLogs\",\n \"params\": [\n \"vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x630c507ff633312087dc33c513b66276abcd2fc3\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns an array of [logs](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) matching a specified filter object.\n\nFor private contracts, `priv_getLogs` is the same as [`eth_getLogs`](#eth_getlogs) for public contracts\nexcept there is no [automatic log bloom caching](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#auto-log-bloom-caching-enabled)\nfor private contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n#### Returns\n\n`array` - [Log objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#log-object)." + }, + "response": [ + { + "name": "priv_getLogs", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getLogs\",\n \"params\": [\n \"vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x630c507ff633312087dc33c513b66276abcd2fc3\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x342\",\n \"blockHash\": \"0xf5954f068fa2f2f7741281e8c753a8e92047e27ab3c4971836d2c89fab86d92b\",\n \"transactionHash\": \"0xa9ba5cffde9d4ad8997c5c4352d5d49eeea0e9def8a4ea69991b8837c49d4e4f\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x630c507ff633312087dc33c513b66276abcd2fc3\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n ]\n },\n {\n \"logIndex\": \"0x0\",\n \"removed\": false,\n \"blockNumber\": \"0x383\",\n \"blockHash\": \"0x91b73a47d53e3a88d62ed091a89a4be7557ad91b552e7ff7d86bf78977d5d45d\",\n \"transactionHash\": \"0xc2a185faf00e87434e55b7f70cc4c38be354c2128b4b96b5f5def0b54a2173ec\",\n \"transactionIndex\": \"0x0\",\n \"address\": \"0x630c507ff633312087dc33c513b66276abcd2fc3\",\n \"data\": \"0x\",\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\",\n \"0x0000000000000000000000000000000000000000000000000000000000000002\"\n ]\n }\n ]\n}" + } + ] + }, + { + "name": "priv_getPrivacyPrecompileAddress", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivacyPrecompileAddress\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the address of the\n[privacy precompiled contract](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Private-Transaction-Processing). The address\nis derived and based on the value of the [`privacy-onchain-groups-enabled`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#privacy-onchain-groups-enabled)\noption.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : `data` - Address of the privacy precompile." + }, + "response": [ + { + "name": "priv_getPrivacyPrecompileAddress", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivacyPrecompileAddress\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x000000000000000000000000000000000000007e\"\n}" + } + ] + }, + { + "name": "priv_getPrivateTransaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivateTransaction\",\n \"params\": [\n \"0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the private transaction if you are a participant, otherwise, `null`.\n\n#### Parameters\n\n`data` - Transaction hash returned by [`eea_sendRawTransaction`](#eea_sendrawtransaction) or\n[`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction).\n\n#### Returns\n\nObject - [Private transaction object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#private-transaction-object), or `null` if not\na participant in the private transaction." + }, + "response": [ + { + "name": "priv_getPrivateTransaction", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getPrivateTransaction\",\n \"params\": [\n \"0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\": \"0x2dc6c0\",\n \"gasPrice\": \"0x0\",\n \"hash\": \"0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498\",\n \"input\": \"0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610221806100606000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f2451461005c5780636057361d1461008757806367e404ce146100b4575b600080fd5b34801561006857600080fd5b5061007161010b565b6040518082815260200191505060405180910390f35b34801561009357600080fd5b506100b260048036038101908080359060200190929190505050610115565b005b3480156100c057600080fd5b506100c96101cb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600254905090565b7fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f53382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18060028190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050905600a165627a7a723058208efaf938851fb2d235f8bf9a9685f149129a30fe0f4b20a6c1885dc02f639eba0029\",\n \"nonce\": \"0x0\",\n \"to\": null,\n \"value\": \"0x0\",\n \"v\": \"0xfe8\",\n \"r\": \"0x654a6a9663ca70bb13e27cca14b3777cc92da184e19a151cdeef2ccbbd5c6405\",\n \"s\": \"0x5dd4667b020c8a5af7ae28d4c3126f8dcb1187f49dcf0de9d7a39b1651892eef\",\n \"privateFrom\": \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"privateFor\": [\n \"g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=\"\n ],\n \"restriction\": \"restricted\"\n }\n}" + } + ] + }, + { + "name": "priv_getTransactionCount", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the private transaction count for specified account and privacy group.\n\n> **important**\n\n> If sending more than one transaction to be mined in the same block (that is, you are not waiting for the transaction receipt), you must calculate the private transaction nonce outside Besu instead of using `priv_getTransactionCount`.\n\n#### Parameters\n\n`data` - Account address.\n\n`data` - Privacy group ID.\n\n#### Returns\n\n`quantity` - Integer representing the number of private transactions sent from the address to the\nspecified privacy group." + }, + "response": [ + { + "name": "priv_getTransactionCount", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionCount\",\n \"params\": [\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x1\"\n}" + } + ] + }, + { + "name": "priv_getTransactionReceipt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionReceipt\",\n \"params\": [\n \"0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns information about the private transaction after mining the transaction. Receipts for\npending transactions are not available.\n\n#### Parameters\n\n`data` - 32-byte hash of a transaction.\n\n#### Returns\n\n`Object` - [Private Transaction receipt object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#private-transaction-receipt-object),\nor `null` if no receipt found." + }, + "response": [ + { + "name": "priv_getTransactionReceipt", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_getTransactionReceipt\",\n \"params\": [\n \"0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"contractAddress\": \"0x493b76031593402e24e16faa81f677b58e2d53f3\",\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"output\": \"0x6080604052600436106049576000357c010000000000000000000000000000000000000000000\\n 0000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b3480156059\\n 57600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b\\n 50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b8060008190555050560\\n 0a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029\",\n \"commitmentHash\": \"0x79b9e6b0856db398ad7dc208f15b1d38c0c0b0c5f99e4a443a2c5a85510e96a5\",\n \"transactionHash\": \"0x36219e92b5f53d4150aa9ef7d2d793118cced523de6724100da5b534e3ceb4b8\",\n \"privateFrom\": \"negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=\",\n \"privacyGroupId\": \"cD636RZlcqVSpoxT/ExbkWQfBO7kPAZO0QlWHErNSL8=\",\n \"status\": \"0x1\",\n \"logs\": []\n }\n}" + } + ] + }, + { + "name": "priv_newFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_newFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x991cc548c154b2953cc48c02f782e1314097dfbb\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Creates a [log filter](https://besu.hyperledger.org/en/stable/Concepts/Events-and-Logs) for a private contract. To poll for logs associated with the\ncreated filter, use [`priv_getFilterChanges`](#priv_getfilterchanges). To get all logs associated with\nthe filter, use [`priv_getFilterLogs`](#priv_getfilterlogs).\n\nFor private contracts, `priv_newFilter` is the same as [`eth_newFilter`](#eth_newfilter)\nfor public contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`Object` - [Filter options object](https://besu.hyperledger.org/en/stable/Reference/API-Objects#filter-options-object).\n\n> **Note**\n>\n> `fromBlock` and `toBlock` in the filter options object default to `latest`." + }, + "response": [ + { + "name": "priv_newFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_newFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n {\n \"fromBlock\": \"earliest\",\n \"toBlock\": \"latest\",\n \"addresses\": [\n \"0x991cc548c154b2953cc48c02f782e1314097dfbb\"\n ],\n \"topics\": [\n \"0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410\"\n ]\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": \"0x4a35b92809d73f4f53a2355d62125442\"\n}" + } + ] + }, + { + "name": "priv_uninstallFilter", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_uninstallFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Uninstalls a filter for a private contract with the specified ID. When a filter is no longer required,\ncall this method.\n\nFilters time out when not requested by [`priv_getFilterChanges`](#priv_getfilterchanges) or [`priv_getFilterLogs`](#priv_getfilterlogs) for 10\nminutes.\n\nFor private contracts, `priv_uninstallFilter` is the same as [`eth_uninstallFilter`](#eth_uninstallfilter)\nfor public contracts.\n\n#### Parameters\n\n`data` - 32-byte [privacy Group ID](https://besu.hyperledger.org/en/stable/Concepts/Privacy/Privacy-Groups).\n\n`data` - Filter ID.\n\n#### Returns\n\n`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`." + }, + "response": [ + { + "name": "priv_uninstallFilter", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"priv_uninstallFilter\",\n \"params\": [\n \"4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=\",\n \"0x4a35b92809d73f4f53a2355d62125442\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": true\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `PRIV` API methods are not enabled by default for JSON-RPC. To enable the `PRIV` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "TRACE", + "item": [ + { + "name": "trace_replayBlockTransactions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"trace_replayBlockTransactions\",\n \"params\": [\n \"0x12\",\n [\n \"trace\",\n \"vmTrace\",\n \"stateDiff\"\n ]\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides transaction processing tracing per block.\n\n> **important**\n\n Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n requested block must be within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained)\n (by default, 1024).\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n`array of strings` - Tracing options are\n[`trace`, `vmTrace`, and `stateDiff`](Trace-Types). Specify any\ncombination of the three options including none of them.\n\n#### Returns\n\n`result` - Array of [transaction trace objects](https://besu.hyperledger.org/en/stable/Reference/API-Objects#transaction-trace-object) containing\none object per transaction, in transaction execution order." + }, + "response": [ + { + "name": "trace_replayBlockTransactions", + "originalRequest": { + "method": "POST", + "header": [], + "url": null + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\":[\n {\n \"output\":\"0x\",\n \"vmTrace\":{\n \"code\":\"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851\",\n \"ops\":[\n {\n \"cost\":3,\n \"ex\":{\n \"mem\":null,\n \"push\":[\n \"0x8\"\n ],\n \"store\":null,\n \"used\":16756175\n },\n \"pc\":72,\n \"sub\":null\n },\n {\"other properties...\":\"values...\"}\n ]\n },\n \"trace\":[\n {\n \"action\":{\n \"callType\":\"call\",\n \"from\":\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\":\"0xffadea\",\n \"input\":\"0x\",\n \"to\":\"0x0100000000000000000000000000000000000000\",\n \"value\":\"0x0\"\n },\n \"result\":{\n \"gasUsed\":\"0x1e\",\n \"output\":\"0x\"\n },\n \"subtraces\":0,\n \"traceAddress\":[\n ],\n \"type\":\"call\"\n }\n ],\n \"stateDiff\":{\n \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\":{\n \"balance\":{\n \"*\":{\n \"from\":\"0xffffffffffffffffffffffffffffffffc3e12a20b\",\n \"to\":\"0xffffffffffffffffffffffffffffffffc3dc5f091\"\n }\n },\n \"code\":\"=\",\n \"nonce\":{\n \"*\":{\n \"from\":\"0x14\",\n \"to\":\"0x15\"\n }\n },\n \"storage\":{\n }\n }\n },\n \"transactionHash\":\"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd\",\n },\n {\"other properties...\":\"values...\"}\n ]\n}" + } + ] + }, + { + "name": "trace_block", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"trace_block\",\n \"params\": [\n \"0x6\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides transaction processing of [type `trace`](Trace-Types#trace) for the specified block.\n\n> **Important**\n>\n> Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n> requested block must be within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained) (by default, 1024).\n\n#### Parameters\n\n`quantity|tag` - Integer representing a block number or one of the string tags `latest`,\n`earliest`, or `pending`, as described in\n[Block Parameter](https://besu.hyperledger.org/en/stable/HowTo/Interact/APIs/Using-JSON-RPC-API#block-parameter).\n\n#### Returns\n\n`result` - Array of [calls to other contracts](Trace-Types#trace) containing\none object per call, in transaction execution order." + }, + "response": [ + { + "name": "trace_block", + "originalRequest": { + "method": "POST", + "header": [], + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "trace_transaction", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"trace_transaction\",\n \"params\": [\n \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Provides transaction processing of [type `trace`](Trace-Types#trace) for the specified transaction.\n\n> **Important**\n>\n> Your node must be an archive node (that is, synchronized without pruning or fast sync) or the\n> requested transaction must be contained in a block within [the number of pruning blocks retained](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#pruning-blocks-retained) (by default, 1024).\n\n#### Parameters\n\n`data` : Transaction hash\n\n#### Returns\n\n`result` - Array of [calls to other contracts](Trace-Types#trace) containing\none object per call, in the order called by the transaction.\n" + }, + "response": [ + { + "name": "trace_transaction", + "originalRequest": { + "method": "POST", + "header": [], + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"result\": [\n {\n \"action\": {\n \"creationMethod\": \"create\",\n \"from\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n \"gas\": \"0xff2e26\",\n \"init\": \"0x60006000600060006000732c2b9c9a4a25e24b174f26114e8926a9f2128fe45af2600060006000600060007300a00000000000000000000000000000000000005af2\",\n \"value\": \"0x0\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": {\n \"address\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"code\": \"0x\",\n \"gasUsed\": \"0x1c39\"\n },\n \"subtraces\": 2,\n \"traceAddress\": [],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"create\"\n },\n {\n \"action\": {\n \"callType\": \"callcode\",\n \"from\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"gas\": \"0xfb2ea9\",\n \"input\": \"0x\",\n \"to\": \"0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4\",\n \"value\": \"0x0\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": {\n \"gasUsed\": \"0x138e\",\n \"output\": \"0x\"\n },\n \"subtraces\": 1,\n \"traceAddress\": [\n 0\n ],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"call\"\n },\n {\n \"action\": {\n \"address\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"balance\": \"0x0\",\n \"refundAddress\": \"0x0000000000000000000000000000000000000000\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": null,\n \"subtraces\": 0,\n \"traceAddress\": [\n 0,\n 0\n ],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"suicide\"\n },\n {\n \"action\": {\n \"callType\": \"callcode\",\n \"from\": \"0x30753e4a8aad7f8597332e813735def5dd395028\",\n \"gas\": \"0xfb18a5\",\n \"input\": \"0x\",\n \"to\": \"0x00a0000000000000000000000000000000000000\",\n \"value\": \"0x0\"\n },\n \"blockHash\": \"0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e\",\n \"blockNumber\": 19,\n \"result\": {\n \"gasUsed\": \"0x30b\",\n \"output\": \"0x\"\n },\n \"subtraces\": 0,\n \"traceAddress\": [\n 1\n ],\n \"transactionHash\": \"0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7\",\n \"transactionPosition\": 3,\n \"type\": \"call\"\n }\n ],\n \"id\": 1\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `TRACE` API methods are not enabled by default for JSON-RPC. To enable the `TRACE` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options.\n\nThe TRACE API is a more concise alternative to the DEBUG API." + }, + { + "name": "TXPOOL", + "item": [ + { + "name": "txpool_besuPendingTransactions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuPendingTransactions\",\n \"params\": [\n 2,\n {\n \"from\": {\n \"eq\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"\n },\n \"gas\": {\n \"lt\": \"0x5209\"\n },\n \"nonce\": {\n \"gt\": \"0x1\"\n }\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists pending transactions that match the supplied filter conditions.\n\n#### Parameters\n\n* `QUANTITY` - Integer representing the maximum number of results to return.\n* Object of fields used to create the filter condition.\n\nEach field in the object corresponds to a field name containing an operator, and a value for the\noperator. A field name can only be specified once, and can only contain one operator.\nFor example, you cannot query transactions with a gas price between 8 and 9 Gwei by using both the\n`gt` and `lt` operator in the same field name instance.\n\nAll filters must be satisfied for a transaction to be returned.\n\n| Field name | Value | Value type | Supported operators |\n|--------------|-------------------------------------------|:---------------------:|---------------------|\n| **from** | Address of the sender. | *Data*, 20 bytes | `eq` |\n| **to** | Address of the receiver, or `\"contract_creation\"`.| *Data*, 20 bytes |`eq`, `action`|\n| **gas** | Gas provided by the sender. | *Quantity* | `eq`, `gt`, `lt` |\n| **gasPrice** | Gas price, in wei, provided by the sender.| *Quantity* | `eq`, `gt`, `lt` |\n| **value** | Value transferred, in wei. | *Quantity* | `eq`, `gt`, `lt` |\n| **nonce** | Number of transactions made by the sender.| *Quantity* | `eq`, `gt`, `lt` |\n|\n\nSupported operators:\n\n* `eq` (Equal to)\n* `lt` (Less than)\n* `gt` (Greater than)\n* `action`\n\n> **Note**\n>\n> The only supported `action` is `\"contract_creation\"`.\n\n#### Returns\n\n`result` - Array of objects with [details of the pending transaction](https://besu.hyperledger.org/en/stable/Reference/API-Objects#pending-transaction-object)." + }, + "response": [ + { + "name": "txpool_besuPendingTransactions", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuPendingTransactions\",\n \"params\": [\n 2,\n {\n \"from\": {\n \"eq\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"\n },\n \"gas\": {\n \"lt\": \"0x5209\"\n },\n \"nonce\": {\n \"gt\": \"0x1\"\n }\n }\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"from\": \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\",\n \"gas\": \"0x5208\",\n \"gasPrice\": \"0xab5d04c00\",\n \"hash\": \"0xb7b2f4306c1c228ec94043da73b582594007091a7dfe024b1f8d6d772284e54b\",\n \"input\": \"0x\",\n \"nonce\": \"0x2\",\n \"to\": \"0xf8be4ebda7f62d79a665294ec1263bfdb59aabf2\",\n \"value\": \"0x0\",\n \"v\": \"0xfe8\",\n \"r\": \"0x5beb711e652c6cf0a589d3cea904eefc4f45ce4372652288701d08cc4412086d\",\n \"s\": \"0x3af14a56e63aa5fb7dcb444a89708363a9d2c1eba1f777c67690288415080ded\"\n }\n ]\n}" + } + ] + }, + { + "name": "txpool_besuStatistics", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuStatistics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists statistics about the node transaction pool.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - Transaction pool statistics:\n\n* `maxSize` - Maximum number of transactions kept in the transaction pool. Use the\n [`--tx-pool-max-size`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#tx-pool-max-size) option to configure the maximum size.\n* `localCount` - Number of transactions submitted directly to this node.\n* `remoteCount` - Number of transactions received from remote nodes." + }, + "response": [ + { + "name": "txpool_besuStatistics", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuStatistics\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"maxSize\": 4096,\n \"localCount\": 1,\n \"remoteCount\": 0\n }\n}" + } + ] + }, + { + "name": "txpool_besuTransactions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuTransactions\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Lists transactions in the node transaction pool.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` - List of transactions." + }, + "response": [ + { + "name": "txpool_besuTransactions", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"txpool_besuTransactions\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": [\n {\n \"hash\": \"0x8a66830098be4006a3f63a03b6e9b67aa721e04bd6b46d420b8f1937689fb4f1\",\n \"isReceivedFromLocalSource\": true,\n \"addedToPoolAt\": \"2019-03-21T01:35:50.911Z\"\n },\n {\n \"hash\": \"0x41ee803c3987ceb5bcea0fad7a76a8106a2a6dd654409007d9931032ea54579b\",\n \"isReceivedFromLocalSource\": true,\n \"addedToPoolAt\": \"2019-03-21T01:36:00.374Z\"\n }\n ]\n}" + } + ] + } + ], + "description": "> **Note**\n>\n> The `TXPOOL` API methods are not enabled by default for JSON-RPC. To enable the `TXPOOL` API methods, use the [`--rpc-http-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-http-api) or [`--rpc-ws-api`](https://besu.hyperledger.org/en/stable/CLI/CLI-Syntax#rpc-ws-api) options." + }, + { + "name": "WEB3", + "item": [ + { + "name": "web3_clientVersion", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns the current client version.\n\n#### Parameters\n\nNone\n\n#### Returns\n\n`result` : *string* - Current client version." + }, + "response": [ + { + "name": "web3_clientVersion", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\",\n \"params\": [],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"besu/\"\n}" + } + ] + }, + { + "name": "web3_sha3", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_sha3\",\n \"params\": [\n \"0x68656c6c6f20776f726c00\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + }, + "description": "Returns a [SHA3](https://en.wikipedia.org/wiki/SHA-3) hash of the specified data. The result value\nis a [Keccak-256](https://keccak.team/keccak.html) hash, not the standardized SHA3-256.\n\n#### Parameters\n\n`DATA` - Data to convert to a SHA3 hash.\n\n#### Returns\n\n`result` (*DATA*) - SHA3 result of the input data." + }, + "response": [ + { + "name": "web3_sha3", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_sha3\",\n \"params\": [\n \"0x68656c6c6f20776f726c00\"\n ],\n \"id\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{rpc-http-host}}:{{rpc-http-port}}", + "protocol": "http", + "host": ["{{rpc-http-host}}"], + "port": "{{rpc-http-port}}" + } + }, + "code": 200, + "_postman_previewlanguage": "json", + "header": null, + "cookie": [], + "body": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 53,\n \"result\": \"0x5e39a0a66544c0668bde22d61c47a8710000ece931f13b84d3b2feb44ec96d3f\"\n}" + } + ] + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [""] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [""] + } + } + ] +} diff --git a/versioned_docs/version-stable/global/postman.md b/versioned_docs/version-stable/global/postman.md new file mode 100644 index 00000000000..a9afe58649b --- /dev/null +++ b/versioned_docs/version-stable/global/postman.md @@ -0,0 +1,15 @@ +:::info Besu JSON-RPC APIs documentation in Postman format + +View the [Besu JSON-RPC APIs documentation](https://www.postman.com/hyperledger/workspace/hyperledger-besu/collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8) in the Postman format and obtain example requests in multiple coding languages. + +#### Run in Postman + +Click the following button to fork the collection and run requests directly on your local network. + +[![Run in Postman](https://run.pstmn.io/button.svg)](https://god.gw.postman.com/run-collection/11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8?action=collection%2Ffork&collection-url=entityId%3D11610746-f334929f-c8c3-43ed-bb73-69a6f0d728d8%26entityType%3Dcollection%26workspaceId%3Dc4b60b6f-9f15-42d0-8327-7ebabca6f0fd#?env%5BBesu%20node%20on%20local%20host%5D=W3sia2V5IjoicnBjLWh0dHAtaG9zdCIsInZhbHVlIjoibG9jYWxob3N0IiwiZW5hYmxlZCI6ZmFsc2V9LHsia2V5IjoicnBjLWh0dHAtcG9ydCIsInZhbHVlIjoiODU0NSIsImVuYWJsZWQiOmZhbHNlfV0=). + +#### Download collection + +Alternatively you can [download the JSON collection file](../assets/postman/postman_collection.json). + +::: diff --git a/versioned_docs/version-stable/global/test_accounts.md b/versioned_docs/version-stable/global/test_accounts.md new file mode 100644 index 00000000000..ae819b23ed3 --- /dev/null +++ b/versioned_docs/version-stable/global/test_accounts.md @@ -0,0 +1,51 @@ +:::danger **Do not use the test accounts on Ethereum Mainnet or any production network.** + +The following accounts are test accounts and their private keys are publicly visible in this documentation and in publicly available source code. + +They are not secure and everyone can use them. + +**Using test accounts on Ethereum Mainnet and production networks can lead to loss of funds and identity fraud.** + +In this documentation, we only provide test accounts for ease of testing and learning purposes; never use them for other purposes. + +**Always secure your Ethereum Mainnet and any production account properly.** + +See for instance [MyCrypto "Protecting Yourself and Your Funds" guide](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds). + +::: + +:::info "Test Account 1 (address `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`)" + +Private key to copy : + +```text +0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63 +``` + +Initial balance : 200 Eth _(200000000000000000000 Wei)_ + +::: + +:::info "Test Account 2 (address `0x627306090abaB3A6e1400e9345bC60c78a8BEf57`)" + +Private key to copy : + +```text +0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 +``` + +Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ + +::: + +:::info "Test Account 3 (address `0xf17f52151EbEF6C7334FAD080c5704D77216b732`)" + +Private key to copy : + +```text +0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f +``` + +Initial balance : 90000 Eth _(90000000000000000000000 Wei)_ + +::: diff --git a/versioned_docs/version-stable/private-networks/_category_.json b/versioned_docs/version-stable/private-networks/_category_.json new file mode 100644 index 00000000000..865a111a8b4 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Private networks", + "position": 1 +} diff --git a/versioned_docs/version-stable/private-networks/concepts/_category_.json b/versioned_docs/version-stable/private-networks/concepts/_category_.json new file mode 100644 index 00000000000..d373a29254a --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Concepts", + "position": 4 +} diff --git a/versioned_docs/version-stable/private-networks/concepts/index.md b/versioned_docs/version-stable/private-networks/concepts/index.md new file mode 100644 index 00000000000..efffe0e3a05 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/index.md @@ -0,0 +1,22 @@ +--- +title: Concepts +description: private networks concepts overview +sidebar_position: 3 +tags: + - private networks +--- + +# Concepts + +This section provides background information and context about private network features. + +The following features are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: + +- Transactions: + - [Transaction types](../../public-networks/concepts/transactions/types.md) + - [Transaction pool](../../public-networks/concepts/transactions/pool.md) + - [Transaction validation](../../public-networks/concepts/transactions/validation.md) +- [Network ID and chain ID](../../public-networks/concepts/network-and-chain-id.md) +- [Events and logs](../../public-networks/concepts/events-and-logs.md) +- [Genesis file](../../public-networks/concepts/genesis-file.md) +- [Node keys](../../public-networks/concepts/node-keys.md) diff --git a/versioned_docs/version-stable/private-networks/concepts/permissioning/_category_.json b/versioned_docs/version-stable/private-networks/concepts/permissioning/_category_.json new file mode 100644 index 00000000000..7299170da97 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Permissioning", + "position": 3 +} diff --git a/versioned_docs/version-stable/private-networks/concepts/permissioning/index.md b/versioned_docs/version-stable/private-networks/concepts/permissioning/index.md new file mode 100644 index 00000000000..ad3678f68fd --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/permissioning/index.md @@ -0,0 +1,65 @@ +--- +title: Permissioning +sidebar_position: 1 +description: Besu permissioning feature +tags: + - private networks +--- + +# Permissioning + +A permissioned network enables node permissioning and account permissioning, allowing only specified nodes and accounts to access the network. + +:::caution Permissioning is not privacy + +In peer-to-peer networks, node permissioning enforces rules on nodes you control. + +Permissioning requires a distributed network of trust across the network where participants agree to follow the rules. One bad actor can decide not to follow the rules. Nodes can take action to prevent the bad actor adding to the chain but they cannot prevent the bad actor from allowing access to the chain. + +Besu also implements [privacy](../privacy/index.md). + +::: + +## Node permissioning + +Use node permissioning to restrict access to known participants only. + +![Node Permissioning](../../../assets/images/node-permissioning-bad-actor.png) + +## Account permissioning + +Use account permissioning to: + +- Enforce onboarding or identity requirements. +- Suspend accounts. +- Restrict the actions an account can perform. + +![Account Permissioning](../../../assets/images/enterprise-ethereum-account-permissioning.png) + +## Specify permissioning + +You can specify permissioning [locally](#local) or [onchain](#onchain). + +### Local + +[Local permissioning](../../how-to/use-permissioning/local.md) works at the node level. Each node in the network has a [permissions configuration file]. + +Local permissioning affects your node but not the rest of the network. Use local permissioning to restrict use of your node (that is, the resources under your control). For example, customers able to access your node. + +Local permissioning does not require coordination with the rest of the network and you can act immediately to protect your node. Your rules are not enforced in blocks produced by other nodes. + +### Onchain + +[Onchain permissioning](onchain.md) works through a smart contract on the network. Specifying permissioning onchain enables all nodes to read and update permissioning configuration from one location. + +Onchain permissioning requires coordination to update the rules. The network might not be able to act immediately (for example, the smart contract might enforce a minimum of number of votes before changing permissioning rules). + +When you update onchain permissioning, the update applies across the network and new blocks abide by the updated rules. For example, blocked accounts can no longer add transactions to the chain. + +The following diagram illustrates applying local and onchain permissioning rules. + +![Permissioning Flow](../../../assets/images/PermissioningFlow.png) + + + +[permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file diff --git a/versioned_docs/version-stable/private-networks/concepts/permissioning/onchain.md b/versioned_docs/version-stable/private-networks/concepts/permissioning/onchain.md new file mode 100644 index 00000000000..908a3418f9b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/permissioning/onchain.md @@ -0,0 +1,73 @@ +--- +title: Onchain permissioning +description: Onchain permissioning +sidebar_position: 1 +tags: + - private networks +--- + +# Onchain permissioning + +Onchain [permissioning](index.md) uses smart contracts to store and administer the node, account, and admin allowlists. Using onchain permissioning enables all nodes to read the allowlists from a single source, the blockchain. + +:::danger + +When using onchain account permissioning, a node checks permissions when importing blocks. Meaning, a node only imports blocks in which all transactions are from authorized senders. If you disable onchain account permissioning and your node accepts blocks without enforcing this rule, your node cannot re-synchronize with other nodes that enforce onchain account permissioning rules (your node goes into forked state). + +::: + +:::note + +Custom smart contracts and dapps can be implemented to work with onchain permissioning. + +::: + +## Permissioning contracts + +:::caution + +The permissioning contract has multiple interfaces, and each interface maps to a specific version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). Ensure that you [specify the permissioning contract interface] being used when starting Besu. + +::: + +### Allowlists + +Permissioning implements three allowlists: + +- Accounts, which can submit transactions to the network. +- Nodes, which can join the network. +- Admins, which are accounts able to update the accounts and nodes allowlists. + +:::caution Using account permissioning and privacy + +Account permissioning is incompatible with [random key signing](../../how-to/use-privacy/sign-pmts.md) for [privacy marker transactions](../privacy/private-transactions/processing.md). + +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: + +:::tip + +If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) and search for messages containing `Node permissioning` to identify the issue. + +Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been correctly configured for all nodes with the externally accessible address. + +If you change your network configuration, you may need to update the node allowlist. + +::: + +## Bootnodes + +When a node joins the network, the node connects to the [bootnodes](../../how-to/configure/bootnodes.md) until it synchronizes to the chain head, regardless of node permissions. After synchronization, the Account Rules and Node Rules smart contracts apply the permissioning rules. + +If a synchronized node loses all peer connections (that is, it has zero peers), it reconnects to the bootnodes to rediscover peers. + +:::info + +All bootnodes must be on the nodes allowlist. + +::: + + + +[specify the permissioning contract interface]: ../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version diff --git a/versioned_docs/version-stable/private-networks/concepts/permissioning/plugin.md b/versioned_docs/version-stable/private-networks/concepts/permissioning/plugin.md new file mode 100644 index 00000000000..a4f62031d8b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/permissioning/plugin.md @@ -0,0 +1,53 @@ +--- +title: Permissioning plugin +description: Plugin based permissioning +sidebar_position: 2 +tags: + - private networks +--- + +# Permissioning plugin + +You can define complex [permissioning](index.md) solutions by building a plugin that extends Hyperledger Besu functionality. + +The plugin API provides a `PermissioningService` interface that currently supports connection permissioning and message permissioning. + +## Connection permissioning + +Use connection permissioning when deciding whether to restrict node access to known participants only. + +## Message permissioning + +Use message permissioning to propagate different types of devP2P messages to particular nodes. For example, this can be used to prevent pending transactions from being forwarded to other nodes. + +## Register your plugin + +To enable permissioning in your plugin, implement the `PermissioningService` interface and register your providers. + +```java +@AutoService(BesuPlugin.class) +public class TestPermissioningPlugin implements BesuPlugin { + PermissioningService service; + + @Override + public void register(final BesuContext context) { + service = context.getService(PermissioningService.class).get(); + } + + @Override + public void start() { + service.registerNodePermissioningProvider((sourceEnode, destinationEnode) -> { + // perform logic for node permissioning + return true; + }); + + service.registerNodeMessagePermissioningProvider((destinationEnode, code) -> { + // perform logic for message permissioning + return true; + }); + } + + @Override + public void stop() {} +} +``` diff --git a/versioned_docs/version-stable/private-networks/concepts/pki.md b/versioned_docs/version-stable/private-networks/concepts/pki.md new file mode 100644 index 00000000000..97cec02eab0 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/pki.md @@ -0,0 +1,45 @@ +--- +title: Public key infrastructure +sidebar_position: 5 +description: Public key infrastructure +tags: + - private networks +--- + +# Public key infrastructure + +:::warning + +Public key infrastructure (PKI) support is an early access feature, and functionality and options may be updated between releases. + +::: + +Hyperledger Besu's public key infrastructure allows you to use certificates issued by a trusted authority to manage node and account identities in the following ways: + +- Node permissioning - Only authorized nodes can connect to other nodes in the network using TLS for the P2P communication. +- Block proposal permissioning - Only blocks proposed by authorized validators are accepted. + +Supported keystore and truststore formats used to store the certificates include PKCS11, PKCS12, and JKS. + +## Node permissioning + +Allow TLS communication between nodes by using certificates issued by a trusted authority to connect to other authorized nodes in the network. + +When receiving connection requests, the incoming connection must be from another authorized node. Similarly, when connecting to a node the initiator ensures that the remote node is authorized to participate in the network. + +[Configure TLS for the P2P communication using the Besu command line options](../how-to/configure/tls/p2p.md). + +## Block proposal permissioning + +:::caution + +Only private networks using the [QBFT consensus protocol] support block proposal permissioning. + +::: + +Use certificates issued by a trusted authority to ensure only authorized validator nodes can propose new blocks in the network. The block hash is signed by the validator private certificate and included in the header of the proposed block as a [CMS (Cryptographic Message Syntax)]. This is used by other validators to verify that the proposer is authorized to create a block in the network. + +[Configure block proposal permissioning using the Besu command line options](../how-to/configure/block-proposal-permissioning.md). + +[QBFT consensus protocol]: ../how-to/configure/consensus/qbft.md +[CMS (Cryptographic Message Syntax)]: https://en.wikipedia.org/wiki/Cryptographic_Message_Syntax diff --git a/versioned_docs/version-stable/private-networks/concepts/plugins.md b/versioned_docs/version-stable/private-networks/concepts/plugins.md new file mode 100644 index 00000000000..70ee78f7ca4 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/plugins.md @@ -0,0 +1,55 @@ +--- +title: Plugins +sidebar_position: 6 +description: Plugins overview +tags: + - private networks +--- + +# Plugins + +You can extend Hyperledger Besu functionality by building Java plugins or using existing open source Besu plugins. Use the Plugin API to take data from any Besu network, public or permissioned, and feed it into an application or system. + +For example, create a plugin to add more monitoring functionality or stream event data to a third-party application. The API exposes data about the following components: + +- Blocks +- Balances +- Transactions +- Smart contracts +- Execution results +- Logs +- Syncing state. + +![Besu plugin API](../../assets/images/Hyperledger-Besu-Plugin-API.png) + +The plugin API provides access to [interfaces](../reference/plugin-api-interfaces.md) allowing you to build the plugin. + +:::info + +View the [plugin API webinar](https://youtu.be/78sa2WuA1rg) for an example of how to build a plugin. + +For more information about the available interfaces, see the [Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). + +::: + +## Install plugins + +To allow Besu to access and use the plugin, copy the plugin (`.jar`) to the `plugins` directory. + +:::caution + +If not already present, you must create the `plugins` directory one directory level below (`../`) the `besu` executable. + +::: + +Each plugin in the directory has the following lifecycle events: + +- **Register** - Executed when Besu starts. Besu checks plugin compatibility and registers plugins. +- **Start** - Plugins start after being successfully registered. +- **Stop** - Besu stops plugins. + +:::note + +The order in which Besu calls plugins during lifecycle events is not guaranteed. + +::: diff --git a/versioned_docs/version-stable/private-networks/concepts/poa.md b/versioned_docs/version-stable/private-networks/concepts/poa.md new file mode 100644 index 00000000000..40d07a75c53 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/poa.md @@ -0,0 +1,69 @@ +--- +title: Proof of authority consensus +sidebar_position: 1 +description: Besu proof of authority consensus protocols comparison +tags: + - private networks +--- + +# Proof of authority consensus + +Besu implements the QBFT, IBFT 2.0, and Clique proof of authority (PoA) [consensus protocols](../how-to/configure/consensus/index.md). PoA consensus protocols work when participants know each other and there is a level of trust between them. For example, in a permissioned consortium network. + +PoA consensus protocols have faster block times and a much greater transaction throughput than the Ethash proof of work consensus protocol used on the Ethereum Mainnet. + +In QBFT, IBFT 2.0, or Clique, a group of nodes in the network act as validators (QBFT and IBFT 2.0) or signers (Clique). The existing nodes in the signer/validator pool vote to add nodes to or remove nodes from the pool. + +:::note + +For the rest of this page, the term validator is used to refer to signers and validators. + +::: + +## Properties + +Properties to consider when comparing QBFT, IBFT 2.0, and Clique are: + +- Immediate finality. +- Minimum number of validators. +- Liveness. +- Speed. + +### Immediate finality + +QBFT and IBFT 2.0 have immediate finality; there are no forks and all valid blocks get included in the main chain. + +Clique does not have immediate finality. Implementations using Clique must be aware of forks and chain reorganizations occurring. + +### Minimum number of validators + +To be Byzantine fault tolerant, QBFT and IBFT 2.0 require a minimum of four validators. + +Clique can operate with a single validator but operating with a single validator offers no redundancy if the validator fails. + +:::tip + +Byzantine fault tolerant is the ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +::: + +### Liveness + +Clique is more fault tolerant than QBFT and IBFT 2.0. Clique tolerates up to half of the validators failing. QBFT and IBFT 2.0 networks require greater than or equal to two-thirds of validators to be operating to create blocks. For example, an QBFT and IBFT 2.0 network of: + +- Four to five validators tolerates one unresponsive validator. +- Six to eight validators tolerates two unresponsive validators. + +Networks with three or less validators can produce blocks but do not guarantee finality when operating in adversarial environments. + +:::caution + +We recommend using QBFT or IBFT 2.0 networks with at least four nodes in production environments. + +::: + +### Speed + +Reaching consensus and adding blocks is faster in Clique networks. For Clique, the probability of a fork increases as the number of validators increases. + +For QBFT and IBFT 2.0, the time to add new blocks increases as the number of validators increases. diff --git a/versioned_docs/version-stable/private-networks/concepts/privacy/_category_.json b/versioned_docs/version-stable/private-networks/concepts/privacy/_category_.json new file mode 100644 index 00000000000..e1382c18fd5 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Privacy", + "position": 2 +} diff --git a/versioned_docs/version-stable/private-networks/concepts/privacy/flexible-privacy.md b/versioned_docs/version-stable/private-networks/concepts/privacy/flexible-privacy.md new file mode 100644 index 00000000000..ea40eca8c52 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/privacy/flexible-privacy.md @@ -0,0 +1,81 @@ +--- +title: Flexible privacy groups +sidebar_position: 3 +description: Flexible privacy groups +--- + +# Flexible privacy groups + +Flexible [privacy groups](privacy-groups.md) use smart contracts to store and maintain the group membership. You can [add and remove members to and from flexible privacy groups](../../how-to/use-privacy/flexible.md). + +:::tip + +Because group membership for flexible privacy groups is stored in a smart contract, flexible privacy groups are also known as onchain privacy groups. + +::: + +:::danger + +Flexible privacy groups are an early access feature. Don't use in production networks. + +The flexible privacy group interfaces might change between releases. There might not be an upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy group functionality in future versions. + +We don't recommended creating flexible privacy groups in a chain with existing [offchain privacy groups](privacy-groups.md). + +::: + +## Group management contracts + +The privacy group management contract bytecode is hard-coded into Besu and when you create a privacy group, the contract bytecode is part of the genesis state of the privacy group. + +:::caution + +All members of a flexible privacy group must be using the same version of Besu. If using different versions, the private state within the privacy group may become inconsistent. + +::: + +In the default implementation of the group management contract, the signer of the private transaction that creates the privacy group is also the owner of the group. Only the owner can add and remove participants, and upgrade the management contract. + +The owner is identified by the signing key. Transactions to add and remove participants, or upgrade the management contract, must be signed by the same key that signed the group creation transaction. + +## Flexible privacy group IDs + +When creating a flexible privacy group, generate the privacy group ID for the group outside of Besu and pass the ID as a parameter. + +The [web3js-quorum library](../../how-to/use-privacy/flexible.md) generates a unique privacy group ID and passes the ID to Besu when creating a privacy group. + +:::caution + +When generating a privacy group ID, you must ensure the ID is unique across all network participants. If you create a privacy group with an existing privacy group ID, the existing privacy group is overwritten. + +To ensure unique privacy group IDs, we recommend using 256-bit SecureRandom. + +::: + +## Multi-tenancy + +When using [multi-tenancy](multi-tenancy.md) with flexible privacy groups, each user provides a JSON Web Token (JWT) which allows Besu to check that the user has access to functionality and data associated with a privacy group. + +Using multi-tenancy with flexible privacy groups is more complex than with [offchain privacy groups](privacy-groups.md) because users may be added and removed from flexible privacy groups. When a user is added to a privacy group, they get access to all existing data in the privacy group. After being removed from a privacy group, a user retains access to already existing data in the privacy group, up to the block containing the [privacy marker transaction (PMT)](private-transactions/processing.md) that removed them (the removal block). A removed user doesn't have access to data in the privacy group that happens after they were removed. + +In particular, when multi-tenancy is enabled and a user requests access to a privacy group they were once a member of but later removed from, Besu allows the user access to the following functionality and data associated with the privacy group: + +- Private transactions using `priv_getTransaction` and private transaction receipts using [`priv_getTransactionReceipt`](../../../public-networks/reference/api/index.md#priv_gettransactionreceipt) from blocks up to (and including) the removal block. + + :::note + + A removed group member may have access to some private transactions after the removal PMT in the same block. + + ::: + +- Using [`priv_call`](../../../public-networks/reference/api/index.md#priv_call) on blocks up to (and including) the removal block. + +- Private logs using [`priv_getLogs`](../../../public-networks/reference/api/index.md#priv_getlogs) for blocks up to (and including) the removal block. When the `toBlock` is greater than the removal block, `priv_getLogs` still returns logs up to the removal block. + + :::note + + When a user is removed from a privacy group, any log filters they've created are also removed and can't be accessed. A user can only create and access filters for a privacy group they are currently a member of. + + ::: + +All other [`PRIV` API methods](../../../public-networks/reference/api/index.md#priv-methods) fail for the removed group member. diff --git a/versioned_docs/version-stable/private-networks/concepts/privacy/index.md b/versioned_docs/version-stable/private-networks/concepts/privacy/index.md new file mode 100644 index 00000000000..0888bbe40e3 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/privacy/index.md @@ -0,0 +1,71 @@ +--- +title: Privacy +sidebar_position: 1 +description: Privacy +--- + +# Privacy + +In Besu, privacy refers to the ability to keep transactions private between the involved participants. Other participants cannot access the transaction content or list of participants. + +:::danger + +For production environments requiring private transactions: + +- We recommend using a network with a consensus mechanism supporting transaction finality. For example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md). +- Tessera must be [highly available and run in a separate instance to Besu]. + +Using private transactions with [pruning] or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. + +::: + +## Private transaction manager + +Besu uses a private transaction manager, [Tessera](https://docs.tessera.consensys.net/), to implement privacy. Each Besu node that sends or receives [private transactions](private-transactions/index.md) requires an associated Tessera node. + +

+ +![Tessera Nodes](../../../assets/images/TesseraNodes.png) + +

+ +Private transactions pass from the Besu node to the associated Tessera node. The Tessera node encrypts and directly distributes (that is, point-to-point) the private transaction to the Tessera nodes participating in the transaction. + +By default, each participant in a privacy-enabled network uses its own Besu and Tessera node. [Multi-tenancy](multi-tenancy.md) allows more than one participant to use the same Besu and Tessera node. + +:::tip + +Private Transaction Managers are also known as Enclaves. + +::: + +## Privacy-enabled networks + +When enabling privacy in a [private network](../../get-started/system-requirements.md), there's an assumed level of trust among the node operators, since all are members of the private network. + +:::caution + +Inefficient contracts deployed accidentally or deliberately can cause performance issues in privacy-enabled networks because gas isn't required in private transactions. + +::: + +In contrast, gas is required in Ethereum Mainnet and public testnets because they are trustless environments. + +Privacy-enabled networks should have a mechanism to establish trust offchain. Node operators should be informed on: + +- Guidelines for use, responsibilities, and good behavior. +- Smart contract security, so contracts deployed on the network use resources efficiently. +- Consequences for malicious activity. + +Privacy-enabled networks should run development and test environments that closely resemble production, so contracts can be tested, and potential issues can be found before they're deployed in production. + +## Reorg-compatible privacy + +In v1.4, using private transactions in a network using a consensus mechanism where forks occur (that is, PoW algorithms or Clique) is an early access feature. + +Do not use private transactions in production environments using consensus mechanisms where forks occur. + + + +[highly available and run in a separate instance to Besu]: ../../how-to/use-privacy/tessera.md +[pruning]: ../../../public-networks/concepts/data-storage-formats.md#pruning diff --git a/versioned_docs/version-stable/private-networks/concepts/privacy/multi-tenancy.md b/versioned_docs/version-stable/private-networks/concepts/privacy/multi-tenancy.md new file mode 100644 index 00000000000..d04b9606eb8 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/privacy/multi-tenancy.md @@ -0,0 +1,33 @@ +--- +title: Multi-tenancy +sidebar_position: 4 +description: Multi-tenancy +--- + +# Multi-tenancy + +By default, each participant in a privacy network uses its own Besu and Tessera node. + +Multi-tenancy allows multiple participants to use the same Besu and Tessera node. Each participant is a _tenant_, and the operator is the _owner_ of the Besu and Tessera node. + +:::info + +The operator is responsible for [configuring multi-tenancy](../../tutorials/privacy/multi-tenancy.md), and has access to all tenant data. + +::: + +![Multi-tenancy](../../../assets/images/Multi-tenancy.png) + +:::tip + +Ensure the multi-tenant Tessera node client API is configured to allow access only by the multi-tenant Besu node. Access to your data is secured through Besu using multi-tenancy mode. + +If not configured to allow access only by the multi-tenant Besu node, other Tessera clients, including other Besu nodes, might be able to access tenant data. + +To secure access, you can [configure TLS between Besu and Tessera](../../how-to/configure/tls/client-and-server.md) with the [`WHITELIST`](https://docs.tessera.consensys.net/en/stable/HowTo/Configure/TLS/#whitelist) trust mode. + +::: + +Multi-tenancy validates that tenants have permission to use the specified HTTP or WebSocket JSON-RPC requests, and the tenant has access to the requested privacy data. Private data is isolated and each tenant uses a JSON Web Token (JWT) for authentication. + +You can [create the JWT either externally or internally](../../../public-networks/how-to/use-besu-api/authenticate.md). diff --git a/versioned_docs/version-stable/private-networks/concepts/privacy/plugin.md b/versioned_docs/version-stable/private-networks/concepts/privacy/plugin.md new file mode 100644 index 00000000000..fbc34fb440f --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/privacy/plugin.md @@ -0,0 +1,111 @@ +--- +title: Privacy plugin +description: Privacy plugin +sidebar_position: 5 +--- + +# Privacy plugin + +You can define your own strategy for private transactions by building a plugin that extends Hyperledger Besu functionality. + +The plugin can take many forms, but it must provide Besu with a private transaction when required. + +:::danger + +The privacy plugin is an early access feature and plugin interfaces are subject to change between releases. + +::: + +## Configuration + +Enable the privacy plugin by starting Besu and including the `--Xprivacy-plugin-enabled` command line option. The registered plugin must implement the `PrivacyPluginPayloadProvider` interface. + +## Use the payload provider interface + +The privacy plugin must define the [privacy marker transaction (PMT)] payload. Use the payload to retrieve the contents of the private transaction which could be a link to a location in an enclave, or an encrypted form of the private payload itself. + +Besu doesn't need to know how the private transaction is distributed, it just needs to know what the private transaction for the PMT is. + +### Send transactions + +When submitting a private transaction using [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction), the signed transaction must be sent to `0x000000000000000000000000000000000000007a` to indicate which [privacy precompiled contract](private-transactions/processing.md) is being used. + +The transaction flow is as follows: + +1. The JSON-RPC endpoint passes the private transaction to the private transaction manager (for example Tessera). +2. The private transaction manager sends the private transaction to the privacy plugin. +3. The plugin decides what data to store onchain in the payload, for example the encrypted and serialized private transaction. +4. The plugin returns what needs to be stored in the payload for the PMT. +5. The private transaction handler creates a PMT for the private transaction, and propagates the PMT using devP2P in the same way as a public Ethereum transaction. + +### Mine transactions + +The process of mining transactions happens in reverse to sending transactions. + +1. The Mainnet transaction processor processes the PMT in the same way as any other public transaction. On nodes containing the [privacy precompile contract](../../../public-networks/reference/api/index.md#priv_getprivacyprecompileaddress) specified in the `to` attribute of the PMT, the Mainnet transaction processor passes the PMT to the privacy precompile contract. + + :::note + + Nodes receiving the PMT that do not contain the specified privacy precompile contract will ignore the PMT. + + ::: + +1. The privacy precompile contract queries the plugin for the private transaction using the PMT. +1. The privacy precompile contract passes the private transaction to the private transaction manager. The privacy group ID specifies the private world state to use. +1. The private transaction manager executes the transaction. The private transaction manager can read and write to the private world state, and read from the public world state. + +## Transaction factory + +An additional extension is available to help you define how PMTs are signed. Currently, Besu supports fixed or random key signing for PMTs. + +The extension allows you to use a more dynamic approach, for example different keys for different groups. + +Your plugin needs to register the `PrivateMarkerTransactionFactory` interface which is called before submitting a PMT to the transaction pool. The responsibility then lies with the plugin to sign and serialize the PMT. + +[privacy marker transaction (PMT)]: ../../how-to/use-privacy/access-private-transactions.md + +## Register your plugin + +To enable Besu to use your privacy plugin, you must implement the `PrivacyPluginService` interface and you must call `setPayloadProvider`. + +```java + +@AutoService(BesuPlugin.class) +public class TestPrivacyPlugin implements BesuPlugin { + + private PrivacyPluginService service; + + @Override + public void register(BesuContext context) { + service = context.getService(PrivacyPluginService.class).get(); + } + + @Override + public void start() { + service.setPayloadProvider(new PrivacyPluginPayloadProvider() { + @Override + public Bytes generateMarkerPayload(PrivateTransaction privateTransaction, String privacyUserId) { + // perform logic to serialize the payload of the marker transaction + // in this example we are serialising the private transaction using rlp https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/ + return org.hyperledger.besu.ethereum.privacy.PrivateTransaction.serialize(privateTransaction).encoded(); + } + + @Override + public Optional getPrivateTransactionFromPayload(Transaction transaction) { + // perform logic to deserialize payload from the marker transaction + + final BytesValueRLPInput bytesValueRLPInput = + new BytesValueRLPInput(transaction.getPayload(), false); + + return Optional.of(org.hyperledger.besu.ethereum.privacy.PrivateTransaction.readFrom(bytesValueRLPInput)); + } + }); + } + + @Override + public void stop() { + + } +} + +``` diff --git a/versioned_docs/version-stable/private-networks/concepts/privacy/privacy-groups.md b/versioned_docs/version-stable/private-networks/concepts/privacy/privacy-groups.md new file mode 100644 index 00000000000..8521efe7810 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/privacy/privacy-groups.md @@ -0,0 +1,77 @@ +--- +title: Privacy groups +sidebar_position: 2 +description: Privacy groups +--- + +# Privacy groups + +A privacy group is a group of nodes identified by a unique privacy group ID by Tessera. Tessera stores each private transaction with the privacy group ID. + +The Besu nodes maintain the public world state for the blockchain and a private state for each privacy group. The private states contain data that is not shared in the globally replicated world state. + +:::caution + +The privacy group implementations described below are offchain privacy groups and cannot have their group membership updated. + +[Flexible privacy groups are an early access feature](flexible-privacy.md). + +::: + +## Privacy types + +Besu implements two types of privacy: + +- Enterprise Ethereum Alliance (EEA) privacy, where private transactions include `privateFor` as the recipient. +- Besu-extended privacy, where private transactions include `privacyGroupId` as the recipient. + +Both privacy types create privacy groups and store private transactions with their privacy group in Tessera. + +

+ +![Privacy Groups](../../../assets/images/PrivacyGroups.png) + +

+ +:::note + +For clarity, the Tessera nodes are not shown in the previous diagram. To send private transactions, each Besu node must have an associated Tessera node. + +::: + +### Access between states + +A contract in a privacy group: + +- Can read or write to a contract in the same privacy group. +- Can read from the public state including public contracts. +- Cannot access contracts from a different privacy group. + +A public contract cannot access a private contract. + +### Enterprise Ethereum Alliance privacy + +In the privacy implementation complying with the [EEA Client Specification](https://entethalliance.org/technical-documents/) the group of nodes specified by `privateFrom` and `privateFor` form a privacy group with a unique privacy group ID provided by Tessera. + +The previous diagram illustrates two privacy groups enabling: + +- A, B, and C to send transactions that are private from D. +- A, C, and D to send transactions that are private from B. + +Using EEA-compliant privacy, to send private transactions between A, B, and C, A initializes a contract in a private transaction with B and C specified as the `privateFor` and A specified as the `privateFrom`. Initializing the contract creates a privacy group consisting of A, B, and C. For the ABC private state to remain consistent, A, B, and C must be included on transactions (as either `privateFrom` or `privateFor`) even if they are between only two of the three parties. + +To send private transactions between A, C, and D, C initializes a different contract in a private transaction with A and D specified as the `privateFor` and C specified as the `privateFrom`. Initializing the contract creates a privacy group consisting of A, C, and D. For the ACD private state to remain consistent, A, C, and D must be included on transactions (as either `privateFrom` or `privateFor`) even if they are between only two of the three parties. + +### Besu-extended privacy + +The Besu-extended privacy implementation creates a privacy group using [`priv_createPrivacyGroup`](../../../public-networks/reference/api/index.md#priv_createprivacygroup) with private transactions sent to the privacy group ID. + +Using the same privacy groups as in the previous example. + +Using Besu-extended privacy, to send private transactions between A, B, and C, A creates a privacy group consisting of A, B, and C. The privacy group ID is specified when sending private transactions and A, B, and C are recipients of all private transactions sent to the privacy group. + +To send private transactions between A, C, and D, A creates a privacy group consisting of A, C, and D. The privacy group ID of this group is specified when sending private transactions with A, C, and D as recipients. + +## Multi-tenancy + +When using [multi-tenancy](multi-tenancy.md) with privacy groups, each user provides a JSON Web Token (JWT) which allows Besu to check that the user has access to functionality and data associated with a privacy group. diff --git a/versioned_docs/version-stable/private-networks/concepts/privacy/private-transactions/_category_.json b/versioned_docs/version-stable/private-networks/concepts/privacy/private-transactions/_category_.json new file mode 100644 index 00000000000..465b0be5572 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/privacy/private-transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Private transactions", + "position": 1 +} diff --git a/versioned_docs/version-stable/private-networks/concepts/privacy/private-transactions/index.md b/versioned_docs/version-stable/private-networks/concepts/privacy/private-transactions/index.md new file mode 100644 index 00000000000..c149089080d --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/privacy/private-transactions/index.md @@ -0,0 +1,98 @@ +--- +description: Private transaction overview +--- + +# Private transactions + +Private transactions have the same parameters as public Ethereum transactions, with the following additions: + +- `privateFrom` - The Tessera public key of the transaction sender. +- One of the following: + - `privateFor` - The Tessera public keys of the transaction recipients. + - `privacyGroupId` - [The privacy group to receive the transaction](../privacy-groups.md). +- `restriction` - Whether the private transaction is `restricted` or `unrestricted`: + + - `restricted` - Only the nodes participating in the transaction receive and store the payload of the private transaction. + - `unrestricted` - All nodes in the network receive the payload of the private transaction, but only the nodes participating in the transaction can read the transaction. + + :::info + + Besu implements `restricted` private transactions only. + + ::: + +The `gas` and `gasPrice` are used by the [privacy marker transaction (PMT)](processing.md), not the private transaction itself. + +:::info + +Because gas isn't required in private transactions, inefficient contracts deployed accidentally or deliberately can cause performance issues in privacy-enabled networks. Ensure your network has a mechanism to [establish trust offchain](../index.md#privacy-enabled-networks). + +::: + +You can [create and send private transactions](../../../how-to/send-transactions/private-transactions.md). + +## Besu and Tessera keys + +Besu and Tessera nodes both have public/private key pairs identifying them. A Besu node sending a private transaction to a Tessera node signs the transaction with the Besu node private key. The `privateFrom` and `privateFor` parameters specified in the RLP-encoded transaction string for [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) are the public keys of the Tessera nodes sending and receiving the transaction. + +:::info + +The mapping of Besu node addresses to Tessera node public keys is offchain. That is, the sender of a private transaction must know the Tessera node public key of the recipient. + +::: + +## Nonces + +A nonce is the number of previous transactions made by the sender. + +[Private transaction processing](processing.md) involves two transactions: the private transaction distributed to involved participants, and the privacy marker transaction (PMT) included on the public blockchain. Each of these transactions has its own nonce. Since the PMT is a public transaction, the PMT nonce is the public nonce for the account. + +### Private transaction nonce + +Besu maintains separate private states for each [privacy group](../privacy-groups.md). The private transaction nonce for an account is specific to the privacy group. That is, the nonce for account A for privacy group ABC is different to the nonce for account A for privacy group AB. + +### Private nonce validation + +Unlike public transactions, private transactions are not submitted to the [transaction pool](../../../../public-networks/concepts/transactions/pool.md). The private transaction is distributed directly to the participants in the transaction, and the PMT is submitted to the transaction pool. + +Unlike [public transaction nonces](../../../../public-networks/concepts/transactions/validation.md), private transaction nonces aren't validated when the private transaction is submitted. If a private transaction has an incorrect nonce, the PMT is still valid and is added to a block. However, in this scenario, the private transaction execution fails when [processing the PMT](processing.md) for the private transaction with the incorrect nonce. + +The following private transaction flow illustrates when nonce validation occurs: + +1. Submit a private transaction with a [nonce value](#private-transaction-nonce). +1. The private transaction is distributed to all participants in the privacy group. +1. The PMT is created and submitted to the transaction pool with a nonce of `0` if using one-time accounts. If using a specific account with [`--privacy-marker-transaction-signing-key-file`](../../../reference/cli/options.md#privacy-marker-transaction-signing-key-file), the public nonce for that account is obtained and used for the PMT. +1. The PMT is mined and included in the block. +1. After the block containing the PMT is imported, and the PMT is processed, the private transaction is retrieved from the private transaction manager and executed. + + If the private transaction was submitted with a correct nonce in step 1, the nonce is validated as correct. If an incorrect nonce was submitted, the private transaction execution fails. + +### Private nonce management + +In Besu, you call [`eth_getTransactionCount`](../../../../public-networks/reference/api/index.md#eth_gettransactioncount) to get a nonce, then use that nonce with [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction) to send a private transaction. + +However, when you send multiple transactions in row, if a subsequent call to `getTransactionCount` happens before a previous transaction is processed, you can get the same nonce again. + +You can manage private nonces in multiple ways: + +- Let Besu handle it. You just need to wait long enough between calls to `sendRawTransaction` for the transactions to process. The current window is around 1.5 seconds, depending on block time. + + Public transactions deal with this issue, but the window is shorter, since you can use the transaction pool to take into account pending transactions (by using `eth_getTransactionCount("pending")`). + + For private transactions, the window is longer because private transactions aren't submitted to the transaction pool. You must wait until the private transaction's corresponding PMT is included in a block. + +- Manage the nonce yourself, by keeping track of and providing the nonce at each call. We recommend this if you're [sending many transactions that are independent of each other](../../../how-to/send-transactions/concurrent-private-transactions.md). + + :::note + + You can use [`priv_getTransactionCount`](../../../reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for an account for the specified privacy group or participants. + + ::: + +- Use [Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) for nonce management. We recommend this for enterprise use. + +:::tip + +The [web3js-quorum library includes an example](https://github.com/ConsenSys/web3js-quorum/blob/9a0f9eb1b91a4a0d93801f77782b509ae2e7314c/example/concurrentPrivateTransactions/concurrentPrivateTransactions.js) of nonce management when [sending concurrent private transactions](../../../how-to/send-transactions/concurrent-private-transactions.md). The example calculates the correct nonces for the private transactions and PMTs outside of Besu. + +::: diff --git a/versioned_docs/version-stable/private-networks/concepts/privacy/private-transactions/processing.md b/versioned_docs/version-stable/private-networks/concepts/privacy/private-transactions/processing.md new file mode 100644 index 00000000000..196f2b9e7e0 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/concepts/privacy/private-transactions/processing.md @@ -0,0 +1,72 @@ +--- +title: Private transaction processing +sidebar_position: 1 +description: Private transaction processing +--- + +# Private transaction processing + +Processing [private transactions](index.md) involves the following: + +- **Precompiled contract**: A smart contract compiled from the source language to EVM bytecode and stored by an Ethereum node for later execution. + +- **Privacy marker transaction (PMT)**: A public Ethereum transaction with a payload of the enclave key. The enclave key is a pointer to the private transaction in Tessera. The `to` attribute of the PMT is the [address of the privacy precompiled contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress). + + The PMT is [signed with a random key or the key specified on the command line]. + +Private transaction processing is illustrated and described in the following diagram. + +![Processing Private Transactions](../../../../assets/images/PrivateTransactionProcessing.png) + +1. Submit a private transaction using [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). The signed transaction includes transaction parameters specific to private transactions, including: + + - `privateFor` or `privacyGroupId`, which specifies the list of recipients. + - `privateFrom`, which specifies the sender. + - `restriction`, which specifies the transaction is restricted to the transaction participants. + +1. The JSON-RPC endpoint passes the private transaction to the Private Transaction Handler. + +1. The Private Transaction Handler sends the private transaction to Tessera. + +1. Tessera distributes the private transaction directly (that is, point-to-point) to the Tessera nodes specified in `privateFor` or belonging to the privacy group identified by `privacyGroupId`. All recipient Tessera nodes store the transaction. Tessera associates the stored transaction with the transaction hash and privacy group ID. + +1. Tessera returns the transaction hash to the Private Transaction Handler. + +1. The Private Transaction Handler creates a PMT for the private transaction. The Private Transaction Handler propagates the PMT using devP2P in the same way as any other public Ethereum transaction. + + :::tip + + If you want to sign the PMT outside of Besu, use [`priv_distributeRawTransaction`](../../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../../reference/api/index.md#eea_sendrawtransaction). + + ::: + +1. Besu mines the PMT into a block and the PMT is distributed to all Ethereum nodes in the network. + +1. The Mainnet Transaction Processor processes the PMT in the same way as any other public transaction. On nodes containing the [privacy precompile contract](../../../reference/api/index.md#priv_getprivacyprecompileaddress) specified in the `to` attribute of the PMT, the Mainnet Transaction Processor passes the PMT to the privacy precompile contract. + + :::note + + Nodes receiving the PMT that don't contain the privacy precompile contract ignore the PMT. + + ::: + +1. The privacy precompile contract queries Tessera for the private transaction and privacy group ID using the transaction hash. + +1. The privacy precompile contract passes the private transaction to the Private Transaction Processor. The privacy group ID specifies the private world state to use. + +1. The Private Transaction Processor executes the transaction. The Private Transaction Processor can read and write to the private world state, and read from the public world state. + +:::danger Recommendations + +- We recommend using a network with a consensus mechanism supporting transaction finality. For example, [IBFT 2.0](../../../how-to/configure/consensus/ibft.md). +- Tessera must be [highly available and run in a separate instance to Besu](../../../how-to/use-privacy/tessera.md). + +Using private transactions with [pruning] or [fast sync](../../../../public-networks/reference/cli/options.md#sync-mode) is not supported. + +::: + + + +[signed with a random key or the key specified on the command line]: ../../../how-to/use-privacy/sign-pmts.md +[highly available and run in a separate instance to Besu]: ../../../how-to/use-privacy/tessera.md +[pruning]: ../../../../public-networks/concepts/data-storage-formats.md#pruning diff --git a/versioned_docs/version-stable/private-networks/get-started/_category_.json b/versioned_docs/version-stable/private-networks/get-started/_category_.json new file mode 100644 index 00000000000..3b3ed44eda6 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/get-started/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Get started", + "position": 2, + "collapsed": false, + "link": { + "type": "generated-index", + "slug": "/private-networks/get-started" + } +} diff --git a/versioned_docs/version-stable/private-networks/get-started/install/_category_.json b/versioned_docs/version-stable/private-networks/get-started/install/_category_.json new file mode 100644 index 00000000000..043580c1474 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/get-started/install/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Install Besu", + "position": 2 +} diff --git a/versioned_docs/version-stable/private-networks/get-started/install/binary-distribution.md b/versioned_docs/version-stable/private-networks/get-started/install/binary-distribution.md new file mode 100644 index 00000000000..74dcba7e6f4 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/get-started/install/binary-distribution.md @@ -0,0 +1,94 @@ +--- +title: Install binary distribution +description: Install or upgrade Hyperledger Besu from binary distribution +sidebar_position: 3 +tags: + - private networks +--- + +# Install binary distribution + +## MacOS with Homebrew + +### Prerequisites + +- [Homebrew](https://brew.sh/) +- Java JDK + +:::caution + +Hyperledger Besu supports: + +- MacOS High Sierra 10.13 or later versions. +- Java 17+. You can install Java using `brew install openjdk`. Alternatively, you can manually install the [Java JDK](https://www.oracle.com/java/technologies/downloads). + +::: + +### Install (or upgrade) using Homebrew + +To install Besu using Homebrew: + +```bash +brew tap hyperledger/besu +brew install hyperledger/besu/besu +``` + +To upgrade an existing Besu installation using Homebrew: + +```bash +brew upgrade hyperledger/besu/besu +``` + +:::note + +If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. + +::: + +:::note + +When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command `brew tap --repair`. + +::: + +To display the Besu version and confirm installation: + +```bash +besu --version +``` + +To display Besu command line help: + +```bash +besu --help +``` + +## Linux / Unix + +### Prerequisites + +- [Java JDK 17+](https://www.oracle.com/java/technologies/downloads/) + +:::note Linux open file limit + +If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the maximum number of open files allowed using `ulimit`. If the open files limit is not high enough, a `Too many open files` RocksDB exception occurs. + +::: + +:::tip + +We recommend installing [jemalloc](https://jemalloc.net/) to reduce memory usage. If using Ubuntu, you can install it with the command: `apt install libjemalloc-dev`. + +::: + +### Install from packaged binaries + +Download the Besu [packaged binaries](https://github.com/hyperledger/besu/releases). + +Unpack the downloaded files and change into the `besu-` directory. + +Display Besu command line help to confirm installation: + +```bash +bin/besu --help +``` diff --git a/versioned_docs/version-stable/private-networks/get-started/install/index.md b/versioned_docs/version-stable/private-networks/get-started/install/index.md new file mode 100644 index 00000000000..5c6fb933f52 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/get-started/install/index.md @@ -0,0 +1,28 @@ +--- +title: Installation options +description: Options for getting started with Hyperledger Besu +sidebar_position: 1 +tags: + - private networks +--- + +# Installation options + +Get started with the [Developer Quickstart](../../../private-networks/tutorials/quickstart.md). Use the quickstart to rapidly generate local blockchain networks. + +You can also install the following: + +- [Docker image](run-docker-image.md) +- [Binaries](binary-distribution.md) + +## Build from source + +If you want to use the latest development version of Hyperledger Besu or a specific commit, build from source. Otherwise, use the [binary] or [Docker image] for more stable versions. + +View the [Hyperledger Wiki] for instructions to install Hyperledger Besu from source. + + + +[Hyperledger Wiki]: https://wiki.hyperledger.org/display/BESU/Building+from+source +[binary]: binary-distribution.md +[Docker image]: run-docker-image.md diff --git a/versioned_docs/version-stable/private-networks/get-started/install/run-docker-image.md b/versioned_docs/version-stable/private-networks/get-started/install/run-docker-image.md new file mode 100644 index 00000000000..bc84eefbb97 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/get-started/install/run-docker-image.md @@ -0,0 +1,109 @@ +--- +title: Run Besu from Docker image +description: Run Hyperledger Besu using the official docker image +sidebar_position: 2 +tags: + - private networks +--- + +# Run Besu from a Docker image + +Hyperledger Besu provides a Docker image to run a Besu node in a Docker container. + +Use this Docker image to run a single Besu node without installing Besu. + +## Prerequisites + +- [Docker](https://docs.docker.com/install/) + +- MacOS or Linux + + :::caution + + The Docker image does not run on Windows. + + ::: + +## Expose ports + +Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need to expose the ports to use the default ports or the ports specified using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port), [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port), [`--rpc-ws-port`](../../../public-networks/reference/cli/options.md#rpc-ws-port), [`--metrics-port`](../../../public-networks/reference/cli/options.md#metrics-port), [`--graphql-http-port`](../../../public-networks/reference/cli/options.md#graphql-http-port), and [`--metrics-push-port`](../../../public-networks/reference/cli/options.md#metrics-push-port) options. + +To run Besu exposing local ports for access: + +```bash +docker run -p :8545 -p :8546 -p :30303 hyperledger/besu:latest --rpc-http-enabled --rpc-ws-enabled +``` + +:::note + +The examples on this page expose TCP ports only. To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: + +```bash +docker run -p :/udp +``` + +See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). + +::: + +To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: + +```bash +docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled +``` + +## Start Besu + +:::danger + +Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default data path interferes with the operation of Besu and prevents Besu from safely launching. + +To run a node that maintains the node state (key and database), [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) must be set to a location other than `/opt/besu` and a storage volume mounted at that location. + +When running in a Docker container, [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) must be set to `DOCKER` or `AUTO` (default). Don't set [`--nat-method`](../../../public-networks/how-to/connect/specify-nat.md) to `NONE` or `UPNP`. + +::: + +You can specify [Besu environment variables](../../../public-networks/reference/cli/options.md#specify-options) with the Docker image instead of the command line options. + +```bash +docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest +``` + +:::caution "Unsupported address type exception" + +When running Besu from a Docker image, you might get the following exception: + +```bash +Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. +``` + +This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, preventing outbound communication. IPv6 is disabled by default in Docker. + +[Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound IPv6 traffic and allow connection with IPv6 peers. + +::: + +### Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes with WebSocket enabled: + +```bash +docker run -p 8546:8546 --mount type=bind,source=/,target=/var/lib/besu hyperledger/besu:latest --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-ws-enabled --network=dev --data-path=/var/lib/besu +``` + +## Stop Besu and clean up resources + +When done running nodes, you can shut down the node container without deleting resources or you can delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the container and volume names. + +To stop a container: + +```bash +docker stop +``` + +To delete a container: + +```bash +docker rm +``` diff --git a/versioned_docs/version-stable/private-networks/get-started/start-node.md b/versioned_docs/version-stable/private-networks/get-started/start-node.md new file mode 100644 index 00000000000..4d7162a5927 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/get-started/start-node.md @@ -0,0 +1,106 @@ +--- +title: Start Besu +description: Start Besu on a private Ethereum network. +sidebar_position: 3 +tags: + - private networks +--- + +# Start Besu + +Use the [`besu`](../reference/cli/options.md) command with the required command line options to start a node. + +## Prerequisites + +[Besu installed](install/binary-distribution.md) + +## Local block data + +When connecting to a network other than the network previously connected to, you must either delete the local block data or use the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option to specify a different data directory. + +To delete the local block data, delete the `database` directory in the `besu/build/distribution/besu-` directory. + +## Genesis configuration + +To define a genesis configuration, create a [genesis file](../../public-networks/concepts/genesis-file.md) (for example, `genesis.json`) and specify the file using the [`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) option. + +When you specify [`--network=dev`](../../public-networks/reference/cli/options.md#network), Besu uses the development mode genesis configuration with a fixed low difficulty. A node started with [`--network=dev`](../../public-networks/reference/cli/options.md#network) has an empty bootnodes list by default. + +Predefined genesis configurations for named networks are in the [Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). + +## Confirm node is running + +If you started Besu with the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option, use [cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to confirm the node is running. + +- `eth_chainId` returns the chain ID of the network. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 + ``` + +- `eth_syncing` returns the starting, current, and highest block. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 + ``` + + For example, after connecting to Mainnet, `eth_syncing` will return something similar to: + + ```json + { + "jsonrpc": "2.0", + "id": 1, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x2d0", + "highestBlock": "0x66c0" + } + } + ``` + +## Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes: + +```bash +besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir +``` + +You can also use the following [configuration file](../../public-networks/how-to/configuration-file.md) on the command line to start a node with the same options as above: + +```toml +network="dev" +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +rpc-http-cors-origins=["all"] +host-allowlist=["*"] +rpc-ws-enabled=true +rpc-http-enabled=true +data-path="/tmp/tmpdata-path" +``` + +:::caution + +The following settings are a security risk in production environments: + +- Enabling the HTTP JSON-RPC service ([`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled)) and setting [`--rpc-http-host`](../../public-networks/reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the RPC connection on your node to any remote connection. +- Setting [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) to `"*"` allows JSON-RPC API access from any host. +- Setting [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) to `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. + +::: + +## Run a node on a private network + +To run a node on your private network specifying a genesis file and data directory: + +```bash +besu --genesis-file=/genesis.json --data-path= --rpc-http-enabled --bootnodes= +``` + +Where `` is the path to the directory to save the chain data to. Ensure you configure a peer discovery method, such as [bootnodes](../how-to/configure/bootnodes.md). + +:::note + +You might need to set [`--tx-pool-limit-by-account-percentage`](../../public-networks/reference/cli/options.md#tx-pool-limit-by-account-percentage) to 1. The default value is suitable for Mainnet, but may cause issues on private networks. + +::: diff --git a/versioned_docs/version-stable/private-networks/get-started/system-requirements.md b/versioned_docs/version-stable/private-networks/get-started/system-requirements.md new file mode 100644 index 00000000000..18666307ee7 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/get-started/system-requirements.md @@ -0,0 +1,52 @@ +--- +title: System requirements +description: Ensure you meet the system requirements to sync and run Besu. +sidebar_position: 1 +tags: + - private networks +--- + +# System requirements + +Private network system requirements depend on many factors, including: + +- Size of the world state for the network. +- Number of transactions submitted to the network. +- [Block gas limit](../../public-networks/reference/genesis-items.md#genesis-block-parameters). +- Number and complexity of [JSON-RPC](../../public-networks/how-to/use-besu-api/json-rpc.md), [PubSub](../../public-networks/how-to/use-besu-api/rpc-pubsub.md), or [GraphQL](../../public-networks/how-to/use-besu-api/graphql.md) queries handled by the node. + +Participation in private networks is typically restricted in some way, so the volume of traffic is much lower than on Mainnet, resulting in lower system requirements. + +## Determining system requirements + +To determine system requirements, check CPU and disk space requirements using [Prometheus](../../public-networks/how-to/monitor/metrics.md). Grafana provides a [sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. + +## Java Virtual Machine size + +Depending on your environment and network setup, the minimum Java Virtual Machine (JVM) memory requirement for private networks is 4 GB. + +JVM memory requirements are highest when syncing, but will reduce after the node is synchronized to the chain head. Monitor your system to determine your actual JVM memory needs. + +## VM requirements + +If you set up your own VM locally using a VM manager such as [VirtualBox](https://www.oracle.com/virtualization/virtualbox/): + +- Ensure you enable Intel Virtualization Technology (VTx) and Virtualization Technology for Directed I/O (VT-d) in the BIOS settings. +- On Windows, you might need to disable Hyper-V in the Windows Feature list. + +We recommend you create a VM with the following attributes: + +- Memory size: Set to 6 GB (recommended) +- Create a virtual hard disk with at least 10 GB (20 GB recommended) +- Virtual hard disk file type: VDI (if you need to share it with other apps, use VHD) +- (Optional) You can create a shared directory to copy block files or genesis files from the host computer to the VM. For details on how to create a shared directory, see "Share Folders" in the [Oracle VirtualBox documentation]. + +## Disk type + +Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). Read-only nodes can use a lower performance setup. + +You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). For higher performance in production settings, we recommend upgrading to [NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). + + + +[Oracle VirtualBox documentation]: https://docs.oracle.com/en/virtualization/virtualbox/6.1/user/ diff --git a/versioned_docs/version-stable/private-networks/how-to/_category_.json b/versioned_docs/version-stable/private-networks/how-to/_category_.json new file mode 100644 index 00000000000..ba43c43036f --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "How to", + "position": 3 +} diff --git a/versioned_docs/version-stable/private-networks/how-to/backup.md b/versioned_docs/version-stable/private-networks/how-to/backup.md new file mode 100644 index 00000000000..d81cca0621c --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/backup.md @@ -0,0 +1,51 @@ +--- +title: Backup and restore +description: Backing up and restoring Besu +sidebar_position: 7 +tags: + - private networks +--- + +# Backup and restore Besu + +In a decentralized blockchain, data replicates between nodes so it's not lost. But backing up configuration and data ensures a smoother recovery from corrupted data or other failures. + +## Genesis file + +The genesis file for a network must be accessible on every node. We recommend storing the genesis file under source control. + +## Data backups + +If installed locally, the default data location is the Besu installation directory. + +We recommend mounting a [separate volume to store data](../get-started/install/run-docker-image.md). Use the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) command line option to pass the path to Besu. + +The default data location is the Besu installation directory, or `/opt/besu/database` if using the [Besu Docker image](../get-started/install/run-docker-image.md). + +Having some data reduces the time to synchronize a new node. You can perform periodic backups of the data directory and send the data to your preferred backup mechanism. For example, `cron` job and `rsync`, archives to the cloud such as s3, or `tar.gz` archives. + +## Data restores + +To restore data: + +1. If the node is running, stop the node. +1. If required, move the data directory to another location for analysis. +1. Restore the data from your last known good backup to the same directory. +1. Ensure user permissions are valid so you can read from and write to the data directory. +1. Restart the node. + +## Corrupted data + +If log messages signify a corrupt database, the cleanest way to recover is: + +1. Stop the node. +1. Restore the data from a [previous backup](#data-backups). +1. Restart the node. + +## Find peers after restarting + +The process for finding peers after restarting is the same as for [finding peers after upgrading and restarting]. + + + +[finding peers after upgrading and restarting]: ../../public-networks/how-to/upgrade-node.md#find-peers-on-restarting diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/_category_.json b/versioned_docs/version-stable/private-networks/how-to/configure/_category_.json new file mode 100644 index 00000000000..49e1f9da31b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure", + "position": 1 +} diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/block-proposal-permissioning.md b/versioned_docs/version-stable/private-networks/how-to/configure/block-proposal-permissioning.md new file mode 100644 index 00000000000..c164fadeddd --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/block-proposal-permissioning.md @@ -0,0 +1,292 @@ +--- +title: Block proposal permissioning +description: Block proposal permissioning +sidebar_position: 7 +tags: + - private networks +--- + +# Block proposal permissioning + +:::info + +Only private networks using the [QBFT consensus protocol] support block proposal permissioning. + +Block proposal permissioning is an early access feature, and functionality and options may be updated between releases. + +::: + +You can configure [block proposal permissioning](../../concepts/pki.md#block-proposal-permissioning) to ensure only authorized validator nodes can propose blocks in the network. + +Use certificates issued by a trusted authority to ensure validators are authorized to propose blocks. + +## Configure block proposal permissioning + +**Prerequisites**: + +- A configured network. For example, [see steps 1 to 5 in the QBFT tutorial](../../tutorials/qbft.md). +- A keystore containing the certificate and key for each network node. +- A truststore containing all the trusted certificates for the network. + +Start Besu and include the following command line options on the required nodes: + +```bash +besu --Xpki-block-creation-enabled=true \ +--Xpki-block-creation-keystore-type="pkcs12" \ +--Xpki-block-creation-keystore-file="keystore" \ +--Xpki-block-creation-keystore-password-file="keystore.password" \ +--Xpki-block-creation-crl-file="crl2.pem" \ +--Xpki-block-creation-keystore-certificate-alias="validator" \ +--Xpki-block-creation-truststore-type="pkcs12" \ +--Xpki-block-creation-truststore-file="truststore" \ +--Xpki-block-creation-truststore-password-file="truststore.password" +``` + +In the command line: + +- Enable block proposal permissioning using [`--Xpki-block-creation-enabled=true`](#xpki-block-creation-enabled). +- Specify the keystore type and keystore file using [`Xpki-block-creation-keystore-type`](#xpki-block-creation-keystore-type) and [`--Xpki-block-creation-keystore-file`](#xpki-block-creation-keystore-file). +- Specify the text file containing the password to unlock the keystore file using [`Xpki-block-creation-keystore-password-file`](#xpki-block-creation-keystore-password-file). +- Specify the optional [certificate revocation list (CRL)] file using [`Xpki-block-creation-crl-file`](#xpki-block-creation-crl-file). +- Specify the alias of the certificate to be included in blocks proposed by this validator using [`Xpki-block-creation-keystore-certificate-alias`](#xpki-block-creation-keystore-certificate-alias). +- Specify the truststore type and truststore file using [`Xpki-block-creation-truststore-type`](#xpki-block-creation-truststore-type) and [`Xpki-block-creation-truststore-file`](#xpki-block-creation-truststore-file). +- Specify the text file containing the password to unlock the truststore file using [`Xpki-block-creation-truststore-password-file`](#xpki-block-creation-truststore-password-file). + +## Command line options + +### `Xpki-block-creation-crl-file` + + + +# Syntax + +```bash +--Xpki-block-creation-crl-file= +``` + +# Example + +```bash +--Xpki-block-creation-crl-file=/home/cert/cert.crl.pem +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_CRL_FILE=/home/cert/cert.crl.pem +``` + + + +Path to the optional certificate revocation list (CRL) file. + +### `Xpki-block-creation-enabled` + + + +# Syntax + +```bash +--Xpki-block-creation-enabled[=] +``` + +# Example + +```bash +--Xpki-block-creation-enabled=true +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_ENABLED=true +``` + + + +Enable PKI integration. The default is `false`. + +### `Xpki-block-creation-keystore-certificate-alias` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-certificate-alias= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-certificate-alias=validatorA +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_CERTIFICATE_ALIAS=validatorA +``` + + + +Alias of the certificate to be included in the blocks proposed by this validator. The default is `validator`. + +### `Xpki-block-creation-keystore-file` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-file= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-file=/home/cert/keystore.jks +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_FILE=/home/cert/keystore.jks +``` + + + +Keystore file containing the key and certificate for PKI block creation. + +### `Xpki-block-creation-keystore-password-file` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-password-file= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_PASSWORD-FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the keystore file. + +### `Xpki-block-creation-keystore-type` + + + +# Syntax + +```bash +--Xpki-block-creation-keystore-type= +``` + +# Example + +```bash +--Xpki-block-creation-keystore-type=JKS +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_KEYSTORE_TYPE=JKS +``` + + + +PKI keystore type. Valid options are `JKS` and `PKCS12`. The default is `JKS`. + +### `Xpki-block-creation-truststore-file` + + + +# Syntax + +```bash +--Xpki-block-creation-truststore-file= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-file=/home/cert/truststore.jks +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_FILE=/home/cert/truststore.jks +``` + + + +Truststore containing the trusted certificates for PKI block creation. + +### `Xpki-block-creation-truststore-password-file` + + + +# Syntax + +```bash +--Xpki-block-creation-truststore-password-file= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the truststore file. + +### `Xpki-block-creation-truststore-type` + + + +# Syntax + +```bash +--Xpki-block-creation-truststore-type= +``` + +# Example + +```bash +--Xpki-block-creation-truststore-type=JKS +``` + +# Environment variable + +```bash +BESU_XPKI_BLOCK_CREATION_TRUSTSTORE_TYPE=JKS +``` + + + +PKI truststore type. Valid options are `JKS` and `PKCS12`. The default is `JKS`. + +[QBFT consensus protocol]: ./consensus/qbft.md +[certificate revocation list (CRL)]: https://www.securew2.com/blog/certificate-revocation-crl-explained diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/bootnodes.md b/versioned_docs/version-stable/private-networks/how-to/configure/bootnodes.md new file mode 100644 index 00000000000..11787681a04 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/bootnodes.md @@ -0,0 +1,71 @@ +--- +title: Bootnodes +description: Configuring bootnodes +sidebar_position: 3 +tags: + - private networks +--- + +# Configure bootnodes + +You can use bootnodes to initially discover peers. Bootnodes are regular nodes used to discover other nodes. + +In private networks for development or testing purposes, specify at least one bootnode. + +In production networks, [configure two or more nodes as bootnodes](#configure-bootnodes-in-a-production-network). + +:::tip + +Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, you can use only bootnodes, only static nodes, or both bootnodes and static nodes. + +To find peers, configure one or more bootnodes. To configure a specific set of peer connections, use [static nodes](../../../public-networks/how-to/connect/static-nodes.md). + +::: + +:::note Mainnet and public testnets + +For Mainnet and the Sepolia and Goerli testnets, Hyperledger Besu has an internal list of enode URLs and uses this list automatically when you specify the [`--network`](../../../public-networks/reference/cli/options.md#network) option. + +::: + +## Specify a bootnode + +To start a node, specify a bootnode [enode](../../../public-networks/concepts/node-keys.md) for P2P discovery, using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. + +```bash +besu --genesis-file=privateNetworkGenesis.json --data-path=nodeDataPath --bootnodes=enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb99bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303 +``` + +The default host and port advertised to other peers for P2P discovery is `127.0.0.1:30303`. To specify a different host or port, use the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) and [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) options. + +By default, peer discovery listens on all available network interfaces. If the device Besu is running on must bind to a specific network interface, specify the interface using the [`--p2p-interface`](../../../public-networks/reference/cli/options.md#p2p-interface) option. + +## Configure bootnodes in a production network + +A network must have at least one operating bootnode. To allow for continuity in the event of failure, configure two or more bootnodes in a production network. + +We don't recommend putting bootnodes behind a load balancer because the [enode](../../../public-networks/concepts/node-keys.md#enode-url) relates to the node public key, IP address, and discovery ports. Any changes to a bootnode enode prevents other nodes from being able to establish a connection with the bootnode. This is why we recommend putting more bootnodes on the network itself. + +To ensure a bootnode enode doesn't change when recovering from a complete bootnode failure: + +1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) before starting the bootnode. +1. When creating bootnodes in the cloud (for example, AWS and Azure), attempt to assign a static IP address to them. If your network is: + + - Publicly accessible, assign an elastic IP. + - Internal only, specify a private IP address when you create the instance and record this IP address. + +We recommend storing the bootnode configuration under source control. + +To allow for failure, specify all bootnodes on the command line (even to the bootnodes themselves). + +:::tip + +Having each bootnode list the other bootnodes increases the speed of discovery. Nodes ignore their own enode in the bootnodes list so it isn't required to specify different bootnode lists to the bootnodes themselves. + +::: + +## Add and remove bootnodes + +Adding new bootnodes is a similar process to creating bootnodes. After creating the bootnodes and adding them to the network, update the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) command line option for each node to include the new bootnodes. + +When adding bootnodes, you don't need to restart running nodes. By updating the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option, the next time you restart the nodes (for example, when [upgrading](../../../public-networks/how-to/upgrade-node.md)), the nodes connect to the new bootnodes. diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/consensus/_category_.json b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/_category_.json new file mode 100644 index 00000000000..bc0d5770af5 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Consensus", + "position": 1 +} diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/consensus/add-validators-without-voting.md b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/add-validators-without-voting.md new file mode 100644 index 00000000000..70d875e33a0 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/add-validators-without-voting.md @@ -0,0 +1,309 @@ +--- +title: Add and remove validators without voting +description: How to add or remove validators without voting +sidebar_position: 5 +tags: + - private networks +--- + +# Add and remove validators without voting + +[QBFT](qbft.md) or [IBFT 2.0](ibft.md) network conditions might not allow voting to change validators. For example, if a majority of the current validators are no longer participating in the network, a vote to add or remove validators won't be successful. You can bypass voting and specify new validators using a transition in the genesis file. + +:::caution + +- In most cases, add or remove validators [by voting or smart contract for QBFT](qbft.md#add-and-remove-validators); or [by voting for IBFT 2.0](ibft.md#add-and-remove-validators). Use transitions only when voting isn't possible. Using transitions requires coordinating a rolling update of all the nodes in order to pick up the configuration at the correct block height. Using transitions also leaves the validator overrides permanently in your genesis configuration. +- Transitions are a Besu-specific feature. If you run a mixed-client QBFT network, you can't use transitions to change the validators. + +::: + +To add or remove validators without voting: + +1. In the genesis file, add the `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - ` ... ` are strings representing the account addresses of the validators after ``. + + + + # QBFT syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": , + "validators": [ + , + ... + + ] + } + ] + } + }, + ... + } + ``` + + # QBFT example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": 25, + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` + + # IBFT 2.0 syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": , + "validators": [ + , + ... + + ] + } + ] + } + }, + ... + } + ``` + + # IBFT 2.0 example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": 25, + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` + + + +2. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. +3. To verify the changes after the transition block, call [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber) or [`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + +:::caution + +Don't specify a transition block in the past. + +Specifying a transition block in the past can result in unexpected behavior, such as causing the network to fork. + +::: + +## Override smart contract validators + +When using [QBFT contract validator selection](qbft.md#add-and-remove-validators-using-a-smart-contract), if network conditions require it, you can bypass the smart contract and specify new validators in the genesis file. For example, you lose quorum for your current list of contract validators, and you can't perform a transaction to vote more in. + +This requires temporarily [switching to block header validator selection mode](qbft.md#swap-validator-management-methods). + +To bypass the smart contract and specify new validators: + +1. In the genesis file, add a `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - `` is the validator selection mode to switch to. In this case we'll switch to the `blockheader` mode temporarily. + - ` ... ` are strings representing the account addresses of the validators after ``. These validators only need to be sufficient to progress the chain and allow a new contract to be deployed. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": , + "validatorselectionmode": , + "validators": [ + , + ... + + ] + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + } + ] + } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. +1. Deploy a new contract to the blockchain containing the desired list of validators. +1. In the genesis file, add another `transitions` configuration item where: + + - `` is the upcoming block at which to change validators. + - `` is the validator selection mode to switch to. In this case we'll switch to `contract` mode. + - `` is the address of the new smart contract. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + “validatorcontractaddress”: “0x0000000000000000000000000000000000007777” + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + }, + { + "block": , + "validatorselectionmode": , + "validatorcontractaddress": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + }, + "transitions": { + "qbft": [ + { + "block": 2555, + "validatorselectionmode": "blockheader", + "validators": [ + "0x372a70ace72b02cc7f1757183f98c620254f9c8d", + "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + ] + }, + { + "block": 2755, + "validatorselectionmode": "contract", + "validatorcontractaddress": "0x0000000000000000000000000000000000009999" + } + ] + } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. You can make a rolling update of the nodes, as long as they're all up before the transition block is processed. diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/consensus/clique.md b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/clique.md new file mode 100644 index 00000000000..6bf2aecf81f --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/clique.md @@ -0,0 +1,158 @@ +--- +title: Clique +description: Hyperledger Besu Clique Proof-of-Authority (PoA) consensus protocol implementation +sidebar_position: 4 +path: blob/master/config/src/main/resources/ +source: rinkeby.json +tags: + - private networks +--- + +# Configure Clique consensus + +Besu implements the [Clique](https://eips.ethereum.org/EIPS/eip-225) proof of authority (PoA) [consensus protocol](index.md). Private networks can use Clique. + +:::danger + +Clique is not suitable for production environments. Use only in development environments. + +::: + +In Clique networks, approved accounts, known as signers, validate transactions and blocks. Signers take turns to create the next block. Existing signers propose and vote to [add or remove signers](#add-and-remove-signers). + +You can [create a private network using Clique](../../../tutorials/clique.md). + +## Genesis file + +To use Clique in a private network, Besu requires a Clique [genesis file](../../../../public-networks/concepts/genesis-file.md). + +A Clique genesis file defines properties specific to Clique. + +```json title="Example Clique genesis file" +{ + "config": { + "chainId": 1981, + "berlinBlock": 0, + "clique": { + "blockperiodseconds": 15, + "epochlength": 30000 + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "extraData": "0x000000000000000000000000000000000000000000000000000000000000000001a54556254bfa3db2daa7673435ec63649925c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x1fffffffffffff", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "timestamp": "0x5c51a607", + "alloc": {}, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +The properties specific to Clique are: + +- `blockperiodseconds` - The block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `extraData` - [Extra data](#extra-data) including the initial signers. + +### Extra data + +The `extraData` property consists of: + +- 0x prefix. +- 32 bytes of vanity data. +- A list of initial signer addresses (at least one initial signer is required). 20 bytes for each signer. +- 65 bytes for the proposer signature. In the genesis block there is no initial proposer, so the proposer signature is all zeros. + +### One initial signer + +![One Initial Signer](../../../../assets/images/CliqueOneIntialSigner.png) + +### Two initial signers + +![Two Initial Signers](../../../../assets/images/CliqueTwoIntialSigners.png) + +### Post-Merge configuration + +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. + +| Field | Constant value | Comment | +| --- | --- | --- | +| **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | +| **`difficulty`** | `0` | Replaced with `prevrandao` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | + +Additionally, [`extraData`](#extra-data) is limited to 32 bytes of vanity data after The Merge. + +## Connect to a Clique network + +To start a node on a Clique private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. + +## Add and remove signers + +Existing signers propose and vote to add or remove validators using the Clique JSON-RPC API methods. Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). + +The Clique API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `CLIQUE`. + +The methods to add or remove signers are: + +- [`clique_propose`](../../../reference/api/index.md#clique_propose). +- [`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). +- [`clique_discard`](../../../reference/api/index.md#clique_discard). + +To view signer metrics for a specified block range, call [`clique_getSignerMetrics`](../../../reference/api/index.md#clique_getsignermetrics). + +### Add a signer + +To propose adding a signer to a Clique network, call [`clique_propose`](../../../reference/api/index.md#clique_propose), specifying the address of the proposed signer and `true`. A majority of signers must execute the call. + +```bash title="JSON-RPC clique_propose request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` + +When the signer creates the next block, the signer adds a vote to the block for the proposed signer. + +When more than 50% of the existing signers propose adding the signer, with their votes distributed in blocks, the signer can begin signing blocks. + +To return a list of signers and confirm the addition of a proposed signer, call [`clique_getSigners`](../../../reference/api/index.md#clique_getsigners). + +```bash title="JSON-RPC clique_getSigners request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' +``` + +To discard your proposal after confirming the addition of a signer, call [`clique_discard`](../../../reference/api/index.md#clique_discard) specifying the address of the proposed signer. + +```bash title="JSON-RPC clique_discard request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` + +### Remove a signer + +The process for removing a signer from a Clique network is the same as [adding a signer](#add-a-signer), except you specify `false` as the second parameter of [`clique_propose`](../../../reference/api/index.md#clique_propose). + +### Epoch transition + +At each epoch transition, Clique discards all pending votes collected from received blocks. Existing proposals remain in effect and signers re-add their vote the next time they create a block. + +Define the number of blocks between epoch transitions in the [Clique genesis file](#genesis-file). + +## Limitations + +In Clique, blocks created by in-turn validators are published immediately. Out-of-turn validators create blocks that are published after a short delay. In-turn blocks have a higher difficulty than out-of-turn blocks, which allows small forks to resolve to the chain with more in-turn blocks. + +However, when the out-of-turn delay is shorter than the block propagation delay, out-of-turn blocks may be published before in-turn blocks. This may cause large, irresolvable forks in a network. + +:::tip + +We recommend using a more updated consensus protocol such as [IBFT 2.0](ibft.md) or [QBFT](qbft.md). + +::: + + + +\*[vanity data]: Signers can include anything they like as vanity data. diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/consensus/ibft.md b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/ibft.md new file mode 100644 index 00000000000..de26b5a2a2b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/ibft.md @@ -0,0 +1,501 @@ +--- +title: IBFT 2.0 +description: Hyperledger Besu IBFT 2.0 proof of authority (PoA) consensus protocol implementation +sidebar_position: 3 +tags: + - private networks +--- + +# Configure IBFT 2.0 consensus + +Besu implements the IBFT 2.0 proof of authority (PoA) [consensus protocol](index.md). IBFT 2.0 is supported for existing private networks, but [QBFT](qbft.md) is the recommended enterprise-grade consensus protocol for private networks. + +In IBFT 2.0 networks, approved accounts, known as validators, validate transactions and blocks. Validators take turns to create the next block. Before inserting the block onto the chain, a super-majority (greater than or equal to 2/3) of validators must first sign the block. + +Existing validators propose and vote to [add or remove validators](#add-and-remove-validators). + +You can [create a private network using IBFT](../../../tutorials/ibft/index.md). + +:::danger + +Configure your network to ensure you never lose more than 1/3 of your validators. If more than 1/3 of validators stop participating, new blocks are no longer created, and the network stalls. It may take significant time to recover once nodes are restarted. + +::: + +:::tip + +You can use a plugin to securely store a validator's key using the [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. + +::: + +## Genesis file + +To use IBFT 2.0, Besu requires an IBFT 2.0 [genesis file](../../../../public-networks/concepts/genesis-file.md). The genesis file defines properties specific to IBFT 2.0. + +```json title="Example IBFT 2.0 genesis file" +{ + "config": { + "chainId": 1981, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4, + "blockreward": "5000000000000000", + "miningbeneficiary": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d594c2ab482b506de561668e07f04547232a72897daf808400000000c0", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "alloc": {} +} +``` + +The properties specific to IBFT 2.0 are: + +- `blockperiodseconds` - The minimum block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. +- `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all nodes on the network must use the identical value. +- `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator that proposes the block. If set, then all nodes on the network must use the same beneficiary. +- `extraData` - RLP encoded [extra data](#extra-data). + +:::caution + +We don't recommend changing `epochlength` in a running network. Changing the `epochlength` after genesis can result in illegal blocks. + +::: + +:::caution Invalid block header error + +When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. The imported chain makes new blocks faster than the genesis file allows and Besu rejects them with this error. This error most often occurs when importing chains from older versions of Besu. + +Decrease the `blockperiodseconds` in the new IBFT 2.0 genesis file to a lower value that satisfies the block header validation. + +::: + +If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. + +After you update the new genesis file, if the imported chain has a `blockperiodseconds` value set lower than you prefer, you can adjust it by [configuring the block time on an existing IBFT 2.0 network](#configure-block-time-on-an-existing-network). + +The properties with specific values in the IBFT 2.0 genesis files are: + +- `nonce` - `0x0` +- `difficulty` - `0x1` +- `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul block identification + +To start a node on an IBFT 2.0 private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. + +### Extra data + +The `extraData` property is an RLP encoding of: + +- 32 bytes of vanity data. +- A list of validator addresses. +- Any validator votes. No vote is included in the genesis block. +- The round the block was created on. The round in the genesis block is 0. +- A list of seals of the validators (signed block hashes). No seals are included in the genesis block. + +In the genesis block, the important information in the extra data is the list of validators. All other details have empty values. Formally, `extraData` in the genesis block contains `RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. + +:::info + +RLP encoding is a space-efficient object serialization scheme used in Ethereum. + +::: + +#### Generate extra data + +To generate the `extraData` RLP string for inclusion in the genesis file, use the [`rlp encode`](../../../../public-networks/reference/cli/subcommands.md#rlp) Besu subcommand. + +```bash title="Example" +besu rlp encode --from=toEncode.json +``` + +Where the `toEncode.json` file contains a list of the initial validators, in ascending order. To write the validator address and copy it to the `toEncode.json` file, use the [`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu subcommand. For example: + +```json title="One initial validator in toEncode.json file" +["9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb"] +``` + +Copy the RLP encoded data to the `extraData` property in the genesis file. + +### Block time + +When the protocol receives a new chain head, the block time (`blockperiodseconds`) and round timeout (`requesttimeoutseconds`) timers start. When `blockperiodseconds` expires, the protocol proposes a new block. + +If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with the block time and timeout timers reset. The timeout period for the new round is two times `requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a block. + +Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round then starts, resetting the block time and round timeout timers. When `blockperiodseconds` expires, the protocol proposes the next new block. + +:::danger + +If more than 1/3 of validators stop participating, new blocks can no longer be created and `requesttimeoutseconds` doubles with each round change. The quickest method to resume block production is to restart all validators, which resets `requesttimeoutseconds` to its genesis value. + +::: + +Once `blockperiodseconds` is over, the time from proposing a block to adding the block is small (usually around one second) even in networks with geographically dispersed validators. + +An internal network run by ConsenSys had four geographically dispersed validators in Sweden, Sydney, and two in North Virginia. With a `blockperiodseconds` of 5 and a `requesttimeoutseconds` of 10, the testnet consistently created blocks with a five second block time. + +#### Tune block timeout + +To tune the block timeout for your network deployment: + +1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times `blockperiodseconds`. +1. Reduce `requesttimeoutseconds` until you start to see round changes occurring. +1. Increase `requesttimeoutseconds` to the value where round changes are no longer occurring. + +:::tip + +View [`TRACE` logs](../../../../public-networks/reference/api/index.md#trace-methods) to see round change log messages. + +::: + +Use a [transition](#transitions) to update the `blockperiodseconds` in an existing network. + +### Optional configuration options + +Optional configuration options in the genesis file are: + +- `messageQueueLimit` - In large networks with limited resources, increasing the message queue limit might help with message activity surges. The default is 1000. +- `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate message limit might reduce the number of retransmissions. A value of two to three times the number of validators is usually enough. The default is 100. +- `futureMessagesLimit` - The future messages buffer holds messages for a future chain height. For large networks, increasing the future messages limit might be useful. The default is 1000. +- `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering messages in the future messages buffer. The default is 10. + +### Post-Merge configuration + +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. + +| Field | Constant value | Comment | +| --- | --- | --- | +| **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | +| **`difficulty`** | `0` | Replaced with `prevrandao` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | + +Additionally, [`extraData`](#extra-data) is limited to 32 bytes of vanity data after The Merge. + +## Add and remove validators + +Existing validators propose and vote to add or remove validators using the IBFT 2.0 JSON-RPC API methods. Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSocket interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). + +The IBFT 2.0 API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `IBFT`. + +The methods to add or remove validators are: + +- [`ibft_getPendingVotes`](../../../reference/api/index.md#ibft_getpendingvotes). +- [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). +- [`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote). + +To view validator metrics for a specified block range, use [`ibft_getSignerMetrics`](../../../../public-networks/reference/api/index.md#ibft_getsignermetrics). + +:::note + +If network conditions render it impossible to add and remove validators by voting, you can [add and remove validators without voting](add-validators-without-voting.md). + +::: + +### Add a validator + +To propose adding a validator to an IBFT 2.0 network, call [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the proposed validator and `true`. A majority of validators must execute the call. + +```bash title="JSON-RPC ibft_proposeValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` + +When the validator proposes the next block, the protocol inserts one proposal received from [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote) into the block. If blocks include all proposals, subsequent blocks proposed by the validator will not contain a vote. + +When more than 50% of the existing validators have published a matching proposal, the protocol adds the proposed validator to the validator pool and the validator can begin validating blocks. + +To return a list of validators and confirm the addition of a proposed validator, use [`ibft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber). + +```bash title="JSON-RPC ibft_getValidatorsByBlockNumber request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' +``` + +To discard your proposal after confirming the addition of a validator, call [`ibft_discardValidatorVote`](../../../reference/api/index.md#ibft_discardvalidatorvote), specifying the address of the proposed validator. + +```bash title="JSON-RPC ibft_discardValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` + +### Remove a validator + +The process for removing a validator from an IBFT 2.0 network is the same as [adding a validator](#add-a-validator) except you specify `false` as the second parameter of [`ibft_proposeValidatorVote`](../../../reference/api/index.md#ibft_proposevalidatorvote). + +### Epoch transition + +At each epoch transition, IBFT 2.0 discards all pending votes collected from received blocks. Existing proposals remain in effect and validators re-add their vote the next time they create a block. + +An epoch transition occurs every `epochLength` blocks. Define `epochlength` in the [IBFT 2.0 genesis file](#genesis-file). + +### Minimum number of validators + +IBFT 2.0 requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the ability for a blockchain network to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +### Maximum number of validators + +As the number of validators increase, the message complexity increases, which can decrease performance. In [network tests](https://wiki.hyperledger.org/display/BESU/Maximum+Validator+count+for+an+IBFT2+Network), IBFT 2.0 handles up to 30 validators with no loss of performance. + +Non-validator nodes don't affect performance and don't count towards the maximum limit. + +## Transitions + +The `transitions` genesis configuration item allows you to specify a future block number at which to change IBFT 2.0 network configuration in an existing network. For example, you can update the [block time](#configure-block-time-on-an-existing-network-deployment), [block reward](#configure-block-rewards-on-an-existing-network-deployment), or [mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). + +:::caution + +Do not specify a transition block in the past. Specifying a transition block in the past could result in unexpected behavior, such as causing the network to fork. + +::: + +### Configure block time on an existing network deployment + +To update an existing network with a new `blockperiodseconds`: + +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockperiodseconds`. + - `` is the updated value for `blockperiodseconds`. + + + + # Syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": , + "blockperiodseconds": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "ibft2": [ + { + "block": 1240, + "blockperiodseconds": 4 + } + ] + } + }, + ... + } + ``` + + + +1. Restart all nodes in the network using the updated genesis file. +1. To verify the changes after the transition block, call [`ibft_getValidatorsByBlockNumber`](../../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + +### Configure block rewards on an existing network deployment + +To update an existing network with a new `blockreward`: + +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockreward`. + - `` is the updated value for `blockreward`. + + + + # Syntax + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "ibft2": [ + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "ibft2": [ + { + "block": 10, + "blockreward": "6000000000000000" + }, + { + "block": 15, + "blockreward": "75000000000000000" + }, + { + "block": 20, + "blockreward": "0" + } + ] + } + }, + ... + } + ``` + + + + :::note + + You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. + + ::: + +1. Restart all nodes in the network using the updated genesis file. + +### Configure the mining beneficiary on an existing network deployment + +To update an existing network with a new mining beneficiary: + +1. Stop all nodes in the network. +1. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `miningbeneficiary`. + - `` is the updated 20-byte address for `miningbeneficiary`. Starting at ``, block rewards go to this address. + + + + # Syntax + + ```bash + { + "config": { + "chainId": 999, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 1, + "epochlength": 30000, + "requesttimeoutseconds": 5, + "blockreward": "5000000000000000000", + "miningbeneficiary": "0x0000000000000000000000000000000000000001" + }, + "transitions": { + "ibft2": [ + { + "block": , + "miningbeneficiary": + }, + { + "block": , + "miningbeneficiary": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + "chainId": 999, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 1, + "epochlength": 30000, + "requesttimeoutseconds": 5, + "blockreward": "5000000000000000000", + "miningbeneficiary": "0x0000000000000000000000000000000000000001" + }, + "transitions": { + "ibft2": [ + { + "block": 10000, + "miningbeneficiary": "", + }, + { + "block": 20000, + "miningbeneficiary": "0x0000000000000000000000000000000000000002", + } + ] + } + }, + ... + } + ``` + + + + :::note + + Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the block producer rather than a global override address. + + ::: + +1. Restart all nodes in the network using the updated genesis file. + + + +_[vanity data]: Validators can include anything they like as vanity data. _[RLP]: Recursive Length Prefix + +``` + +``` diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/consensus/index.md b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/index.md new file mode 100644 index 00000000000..8ea4813a032 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/index.md @@ -0,0 +1,81 @@ +--- +title: Consensus protocols +description: Besu consensus protocols +sidebar_position: 1 +tags: + - private networks +--- + +# Consensus protocols + +Besu supports the following consensus protocols: + +- [QBFT](qbft.md) (proof of authority) - The recommended enterprise-grade consensus protocol for private networks. +- [IBFT 2.0](ibft.md) (proof of authority) - Supported for existing private networks. +- [Clique](clique.md) (proof of authority) - Not recommended for production use. +- [Proof of stake](../../../../public-networks/concepts/proof-of-stake/index.md) - Used on Ethereum Mainnet and public testnets. +- [Ethash](https://ethereum.org/en/developers/docs/consensus-mechanisms/pow/) (proof of work) - Can be used in [small development networks](../../../tutorials/ethash.md). + +See a [comparison of the proof of authority consensus protocols](../../../concepts/poa.md). + +The `config` property in the genesis file specifies the consensus protocol for a chain. + + + +# Ethash + +```json +{ + "config": { + ... + "ethash": { + ... + } + }, + ... +} +``` + +# Clique + +```json +{ + "config": { + ... + "clique": { + ... + } + }, + ... +} +``` + +# IBFT 2.0 + +```json +{ + "config": { + ... + "ibft2": { + ... + } + }, + ... +} +``` + +# QBFT + +```json +{ + "config": { + ... + "qbft": { + ... + } + }, + ... +} +``` + + diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/consensus/qbft.md b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/qbft.md new file mode 100644 index 00000000000..727f2662887 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/consensus/qbft.md @@ -0,0 +1,695 @@ +--- +title: QBFT +description: Hyperledger Besu QBFT proof of authority (PoA) consensus protocol implementation +sidebar_position: 2 +tags: + - private networks +--- + +# Configure QBFT consensus + +Hyperledger Besu implements the QBFT proof of authority (PoA) [consensus protocol](index.md). QBFT is the recommended enterprise-grade consensus protocol for private networks. + +In QBFT networks, approved accounts, known as validators, validate transactions and blocks. Validators take turns to create the next block. Before inserting the block onto the chain, a super-majority (greater than or equal to 2/3) of validators must first sign the block. + +Existing validators propose and vote to [add or remove validators](#add-and-remove-validators). + +You can [create a private network using QBFT](../../../tutorials/qbft.md). + +:::caution + +Configure your network to ensure you never lose more than 1/3 your validators. If more than 1/3 of validators stop participating, new blocks are no longer created, and the network stalls. It may take significant time to recover once nodes are restarted. + +::: + +:::tip + +You can use a plugin to securely store a validator's key using the [`--security-module`](../../../../public-networks/reference/cli/options.md#security-module) option. + +::: + +## Genesis file + +To use QBFT, define a [genesis file](../../../../public-networks/concepts/genesis-file.md) that contains the QBFT properties. + +The genesis file differs depending on the [validator management method](#add-and-remove-validators) you intend to use. + +:::note + +You can use a [transitions](#transitions) to change the `blockperiodseconds` or validator management method of the network at a later time. + +::: + + + +# Block header validator selection + +```json +{ + "config": { + "chainid": 1337, + "berlinBlock": 0, + "qbft": { + "epochlength": 30000, + "blockperiodseconds": 5, + "requesttimeoutseconds": 10 + } + }, + "nonce": "0x0", + "timestamp": "0x5b3d92d7", + "extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549464a702e6263b7297a96638cac6ae65e6541f4169943923390ad55e90c237593b3b0e401f3b08a0318594aefdb9a738c9f433e5b6b212a6d62f6370c2f69294c7eeb9a4e00ce683cf93039b212648e01c6c6b78c080c0", + "gasLimit": "0x29b92700", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "64d9be4177f418bcf4e56adad85f33e3a64efe22": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +# Contract validator selection + +```json +{ + "config": { + "chainid": 1337, + "berlinBlock": 0, + "qbft": { + "epochlength": 30000, + "blockperiodseconds": 5, + "requesttimeoutseconds": 10, + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + } + }, + "nonce": "0x0", + "timestamp": "0x5b3d92d7", + "extraData": "0xe5a00000000000000000000000000000000000000000000000000000000000000000c0c080c0", + "gasLimit": "0x29b92700", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "64d9be4177f418bcf4e56adad85f33e3a64efe22": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "9f66f8a0f0a6537e4a36aa1799673ea7ae97a166": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "a7f25969fb6f3d5ac09a88862c90b5ff664557a7": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "f4bbfd32c11c9d63e9b4c77bb225810f840342df": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + }, + "0x0000000000000000000000000000000000007777": { + "comment": "validator smart contract", + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100a5576000357c0100000000000000000000000000000000000000000000000000000000900480639692ea25116100785780639692ea2514610113578063b4ec9ac114610126578063b7ab4db514610139578063c76f24371461014e57600080fd5b80631c5a9d9c146100aa578063508adcfc146100bf57806351b42b00146100db5780635dc43899146100e3575b600080fd5b6100bd6100b8366004611399565b610161565b005b6100c860035481565b6040519081526020015b60405180910390f35b6100bd6104aa565b6100f66100f1366004611399565b61074e565b6040805193845260208401929092521515908201526060016100d2565b6100bd610121366004611399565b610bbd565b6100bd610134366004611399565b610deb565b6101416110a3565b6040516100d291906113c9565b6100bd61015c366004611399565b611105565b3360009081526001602052604090205460ff1661019c5760405160e560020a62461bcd02815260040161019390611416565b60405180910390fd5b600160a060020a03811661021b5760405160e560020a62461bcd02815260206004820152602860248201527f63616e6e6f742061637469766174652076616c696461746f722077697468206160448201527f64647265737320300000000000000000000000000000000000000000000000006064820152608401610193565b60005b6000548110156102b7576000818154811061023b5761023b611505565b600091825260209091200154600160a060020a03838116911614156102a55760405160e560020a62461bcd02815260206004820152601b60248201527f76616c696461746f7220697320616c72656164792061637469766500000000006044820152606401610193565b806102af816114b8565b91505061021e565b33600090815260016020526040902054610100900460ff16156103345733600090815260016020526040812054815484929162010000900460ff1690811061030157610301611505565b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550610432565b600054610100116103b05760405160e560020a62461bcd02815260206004820152602e60248201527f6e756d626572206f662076616c696461746f72732063616e6e6f74206265206c60448201527f6172676572207468616e203235360000000000000000000000000000000000006064820152608401610193565b3360009081526001602081905260408220805461ff001981166101009081178355845460ff16620100000262ffff001990921691909117179055815490810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563018054600160a060020a038416600160a060020a03199091161790555b600160a060020a0382166000818152600260205260408082208054600160a060020a03191633908117909155915490519192917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f9161049e916001909182521515602082015260400190565b60405180910390a35050565b3360009081526001602052604090205460ff166104dc5760405160e560020a62461bcd02815260040161019390611416565b6000546001106105315760405160e560020a62461bcd02815260206004820181905260248201527f63616e6e6f742064656163746976617465206c6173742076616c696461746f726044820152606401610193565b33600090815260016020526040902054610100900460ff166105be5760405160e560020a62461bcd02815260206004820152602860248201527f73656e64657220646f6573206e6f74206861766520616e20616374697665207660448201527f616c696461746f720000000000000000000000000000000000000000000000006064820152608401610193565b336000908152600160205260408120805461ff0019169081905581546201000090910460ff1691908190839081106105f8576105f8611505565b60009182526020822001548154600160a060020a03909116925081906106209060019061148a565b8154811061063057610630611505565b60009182526020822001548154600160a060020a03909116925082919060ff861690811061066057610660611505565b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055838316825260028152604080832054909316825260019052908120805462ff000019166201000060ff8716021790558054806106c6576106c66114ec565b6000828152602080822060001990840181018054600160a060020a03199081169091559301909355600160a060020a03851680825260028452604080832080549094169093558154835190815293840191909152339290917fbdea108da876d927928b65816d521f940fd6dc068dc0e02ba434e0ed0f2d915f910160405180910390a3505050565b336000908152600160205260408120548190819060ff166107845760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a03851660009081526004602052604090205481101561082357600160a060020a038516600090815260046020526040812080546001929190849081106107d6576107d6611505565b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610811578361080d816114b8565b9450505b8061081b816114b8565b915050610787565b5060026003546108339190611465565b831115610b8657600160a060020a038416600090815260046020526040812061085b9161135f565b600160a060020a03841660009081526001602052604090205460ff1615610ab0576003805490600061088c836114a1565b9091555050600160a060020a038416600090815260016020526040902054610100900460ff1615610a89576000546001106109325760405160e560020a62461bcd02815260206004820152603860248201527f63616e6e6f742072656d6f766520616c6c6f776564206163636f756e7420776960448201527f7468206c617374206163746976652076616c696461746f7200000000000000006064820152608401610193565b600160a060020a03841660009081526001602052604081205481546201000090910460ff169160029181908490811061096d5761096d611505565b6000918252602080832090910154600160a060020a0316835282019290925260400181208054600160a060020a0319169055805481906109af9060019061148a565b815481106109bf576109bf611505565b60009182526020822001548154600160a060020a03909116925082919060ff85169081106109ef576109ef611505565b600091825260208220018054600160a060020a031916600160a060020a039390931692909217909155805480610a2757610a276114ec565b6000828152602080822083016000199081018054600160a060020a0319169055909201909255600160a060020a0392831682526002815260408083205490931682526001905220805460ff909216620100000262ff0000199092169190911790555b600160a060020a0384166000908152600160205260409020805462ffffff19169055610b32565b60038054906000610ac0836114b8565b909155505060408051606081018252600180825260006020808401828152848601838152600160a060020a038b16845293909152939020915182549351915160ff16620100000262ff0000199215156101000261ff00199215159290921661ffff199095169490941717169190911790555b600160a060020a03841660008181526001602090815260409182902054915160ff909216151582527f94154efdb7741591680558a88682943a481f1a468cb81f46fe7f8cead2e40519910160405180910390a25b826002600354610b969190611465565b610ba190600161144d565b6002600354610bb09190611465565b9196909550931192915050565b3360009081526001602052604090205460ff16610bef5760405160e560020a62461bcd02815260040161019390611416565b60005b600160a060020a038216600090815260046020526040902054811015610d4b57600160a060020a0382166000908152600460205260409020805433919083908110610c3f57610c3f611505565b600091825260209091200154600160a060020a03161415610d3957600160a060020a03821660009081526004602052604090208054610c809060019061148a565b81548110610c9057610c90611505565b6000918252602080832090910154600160a060020a03858116845260049092526040909220805491909216919083908110610ccd57610ccd611505565b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559184168152600490915260409020805480610d1257610d126114ec565b60008281526020902081016000199081018054600160a060020a0319169055019055610d4b565b80610d43816114b8565b915050610bf2565b50600160a060020a0381166000818152600460205260409020546003543392917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba91610d9990600290611465565b610da490600161144d565b600160a060020a0386166000908152600160208181526040928390205483519586529085019390935260ff909216159083015260608201526080015b60405180910390a350565b3360009081526001602052604090205460ff16610e1d5760405160e560020a62461bcd02815260040161019390611416565b600160a060020a038116610e765760405160e560020a62461bcd02815260206004820152601f60248201527f6163636f756e7420746f2062652061646465642063616e6e6f742062652030006044820152606401610193565b600160a060020a03811660009081526001602081905260409091205460ff16151514610f0d5760405160e560020a62461bcd02815260206004820152602a60248201527f6163636f756e7420746f2072656d6f7665206973206e6f74206f6e207468652060448201527f616c6c6f77206c697374000000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a038216600090815260046020526040902054811015610ffb57600160a060020a0382166000908152600460205260409020805433919083908110610f5d57610f5d611505565b600091825260209091200154600160a060020a03161415610fe95760405160e560020a62461bcd02815260206004820152602a60248201527f73656e6465722068617320616c726561647920766f74656420746f2072656d6f60448201527f7665206163636f756e74000000000000000000000000000000000000000000006064820152608401610193565b80610ff3816114b8565b915050610f10565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061107490600290611465565b61107f90600161144d565b60408051928352602083019190915260009082018190526060820152608001610de0565b606060008054806020026020016040519081016040528092919081815260200182805480156110fb57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116110dd575b5050505050905090565b3360009081526001602052604090205460ff166111375760405160e560020a62461bcd02815260040161019390611416565b600160a060020a03811660009081526001602052604090205460ff16156111c95760405160e560020a62461bcd02815260206004820152602b60248201527f6163636f756e7420746f2061646420697320616c7265616479206f6e2074686560448201527f20616c6c6f77206c6973740000000000000000000000000000000000000000006064820152608401610193565b60005b600160a060020a0382166000908152600460205260409020548110156112b757600160a060020a038216600090815260046020526040902080543391908390811061121957611219611505565b600091825260209091200154600160a060020a031614156112a55760405160e560020a62461bcd02815260206004820152602760248201527f73656e6465722068617320616c726561647920766f74656420746f206164642060448201527f6163636f756e74000000000000000000000000000000000000000000000000006064820152608401610193565b806112af816114b8565b9150506111cc565b50600160a060020a0381166000818152600460209081526040822080546001810182558184529183209091018054600160a060020a0319163390811790915591839052546003549192917f91ad81c76cda7c0ccc324838ae74757eab38b250da52daab154daf408cb3bcba919061133090600290611465565b61133b90600161144d565b60408051928352602083019190915260019082015260006060820152608001610de0565b508054600082559060005260206000209081019061137d9190611380565b50565b5b808211156113955760008155600101611381565b5090565b6000602082840312156113ab57600080fd5b8135600160a060020a03811681146113c257600080fd5b9392505050565b6020808252825182820181905260009190848201906040850190845b8181101561140a578351600160a060020a0316835292840192918401916001016113e5565b50909695505050505050565b6020808252601f908201527f73656e646572206973206e6f74206f6e2074686520616c6c6f77206c69737400604082015260600190565b60008219821115611460576114606114d3565b500190565b6000826114855760e060020a634e487b7102600052601260045260246000fd5b500490565b60008282101561149c5761149c6114d3565b500390565b6000816114b0576114b06114d3565b506000190190565b60006000198214156114cc576114cc6114d3565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052603160045260246000fd5b60e060020a634e487b7102600052603260045260246000fdfea26469706673582212200c3e9c07521b155532c0de1605aae52f4ae953670f0afb0f30d320580b93213d64736f6c63430008070033", + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000000000000000000000000000000000000002", + "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": "0000000000000000000000009a6d82ef3912d5ab60473124bccd2f2a640769d7", + "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564": "00000000000000000000000065463bf6268e5cc409b6501ec846487b935a1446", + "aedead2c33b41c31b4afd2246c6bf5131c209d4b0ca6c2247778ac7be7443a00": "0000000000000000000000000000000000000000000000000000000000000101", + "33784757d5da236467d27a7c5b0cc5aa9026ca3b79e29106a67a5e93c292a523": "0000000000000000000000000000000000000000000000000000000000010101", + "35aba1eb0bbe741ac01e5b6ce584bc042b1a0b7d115eb8f7dd02a1a1de2fd14d": "000000000000000000000000fe3b557e8fb62b89f4916b721be55ceb828dbd73", + "0d9217f0a1f7c602fd67052d20171ff73b156d1b87ea258cb6a5d94f71298158": "000000000000000000000000627306090abab3a6e1400e9345bc60c78a8bef57", + "0000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000000000000000000000000000000000000000002" + }, + "version": "0x01" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + + + +The QBFT properties are: + +- `blockperiodseconds` - The minimum block time, in seconds. +- `epochlength` - The number of blocks after which to reset all votes. +- `requesttimeoutseconds` - The timeout for each consensus round before a round change, in seconds. +- `blockreward` - Optional reward amount in Wei to reward the beneficiary. Defaults to zero (0). Can be specified as a hexadecimal (with 0x prefix) or decimal string value. If set, then all nodes on the network must use the identical value. +- `validatorcontractaddress` - Address of the validator smart contract. Required only if using a contract validator selection. The address must be identical to the address in the `alloc` section. This option can also be used in the [transitions](#transitions) configuration item if swapping [validator management methods](#add-and-remove-validators) in an existing network. +- `miningbeneficiary` - Optional beneficiary of the `blockreward`. Defaults to the validator that proposes the block. If set, then all nodes on the network must use the same beneficiary. +- [`extraData`](#extra-data) - RLP encoded [extra data](#extra-data). + +:::caution + +We don't recommend changing `epochlength` in a running network. Changing the `epochlength` after genesis can result in illegal blocks. + +::: + +:::caution Invalid block header error + +When adding a new node, if a `TimeStampMoreRecentThanParent | Invalid block header` error occurs, the genesis file of the new node specifies a higher `blockperiodseconds` than the imported chain. The imported chain makes new blocks faster than the genesis file allows and Besu rejects them with this error. This error most often occurs when importing chains from older versions of Besu. + +Decrease the `blockperiodseconds` in the new QBFT genesis file to a lower value that satisfies the block header validation. + +If the error reads `| TimestampMoreRecentThanParent | Invalid block header: timestamp 1619660141 is only 3 seconds newer than parent timestamp 1619660138. Minimum 4 seconds`, decrease the `blockperiodseconds` from 4 seconds to 3 seconds to match the imported chain. + +After you update the new genesis file, if the imported chain has a `blockperiodseconds` value set lower than you prefer, you can adjust it by [configuring the block time on an existing QBFT network](#configure-block-time-on-an-existing-network). + +::: + +The properties with specific values in the QBFT genesis files are: + +- `difficulty` - `0x1` +- `mixHash` - `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul block identification + +To start a node on a QBFT private network, use the [`--genesis-file`](../../../../public-networks/reference/cli/options.md#genesis-file) option to specify the custom genesis file. + +### Extra data + +The `extraData` property is an RLP encoding of: + +- 32 bytes of vanity data. +- If using: + - [Block header validator selection](#add-and-remove-validators-using-block-headers), a list of validator addresses. + - [Contract validator selection](#add-and-remove-validators-using-a-smart-contract), no validators. +- Any validator votes. No vote is included in the genesis block. +- The round the block was created on. The round in the genesis block is 0. +- A list of seals of the validators (signed block hashes). No seals are included in the genesis block. + +When using block header validator selection, the important information in the genesis block extra data is the list of validators. All other details have empty values in the genesis block. + +:::info + +When using contract validator selection to manage validators, the list of validators is configured in the `alloc` property's `storage` section. View the example smart contract for more information on how to generate the `storage` section. + +::: + +Formally, `extraData` in the genesis block contains: + +- If using block header validator selection: `RLP([32 bytes Vanity, List, No Vote, Round=Int(0), 0 Seals])`. +- If using contract validator selection: `RLP([32 bytes Vanity, 0 Validators, No Vote, Round=Int(0), 0 Seals])`. + +:::info + +RLP encoding is a space-efficient object serialization scheme used in Ethereum. + +::: + +#### Generate extra data + +To generate the `extraData` RLP string for inclusion in the genesis file, use the [`rlp encode`](../../../reference/cli/subcommands.md#rlp) Besu subcommand. + +```bash title="Example" +besu rlp encode --from=toEncode.json --type=QBFT_EXTRA_DATA +``` + +Where the `toEncode.json` file contains a list of the initial validators, in ascending order. To write the validator address and copy it to the `toEncode.json` file, use the [`public-key export-address`](../../../../public-networks/reference/cli/subcommands.md#export-address) Besu subcommand. For example: + +```json title="Initial validators in toEncode.json file" +[ + "0x4592c8e45706cc08b8f44b11e43cba0cfc5892cb", + "0x06e23768a0f59cf365e18c2e0c89e151bcdedc70", + "0xc5327f96ee02d7bcbc1bf1236b8c15148971e1de", + "0xab5e7f4061c605820d3744227eed91ff8e2c8908" +] +``` + +Copy the RLP encoded data to the `extraData` property in the genesis file. + +```bash title="RLP encoded data" +0xf87aa00000000000000000000000000000000000000000000000000000000000000000f854944592c8e45706cc08b8f44b11e43cba0cfc5892cb9406e23768a0f59cf365e18c2e0c89e151bcdedc7094c5327f96ee02d7bcbc1bf1236b8c15148971e1de94ab5e7f4061c605820d3744227eed91ff8e2c8908c080c0 +``` + +When you start the network, the four nodes previously specified in `toEncode.json` are the validators for the network. + +### Block time + +When the protocol receives a new chain head, the block time (`blockperiodseconds`) timer starts. When `blockperiodseconds` expires, the round timeout (`requesttimeoutseconds`) timer starts and the protocol proposes a new block. + +If `requesttimeoutseconds` expires before adding the proposed block, a round change occurs, with the block time and timeout timers reset. The timeout period for the new round is two times `requesttimeoutseconds`. The timeout period continues to double each time a round fails to add a block. + +Usually, the protocol adds the proposed block before reaching `requesttimeoutseconds`. A new round then starts, resetting the block time and round timeout timers. When `blockperiodseconds` expires, the protocol proposes the next new block. + +:::danger + +If more than 1/3 of validators stop participating, new blocks can no longer be created and `requesttimeoutseconds` doubles with each round change. The quickest method to resume block production is to restart all validators, which resets `requesttimeoutseconds` to its genesis value. + +::: + +Once `blockperiodseconds` is over, the time from proposing a block to adding the block is small (usually around one second) even in networks with geographically dispersed validators. + +#### Tune block timeout + +To tune the block timeout for your network deployment: + +1. Set `blockperiodseconds` to your desired block time and `requesttimeoutseconds` to two times `blockperiodseconds`. +1. Reduce `requesttimeoutseconds` until you start to see round changes occurring. +1. Increase `requesttimeoutseconds` to the value where round changes are no longer occurring. + +:::tip + +View [`TRACE` logs](../../../../public-networks/reference/api/index.md#admin_changeloglevel) to see round change log messages. + +::: + +Use a [transition](#transitions) to update the `blockperiodseconds` in an existing network. + +### Optional configuration options + +Optional configuration options in the genesis file are: + +- `messageQueueLimit` - In large networks with limited resources, increasing the message queue limit might help with message activity surges. The default is 1000. +- `duplicateMessageLimit` - If the same node is retransmitting messages, increasing the duplicate message limit might reduce the number of retransmissions. A value of two to three times the number of validators is usually enough. The default is 100. +- `futureMessagesLimit` - The future messages buffer holds messages for a future chain height. For large networks, increasing the future messages limit might be useful. The default is 1000. +- `futureMessagesMaxDistance` - The maximum height from the current chain height for buffering messages in the future messages buffer. The default is 10. + +### Post-Merge configuration + +After [The Merge](../../../../public-networks/concepts/the-merge.md), the following block fields are modified or deprecated. Their fields **must** contain only the constant values from the following chart. + +| Field | Constant value | Comment | +| --- | --- | --- | +| **`ommersHash`** | `0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347` | `= Keccak256(RLP([]))` | +| **`difficulty`** | `0` | Replaced with `prevrandao` | +| **`mixHash`** | `0x0000000000000000000000000000000000000000000000000000000000000000` | Replaced with `prevrandao` | +| **`nonce`** | `0x0000000000000000` | | +| **`ommers`** | `[]` | `RLP([]) = 0xc0` | + +Additionally, [`extraData`](#extra-data) is limited to the 32 bytes of vanity data after The Merge. + +## Add and remove validators + +QBFT provides two methods to manage validators: + +- [Block header validator selection](#add-and-remove-validators-using-block-headers) - Existing validators propose and vote to add or remove validators using the QBFT JSON-RPC API methods. + +- [Contract validator selection](#add-and-remove-validators-using-a-smart-contract) - Use a smart contract to specify the validators used to propose and validate blocks. + +You can use [transitions](#transitions) to swap between block header validator selection and contract validator selection in an existing network. + +For block header validator selection, initial validators are configured in the genesis file's [`extraData`](#extra-data) property, whereas the initial validators when using the contract validator selection method are configured in the genesis file's `storage` section. + +### Add and remove validators using block headers + +Enable the HTTP interface with [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) or the WebSockets interface with [`--rpc-ws-enabled`](../../../../public-networks/reference/cli/options.md#rpc-ws-enabled). + +The QBFT API methods are disabled by default. To enable them, specify the [`--rpc-http-api`](../../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../../public-networks/reference/cli/options.md#rpc-ws-api) option and include `QBFT`. + +The methods to add or remove validators are: + +- [`qbft_getPendingVotes`](../../../reference/api/index.md#qbft_getpendingvotes). +- [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). +- [`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote). + +To view validator metrics for a specified block range, use [`qbft_getSignerMetrics`](../../../reference/api/index.md#qbft_getsignermetrics). + +:::note + +If network conditions render it impossible to add and remove validators by voting, you can [add and remove validators without voting](add-validators-without-voting.md). + +::: + +#### Add a validator + +To propose adding a validator, call [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote), specifying the address of the proposed validator and `true`. A majority of validators must execute the call. + +```bash title="JSON-RPC qbft_proposeValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' +``` + +When the validator proposes the next block, the protocol inserts one proposal received from [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote) into the block. If blocks include all proposals, subsequent blocks proposed by the validator will not contain a vote. + +When more than 50% of the existing validators have published a matching proposal, the protocol adds the proposed validator to the validator pool and the validator can begin validating blocks. + +To return a list of validators and confirm the addition of a proposed validator, use [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#qbft_getvalidatorsbyblocknumber). + +```bash title="JSON-RPC qbft_getValidatorsByBlockNumber request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' +``` + +To discard your proposal after confirming the addition of a validator, call [`qbft_discardValidatorVote`](../../../reference/api/index.md#qbft_discardvalidatorvote), specifying the address of the proposed validator. + +```bash title="JSON-RPC qbft_discardValidatorVote request example" +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' +``` + +#### Remove a validator + +The process for removing a validator is the same as adding a validator except you specify `false` as the second parameter of [`qbft_proposeValidatorVote`](../../../reference/api/index.md#qbft_proposevalidatorvote). + +#### Epoch transition + +At each epoch transition, QBFT discards all pending votes collected from received blocks. Existing proposals remain in effect and validators re-add their vote the next time they create a block. + +An epoch transition occurs every `epochLength` blocks. Define `epochlength` in the QBFT genesis file. + +### Add and remove validators using a smart contract + +Users can create their own smart contracts to add or remove validators based on their organizational requirements. View the [example smart contract](https://github.com/ConsenSys/validator-smart-contracts) for more information on how to create and deploy the smart contract. + +You can pre-deploy the validator smart contract in a new QBFT network by specifying the contract details in the [genesis file](qbft.md#genesis-file). For existing QBFT networks you need to compile and deploy the contract using a transaction, then obtain the contract address from the receipt and use that in a [transition](#swap-validator-management-methods). + +:::info + +You can't use the JSON-RPC methods to add or remove validators when using a smart contract to manage nodes. + +You must interact with the contract functions using transactions. + +::: + +:::note + +If network conditions render it impossible to add and remove validators using a smart contract, you can [override smart contract validators](add-validators-without-voting.md#override-smart-contract-validators). + +::: + +### Minimum number of validators + +QBFT requires four validators to be Byzantine fault tolerant. Byzantine fault tolerance is the ability for a blockchain network to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. + +## Transitions + +The `transitions` genesis configuration item allows you to specify a future block number at which to change QBFT network configuration in an existing network. For example, you can update the [block time](#configure-block-time-on-an-existing-network), [block reward](#configure-block-rewards-on-an-existing-network-deployment), [validator management method](#swap-validator-management-methods), or [mining beneficiary](#configure-the-mining-beneficiary-on-an-existing-network-deployment). + +:::caution + +Do not specify a transition block in the past. Specifying a transition block in the past could result in unexpected behavior, such as causing the network to fork. + +::: + +### Configure block time on an existing network + +To update an existing network with a new `blockperiodseconds`: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockperiodseconds`. + - `` is the updated value for `blockperiodseconds`. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": , + "blockperiodseconds": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + }, + "transitions": { + "qbft": [ + { + "block": 1240, + "blockperiodseconds": 4 + } + ] + } + }, + ... + } + ``` + + + +3. Restart all nodes in the network using the updated genesis file. +4. To verify the changes after the transition block, call [`qbft_getValidatorsByBlockNumber`](../../../reference/api/index.md#ibft_getvalidatorsbyblocknumber), specifying `latest`. + +### Configure block rewards on an existing network deployment + +To update an existing network with a new `blockreward`: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `blockreward`. + - `` is the updated value for `blockreward`. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "qbft": [ + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + }, + { + "block": , + "blockreward": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + "blockreward": "5000000000000000" + }, + "transitions": { + "qbft": [ + { + "block": 10, + "blockreward": "6000000000000000" + }, + { + "block": 15, + "blockreward": "75000000000000000" + }, + { + "block": 20, + "blockreward": "0" + } + ] + } + }, + ... + } + ``` + + + + :::note + + You can add multiple `blockreward` updates in one transition object by specifying multiple future blocks. + + ::: + +3. Restart all nodes in the network using the updated genesis file. + +### Swap validator management methods + +To swap between block header validator selection and contract validator selection methods in an existing network: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change the validator selection method. + - `` is the validator selection mode to switch to. Valid options are `contract` and `blockheader`. + - `` is the smart contract address, if switching to the contract validator selection method. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": , + "validatorselectionmode": , + "validatorcontractaddress": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": 102885, + "validatorselectionmode": "contract", + "validatorcontractaddress": "0x0000000000000000000000000000000000007777" + } + ] + } + }, + ... + } + ``` + + + +3. Restart all nodes in the network using the updated genesis file. + +### Configure the mining beneficiary on an existing network deployment + +To update an existing network with a new mining beneficiary: + +1. Stop all nodes in the network. +2. In the [genesis file](#genesis-file), add the `transitions` configuration item where: + + - `` is the upcoming block at which to change `miningbeneficiary`. + - `` is the updated 20-byte address for `miningbeneficiary`. Starting at ``, block rewards go to this address. + + + + # Syntax + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": , + "miningbeneficiary": + }, + { + "block": , + "miningbeneficiary": + } + ] + } + }, + ... + } + ``` + + # Example + + ```bash + { + "config": { + ... + "qbft": { + "blockperiodseconds": 5, + "epochlength": 30000, + "requesttimeoutseconds": 10 + }, + "transitions": { + "qbft": [ + { + "block": 10000, + "miningbeneficiary": "0x0000000000000000000000000000000000000002", + }, + { + "block": 20000, + "miningbeneficiary": "", + } + ] + } + }, + ... + } + ``` + + + + :::note + + Setting the `miningbeneficiary` to an empty value clears out any override so that block rewards go to the block producer rather than a global override address. + + ::: + +3. Restart all nodes in the network using the updated genesis file. + + + +_[vanity data]: Validators can include anything they like as vanity data. _[RLP]: Recursive Length Prefix + +[GoQuorum]: https://consensys.net/docs/goquorum/en/stable/ +[View the example smart contract]: https://github.com/ConsenSys/validator-smart-contracts diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/contracts.md b/versioned_docs/version-stable/private-networks/how-to/configure/contracts.md new file mode 100644 index 00000000000..a38c58e3894 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/contracts.md @@ -0,0 +1,39 @@ +--- +title: Pre-deploy a contract +description: Pre-deploying contracts in the genesis file +sidebar_position: 5 +tags: + - private networks +--- + +# Pre-deploy contracts in the genesis file + +To pre-deploy contracts when starting Besu, specify the contract code in the [genesis file](../../../public-networks/concepts/genesis-file.md). + +:::tip Contract code in the genesis file + +```json +{ + ... + "alloc": { + "0x0ffd23af8eebc60b3cfdeed6f814988757237314": { + "balance": "0x100000000000000000000000000000000000000000000000000", + "code": "0x6080604052600436106043576000357c010000000000000000000000000000000000000000000000000000000090048063010fc84214604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b80600081905550807f04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce360405160405180910390a25056fea165627a7a7230582038cb7ea327af8f73feabcfbff64498f1e74831e67f7c75286760d3845c6747c70029", + "storage": { + "7aa07e0c924147697605046b7c2c32645b7bbfb41e0ac5d0a84ac93cbb759798": "0000000000000000000000000000000000000000000000000000000000000001", + "cea2b0602db61f92b76ec4402875cc38eedc9fc425cb1b697fc2265d50fc20fb": "0000000000000000000000000000000000000000000000000000000000000001", + } + } + }, + ... +} +``` + +::: + +The contract code in the genesis file defines the: + +- Address. +- Balance. +- Bytecode. +- Key value pairs for contract storage. diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/curves.md b/versioned_docs/version-stable/private-networks/how-to/configure/curves.md new file mode 100644 index 00000000000..72edb764a18 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/curves.md @@ -0,0 +1,41 @@ +--- +title: Alternative elliptic curves +description: Using alternative elliptic curves in Besu +sidebar_position: 8 +tags: + - private networks +--- + +# Configure alternative elliptic curves + +:::caution + +Configuring alternative elliptic curves is an early access feature. + +::: + +By default, Besu uses the Ethereum standard `secp256k1` elliptic curve (EC). However, when running nodes in a private network, it is possible to configure an alternative elliptic curve. + +The configuration for what elliptic curve Besu will use is done in the network configuration section of genesis file, using the [`ecCurve`](../../../public-networks/reference/genesis-items.md#Configuration_Items) key: + +```bash +{ + "genesis": { + "config": { + "ecCurve": "secp256k1", + [...] + }, + [...] +} +``` + +:::danger Important + +All nodes in the network **MUST** use the same elliptic curve. Nodes with different EC configuration from the network won't be able to send messages to other nodes or verify transactions and blocks. + +::: + +Besu supports the following elliptic curves: + +- `secp256k1` (Ethereum default) +- `secp256r1` diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/free-gas.md b/versioned_docs/version-stable/private-networks/how-to/configure/free-gas.md new file mode 100644 index 00000000000..950ab0f1db6 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/free-gas.md @@ -0,0 +1,136 @@ +--- +title: Free gas network +description: Configuring free gas networks +sidebar_position: 2 +tags: + - private networks +--- + +# Configure free gas networks + +Transactions use computational resources so have an associated cost. Gas is the cost unit and the gas price is the price per gas unit. The transaction cost is the gas used \* gas price. + +In public networks, the account submitting the transaction pays the transaction cost, in Ether. The miner (or validator in PoA networks) that includes the transaction in a block receives transaction cost. + +In many private networks, network participants run the validators and do not require gas as an incentive. Networks that don't require gas as an incentive usually configure the gas price to be zero (that is, free gas). Some private networks might allocate Ether and use a non-zero gas price to limit resource use. + +:::tip + +We use the term _free gas network_ to refer to a network with a gas price of zero. A network with a gas price of zero is also known as a _zero gas network_ or _no gas network_. + +::: + +:::note + +Some pre-crafted transactions require the deployment account to have gas available. For example, the transaction that creates the smart contract in [EIP-1820](https://eips.ethereum.org/EIPS/eip-1820). + +::: + +In a free gas network, transactions still use gas but the gas price is zero, meaning the transaction cost is zero. Transaction cost = gas used \* 0 (the gas price). + +## Configure free gas in Besu + +When gas is free, limiting block and contract sizes is less important. In free gas networks, we increase the block size limit and set the contract size limit to the maximum value. + +### 1. Set the block size + +If you want to remove gas from consideration and don't mind blocks potentially taking longer to create, in the genesis file set the block size limit (measured in gas) to the maximum accepted by Truffle (`0x1fffffffffffff`). In the genesis file, specify `gasLimit` following the `config` key. + +```json +{ + "config": { + .... + }, + ... + "gasLimit": "0x1fffffffffffff", + .... +} +``` + +If you are more concerned about blocks arriving on time and don't have expensive individual transactions, set `gasLimit` to a value closer to the amount of gas your validators can process in the configured block time. + +### 2. Set the contract size + +In the `config` section of the genesis file, set the contract size limit to the maximum supported size (in bytes). + +```json +( + "config": { + ... + "contractSizeLimit": 2147483647, + ... + } + ... +} +``` + +### 3. Start Besu with a minimum gas price of zero + +When starting nodes, set the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) to zero. + + + +# Command Line + +```bash +--min-gas-price=0 +``` + +# Configuration File + +```bash +min-gas-price=0 +``` + + + +# Command Line + +:::danger Important + +In a free gas network, ensure the [minimum gas price](../../../public-networks/reference/cli/options.md#min-gas-price) is set to zero for every node. Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. You can query a node's gas configuration using [`eth_gasPrice`](../../../public-networks/reference/api/index.md#eth_gasprice). + +::: + +### 4. Enable zero base fee if using London fork or later + +If your network is configured to use the `londonBlock` or a later hard fork, then you must also enable the `zeroBaseFee` configuration. You must set this on all your nodes. Once it is set, future blocks produced by that node will set a `baseFee` of 0. This is required because the London hard fork (EIP-1559) introduced a non-zero `baseFee` into the block which normally means transactions require gas. + +```json +{ + "config": { + "londonBlock": 0, + "zeroBaseFee": true, + ... + }, + ... +} +``` + +## Configure free gas in Truffle + +If using Truffle to develop on your free gas network, you also need to configure free gas in Truffle. + +Like setting block and contract size limits to their maximum values for Besu, set the transaction gas limit in Truffle to the maximum possible. + +:::info + +Besu does not support private key management. To use Besu with Truffle, you must configure a [Truffle wallet](../../../public-networks/how-to/develop/truffle.md). + +::: + +### Update `truffle-config.js` + +Update the `truffle-config.js` file: + +1. Set the gas price to zero. + + ```js + gasPrice: 0; + ``` + +1. Set the gas limit for a transaction (that is, contract creation) to be the block gas limit - 1. + + ```js + gas: "0x1ffffffffffffe"; + ``` diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/tls/_category_.json b/versioned_docs/version-stable/private-networks/how-to/configure/tls/_category_.json new file mode 100644 index 00000000000..dbda63e2b5b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/tls/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "TLS", + "position": 6 +} diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/tls/client-and-server.md b/versioned_docs/version-stable/private-networks/how-to/configure/tls/client-and-server.md new file mode 100644 index 00000000000..5ee1722415d --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/tls/client-and-server.md @@ -0,0 +1,119 @@ +--- +title: Client and server TLS +sidebar_position: 1 +tags: + - private networks +--- + +# Configure client and server TLS + +Hyperledger Besu supports TLS for client and server communication. For example, you can configure TLS for communication between [EthSigner](https://docs.ethsigner.consensys.net/en/latest/Concepts/TLS/) and Besu, and Besu and [Tessera](https://docs.tessera.consensys.net/HowTo/Configure/TLS/). + +The following diagram displays an example client and server TLS configuration. + +![Besu client and server TLS](../../../../assets/images/Besu_TLS.png) + +Configure TLS communication from the command line. + +## Prerequisites + +- Besu's password-protected PKCS12 keystore +- File containing the keystore password + +## Configure client TLS + +Allow clients (for example a dapp, curl, or EthSigner) to send and receive secure HTTP JSON-RPCs. + +**Client prerequisites**: + +- [Configure the client for TLS] +- Client's PKCS12 keystore information + +### Create the known clients file + +The known clients file allows clients with self-signed certificates or non-public certificates to connect to Besu. + +Create a file (in this example, `knownClients`) that lists one or more trusted clients. Use the format` ` where: + +- `` is the Common Name specified in the client certificate. +- `` is the SHA-256 fingerprint of the client certificate. + +```bash title="Example" +ethsigner 8E:E0:85:9F:FC:2E:2F:21:31:46:0B:82:4C:A6:88:AB:30:34:9A:C6:EA:4F:04:31:ED:0F:69:A7:B5:C2:2F:A7 +curl FC:18:BF:39:45:45:9A:15:46:76:A6:E7:C3:94:64:B8:34:84:A3:8E:B8:EA:67:DC:61:C0:29:E6:38:B8:B7:99 +``` + +You can use [`openssl`](https://www.openssl.org/) or [`keytool`](https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html) to display the SHA256 fingerprint. + +``` +keytool -list -v -keystore -storetype PKCS12 -storepass `. +``` + +### Start Besu + +```bash +besu --rpc-http-enabled --rpc-http-tls-enabled --rpc-http-tls-client-auth-enabled --rpc-http-tls-keystore-file=/Users/me/my_node/keystore.pfx --rpc-http-tls-keystore-password-file=/Users/me/my_node/keystorePassword --rpc-http-tls-known-clients-file=/Users/me/my_node/knownClients --rpc-http-tls-cipher-suite=TLS_AES_256_GCM_SHA384 --rpc-http-tls-protocol=TLSv1.3,TLSv1.2 +``` + +The command line: + +- Enables the HTTP JSON-RPC service using the [`--rpc-http-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables TLS for the HTTP JSON-RPC service using the [`--rpc-http-tls-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-enabled) option. +- Enables TLS client authentication using the [`--rpc-http-tls-client-auth-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-client-auth-enabled) option. +- Specifies the keystore using the [`--rpc-http-tls-keystore-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-file) option. +- Specifies the file that contains the password to decrypt the keystore using the [`--rpc-http-tls-keystore-password-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-keystore-password-file) option. +- [Specifies the clients](#create-the-known-clients-file) allowed to connect to Besu using the [`--rpc-http-tls-known-clients-file`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-known-clients-file) option. +- specifies the Java cipher suites using the [`--rpc-http-tls-cipher-suite`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-cipher-suite) option. +- specifies the TLS protocol version using the [`--rpc-http-tls-protocol`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-protocol) option. + +:::note + +Set [`--rpc-http-tls-ca-clients-enabled`](../../../../public-networks/reference/cli/options.md#rpc-http-tls-ca-clients-enabled) to `true` to allow access to clients with signed and trusted root CAs. + +::: + +## Configure server TLS + +Allow Besu to securely communicate with the server (Tessera). + +**Server prerequisites**: + +- [Configure the server to allow TLS communication] +- Server's certificate information + +### Create the known servers file + +Create a file (in this example, `knownServers`) that lists one or more trusted servers. The file contents use the format `: ` where: + +- `` is the server hostname +- `` is the port used for communication +- `` is the SHA-256 fingerprint of the server's certificate. + +```bash title="Example" +localhost:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC +127.0.0.1:8888 3C:B4:5A:F9:88:43:5E:62:69:9F:A9:9D:41:14:03:BA:83:24:AC:04:CE:BD:92:49:1B:8D:B2:A4:86:39:4C:AC +``` + +:::note + +If you are unsure whether requests use the hostname or an IP address, configure both in the file. + +::: + +### Start Besu + +```bash +besu --privacy-tls-enabled --privacy-tls-keystore-file=/Users/me/my_node/keystore.pfx --privacy-tls-keystore-password-file=/Users/me/my_node/keystorePassword --privacy-tls-known-enclave-file=/Users/me/my_node/knownServers +``` + +The command line: + +- Enables TLS with the server using the [`--privacy-tls-enabled`](../../../reference/cli/options.md#privacy-tls-enabled) option. +- Specifies the keystore using the [`--privacy-tls-keystore-file`](../../../reference/cli/options.md#privacy-tls-keystore-file) option. +- Specifies the file that contains the password to decrypt the keystore using the [`--privacy-tls-keystore-password-file`](../../../reference/cli/options.md#privacy-tls-keystore-password-file) option. +- Specifies the trusted servers using the [`--privacy-tls-known-enclave-file`](../../../reference/cli/options.md#privacy-tls-known-enclave-file) option. + + + +[Configure the client for TLS]: https://docs.ethsigner.consensys.net/en/latest/HowTo/Configure-TLS/#server-tls-connection +[Configure the server to allow TLS communication]: https://docs.tessera.consensys.net/HowTo/Configure/TLS/ diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/tls/p2p.md b/versioned_docs/version-stable/private-networks/how-to/configure/tls/p2p.md new file mode 100644 index 00000000000..3121d25c520 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/tls/p2p.md @@ -0,0 +1,261 @@ +--- +title: Peer-to-peer TLS +sidebar_position: 2 +description: Configure P2P TLS communication +tags: + - private networks +--- + +# Configure P2P TLS + +You can configure TLS to secure the P2P communication between nodes by ensuring only authorized nodes can communicate with each other. Use certificates issued by a trusted authority to connect authorized nodes in the network. + +:::caution + +P2P TLS is an early access feature, and functionality and options may be updated between releases. + +::: + +Besu supports PKCS11, PKCS12, and JKS keystore and truststore types for P2P TLS. + +## Configure P2P TLS + +**Prerequisites**: + +- A configured network. For example, [see steps 1 to 5 in the QBFT tutorial](../../../tutorials/qbft.md). +- Each node requires a keystore that contains the node's certificate and key. +- A truststore containing all the trusted certificates for the network. + +Start Besu and include the following command line options on the required nodes: + +```bash +besu --Xp2p-tls-enabled=true \ +--Xp2p-tls-keystore-type="PKCS12" \ +--Xp2p-tls-keystore-file="keystore" \ +--Xp2p-tls-keystore-password-file="keystore.password" \ +--Xp2p-tls-crl-file="crl2.pem" \ +--Xp2p-tls-truststore-type="JKS" \ +--Xp2p-tls-truststore-file="truststore.jks" \ +--Xp2p-tls-truststore-password-file="truststore_password.txt" +``` + +In the command line: + +- Enable TLS for P2P communication using [`--Xp2p-tls-enabled=true`](#xp2p-tls-enabled). +- Specify the keystore type and keystore file using [`--Xp2p-tls-keystore-type`](#xp2p-tls-keystore-type) and [`--Xp2p-tls-keystore-file`](#xp2p-tls-keystore-file). +- Specify the text file containing the password to unlock the keystore file using [`--Xp2p-tls-keystore-password-file`](#xp2p-tls-keystore-password-file). +- Specify the optional [certificate revocation list (CRL)] file using [`--Xp2p-tls-crl-file`](#xp2p-tls-crl-file). +- Specify the truststore type and truststore file using [`--Xp2p-tls-truststore-type`](#xp2p-tls-truststore-type) and [`--Xp2p-tls-truststore-file`](#xp2p-tls-truststore-file). +- Specify the text file containing the password to unlock the truststore file using [`--Xp2p-tls-truststore-password-file`](#xp2p-tls-keystore-password-file). + +## Command line options + +### `Xp2p-tls-crl-file` + + + +# Syntax + +```bash +--Xp2p-tls-crl-file= +``` + +# Example + +```bash +--Xp2p-tls-crl-file=/home/cert/cert.crl.pem +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_CRL_FILE=/home/cert/cert.crl.pem +``` + + + +Path to the optional certificate revocation list (CRL) file. + +### `Xp2p-tls-enabled` + + + +# Syntax + +```bash +--Xp2p-tls-enabled[=] +``` + +# Example + +```bash +--Xp2p-tls-enabled=true +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_ENABLED=true +``` + + + +Enable TLS for P2P communication. The default is `false`. + +### `Xp2p-tls-keystore-file` + + + +# Syntax + +```bash +--Xp2p-tls-keystore-file= +``` + +# Example + +```bash +--Xp2p-tls-keystore-file=/home/cert/keystore.jks +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_KEYSTORE_FILE=/home/cert/keystore.jks +``` + + + +Keystore file containing the key and certificate to allow TLS for P2P communication. + +### `Xp2p-tls-keystore-password-file` + + + +# Syntax + +```bash +--Xp2p-tls-keystore-password-file= +``` + +# Example + +```bash +--Xp2p-tls-keystore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_KEYSTORE_PASSWORD_FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the keystore file. + +### `Xp2p-tls-keystore-type` + + + +# Syntax + +```bash +--Xp2p-tls-keystore-type= +``` + +# Example + +```bash +--Xp2p-tls-keystore-type=JKS +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_KEYSTORE_TYPE=JKS +``` + + + +Keystore type that allows TLS for P2P communication. Valid options are `JKS`, `PKCS11`, and `PKCS12`. The default is `JKS`. + +### `Xp2p-tls-truststore-file` + + + +# Syntax + +```bash +--Xp2p-tls-truststore-file= +``` + +# Example + +```bash +--Xp2p-tls-truststore-file=/home/cert/truststore.jks +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_TRUSTSTORE_FILE=/home/cert/truststore.jks +``` + + + +Truststore containing the trusted certificates that allows TLS for P2P communication. + +### `Xp2p-tls-truststore-password-file` + + + +# Syntax + +```bash +--Xp2p-tls-truststore-password-file= +``` + +# Example + +```bash +--Xp2p-tls-truststore-password-file=/home/cert/password.txt +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_TRUSTSTORE_PASSWORD_FILE=/home/cert/password.txt +``` + + + +Text file containing the password to unlock the truststore file. + +### `Xp2p-tls-truststore-type` + + + +# Syntax + +```bash +--Xp2p-tls-truststore-type= +``` + +# Example + +```bash +--Xp2p-tls-truststore-type=JKS +``` + +# Environment variable + +```bash +BESU_XP2P_TLS_TRUSTSTORE_TYPE=JKS +``` + + + +Truststore type. Valid options are `JKS`, `PKCS11`, and `PKCS12`. The default is `JKS`. + +[certificate revocation list (CRL)]: https://www.securew2.com/blog/certificate-revocation-crl-explained diff --git a/versioned_docs/version-stable/private-networks/how-to/configure/validators.md b/versioned_docs/version-stable/private-networks/how-to/configure/validators.md new file mode 100644 index 00000000000..0a5be8501e4 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/configure/validators.md @@ -0,0 +1,40 @@ +--- +title: Validators +description: Configuring validators in production networks +sidebar_position: 4 +tags: + - private networks +--- + +# Configure validators in a production network + +As when [configuring bootnodes](bootnodes.md): + +1. Create the [node key pair](../../../public-networks/concepts/node-keys.md) (that is, the private and public key) before starting the validator. +1. When creating validators in the cloud (for example, AWS or Azure), attempt to assign static IP addresses to them. If your network is: + + - Publicly accessible, assign an elastic IP address. + - Internal only, specify a private IP address when you create the instance and record this IP address. + +We recommend storing validator configuration under source control. + +## Number of validators required + +Ensure you configure enough validators to allow for redundancy. IBFT 2.0 tolerates `f = (n-1)/3` faulty validators, where: + +- `f` is the number of faulty validators +- `n` is the number of validators. + +## Adding and removing validators + +You can [vote validators in or out of the validator pool]. + +## Validators as bootnodes + +Validators can also be bootnodes. Other than the [usual configuration for bootnodes](bootnodes.md), you do not need to specify any extra configuration when a validator is also a bootnode. + +If you remove a validator that is also a bootnode, ensure there are enough remaining bootnodes on the network. + + + +[vote validators in or out of the validator pool]: consensus/ibft.md#add-and-remove-validators diff --git a/versioned_docs/version-stable/private-networks/how-to/deploy/_category_.json b/versioned_docs/version-stable/private-networks/how-to/deploy/_category_.json new file mode 100644 index 00000000000..5befebd2362 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/deploy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy for production", + "position": 6 +} diff --git a/versioned_docs/version-stable/private-networks/how-to/deploy/ansible.md b/versioned_docs/version-stable/private-networks/how-to/deploy/ansible.md new file mode 100644 index 00000000000..c8b9b82d5c1 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/deploy/ansible.md @@ -0,0 +1,19 @@ +--- +sidebar_position: 2 +title: Use Ansible +description: Deploying Hyperledger Besu with Ansible role on Galaxy +tags: + - private networks +--- + +# Deploy Besu with Ansible + +To deploy Besu using Ansible, use the [Hyperledger Besu role](https://galaxy.ansible.com/consensys/hyperledger_besu) published on Galaxy. + +For more information, see the "Read Me" button on the [Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). + +:::tip + +We strongly recommend automating network creation. Automating makes updates easier and ensures your configuration is synchronized across the network. + +::: diff --git a/versioned_docs/version-stable/private-networks/how-to/deploy/cloud.md b/versioned_docs/version-stable/private-networks/how-to/deploy/cloud.md new file mode 100644 index 00000000000..d3d6b36a97c --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/deploy/cloud.md @@ -0,0 +1,16 @@ +--- +title: Deploy to the cloud +sidebar_position: 1 +description: Deploying Besu to the cloud +tags: + - private networks +--- + +# Deploy Besu to the cloud + +When deploying Besu to the cloud: + +- Ensure you have enough spread across Availability Zones (AZs) and Regions, especially for bootnodes and validators. +- If your network is a multi-region network, consider using VPC Peering to reduce latency. +- Where required, use VPNs to connect to your on premise systems, or single private chains. +- If deploying to Kubernetes, please refer to the [tutorial](../../tutorials/kubernetes/index.md). diff --git a/versioned_docs/version-stable/private-networks/how-to/deploy/ethstats.md b/versioned_docs/version-stable/private-networks/how-to/deploy/ethstats.md new file mode 100644 index 00000000000..a8a48610cc7 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/deploy/ethstats.md @@ -0,0 +1,55 @@ +--- +sidebar_position: 4 +title: Use Ethstats network monitor +description: Ethstats network monitor +tags: + - private networks +--- + +# Connect to Ethstats network monitor + +Connect to [Ethstats](https://ethstats.dev) to display real time and historical [statistics](#statistics) about the network and nodes. You can connect to the Ethstats dashboard by [connecting to a client and server](#connect-through-a-client-and-server) or by [connecting through the command line](#connect-through-the-command-line). + +## Components + +Ethstats consists of: + +- A [server](https://github.com/goerli/ethstats-server), which consumes node data received from the client. +- A [client](https://github.com/goerli/ethstats-client), which extracts data from the node and sends it to the server. +- A [dashboard](https://github.com/goerli/ethstats-client#available-dashboards), which displays statistics. + +## Statistics + +Statistics displayed by Ethstats include: + +- Nodes in the network. Metrics for nodes include: + - Information about the last received block such as block number, block hash, transaction count, uncle count, block time, and propagation time. + - Connected peers, whether the node is mining, hash rate, latency, and uptime. +- Charts for block time, block difficulty, block gas limit, block uncles, block transactions, block gas used, block propagation histogram, and top miners. +- IP-based geolocation overview. +- Node logs, which display the data sent by a node. +- Block history, which provides the ability to go back in time and playback the block propagation through the nodes. + +## Connect through a client and server + +Refer to the external [Ethstats client](https://github.com/goerli/ethstats-client) and [Ethstats server](https://github.com/goerli/ethstats-server) documentation for installing those components and connecting to a dashboard. + +## Connect through the command line + +You can use command line options to connect a node directly to a [dashboard](https://github.com/goerli/ethstats-client#available-dashboards), without using a client. + +Start a node using the [`--ethstats`](../../../public-networks/reference/cli/options.md#ethstats) option to specify the Ethstats server URL. You can specify a contact email to send to the server using [`--ethstats-contact`](../../../public-networks/reference/cli/options.md#ethstats-contact). + +```bash +besu --ethstats=Dev-Node-1:secret@127.0.0.1:3001 --ethstats-contact=contact@mail.com +``` + +:::note + +A server must be specified by `--ethstats` in order to use `--ethstats-contact`. + +::: + +Open the selected dashboard website. Find your node under the list of nodes to see the statistics for the node and the network. + +![dashboard](../../../assets/images/dashboard.png) diff --git a/versioned_docs/version-stable/private-networks/how-to/deploy/kubernetes.md b/versioned_docs/version-stable/private-networks/how-to/deploy/kubernetes.md new file mode 100644 index 00000000000..fe1a95bec41 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/deploy/kubernetes.md @@ -0,0 +1,13 @@ +--- +sidebar_position: 3 +title: Use Kubernetes +description: Deploying Hyperledger Besu with Kubernetes +tags: + - private networks +--- + +# Deploy Besu with Kubernetes + +Use the [reference implementations](https://github.com/ConsenSys/quorum-kubernetes) to install private networks using Kubernetes (K8s). The repository has full support for cloud providers like AWS, Azure, GCP, and IBM, and has production setups that use of identities and cloud-native secret storage services like Azure KeyVault and AWS Secrets Manager. + +Refer to the [tutorial](../../tutorials/kubernetes/index.md) and familiarize yourself with the reference implementations, and customize them to your requirements. diff --git a/versioned_docs/version-stable/private-networks/how-to/index.md b/versioned_docs/version-stable/private-networks/how-to/index.md new file mode 100644 index 00000000000..ae5ae0ada06 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/index.md @@ -0,0 +1,37 @@ +--- +description: Private networks how to overview +tags: + - private networks +--- + +# How to + +This section provides instructional content for private network features. + +The following features are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: + +- Configure and manage: + - [Use a configuration file](../../public-networks/how-to/configuration-file.md) + - [Configure high availability](../../public-networks/how-to/configure-ha/index.md) + - [Configure mining](../../public-networks/how-to/use-pow/mining.md) +- [Use the Besu API](../../public-networks/how-to/use-besu-api/index.md): + - [Use JSON-RPC over HTTP, WS, and IPC](../../public-networks/how-to/use-besu-api/json-rpc.md) + - [Use RPC Pub/Sub over WS](../../public-networks/how-to/use-besu-api/rpc-pubsub.md) + - [Use GraphQL over HTTP](../../public-networks/how-to/use-besu-api/graphql.md) + - [Authenticate JSON-RPC requests](../../public-networks/how-to/use-besu-api/authenticate.md) + - [Access logs using JSON-RPC API](../../public-networks/how-to/use-besu-api/access-logs.md) +- Find and connect to peers: + - [Configure static nodes](../../public-networks/how-to/connect/static-nodes.md) + - [Configure ports](../../public-networks/how-to/connect/configure-ports.md) + - [Manage peers](../../public-networks/how-to/connect/manage-peers.md) + - [Specify NAT method](../../public-networks/how-to/connect/specify-nat.md) +- [Configure the Java Virtual Machine](../../public-networks/how-to/configure-jvm/index.md) + - [Pass JVM options](../../public-networks/how-to/configure-jvm/pass-jvm-options.md) + - [Manage JVM memory](../../public-networks/how-to/configure-jvm/manage-memory.md) + - [Use Java Flight Recorder](../../public-networks/how-to/configure-jvm/java-flight-recorder.md) +- Develop dapps: + - [Use Truffle](../../public-networks/how-to/develop/truffle.md) + - [Use client libraries](../../public-networks/how-to/develop/client-libraries.md) +- Troubleshoot: + - [Use EVM tool](../../public-networks/how-to/troubleshoot/evm-tool.md) + - [Trace transactions](../../public-networks/how-to/troubleshoot/trace-transactions.md) diff --git a/versioned_docs/version-stable/private-networks/how-to/monitor/_category_.json b/versioned_docs/version-stable/private-networks/how-to/monitor/_category_.json new file mode 100644 index 00000000000..8e8c27af9a7 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/monitor/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Monitor nodes", + "position": 3 +} diff --git a/versioned_docs/version-stable/private-networks/how-to/monitor/elastic-stack.md b/versioned_docs/version-stable/private-networks/how-to/monitor/elastic-stack.md new file mode 100644 index 00000000000..b74dd929dfd --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/monitor/elastic-stack.md @@ -0,0 +1,35 @@ +--- +title: Use Elastic Stack +sidebar_position: 3 +description: Using Elastic Stack (ELK) with Hyperledger Besu +tags: + - private networks +--- + +# Use Elastic Stack + +[Elastic Stack] (ELK) is an open-source log management platform that is available when using the [Developer Quickstart](../../tutorials/quickstart.md). + +The [Filebeat] configuration ingests logs and the [Metricbeat] configuration collects metrics from the nodes at regular defined intervals and outputs them to Redis for storage. Redis provides a highly available mechanism enabling storage by any of the Elastic Beats and pulled by Logstash as required. + +The [pipeline configuration] defines the JSON format used for Besu logs and automatically picks up any new log fields. + +:::note + +The pipeline configuration must match the your log format. If using the default log format, you can use the [grok plugin](https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html) to extract the log fields. + +::: + +To see the Besu Quickstart network logs in Kibana: + +1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting ELK monitoring. +1. Open the [`Kibana logs address`](http://localhost:5601/app/kibana#/discover) listed by the sample networks `list.sh` script. The logs display in Kibana. + + ![Kibana](../../../assets/images/KibanaQuickstart.png) + + + +[Filebeat]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/filebeat/filebeat.yml +[Metricbeat]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/metricbeat/metricbeat.yml +[pipeline configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/common/logstash/pipeline/20_besu.conf +[Elastic Stack]: https://www.elastic.co/what-is/elk-stack diff --git a/versioned_docs/version-stable/private-networks/how-to/monitor/index.md b/versioned_docs/version-stable/private-networks/how-to/monitor/index.md new file mode 100644 index 00000000000..8dae03bb8ee --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/monitor/index.md @@ -0,0 +1,20 @@ +--- +description: Monitoring using metrics and logging +tags: + - private networks +--- + +# Monitoring + +Use monitoring to identify node and network issues. In private networks, you can [configure metrics and logging](../../../public-networks/how-to/monitor/index.md) as in public networks. + +You can also use the following monitoring tools in private networks: + +- [Loki](loki.md) +- [Elastic Stack](elastic-stack.md) +- [Quorum Hibernate](quorum-hibernate.md) +- [Splunk](splunk.md) +- [OpenTelemetry](opentelemetry.md) +- [Sirato Explorer](sirato-explorer.md) + +For an overview of monitoring Hyperledger Besu, view [this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). diff --git a/versioned_docs/version-stable/private-networks/how-to/monitor/loki.md b/versioned_docs/version-stable/private-networks/how-to/monitor/loki.md new file mode 100644 index 00000000000..eabe6f0667b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/monitor/loki.md @@ -0,0 +1,37 @@ +--- +title: Use Grafana Loki +sidebar_position: 2 +description: Using Grafana Loki log management platform with Hyperledger Besu +tags: + - private networks +--- + +# Grafana Loki + +[Grafana Loki] is an open-source log management platform that is available when using the [Developer Quickstart](../../tutorials/quickstart.md). + +The [Promtail configuration] ingests logs at regular defined intervals and outputs them to [Loki] for storage. + +The `pipeline configuration` in Promtail defines pipeline stages that can collate logs natively or using the JSON format. + +:::note + +If using the pipeline regex stage in `Promtail`, configuration must match your log format. + +::: + +To view the GoQuorum Quickstart network logs in Loki: + +1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting Loki monitoring. +2. Open the [`Grafana Loki address`](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=&from=now-15m&to=now) listed by the sample networks `list.sh` script. + + The logs display in Loki. + + ![Loki logs](../../../assets/images/grafana_loki.png) + + + +[Promtail configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/promtail/promtail.yml +[pipeline configuration]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/promtail/promtail.yml +[Loki]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/master/files/common/loki/loki.yml +[Grafana Loki]: https://grafana.com/oss/loki/ diff --git a/versioned_docs/version-stable/private-networks/how-to/monitor/opentelemetry.md b/versioned_docs/version-stable/private-networks/how-to/monitor/opentelemetry.md new file mode 100644 index 00000000000..185b61da3d5 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/monitor/opentelemetry.md @@ -0,0 +1,176 @@ +--- +title: Use OpenTelemetry +sidebar_position: 6 +description: Collect Besu information with the OpenTelemetry Collector +tags: + - private networks +--- + +# Use OpenTelemetry + +You can use the OpenTelemetry monitoring and tracing service to gather node metrics and traces. To enable OpenTelemetry to access Hyperledger Besu, use the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) and [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. Use [Splunk](https://splunk.com) to visualize the collected data. A [Besu Sync example](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu-sync) is available. + +:::tip + +Use OpenTelemetry to monitor the sync time of your Besu node and show where time is spent internally and over the JSON-RPC interface. + +[This office hours recording](https://wiki.hyperledger.org/display/BESU/2021-01-19+Office+Hours+Notes) shows examples of monitoring Hyperledger Besu. + +::: + +## Install OpenTelemetry Collector + +Download and install the [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases). + +:::tip + +You can also install exporters that send system metrics to OpenTelemetry to monitor non-Besu-specific items such as disk and CPU usage. The OpenTelemetry Collector can connect to additional applications, and may be deployed in Kubernetes environments as a daemonset. + +::: + +## Setting up and running OpenTelemetry with Besu + +1. Configure OpenTelemetry to accept data from Besu. For example, use the following configuration for your `otel-collector-config.yml` file, and send data to Splunk and Splunk APM: + + ```yml title="otel-collector-config.yml" + receivers: + otlp: + protocols: + grpc: + http: + + exporters: + splunk_hec/traces: + # Splunk HTTP Event Collector token. + token: "11111111-1111-1111-1111-1111111111113" + # URL to a Splunk instance to send data to. + endpoint: "https://:8088/services/collector" + # Optional Splunk source: https://docs.splunk.com/Splexicon:Source + source: "besu:traces" + # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype + sourcetype: "otlp" + # Splunk index, optional name of the Splunk index targeted. + index: "traces" + # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. + max_connections: 20 + # Whether to disable gzip compression over HTTP. Defaults to false. + disable_compression: false + # HTTP timeout when sending data. Defaults to 10s. + timeout: 10s + # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. + # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. + insecure_skip_verify: true + splunk_hec/metrics: + # Splunk HTTP Event Collector token. + token: "11111111-1111-1111-1111-1111111111113" + # URL to a Splunk instance to send data to. + endpoint: "https://:8088/services/collector" + # Optional Splunk source: https://docs.splunk.com/Splexicon:Source + source: "besu:metrics" + # Optional Splunk source type: https://docs.splunk.com/Splexicon:Sourcetype + sourcetype: "prometheus" + # Splunk index, optional name of the Splunk index targeted. + index: "metrics" + # Maximum HTTP connections to use simultaneously when sending data. Defaults to 100. + max_connections: 20 + # Whether to disable gzip compression over HTTP. Defaults to false. + disable_compression: false + # HTTP timeout when sending data. Defaults to 10s. + timeout: 10s + # Whether to skip checking the certificate of the HEC endpoint when sending data over HTTPS. Defaults to false. + # For this demo, we use a self-signed certificate on the Splunk docker instance, so this flag is set to true. + insecure_skip_verify: true + # Traces + sapm: + access_token: "${SPLUNK_ACCESS_TOKEN}" + endpoint: "https://ingest.${SPLUNK_REALM}.signalfx.com/v2/trace" + # Metrics + Events + signalfx: + access_token: "${SPLUNK_ACCESS_TOKEN}" + realm: "${SPLUNK_REALM}" + + processors: + batch: + + extensions: + health_check: + pprof: + zpages: + + service: + extensions: [pprof, zpages, health_check] + pipelines: + traces: + receivers: [otlp] + exporters: [splunk_hec/traces, sapm] + processors: [batch] + metrics: + receivers: [otlp] + exporters: [splunk_hec/metrics, signalfx] + processors: [batch] + ``` + + It is easiest to run the OpenTelemetry collector with Docker with the following command: + + + + # Syntax + + ```bash + docker run -d \ + -v ./otel-collector-config.yml:/etc/otel/config.yaml \ + -e SPLUNK_ACCESS_TOKEN= \ + -e SPLUNK_REALM= \ + -p 4317:4317 \ + otel/opentelemetry-collector-contrib:latest + ``` + + # Example + + ```bash + docker run -d \ + -v ./otel-collector-config.yml:/etc/otel/config.yaml \ + -e SPLUNK_ACCESS_TOKEN=abcdefg654 \ + -e SPLUNK_REALM=us1 \ + -p 4317:4317 \ + otel/opentelemetry-collector-contrib:latest + ``` + + + + You can also refer to this [Docker-compose example](https://github.com/splunk/splunk-connect-for-ethereum/blob/989dc2ccae7d8235bf3ce2a83a18cf0cd1713294/examples/besu-sync/full-sync/docker-compose.yaml). + +2. Start Besu with the [`--metrics-enabled`](../../../public-networks/reference/cli/options.md#metrics-enabled) and [`--metrics-protocol=opentelemetry`](../../../public-networks/reference/cli/options.md#metrics-protocol) options. For example, run the following command to start a single node: + + + + # Syntax + + ```bash + OTEL_EXPORTER_OTLP_ENDPOINT=https://: besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry + ``` + + # Example + + ```bash + OTEL_EXPORTER_OTLP_ENDPOINT=https://localhost:4317 besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled --metrics-protocol=opentelemetry + ``` + + + + The [OpenTelemetry SDK](https://github.com/open-telemetry/opentelemetry-specification/blob/8f7cdb73618a0b3afa9532b8f8103d719e352781/specification/sdk-environment-variables.md) mandates how to configure the OpenTelemetry gRPC client, so data flows to the collector from Besu. + + You can use the following environment variables: + + | Name | Description | Required | + | --- | --- | --- | + | OTEL_EXPORTER_OTLP_ENDPOINT | OpenTelemetry Collector endpoint, of the form `https://host:port`. The default value is `https://localhost:4317` | Yes | + | OTEL_EXPORTER_OTLP_INSECURE | Whether to allow insecure connections for OpenTelemetry data. False by default. | No | + + + +[Monitoring Besu synchronization to chain with Splunk]: https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu-sync + + + +\*[APM]: Application Performance Monitoring diff --git a/versioned_docs/version-stable/private-networks/how-to/monitor/quorum-hibernate.md b/versioned_docs/version-stable/private-networks/how-to/monitor/quorum-hibernate.md new file mode 100644 index 00000000000..2d6b6139db0 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/monitor/quorum-hibernate.md @@ -0,0 +1,20 @@ +--- +title: Use Quorum Hibernate +sidebar_position: 4 +description: Use Quorum Hibernate with Hyperledger Besu +tags: + - private networks +--- + +# Use Quorum Hibernate + +[Quorum Hibernate] is a proxy that monitors a node's API traffic and hibernates the node when inactive. This reduces infrastructure costs by ensuring only nodes receiving API requests or nodes required to establish consensus are running. + +Quorum Hibernate wakes up hibernating nodes: + +- When a new transaction or API request is received. +- To allow it to periodically sync with the network. + + + +[Quorum Hibernate]: https://github.com/ConsenSys/quorum-hibernate diff --git a/versioned_docs/version-stable/private-networks/how-to/monitor/sirato-explorer.md b/versioned_docs/version-stable/private-networks/how-to/monitor/sirato-explorer.md new file mode 100644 index 00000000000..0b197267531 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/monitor/sirato-explorer.md @@ -0,0 +1,125 @@ +--- +title: Use Sirato Explorer +sidebar_position: 7 +description: Use Sirato Explorer on a privacy-enabled Besu network +tags: + - private networks +--- + +# Use Sirato Blockchain Explorer + +[Sirato Blockchain Explorer](https://www.web3labs.com/sirato) supports public and private EVM networks. This page describes how to use the free version of Sirato with its built-in support for [privacy-enabled](../../concepts/privacy/index.md) Besu networks created using the [Developer Quickstart](../../tutorials/quickstart.md). + +Sirato provides an overview of the entire network, including block information, contract metadata, transaction searches, and [more](https://medium.com/web3labs/epirus-ethereum-saas-blockchain-explorer-d5d961717d15). + +:::note + +You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, in order to allow access for Besu [privacy API methods](../../reference/api/index.md#priv-methods). In production networks, you must [secure access](../../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. + +::: + +## Prerequisites + +[Docker and Docker Compose](https://docs.docker.com/compose/install/) installed. + +## Start Sirato + +Clone the [Sirato GitHub repository](https://github.com/web3labs/sirato-free): + +```bash +git clone https://github.com/web3labs/sirato-free +``` + +The repository contains Docker Compose scripts to allow Sirato to start with a Developer Quickstart test network. + +From the Sirato directory, run the following script: + + + +# Command + +```bash +./start_sirato_besu.sh +``` + +# Result + +```bash +************************************* +Sirator Explorer for Besu +************************************* +Starting explorer +-------------------- +[+] Running 5/5 + â ŋ Container docker-compose-mongodb-1 Started 3.3s + â ŋ Container docker-compose-api-1 Started 4.1s + â ŋ Container docker-compose-ingestion-1 Started 4.2s + â ŋ Container docker-compose-web-1 Started 4.4s + â ŋ Container docker-compose-nginx-1 Started 5.0s +---------------------------------- +Services +---------------------------------- +Sirato explorer HTTP endpoint : http://localhost:260012 +Sirato is connected to node : http://rpcnode:8545 +``` + + + +Open `http://localhost/` on your browser. You’ll see the new initialization page while it boots up. This may take 5–10 minutes for the all services to start and the ingestion sync to complete. + +![`Sirato-dashboard`](../../../assets/images/sirato-loading.png) + +## Use Sirato + +The **Dashboard** page provides an aggregated view of network activities. + +![`Epirus-dashboard`](../../../assets/images/sirato-dashboard.png) + +The **Network** page provides an overview of the network status and connected peers. This page is disabled by default, and is only visible if you set `DISPLAY_NETWOR_TAB=enabled` using the following command: + +```bash +NODE_ENDPOINT=http://member1besu:8545 DISPLAY_NETWORK_TAB=enabled docker-compose -f docker-compose.yml -f sirato-extensions/docker-compose-quorum-dev-quickstart.yml up +``` + +![Sirato network](../../../assets/images/sirato-network.png) + +The **Blocks** page shows a real-time view of the finalized blocks. + +![Sirato blocks](../../../assets/images/sirato-blocks.png) + +You can view a given block details by selecting a block hash or number. + +![Sirato block details](../../../assets/images/sirato-block-details.png) + +The **Transactions** page shows a paginated view of new and historical transactions. + +![Sirato transactions](../../../assets/images/sirato-transactions.png) + +## Stop Sirato + +To stop all the services from running, run the following script: + + + +# Command + +```bash +./stop.sh +``` + +# Result + +```bash +************************************* +Sirator Explorer for Besu +************************************* +Stopping explorer +[+] Running 5/5 + â ŋ Container docker-compose-nginx-1 Stopped 0.5s + â ŋ Container docker-compose-ingestion-1 Stopped 4.0s + â ŋ Container docker-compose-web-1 Stopped 10.3s + â ŋ Container docker-compose-api-1 Stopped 2.9s + â ŋ Container docker-compose-mongodb-1 Stopped +``` + + diff --git a/versioned_docs/version-stable/private-networks/how-to/monitor/splunk.md b/versioned_docs/version-stable/private-networks/how-to/monitor/splunk.md new file mode 100644 index 00000000000..2b749536740 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/monitor/splunk.md @@ -0,0 +1,192 @@ +--- +title: Use Splunk +sidebar_position: 5 +description: Send Hyperledger Besu logs to Splunk +tags: + - private networks +--- + +# Use Splunk + +[Splunk](https://splunkbase.splunk.com/app/4866/) is a third-party monitoring solution compatible with Besu. A Splunk server can receive Besu logs and enable complex search, visualization, and analysis. + +Splunk can aggregate multiple logs in one place and run complex queries without being connected to the machine running Besu to read the standard output. + +Options for running Splunk and Besu are: + +- [Use Splunk](#use-splunk) + - [Developer Quickstart with Splunk](#developer-quickstart-with-splunk) + - [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose) + - [Requirements](#requirements) + - [Steps](#steps) + - [Use Splunk Enterprise as a Docker container](#use-splunk-enterprise-as-a-docker-container) + - [Prerequisites](#prerequisites) + - [Steps](#steps-1) + - [Run a Splunk Enterprise instance](#run-a-splunk-enterprise-instance) + - [Prerequisites](#prerequisites-1) + - [Steps](#steps-2) + - [Splunk options reference](#splunk-options-reference) + +## Developer Quickstart with Splunk + +To view the Quickstart network logs in Splunk: + +1. [Start the Developer Quickstart with Besu](../../tutorials/quickstart.md), selecting Splunk monitoring. +1. Open the [Splunk UI](http://localhost:8000). + +## Splunk Connect for Ethereum Docker Compose + +To run a development Besu node and connect it to Splunk Enterprise, use the Splunk Connect for Ethereum demonstration Docker Compose environment provided by Splunk. + +### Requirements + +- [Git](https://git-scm.com/) +- [Docker and Docker-compose](https://docs.docker.com/compose/install/) + +:::info + +A Splunk license is not required to use the Splunk Connect for Ethereum demonstration. + +::: + +### Steps + +1. Clone the Splunk Connect for Ethereum repository: + + ```bash + git clone https://github.com/splunk/splunk-connect-for-ethereum.git + cd splunk-connect-for-ethereum + ``` + +1. Start the demonstration environment by following the Splunk Connect for Ethereum repository [README](https://github.com/splunk/splunk-connect-for-ethereum/tree/master/examples/besu). + + :::note + + Splunk enterprise takes some time to start. + + Run `docker ps` and wait for the `STATUS` of the 3 containers to be `Up [number] seconds (healthy)`. + + ``` + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 127600dd1173 splunkdlt/ethlogger:latest "ethlogger" 53 seconds ago Up 51 seconds (healthy) ethlogger + 88dfcee683c4 splunk/splunk:latest "/sbin/entrypoint.shâ€Ļ" 53 seconds ago Up 52 seconds (healthy) 8065/tcp, 8088-8089/tcp, 8191/tcp, 9887/tcp, 9997/tcp, 0.0.0.0:18000->8000/tcp splunk + 111b0c6d6072 hyperledger/besu:1.4.4 "besu" 53 seconds ago Up 52 seconds (healthy) 8545-8547/tcp, 30303/tcp besu + ``` + + ::: + +## Use Splunk Enterprise as a Docker container + +### Prerequisites + +- [Docker](https://docs.docker.com/compose/install/) +- [Besu 1.4.4](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/CHANGELOG.md#144) or later [installed](../../get-started/install/binary-distribution.md) + +:::info + +A Splunk license is not required to use the trial version of the Splunk Docker image. The image is not suitable for production use and has [restrictions on daily log volume](https://www.splunk.com/). + +::: + +:::note + +If running [Besu as a Docker container](../../get-started/install/run-docker-image.md), consider using [Splunk Connect for Ethereum Docker Compose](#splunk-connect-for-ethereum-docker-compose) or [Kubernetes](../deploy/kubernetes.md) instead of the Splunk Enterprise trial container. + +::: + +### Steps + +1. Start the Splunk Enterprise container: + + ```bash + docker run \ + -e SPLUNK_START_ARGS=--accept-license \ + -e SPLUNK_HEC_TOKEN=11111111-1111-1111-1111-1111111111113 \ + -e SPLUNK_PASSWORD=changeme \ + --rm \ + -p8080:8000 -p8088:8088 \ + -d \ + --name splunk-demo \ + splunk/splunk:latest + ``` + + Once the service is started, connect on [`http://localhost:8080/`](http://localhost:8080/) and login as the `admin` user with a password of `changeme`. + + :::tip + + To follow the logs of the Splunk container: + + ```bash + docker logs -f splunk-demo + ``` + + ::: + +2. Create the Besu index: + + 1. In the Splunk Web interface, navigate to the [index list in the settings](http://localhost:8080/en-US/manager/search/data/indexes). + 2. [Create an event index] with an Index Name of `besu`. + 3. Leave other fields with the default values. + 4. Save the `besu` index. + +3. Run Besu. To start a Besu node running in development mode, run the following command: + + ```bash + LOGGER=Splunk \ + SPLUNK_URL=https://localhost:8088 \ + SPLUNK_TOKEN=11111111-1111-1111-1111-1111111111113 \ + SPLUNK_SKIPTLSVERIFY=true \ + besu \ + --network=dev \ + --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 \ + --miner-enabled \ + --logging=trace + ``` + + The environment variables specified send the Besu logs to Splunk. Only `LOGGER`, `SPLUNK_URL`, `SPLUNK_TOKEN` and `SPLUNK_SKIPTLSVERIFY` are required in this example. The complete list of options is in the [Splunk options reference table](#splunk-options-reference). + +4. In the Splunk Web interface, navigate to the [search page](http://localhost:8080/en-US/app/search/search). Type `index="besu"` in the search field. Log events sent by Besu are displayed. + + Congratulations! You can now play with the search and other Splunk features to explore your Besu logs. + + ![Splunk search page](../../../assets/images/splunk-ui.png) + +5. Stop Besu with ++ctrl+c++. Stop the Splunk container with `docker stop splunk-demo`. + +## Run a Splunk Enterprise instance + +### Prerequisites + +- [Splunk Enterprise license](https://www.splunk.com/) +- [Besu 1.4.4](https://github.com/hyperledger/besu/blob/master/CHANGELOG.md#144) or later [installed](../../get-started/install/binary-distribution.md) + +### Steps + +1. Follow the steps in the [Splunk Enterprise documentation](https://docs.splunk.com/Documentation/Splunk/8.0.4/Installation) to download, install, and run Splunk Enterprise. + +1. After logging into the Splunk Enterprise Web interface, navigate to the settings to: + + 1. [Create an HTTP Event Collector](https://docs.splunk.com/Documentation/Splunk/8.0.4/Data/UsetheHTTPEventCollector). + 1. [Create an event index] named `besu`. + +1. Run Besu as in step 3 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). Set the `SPLUNK_URL` value to match the HTTP Event Collector address and port. + + You can display logs and use the search engine as in step 4 in [using Splunk on Docker](#use-splunk-enterprise-as-a-docker-container). + +## Splunk options reference + +| Name | Description | Required | +| --- | --- | --- | +| LOGGER | Set to `Splunk` to activate sending logs to Splunk. | Yes | +| HOST | Current host. If in a Docker environment, the default value is the docker container ID. Otherwise, the default value is `localhost`. | No | +| SPLUNK_URL | URL of the Splunk HTTP Event Collector. For example, use `https://localhost:8088` | Yes | +| SPLUNK_TOKEN | Authentication token, usually of the form `11111111-1111-1111-1111-111111111111` | Yes | +| SPLUNK_INDEX | [Index](https://docs.splunk.com/Splexicon:Index) to store logs. Defaults to `besu` | No | +| SPLUNK_SOURCE | [Source of the logs](https://docs.splunk.com/Splexicon:Source). Defaults to `besu` | No | +| SPLUNK_SOURCETYPE | [Source type of the logs](https://docs.splunk.com/Splexicon:Sourcetype). Defaults to `besu` | No | +| SPLUNK_BATCH_SIZE_BYTES | Size of a log batch in bytes. Defaults to `65536` | No | +| SPLUNK_BATCH_SIZE_COUNT | Size of a log batch in number of events. Defaults to `1000` | No | +| SPLUNK_BATCH_INTERVAL | Interval at which to send log batches. Defaults to `500` | No | +| SPLUNK_SKIPTLSVERIFY | Whether to check the Splunk instance TLS certificate when sending data. Defaults to `false` | No | + +[Create an event index]: https://docs.splunk.com/Documentation/Splunk/8.0.4/Indexer/Setupmultipleindexes#Create_events_indexes diff --git a/versioned_docs/version-stable/private-networks/how-to/send-transactions/_category_.json b/versioned_docs/version-stable/private-networks/how-to/send-transactions/_category_.json new file mode 100644 index 00000000000..a663c5c6ed7 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/send-transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create and send transactions", + "position": 2 +} diff --git a/versioned_docs/version-stable/private-networks/how-to/send-transactions/concurrent-private-transactions.md b/versioned_docs/version-stable/private-networks/how-to/send-transactions/concurrent-private-transactions.md new file mode 100644 index 00000000000..a1fb71eb48a --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/send-transactions/concurrent-private-transactions.md @@ -0,0 +1,37 @@ +--- +title: Send concurrent private transactions +description: Creating and sending concurrent private transactions with Hyperledger Besu +sidebar_position: 2 +tags: + - private networks +--- + +# Send concurrent private transactions + +Private transaction processing involves two transactions, the private transaction and the [privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md). The private transaction and the PMT each have their own [nonce](../../concepts/privacy/private-transactions/index.md#nonces). + +If your private transaction rate requires sending private transactions without waiting for the previous private transaction to be mined, using [`eth_getTransactionCount`](../../../public-networks/reference/api/index.md#eth_gettransactioncount) and [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) may result in [incorrect nonces](../../concepts/privacy/private-transactions/index.md#private-nonce-management). + +In this case, use [`priv_distributeRawTransaction`](private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +:::note + +You can use [`priv_getTransactionCount`](../../reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../reference/api/index.md#priv_geteeatransactioncount) to get the nonce for an account for the specified privacy group or participants. + +::: + +Send the corresponding PMT using [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), specifying the public PMT nonce. This method allows you to create and send the PMT yourself rather than [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) handling the PMT. + +:::caution + +When using `priv_distributeRawTransaction` to distribute transactions with consecutive nonces for the same account, the corresponding PMTs must use one account with the nonces in the same order as the private transactions. + +This is to ensure that the private transactions are executed in the correct order. + +::: + +:::info + +The [web3js-quorum library](https://github.com/ConsenSys/web3js-quorum/tree/master/example/concurrentPrivateTransactions) includes an example of how to send concurrent private transactions. The example uses [offchain privacy groups](../../concepts/privacy/privacy-groups.md). Use [`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress) to get the precompile address to specify in the `to` field when creating the PMT. + +::: diff --git a/versioned_docs/version-stable/private-networks/how-to/send-transactions/index.md b/versioned_docs/version-stable/private-networks/how-to/send-transactions/index.md new file mode 100644 index 00000000000..3f9920a3d31 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/send-transactions/index.md @@ -0,0 +1,16 @@ +--- +title: Create and send transactions +description: private networks send transactions overview +tags: + - private networks +--- + +# Create and send transactions + +In private networks, you can create and [send regular transactions](../../../public-networks/how-to/send-transactions.md) as in public networks. + +You can also: + +- [Send private transactions](private-transactions.md). +- [Send concurrent private transactions](concurrent-private-transactions.md). +- [Include revert reason in transactions](revert-reason.md). diff --git a/versioned_docs/version-stable/private-networks/how-to/send-transactions/private-transactions.md b/versioned_docs/version-stable/private-networks/how-to/send-transactions/private-transactions.md new file mode 100644 index 00000000000..cdeb49aec37 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/send-transactions/private-transactions.md @@ -0,0 +1,142 @@ +--- +title: Create and send private transactions +description: Creating and sending private transactions with Hyperledger Besu +sidebar_position: 1 +tags: + - private networks +--- + +# Create and send private transactions + +Create and send [private transactions](../../concepts/privacy/index.md) using: + +- [web3js-quorum client library](../use-privacy/web3js-quorum.md) or [web3j client library](https://github.com/web3j/web3j) +- [`eea_sendTransaction` with EthSigner](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction) +- [`eea_sendRawTransaction`](#eea_sendrawtransaction) +- [`priv_distributeRawTransaction`](#priv_distributerawtransaction). + +All private transaction participants must be online for a private transaction to be successfully distributed. If any participants are offline when submitting the private transaction, the transaction is not attempted and you must resubmit the transaction. + +The `gas` and `gasPrice` specified when sending a private transaction are used by the [privacy marker transaction (PMT)](../../concepts/privacy/private-transactions/processing.md), not the private transaction itself. + +:::note + +Private transactions either deploy contracts or call contract functions. Ether transfer transactions cannot be private. + +::: + +## eea_sendRawTransaction + +[`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) distributes the private transaction to the participating nodes, and signs and submits the PMT, as described in [Private transaction processing](../../concepts/privacy/private-transactions/processing.md). + +:::note + +If [sending concurrent transactions](concurrent-private-transactions.md), you must use [`priv_distributeRawTransaction`](#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +::: + +## priv_distributeRawTransaction + +Use [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction) when sending [concurrent private transactions](concurrent-private-transactions.md). + +[`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) distributes the private transaction to the participating nodes but does not sign and submit the PMT. That is, it performs steps 1 to 5 of [private transaction processing](../../concepts/privacy/private-transactions/processing.md). + +If using [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction), use the value returned by [`priv_distributeRawTransaction`](../../reference/api/index.md#priv_distributerawtransaction), which is the enclave key to the private transaction in [Tessera](https://docs.tessera.consensys.net/), in the `data` field of a call to [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction). Use the value returned by [`priv_getPrivacyPrecompileAddress`](../../reference/api/index.md#priv_getprivacyprecompileaddress), which is the address of the [privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md), in the `to` field of the call. + +By using the [public Ethereum transaction](../../how-to/send-transactions/index.md), [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction), you are signing and submitting the PMT yourself instead of having it signed by the Besu node, giving you greater control over the PMT. + +:::warning + +If the PMT is not sent after distributing the private transaction, the distributed private transaction is not executed and the private states are not updated. + +::: + +```json title="Distribute private transaction using priv_distributeRawTransaction" +{ + "jsonrpc": "2.0", + "method": "priv_distributeRawTransaction", + "params": [ + "0xf90198808203e8832dc6c08080b8fb608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c003600291ba05393543d483654fd01d9ee818cddfc7527dd6e13e6ef7b45a61e2ca13ffb6b70a0452338873862803ffe04056aea98cd0e3417ff971dcb384e54fce8ca1756a665a09de8260dc3763f8383a6a9ffe96909d36cd3ff4c346e3846a6467c50feaf0119e1a0839f41993789227ec721c9eaf1541683287fa436ef6edd9ec8fd088bad1a0c3c8a72657374726963746564" + ], + "id": 1 +} +``` + +```json title="Enclave key to the private transaction in Tessera returned by priv_distributeRawTransaction" +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" +} +``` + +Send the enclave key in the `data` field, and the [privacy precompile address](../../reference/api/index.md#priv_getprivacyprecompileaddress) in the `to` field of `eth_sendRawTransaction`: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_sendRawTransaction", + "params": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "to": "0x000000000000000000000000000000000000007e", + "data": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b", + "gas": "0x2E1800", + "gasPrice": "0x9184e72a000" + } + ], + "id": 1 +} +``` + +## EEA-compliant or Besu-extended privacy + +To create an [EEA-compliant private transaction], specify `privateFor` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +To create a [Besu-extended private transaction], specify a `privacyGroupId` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +## Unsigned and unencoded private transactions + +The [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction) parameter is a signed RLP-encoded private transaction. Shown below are examples of unsigned and unencoded private transactions to create a contract. + +```json title="Unencoded and unsigned EEA-compliant private transaction" +{ + "to": null, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x7600", + "gasPrice": "0x0", + "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "nonce": "0x0", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privateFor": [ + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=", + "6fg8q5rWMBoAT2oIiU3tYJbk4b7oAr7dxaaVY7TeM3U=" + ], + "restriction": "restricted" +} +``` + +```json title="Unencoded and unsigned Besu-extended private transaction" +{ + "to": null, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x7600", + "gasPrice": "0x0", + "data": "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b348015605957600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b80600081905550505600a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "nonce": "0x0", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privacyGroupId": "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M=", + "restriction": "restricted" +} +``` + +:::tip + +The `example` directory in the [web3js-quorum client library](../use-privacy/web3js-quorum.md) contains examples of signing and encoding private transactions. + +::: + + + +[EEA-compliant private transaction]: ../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy +[Besu-extended private transaction]: ../../concepts/privacy/privacy-groups.md#besu-extended-privacy diff --git a/versioned_docs/version-stable/private-networks/how-to/send-transactions/revert-reason.md b/versioned_docs/version-stable/private-networks/how-to/send-transactions/revert-reason.md new file mode 100644 index 00000000000..b501e3a09dc --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/send-transactions/revert-reason.md @@ -0,0 +1,140 @@ +--- +title: Include revert reason +description: Including revert reason in transactions with Hyperledger Besu +sidebar_position: 3 +tags: + - private networks +--- + +# Revert reason + +In smart contracts, the [`revert`](https://docs.soliditylang.org/en/v0.8.12/control-structures.html#revert) operation triggers an exception to flag an error and revert the current call. The EVM passes back to the client an optional string message containing information about the error. + +```sol +pragma solidity ^0.8.4; + +contract VendingMachine { + address owner; + constructor() { + owner = msg.sender; + } + error Unauthorized(); + function buy(uint amount) public payable { + if (amount > msg.value / 2 ether) + revert("Not enough Ether provided."); + // Alternative way to do it: + require( + amount <= msg.value / 2 ether, + "Not enough Ether provided." + ); + // Perform the purchase. + } + function withdraw() public { + if (msg.sender != owner) + revert Unauthorized(); + + payable(msg.sender).transfer(address(this).balance); + } +} +``` + +## Enable revert reason + +Use the [`--revert-reason-enabled`](../../../public-networks/reference/cli/options.md#revert-reason-enabled) command line option to include the revert reason in the transaction receipt, [`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) error, [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) error, and [`trace`](../../../public-networks/reference/trace-types.md#trace) response in Hyperledger Besu. + +:::caution + +Enabling revert reason may use a significant amount of memory. We do not recommend enabling revert reason when connected to public Ethereum networks. + +::: + +## Where the revert reason is included + +With revert reason enabled, the transaction receipt returned by [`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt) includes the revert reason as an ABI-encoded string. + +:::info + +The revert reason is not included in the transactions receipt's root hash. Not including the revert reason in the transactions receipt's root hash means the revert reason is only available to nodes that execute the transaction when importing the block. That is, the revert reason is not available if using fast synchronization ([`--sync-mode=FAST`](../../../public-networks/reference/cli/options.md#sync-mode)). + +::: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": null, + "cumulativeGasUsed": "0x5208", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gasUsed": "0x5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", + "transactionIndex": "0x0", + "revertReason": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" + } +} +``` + +The error returned by [`eth_estimateGas`](../../../public-networks/reference/api/index.md#eth_estimategas) and [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) includes the revert reason as an ABI-encoded string in the `data` field. + +```json title="Exampleof `eth_estimateGas`and`eth_call` error" { "jsonrpc": "2.0", "id": 3, "error": { "code": -32000, "message": "Execution reverted", "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" } } + +```` + +The list items in the [`trace`](../../../public-networks/reference/trace-types.md#trace) response returned by [`trace_replayBlockTransactions`](../../../public-networks/reference/api/index.md#trace_replayblocktransactions), [`trace_block`](../../../public-networks/reference/api/index.md#trace_block), and [`trace_transaction`](../../../public-networks/reference/api/index.md#trace_transaction) include the revert reason as an ABI-encoded string. + +```json title="Example of `trace` response list item" +{ + "jsonrpc": "2.0", + "id": 415, + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffadea", + "input": "0x", + "to": "0x0110000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x220bc13dc4f1ed38dcca927a5be15eca16497d279f4c40d7b8fe9704eadf1464", + "blockNumber": 18, + "error": "Reverted", + "revertReason": "0x7d88c1856cc95352", + "subtraces": 0, + "traceAddress": [], + "transactionHash": "0xc388baa0e55e6b73e850b22dc7e9853700f6b995fd55d95dd6ccd5a13d63c566", + "transactionPosition": 1, + "type": "call" + } + ] +} +```` + +## Revert reason format + +As described in the [Solidity documentation], the revert reason is an ABI-encoded string consisting of: + +```bash +0x08c379a0 // Function selector for Error(string) +0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset +0x000000000000000000000000000000000000000000000000000000000000001a // String length +0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data +``` + +```bash title="Example of revert reason string for 'Not enough Ether provided' " +"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000" +``` + +## Dapp support + +Client libraries, such as web3j, do not support extracting the revert reason from the transaction receipt. To extract the revert reason your dapp must interact directly with Besu using a custom JSON -> Object converter. + + + +[Solidity documentation]: https://docs.soliditylang.org/en/v0.8.12/control-structures.html#revert diff --git a/versioned_docs/version-stable/private-networks/how-to/upgrade.md b/versioned_docs/version-stable/private-networks/how-to/upgrade.md new file mode 100644 index 00000000000..9d985eeb6e4 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/upgrade.md @@ -0,0 +1,44 @@ +--- +title: Upgrade +description: Upgrading protocol versions +sidebar_position: 8 +tags: + - private networks +--- + +# Network and protocol upgrades + +:::info + +Node upgrades upgrade your Besu client to a later version. In private networks, you can [upgrade your node](../../public-networks/how-to/upgrade-node.md) as in public networks. + +::: + +Network upgrades are the mechanism for upgrading the Ethereum protocol. Protocol upgrades occur during the network upgrades. + +For Ethereum Mainnet and public testnets, the milestone block definitions are included in Besu. Upgrading your Besu client applies the network upgrade. + +For private networks, all network participants must agree on the protocol upgrades and coordinate the network upgrades. The genesis file specifies the milestone block at which to apply the protocol upgrade. + +## Upgrade the protocol + +To upgrade the protocol in a private network: + +1. Review included EIPs for breaking changes. A [meta EIP](https://eips.ethereum.org/meta) for each protocol upgrade lists included EIPs. For example, [Istanbul](https://eips.ethereum.org/EIPS/eip-1679). +1. Network participants agree on the block number at which to upgrade. +1. For each node in the network: + 1. Add the [milestone block number](../../public-networks/reference/genesis-items.md#milestone-blocks) to the genesis file. + 1. Restart the node before reaching milestone block. + +:::caution + +To avoid a forked network, all network participants must update their genesis file to include the agreed on milestone block and restart their node before reaching the milestone block. + +::: + +:::tip + +- For compatibility with future protocol upgrades, don't hardcode any gas price assumptions. +- Implementing upgradeable contracts enables contracts to be upgraded if a protocol upgrade does include breaking changes. + +::: diff --git a/versioned_docs/version-stable/private-networks/how-to/use-permissioning/_category_.json b/versioned_docs/version-stable/private-networks/how-to/use-permissioning/_category_.json new file mode 100644 index 00000000000..cbca3cfba02 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use permissioning", + "position": 5 +} diff --git a/versioned_docs/version-stable/private-networks/how-to/use-permissioning/local.md b/versioned_docs/version-stable/private-networks/how-to/use-permissioning/local.md new file mode 100644 index 00000000000..c1269a66d9e --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-permissioning/local.md @@ -0,0 +1,191 @@ +--- +title: Use local permissioning +sidebar_position: 1 +description: Hyperledger Besu local permissioning +tags: + - private networks +--- + +# Use local permissioning + +[Local permissioning](../../concepts/permissioning/index.md#local) supports node and account allowlisting. + +## Node allowlisting + +You can allow access to specified nodes in the [permissions configuration file](#permissions-configuration-file). With node allowlisting enabled, communication is only between nodes in the allowlist. + +:::info + +Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option to enable domain name support. + +If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can connect to a container after being restarted, even if the IP address of the container changes. + +::: + +:::info Nodes allowlist in the permissions configuration file + +`nodes-allowlist=["enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.168.0.9:4567","enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.169.0.9:4568"]` + +::: + +Node allowlisting is at the node level. That is, each node in the network has a [permissions configuration file](#permissions-configuration-file) file in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +Local permissioning doesn't check that the node using the permissions configuration file is listed in the allowlist, it only checks that the remote end of the connection is in the allowlist. Use [onchain permissioning] if you need to check both ends of the connection. + +### Specify bootnodes in the allowlist + +The nodes permissions list must include the [bootnodes](../configure/bootnodes.md) or Hyperledger Besu doesn't start with node permissions enabled. + +If you start Besu with specified bootnodes and have node permissioning enabled: + +```bash +--bootnodes="enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305" +``` + +The `nodes-allowlist` in the [permissions configuration file](#permissions-configuration-file) must contain the specified bootnodes. + +:::tip + +If your node has two different IP addresses for ingress and egress (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. + +::: + +### Enable node allowlisting + +To enable node allowlisting, specify the [`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) option when starting Besu. + +The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +### Update the node allowlist + +To update the nodes allowlist while the node is running, use the following JSON-RPC API methods: + +- [perm_addNodesToAllowlist](../../reference/api/index.md#perm_addnodestoallowlist) +- [perm_removeNodesFromAllowlist](../../reference/api/index.md#perm_removenodesfromallowlist) + +You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly and then update the allowlist using the [`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) method. + +Updates to the permissions configuration file persist across node restarts. + +### View the node allowlist + +To view the nodes allowlist, use the [perm_getNodesAllowlist](../../reference/api/index.md#perm_getnodesallowlist) method. + +:::note + +Each node has a [permissions configuration file](#permissions-configuration-file), which means nodes can have different nodes allowlists. This means nodes might be participating in the network that are not on the allowlist of other nodes in the network. We recommend each node in the network has the same nodes allowlist. + +::: + +```bash Example of different node allowlists + +Node 1 Allowlist = [Node 2, Node 3] + +Node 2 Allowlist = [Node 3, Node 5] + +Node 5 is participating in the same network as Node 1 even though Node 1 does not have Node 5 +on their allowlist. +``` + +## Account allowlisting + +You can specify accounts in the accounts allowlist in the [permissions configuration file](#permissions-configuration-file). A node with account permissioning accepts transactions only from accounts in the accounts allowlist. + +:::info Accounts allowlist in the permissions configuration file + +`accounts-allowlist=["0x0000000000000000000000000000000000000009"]` + +::: + +Account allowlisting is at the node level. That is, each node in the network has a [permissions configuration file](#permissions-configuration-file) in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +:::caution Using account permissioning and privacy + +Account permissioning is incompatible with [random key signing](../use-privacy/sign-pmts.md) for [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md). + +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: + +Transaction validation against the accounts allowlist occurs at the following points: + +- Submitted by JSON-RPC API method [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) +- Received via propagation from another node +- Added to a block by a mining node + +After adding transactions to a block, the transactions are not validated against the allowlist when received by another node. That is, a node can synchronize and add blocks containing transactions from accounts that are not on the accounts allowlist of that node. + +The following diagram illustrates applying local and onchain permissioning rules. + +![Permissioning Flow](../../../assets/images/PermissioningFlow.png) + +```bash title="Example of different account allowlists" + +Node 1 Allowlist = [Account A, Account B] + +Node 2 Allowlist = [Account B, Account C] + +Mining Node Allowlist = [Account A, Account B] + +Account A submits a transaction on Node 1. Node 1 validates and propagates the transaction. The +Mining Node receives the transaction, validates it is from an account in the Mining Node +accounts allowlist, and includes the transaction in the block. Node 2 receives and adds +the block created by the Mining Node. + +Node 2 now has a transaction in the blockchain from Account A, which is not on the accounts +allowlist for Node 2. + +``` + +:::note + +Each node has a [permissions configuration file](#permissions-configuration-file) which means nodes in the network can have different accounts allowlists. This means a transaction can be successfully submitted by Node A from an account in the Node A allowlist but rejected by Node B to which it's propagated if the account is not in the Node B allowlist. We recommend each node in the network has the same accounts allowlist. + +::: + +### Enable account allowlisting + +To enable account allowlisting, specify the [`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled) option when starting Besu. + +The `PERM` API methods are not enabled by default. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +### Update the account allowlist + +To update the accounts allowlist when the node is running, use the JSON-RPC API methods: + +- [`perm_addAccountsToAllowlist`](../../reference/api/index.md#perm_addaccountstoallowlist) +- [`perm_removeAccountsFromAllowlist`](../../reference/api/index.md#perm_removeaccountsfromallowlist). + +You can also update the [`permissions_config.toml`](#permissions-configuration-file) file directly and use the [`perm_reloadPermissionsFromFile`](../../reference/api/index.md#perm_reloadpermissionsfromfile) method to update the allowlists. + +Updates to the permissions configuration file persist across node restarts. + +### View the account allowlist + +To view the accounts allowlist, use the [`perm_getAccountsAllowlist`](../../reference/api/index.md#perm_getaccountsallowlist) method. + +## Permissions configuration file + +The permissions configuration file contains the nodes and accounts allowlists. If the [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options are not specified, the name of the permissions configuration file must be [`permissions_config.toml`](#permissions-configuration-file) and must be in the [data directory](../../../public-networks/reference/cli/options.md#data-path) for the node. + +You can specify the accounts and nodes allowlists in the same file or in separate files for accounts and nodes. + +To specify a permissions configuration file (or separate files for accounts and nodes) in any location, use the [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`--permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options. + +:::note + +The [`--permissions-accounts-config-file`](../../reference/cli/options.md#permissions-accounts-config-file) and [`permissions-nodes-config-file`](../../reference/cli/options.md#permissions-nodes-config-file) options are not used when running Besu from the [Docker image](../../get-started/install/run-docker-image.md). Use a bind mount to [specify a permissions configuration file with Docker]. + +::: + +```toml title="Sample permissions configuration file" +accounts-allowlist=["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"] + +nodes-allowlist=["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304","enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305"] +``` + + + +[specify a permissions configuration file with Docker]: ../../get-started/install/run-docker-image.md +[support domain names]: ../../../public-networks/concepts/node-keys.md#domain-name-support +[onchain permissioning]: ../../concepts/permissioning/onchain.md diff --git a/versioned_docs/version-stable/private-networks/how-to/use-permissioning/onchain.md b/versioned_docs/version-stable/private-networks/how-to/use-permissioning/onchain.md new file mode 100644 index 00000000000..4b177026a20 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-permissioning/onchain.md @@ -0,0 +1,60 @@ +--- +title: Use onchain permissioning +sidebar_position: 2 +description: Use onchain permissioning allowlists +tags: + - private networks +--- + +# Use onchain permissioning + +This page contains some extra info if you're using [onchain permissioning](../../concepts/permissioning/onchain.md). + +:::tip + +If your node has two different IP addresses for ingress and egress (for example, if you use Kubernetes implementing a load balancer for ingress and a NAT gateway IP address for egress), add both addresses to the allowlist, using the same public key for each IP address. This will allow the node to connect. + +::: + +:::important + +Node allowlists [support domain names] in enode URLs as an early access feature. Use the `--Xdns-enabled` option to enable domain name support. + +If using Kubernetes, enable domain name support and use the `--Xdns-update-enabled` option to ensure that Besu can connect to a container after being restarted, even if the IP address of the container changes. + +::: + +:::tip + +If you add a running node, the node does not attempt to reconnect to the bootnode and synchronize until peer discovery restarts. To add an allowlisted node as a peer without waiting for peer discovery to restart, use [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer). + +If you add the node to the allowlist before starting the node, using `admin_addPeer` is not required because peer discovery is run on node startup. + +::: + +:::tip + +If nodes are not connecting as expected, set the [log level to `TRACE`](../../../public-networks/reference/cli/options.md#logging) and search for messages containing `Node permissioning` to identify the issue. + +Ensure the [`--p2p-host`](../../../public-networks/reference/cli/options.md#p2p-host) command line option has been correctly configured for all nodes with the externally accessible address. + +If you change your network configuration, you may need to update the node allowlist. + +::: + +## Specify the permissioning contract interface version + +Use the [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version) command line option to specify the version of the [permissioning contract interface](../../concepts/permissioning/onchain.md#permissioning-contracts). The default is 1. + +Specify the contract interface version that maps to the version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/) the contract interface implements. + +| | EEA Client Specification | Contract interface | +| :------ | :----------------------- | :----------------- | +| Version | 5 | 1 | +| Version | 6 | 2 | + +The permissioning contracts in the [`ConsenSys/permissioning-smart-contracts`](https://github.com/ConsenSys/permissioning-smart-contracts) repository implement the version 2 contract interface. + +[support domain names]: ../../../public-networks/concepts/node-keys.md#domain-name-support +[projects release page]: https://github.com/ConsenSys/permissioning-smart-contracts/releases/latest +[onchain permissioning tutorial]: ../../tutorials/permissioning/onchain.md diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/_category_.json b/versioned_docs/version-stable/private-networks/how-to/use-privacy/_category_.json new file mode 100644 index 00000000000..f2a1d4ca864 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use privacy", + "position": 4 +} diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/access-private-transactions.md b/versioned_docs/version-stable/private-networks/how-to/use-privacy/access-private-transactions.md new file mode 100644 index 00000000000..611f57269a3 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/access-private-transactions.md @@ -0,0 +1,33 @@ +--- +title: Access private and privacy marker transactions +description: Methods for accessing and managing private transactions and privacy groups in Hyperledger Besu +sidebar_position: 6 +tags: + - private networks +--- + +# Access private and privacy marker transactions + +A Hyperledger Besu private transaction creates a [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) and the private transaction itself. + +## Transaction receipts + +With the transaction hash returned when submitting the private transaction, to get the transaction receipt for the: + +- Private transaction, use [`priv_getTransactionReceipt`](../../reference/api/index.md#priv_gettransactionreceipt). +- Privacy marker transaction, use [`eth_getTransactionReceipt`](../../../public-networks/reference/api/index.md#eth_gettransactionreceipt). + +The transaction receipt includes a `status` indicating if the transaction failed (`0x0`), succeeded (`0x1`), or was invalid (`0x2`). + +:::note Private transaction failure example + +To deploy a private contract, you submit a transaction using [`eea_sendRawTransaction`](../send-transactions/private-transactions.md). If contract deployment fails because of insufficient gas, the privacy marker transaction receipt has a status of success and the private transaction receipt has a status of failure. + +::: + +## Transactions + +With the transaction hash returned when submitting the private transaction, to get the: + +- Private transaction, use [`priv_getPrivateTransaction`](../../reference/api/index.md#priv_getprivatetransaction). +- Privacy marker transaction, use [`eth_getTransactionByHash`](../../../public-networks/reference/api/index.md#eth_gettransactionbyhash). diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/besu-extended.md b/versioned_docs/version-stable/private-networks/how-to/use-privacy/besu-extended.md new file mode 100644 index 00000000000..40c1c7d365e --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/besu-extended.md @@ -0,0 +1,40 @@ +--- +title: Use Besu-extended privacy +description: Hyperledger Besu-extended privacy +sidebar_position: 2 +tags: + - private networks +--- + +# Use Besu-extended privacy + +Hyperledger Besu provides an extended implementation of privacy allowing you to [create a privacy group for a set of participants](../../concepts/privacy/privacy-groups.md). You must specify the privacy group ID when sending private transactions. + +To enable the [`PRIV` API methods](../../reference/api/index.md#priv-methods), use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. + +To create the privacy group containing the recipients of a private transaction, use [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup). + +To create an EEA-compliant private transaction, specify `privacyGroupId` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +## Privacy group type + +Privacy groups created using [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) have a `BESU` privacy group type when returned by [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", + "name": "Group B", + "description": "Description of Group B", + "type": "BESU", + "members": [ + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" + ] + } + ] +} +``` diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/eea-compliant.md b/versioned_docs/version-stable/private-networks/how-to/use-privacy/eea-compliant.md new file mode 100644 index 00000000000..300c0b987fd --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/eea-compliant.md @@ -0,0 +1,38 @@ +--- +title: Use EEA-compliant privacy +description: Hyperledger Besu JSON-RPC methods to use for EEA-compliant privacy +sidebar_position: 1 +tags: + - private networks +--- + +# Use EEA-compliant privacy + +When using Hyperledger Besu [EEA-compliant privacy](../../concepts/privacy/privacy-groups.md), the group of nodes specified by `privateFrom` and `privateFor` form a privacy group, to which Tessera assigns a unique privacy group ID. + +To enable the [`EEA` API methods](../../reference/api/index.md#eea-methods), use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) command line options. + +To create an EEA-compliant private transaction, specify `privateFor` when creating the signed transaction passed as an input parameter to [`eea_sendRawTransaction`](../../reference/api/index.md#eea_sendrawtransaction). + +## Privacy group type + +Privacy groups created when specifying `privateFrom` and `privateFor` have a `LEGACY` privacy group type when returned by [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup). + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "68/Cq0mVjB8FbXDLE1tbDRAvD/srluIok137uFOaClM=", + "name": "legacy", + "description": "Privacy groups to support the creation of groups by privateFor and privateFrom", + "type": "LEGACY", + "members": [ + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=", + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=" + ] + } + ] +} +``` diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/flexible.md b/versioned_docs/version-stable/private-networks/how-to/use-privacy/flexible.md new file mode 100644 index 00000000000..abf1892732b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/flexible.md @@ -0,0 +1,62 @@ +--- +title: Use flexible privacy groups +description: Use flexible privacy groups +sidebar_position: 5 +tags: + - private networks +--- + +# Use flexible privacy groups + +Use the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) to create and update membership of [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). + +:::tip + +Because group membership for flexible privacy groups is stored in a smart contract, flexible privacy groups are also known as onchain privacy groups. + +::: + +:::info + +[Flexible privacy groups](../../concepts/privacy/flexible-privacy.md) are an early access feature. Don't use in production networks. + +The flexible privacy group interfaces may change between releases. There might not be an upgrade path from flexible privacy groups created using v1.5 or earlier to enable use of flexible privacy group functionality in future versions. + +We don't recommend creating flexible privacy groups in a chain with existing [offchain privacy groups](../../concepts/privacy/privacy-groups.md). + +::: + +## Enable flexible privacy groups + +Use the [`--privacy-flexible-groups-enabled`](../../reference/cli/options.md#privacy-flexible-groups-enabled) command line option to enable [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). When flexible privacy groups are enabled, the [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup), [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup), and [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) methods for [offchain privacy groups](../../concepts/privacy/privacy-groups.md) are disabled. + +## Simple flexible privacy group example + +To create and find a [flexible privacy group](../../concepts/privacy/flexible-privacy.md) using the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum): + +1. Update the `example/keys.js` file to match your network configuration. + +1. Run: + + ```bash + cd example/onchainPrivacy + node simpleExample.js + ``` + + This script creates the flexible privacy group with two members. `findPrivacyGroup` finds and displays the created privacy group. + +:::tip + +The Tessera logs for Tessera 1 and Tessera 2 display `PrivacyGroupNotFound` errors. This is expected behavior because private transactions check offchain and onchain to find the privacy group for a private transaction. + +::: + +## Add and remove members + +To add and remove members from a [flexible privacy group](../../concepts/privacy/flexible-privacy.md), use the `addTo` and `removeFrom` methods in the [`web3js-quorum` library](https://github.com/ConsenSys/web3js-quorum) client library. + +:::note + +When adding a member, Besu pushes all existing group transactions to the new member and processes them. If there are a large number of existing transactions, adding the member may take some time. + +::: diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/performance-best-practices.md b/versioned_docs/version-stable/private-networks/how-to/use-privacy/performance-best-practices.md new file mode 100644 index 00000000000..5559d610189 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/performance-best-practices.md @@ -0,0 +1,61 @@ +--- +title: Performance best practices +description: Performance best practices +sidebar_position: 10 +tags: + - private networks +--- + +# Performance best practices + +This document collects deployment and usage tips to help you achieve high performance for private transactions. If transaction throughput or latency is not meeting your expectations, please consider the following before raising an issue. + +## General performance + +Private transactions use the same facilities as public ones. General Besu performance tunings apply. Specific approaches are out of scope of this document, except for the following, which strongly impacts performance: + +### Use fast, local, solid state storage + +Running EVM transactions creates a lot of random reads that are executed sequentially. The Besu data folder for high throughput nodes should be located on the fastest possible storage media. + +- Prefer [NVMe](https://cloud.google.com/compute/docs/disks/local-ssd#performance) attached SLC flash or Intel Optane. +- Avoid network attached SSDs or cloud storage with limited input/output operations per second. +- Do not use spinning disks under any circumstances. + +## Private transaction performance + +### Use concurrent submission + +When submitting a private transaction using [web3js-quorum](https://github.com/ConsenSys/web3js-quorum), the submit call will only return once the privacy marker transaction has been included in a block. This limits the throughput to at most one private transaction per block when submitting from a single thread. To increase throughput, use web3js-quorum from multiple concurrent threads or processes. + +### Co-locate Besu and Tessera + +Besu has to talk to its local Tessera node frequently while handling a block. While we do not recommend running them on the same node, minimizing the latency between Besu and Tessera will improve block processing times. Besu and Tessera should not be hosted in geographically distributed locations. + +### Optimize worst-case latency between Tessera nodes + +When distributing a new private transaction between Tessera nodes, the overall throughput is determined by the slowest Tessera nodes. Try to minimize network latency between Tessera nodes and do not mix different machine types when hosting Tessera. + +### Use stateful nonce management + +Management of public and private nonces in web3js-quorum is stateless: before a transaction is sent, web3js-quorum has to query for those nonces. This is increasing latency, the node's load, and is a source of fragility due to nonce collision when multiple senders try to use the same account concurrently. + +For performance and reliability it is advantageous to manage nonces in a stateful manner on the client side instead of querying them for every transaction. If custom code for this is not an option, [Orchestrate](https://consensys.net/codefi/orchestrate/) can be used. + +### Use random senders for privacy marker transactions + +To avoid public nonce management, privacy marker transactions can be sent using a [random account per transaction](https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/#privacy-marker-transaction-signing-key-file). This option is only available for zero gas networks. + +### Avoid queuing transactions in Tessera + +When Tessera is overloaded with transactions, the performance breaks down catastrophically due to unbounded growth of the request queue. Avoid sending more transactions to Tessera than it can handle. Sudden jumps in submission latency and submission failure rate should be answered with a load reduction on the client side, for example using a back-off scheme. + +Please note that this is not Tessera specific but a general issue in distributed systems. It just happens that if queueing discipline is not maintained, Tessera tends to be the first component to fail. + +### Limit the group size to reduce communication overhead + +Smaller groups need fewer communication for transaction propagation. If reducing the number of Tessera nodes involved in a transaction is an option, it will lead to slightly better tail latencies. Multi-tenancy Tessera can be used to have large groups with a small number of Tessera nodes (possibly only one). + +### Limit group membership changes and make them quick + +Groups are locked (prevented from executing transactions) during membership changes. Try to minimize the number of times the membership changes. When possible, spread load across multiple groups to always have some groups available while others are locked. Consider batching group membership changes if possible. Note however that this does not work with the default management contract, yet. diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/privacy-groups.md b/versioned_docs/version-stable/private-networks/how-to/use-privacy/privacy-groups.md new file mode 100644 index 00000000000..1b3f0fadf23 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/privacy-groups.md @@ -0,0 +1,21 @@ +--- +title: Create and manage privacy groups +description: Create and manage privacy groups with Hyperledger Besu +sidebar_position: 4 +tags: + - private networks +--- + +# Create and manage privacy groups + +Hyperledger Besu-extended privacy provides JSON-RPC API methods for creating and managing privacy groups: + +- [`priv_createPrivacyGroup`](../../reference/api/index.md#priv_createprivacygroup) +- [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) +- [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). + +:::tip + +You can find and delete [EEA-compliant privacy groups](../../concepts/privacy/privacy-groups.md) using [`priv_findPrivacyGroup`](../../reference/api/index.md#priv_findprivacygroup) and [`priv_deletePrivacyGroup`](../../reference/api/index.md#priv_deleteprivacygroup). + +::: diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/sign-pmts.md b/versioned_docs/version-stable/private-networks/how-to/use-privacy/sign-pmts.md new file mode 100644 index 00000000000..7ad0029f5d1 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/sign-pmts.md @@ -0,0 +1,39 @@ +--- +title: Sign privacy marker transactions +description: How to sign a privacy marker transaction with Hyperledger Besu +sidebar_position: 7 +tags: + - private networks +--- + +# Sign privacy marker transactions + +You can sign privacy marker transactions (PMTs) with either a random key or a specified key. To sign privacy marker transactions with a specified private key, use [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) when starting Hyperledger Besu. + +:::note + +The private key file can be the same file used by [`--node-private-key-file`](#node-private-key-file), or a different key file to identify who signed the privacy marker transaction. + +::: + +In networks where you pay gas, you must specify a key and the associated account must contain adequate funds. + +In [free gas networks](../configure/free-gas.md), to provide further anonymity by signing each privacy marker transaction with a different random key, exclude the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option when starting Besu. + +:::caution "Using account permissioning and privacy" + +You can't use [account permissioning] with random key signing. + +If using account permissioning and privacy, a signing key must be specified using the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option and the corresponding public key included in the accounts allowlist. + +::: + +:::note + +Besu signs privacy marker transactions during the [private transaction process](../../concepts/privacy/private-transactions/processing.md). + +::: + + + +[account permissioning]: ../../concepts/permissioning/index.md#account-permissioning diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/tessera.md b/versioned_docs/version-stable/private-networks/how-to/use-privacy/tessera.md new file mode 100644 index 00000000000..02754f3fe8f --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/tessera.md @@ -0,0 +1,41 @@ +--- +title: Run Tessera with Besu +description: Running ConsenSys Quorum Tessera with Hyperledger Besu +sidebar_position: 3 +tags: + - private networks +--- + +# Run Tessera with Besu + +To enable [privacy functionality](../../concepts/privacy/index.md) in production systems, [Tessera](https://docs.tessera.consensys.net/) must be [highly available](#high-availability) and [run in a separate instance](#separate-instances) to Hyperledger Besu. + +![Besu-Tessera-High-Availability](../../../assets/images/Besu-Tessera-High-Availability.png) + +:::note + +You can also configure Besu for high availability using load balancers. + +::: + +## High availability + +Privacy requires you to [configure Tessera for high availability]. Besu also requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode) to be enabled in Tessera. + +To successfully distribute a private transaction, all private transaction participants must be online. If any participants are offline when submitting the private transaction, the transaction is not attempted and you need to resubmit the transaction. + +If a Tessera node is unavailable when Besu attempts to process a privacy marker transaction, the Besu node stops processing all new blocks until Tessera is available. The Besu node continually attempts to process the privacy marker transaction until Tessera is available again. + +:::caution + +If Tessera becomes available but has lost data, Besu resumes processing blocks and the private states in the Besu nodes might become inconsistent. + +::: + +## Separate instances + +For production systems, we recommend running Besu and Tessera in separate instances. If running Besu and Tessera in the same instance, restrict the amount of memory used by each JVM to ensure each has enough memory. + + + +[configure Tessera for high availability]: https://consensys.net/docs/goquorum//en/stable/configure-and-manage/configure/high-availability/ diff --git a/versioned_docs/version-stable/private-networks/how-to/use-privacy/web3js-quorum.md b/versioned_docs/version-stable/private-networks/how-to/use-privacy/web3js-quorum.md new file mode 100644 index 00000000000..5e96ec51a9e --- /dev/null +++ b/versioned_docs/version-stable/private-networks/how-to/use-privacy/web3js-quorum.md @@ -0,0 +1,88 @@ +--- +title: Use the web3js-quorum library +description: web3js-quorum client library +sidebar_position: 9 +tags: + - private networks +--- + +# Use the web3js-quorum client library + +[web3js-quorum](https://github.com/ConsenSys/web3js-quorum) is an Ethereum JavaScript library extending [web3.js](https://github.com/ethereum/web3.js/) that adds support for Besu-specific JSON-RPC APIs and features. Use the library to create and send RLP-encoded transactions using JSON-RPC. + +:::caution important +web3js-quorum supports JSON-RPC over HTTP only. +::: + +:::note + +web3js-quorum includes all [quorum.js](https://github.com/ConsenSys/quorum.js) and [web3js-eea](https://github.com/ConsenSys/web3js-eea) features. + +If migrating to web3js-quorum, update your JavaScript code as indicated in the following examples. + +[Read the migration guide for more information about updating your code.](https://consensys.github.io/web3js-quorum/latest/tutorial-Migrate%20from%20web3js-eea.html) + +::: + +## Prerequisites + +- [Node.js (version > 10)](https://nodejs.org/en/download/) +- [The web3 library must be installed in your project](https://github.com/ChainSafe/web3.js#installation) + +## Add web3js-quorum to project + +```bash +npm install web3js-quorum +``` + +## Initialize the web3js-quorum client + +Initialize your client where: + +- `` is the JSON-RPC HTTP endpoint of your Hyperledger Besu node. Specified by the [`--rpc-http-host`](../../../public-networks/reference/cli/options.md#rpc-http-host) and [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) command line options. + + + +# Syntax + +```js +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); +const web3 = new Web3Quorum(new Web3("")); +``` + +# Example + +```js +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); +const web3 = new Web3Quorum(new Web3("http://localhost:8545")); +``` + + + +:::note + +When migrating from web3js-eea to web3js-quorum, use `Web3Quorum`. The constructor doesn't require the chain ID anymore. Chain ID is automatically retrieved from the chain using the specified JSON-RPC HTTP endpoint. + +::: + +## Deploy a contract with `generateAndSendRawTransaction` + +To deploy a private contract, you need the contract binary. You can use [Solidity](https://solidity.readthedocs.io/en/develop/using-the-compiler.html) to get the contract binary. + +```js title="Deploying a contract with 'web3.priv.generateAndSendRawTransaction'" +const contractOptions = { + data: `0x123`, // contract binary + privateFrom: "tesseraNode1PublicKey", + privateFor: ["tesseraNode3PublicKey"], + privateKey: "besuNode1PrivateKey", +}; +return web3.priv.generateAndSendRawTransaction(contractOptions); +``` + +`web3.priv.generateAndSendRawTransaction(contractOptions)` returns the transaction hash. To get the private transaction receipt, use `web3.priv.waitForTransactionReceipt(txHash)`. + +## web3js-quorum methods + +For more information about the web3js-quorum methods, see the [web3js-quorum reference documentation](https://consensys.github.io/web3js-quorum/latest/index.html). diff --git a/versioned_docs/version-stable/private-networks/index.md b/versioned_docs/version-stable/private-networks/index.md new file mode 100644 index 00000000000..377c1af8e90 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/index.md @@ -0,0 +1,30 @@ +--- +title: Private networks +sidebar_position: 1 +sidebar_label: Introduction +id: index +description: Private networks overview +tags: + - private networks +--- + +# Hyperledger Besu for private networks + +You can use Besu to develop enterprise applications requiring secure, high-performance transaction processing in a private network. + +A private network is a network not connected to Ethereum Mainnet or an Ethereum testnet. Private networks typically use a different [chain ID](../public-networks/concepts/network-and-chain-id.md) and proof of authority consensus ([QBFT](how-to/configure/consensus/qbft.md), [IBFT 2.0](how-to/configure/consensus/ibft.md), or [Clique](how-to/configure/consensus/clique.md)). + +You can also [create a local development network](tutorials/ethash.md) using proof of work (Ethash). + +Besu supports enterprise features including [privacy](concepts/privacy/index.md) and [permissioning](concepts/permissioning/index.md). + +Get started with the [Developer Quickstart](tutorials/quickstart.md) to rapidly generate local blockchain networks. + +## Architecture + +The following diagram outlines the high-level architecture of Besu for private networks. + +![Private architecture](../assets/images/private-architecture.jpeg) + +If you have any questions about Besu for private networks, ask on the **besu** channel on +[Hyperledger Discord](https://discord.gg/hyperledger). diff --git a/versioned_docs/version-stable/private-networks/reference/_category_.json b/versioned_docs/version-stable/private-networks/reference/_category_.json new file mode 100644 index 00000000000..3ce2f2b757b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Reference", + "position": 6 +} diff --git a/versioned_docs/version-stable/private-networks/reference/accounts-for-testing.md b/versioned_docs/version-stable/private-networks/reference/accounts-for-testing.md new file mode 100644 index 00000000000..f32a1dbf8a1 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/accounts-for-testing.md @@ -0,0 +1,27 @@ +--- +title: Accounts for testing +sidebar_position: 3 +description: Ethereum accounts used for Hyperledger Besu testing only on private networks +tags: + - private networks +--- + +import TestAccounts from '../../global/test_accounts.md'; + +# Accounts for testing + +You can use existing accounts for testing by including them in the genesis file for a private network. Hyperledger Besu also provides predefined accounts for use in development mode. + +## Development mode + +When you start Besu with the [`--network=dev`](../../public-networks/reference/cli/options.md#network) command line option, Besu uses the `dev.json` genesis file by default. + +The `dev.json` genesis file defines the following accounts used for testing. + + + +## Genesis file + +To use existing test accounts, specify the accounts and balances in a genesis file for your test network. For an example of how to define accounts in the genesis file, see [`dev.json`](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/config/src/main/resources/dev.json). + +To start Besu with the genesis file defining the existing accounts, use the [`--genesis-file`](../../public-networks/reference/cli/options.md#genesis-file) command line option . diff --git a/versioned_docs/version-stable/private-networks/reference/api/_category_.json b/versioned_docs/version-stable/private-networks/reference/api/_category_.json new file mode 100644 index 00000000000..777d7bb818f --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu API", + "position": 2 +} diff --git a/versioned_docs/version-stable/private-networks/reference/api/index.md b/versioned_docs/version-stable/private-networks/reference/api/index.md new file mode 100644 index 00000000000..4d0b71dd721 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/api/index.md @@ -0,0 +1,2157 @@ +--- +description: Hyperledger Besu private network JSON-RPC API methods reference +tags: + - private networks +--- + +# Private network API methods + +:::warning + +- This reference contains API methods that apply to only private networks. For API methods that apply to both private and public networks, see the [public network API reference](../../../public-networks/reference/api/index.md). +- All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If using the [--rpc-http-host](../../../public-networks/reference/cli/options.md#rpc-http-host) or [--rpc-http-port](../../../public-networks/reference/cli/options.md#rpc-http-port) options, update the endpoint. + +::: + +## `CLIQUE` methods + +The `CLIQUE` API methods provide access to the [Clique](../../how-to/configure/consensus/clique.md) consensus engine. + +:::note + +The `CLIQUE` API methods are not enabled by default for JSON-RPC. To enable the `CLIQUE` API methods use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `clique_discard` + +Discards a proposal to [add or remove a signer with the specified address]. + +#### Parameters + +`address`: _string_ - 20-byte address of proposed signer + +#### Returns + +`result`: _boolean_ - indicates if the proposal is discarded + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_discard","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `clique_getSigners` + +Lists [signers for the specified block]. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _string_ - list of 20-byte addresses of signers + + + +# curl HTTP request + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1}' http://127.0.0.1:8545 + ``` + +# wscat WS request + + ```bash + {"jsonrpc":"2.0","method":"clique_getSigners","params":["latest"], "id":1} + ``` + +# JSON result + + ```json + { + "jsonrpc" : "2.0", + "id" : 1, + "result" : [ "0x42eb768f2244c8811c63729a21a3569731535f06", "0x7ffc57839b00206d1ad20c69a1981b489f772031", "0xb279182d99e65703f0076e4812653aab85fca0f0" ] + } + ``` + + + +### `clique_getSignerMetrics` + +Provides the following validator metrics for the specified range: + +- Number of blocks from each validator + +- Block number of the last block proposed by each validator (if any proposed in the specified range) + +- All validators present in the last block + +#### Parameters + +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +If you specify: + +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. + +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. + +#### Returns + +`result`: _array_ of _objects_ - list of validator objects + +:::note + +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"clique_getSignerMetrics","params":["1", "100"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + + +### `clique_getSignersAtHash` + +Lists signers for the specified block. + +#### Parameters + +`hash`: _string_ - 32-byte block hash + +#### Returns + +`result`: _array_ of _string_ - list of 20-byte addresses of signers + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_getSignersAtHash","params":["0x98b2ddb5106b03649d2d337d42154702796438b3c74fd25a5782940e84237a48"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42eb768f2244c8811c63729a21a3569731535f06", + "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "0xb279182d99e65703f0076e4812653aab85fca0f0" + ] +} +``` + + + +### `clique_proposals` + +Returns [current proposals](../../how-to/configure/consensus/clique.md#add-and-remove-signers). + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the proposal for each account (if `true`, the proposal is to add a signer; if `false`, the proposal is to remove a signer.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_proposals","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0x42eb768f2244c8811c63729a21a3569731535f07": false, + "0x12eb759f2222d7711c63729a45c3585731521d01": true + } +} +``` + + + +### `clique_propose` + +Proposes to [add or remove a signer with the specified address]. + +#### Parameters + +- `address`: _string_ - 20-byte address + +- `proposal`: _boolean_ - `true` to propose adding signer or `false` to propose removing signer + +#### Returns + +`result`: _boolean_ - `true` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"clique_propose","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", true], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `EEA` methods + +The `EEA` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and [privacy groups](../../concepts/privacy/privacy-groups.md). + +:::note + +The `EEA` API methods are not enabled by default for JSON-RPC. To enable the `EEA` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `eea_sendRawTransaction` + +Distributes the [private transaction](../../how-to/send-transactions/private-transactions.md), generates the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) and submits it to the transaction pool, and returns the transaction hash of the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md). + +The signed transaction passed as an input parameter includes the `privateFrom`, [`privateFor` or `privacyGroupId`](../../how-to/send-transactions/private-transactions.md#eea-compliant-or-besu-extended-privacy), and `restriction` fields. + +The `gas` and `gasPrice` are used by the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) not the private transaction itself. + +To avoid exposing your private key, create signed transactions offline and send the signed transaction data using `eea_sendRawTransaction`. + +:::important + +For production systems requiring private transactions, use a network with a consensus mechanism supporting transaction finality to make sure the private state does not become inconsistent with the chain. For example, [IBFT 2.0](../../how-to/configure/consensus/ibft.md) and [QBFT](../../how-to/configure/consensus/qbft.md) provide the required finality. + +Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md#pruning) or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) isn't supported. + +Besu doesn't implement [`eea_sendTransaction`](../../how-to/send-transactions/private-transactions.md). + +[EthSigner](https://docs.ethsigner.consensys.net/en/latest/) provides transaction signing and implements [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +::: + +#### Parameters + +`transaction`: _string_ - signed RLP-encoded private transaction + +#### Returns + +`result`: _string_ - 32-byte transaction hash of the [privacy marker transaction](../../concepts/privacy/private-transactions/processing.md) + +:::tip + +If creating a contract, use [priv_getTransactionReceipt](#priv_gettransactionreceipt) to retrieve the contract address after the transaction is finalized. + +::: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"eea_sendRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} +``` + +# JSON result + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + + + +## `IBFT` 2.0 methods + +The `IBFT` API methods provide access to the [IBFT 2.0](../../how-to/configure/consensus/ibft.md) consensus engine. + +:::note + +The `IBFT` API methods are not enabled by default for JSON-RPC. To enable the `IBFT` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `ibft_discardValidatorVote` + +Discards a proposal to [add or remove a validator] with the specified address. + +#### Parameters + +`address`: _string_ - 20-byte address of proposed validator + +#### Returns + +`result`: _boolean_ - indicates if the proposal is discarded + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `ibft_getPendingVotes` + +Returns [votes](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) cast in the current [epoch](../../how-to/configure/consensus/ibft.md#genesis-file). + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to remove a validator. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_getPendingVotes","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, + "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true + } +} +``` + + + +### `ibft_getSignerMetrics` + +Provides the following validator metrics for the specified range: + +- Number of blocks from each validator + +- Block number of the last block proposed by each validator (if any proposed in the specified range) + +- All validators present in the last block of the range + +#### Parameters + +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest` as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +If you specify: + +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. + +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. + +#### Returns + +`result`: _array_ of _objects_ - list of validator objects + +:::note + +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"ibft_getSignerMetrics","params":["1", "100"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + + +### `ibft_getValidatorsByBlockHash` + +Lists the validators defined in the specified block. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `ibft_getValidatorsByBlockNumber` + +Lists the validators defined in the specified block. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `ibft_proposeValidatorVote` + +Proposes to [add or remove a validator] with the specified address. + +#### Parameters + +- `address`: _string_ - account address + +- `proposal`: _boolean_ - `true` to propose adding validator or `false` to propose removing validator + +#### Returns + +`result`: _boolean_ - `true` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `PERM` (Permissioning) methods + +The `PERM` API methods provide permissioning functionality. Use these methods for [local permissioning](../../how-to/use-permissioning/local.md) only. + +:::important + +The `PERM` API methods are not enabled by default for JSON-RPC. To enable the `PERM` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) CLI options. + +::: + +### `perm_addAccountsToAllowlist` + +Adds accounts (participants) to the [accounts permission list](../../how-to/use-permissioning/local.md#account-permissioning). + +#### Parameters + +`addresses`: _array_ of _strings_ - list of account addresses + +:::note + +The parameters list contains a list which is why the account addresses are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error` (errors include attempting to add accounts already on the allowlist and including invalid account addresses.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_addAccountsToAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_addNodesToAllowlist` + +Adds nodes to the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +To use domain names in enode URLs, ensure you [enable DNS support](../../../public-networks/concepts/node-keys.md#domain-name-support) to avoid receiving a `request contains an invalid node` error. + +:::warning + +Enode URL domain name support is an early access feature. + +::: + +#### Parameters + +`enodes`: _array_ of _strings_ - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) + +:::note + +The parameters list contains a list which is why the enode URLs are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error`; errors include attempting to add nodes already on the allowlist or including invalid enode URLs. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_getAccountsAllowlist` + +Lists accounts (participants) in the [accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - list of accounts (participants) in the accounts allowlist + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_getAccountsAllowlist","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x0000000000000000000000000000000000000009", + "0xb9b81ee349c3807e46bc71aa2632203c5b462033" + ] +} +``` + + + +### `perm_getNodesAllowlist` + +Lists nodes in the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) of nodes in the nodes allowlist + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_getNodesAllowlist","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "enode://7b61d5ee4b44335873e6912cb5dd3e3877c860ba21417c9b9ef1f7e500a82213737d4b269046d0669fb2299a234ca03443f25fe5f706b693b3669e5c92478ade@127.0.0.1:30305", + "enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304" + ] +} +``` + + + +### `perm_reloadPermissionsFromFile` + +Reloads the accounts and nodes allowlists from the [permissions configuration file]. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - `Success`, or `error` if the permissions configuration file is not valid + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_reloadPermissionsFromFile","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_removeAccountsFromAllowlist` + +Removes accounts (participants) from the [accounts permissions list](../../how-to/use-permissioning/local.md#account-permissioning). + +#### Parameters + +`addresses`: _array_ of _strings_ - list of account addresses + +:::note + +The parameters list contains a list which is why the account addresses are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error` (errors include attempting to remove accounts not on the allowlist and including invalid account addresses.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_removeAccountsFromAllowlist","params":[["0xb9b81ee349c3807e46bc71aa2632203c5b462032", "0xb9b81ee349c3807e46bc71aa2632203c5b462034"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `perm_removeNodesFromAllowlist` + +Removes nodes from the [nodes allowlist](../../how-to/use-permissioning/local.md#node-allowlisting). + +#### Parameters + +`enodes`: _array_ of _strings_ - list of [enode URLs](../../../public-networks/concepts/node-keys.md#enode-url) + +:::note + +The parameters list contains a list which is why the enode URLs are enclosed by double square brackets. + +::: + +#### Returns + +`result`: _string_ - `Success` or `error` (errors include attempting to remove nodes not on the allowlist and including invalid enode URLs.) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"perm_removeNodesFromAllowlist","params":[["enode://7e4ef30e9ec683f26ad76ffca5b5148fa7a6575f4cfad4eb0f52f9c3d8335f4a9b6f9e66fcc73ef95ed7a2a52784d4f372e7750ac8ae0b544309a5b391a23dd7@127.0.0.1:30303","enode://2feb33b3c6c4a8f77d84a5ce44954e83e5f163e7a65f7f7a7fec499ceb0ddd76a46ef635408c513d64c076470eac86b7f2c8ae4fcd112cb28ce82c0d64ec2c94@127.0.0.1:30304"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +## `PRIV` methods + +The `PRIV` API methods provide functionality for [private transactions](../../concepts/privacy/private-transactions/index.md) and [privacy groups](../../concepts/privacy/privacy-groups.md). + +:::note + +The `PRIV` API methods are not enabled by default for JSON-RPC. To enable the `PRIV` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `priv_call` + +Invokes a private contract function locally and does not change the privacy group state. + +For private contracts, `priv_call` is the same as [`eth_call`](../../../public-networks/reference/api/index.md#eth_call) for public contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `call`: _object_ - [transaction call object](../../../public-networks/reference/api/objects.md#transaction-call-object) + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _data_ - return value of the executed contract + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"priv_call","params":["tb8NVyQqZnHNegf/3mYsyB+HEud4SPWn90rz3GoskRw=", {"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","data": "0x3fa4f245"}, "latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x0000000000000000000000000000000000000000000000000000000000000001" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```bash +{ + block { + number + call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { + data + status + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17449, + "call": { + "data": "0x", + "status": 1 + } + } + } +} +``` + + + +### `priv_createPrivacyGroup` + +Creates a group of nodes, specified by their [Tessera](https://docs.tessera.consensys.net/) public key. + +#### Parameters + +`options`: _object_ - request options object with the following fields: + +- `addresses`: _array_ of _strings_ - list of nodes specified by [Tessera](https://docs.tessera.consensys.net/) public keys + +- `name`: _string_ - (optional) privacy group name + +- `description`: _string_ - (optional) privacy group description + +#### Returns + +`result`: _string_ - privacy group ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method": "priv_createPrivacyGroup", "params": [{"addresses":["sTZpbQhcOfd9ZaFDnC00e/N2Ofv9p4/ZTBbEeVtXJ3E=","quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE="],"name":"Group A","description":"Description Group A"}],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" +} +``` + + + +### `priv_debugGetStateRoot` + +Returns the state root of the specified privacy group at the specified block. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - 32-byte state root + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"priv_debugGetStateRoot","params":["xJdxvWOEmrs2MCkKWlgArTzWIXFfU/tmVxI3EKssVTk=","latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" +} +``` + + + +### `priv_deletePrivacyGroup` + +Deletes the specified privacy group. + +#### Parameters + +`privacyGroupId`: _string_ - privacy group ID + +#### Returns + +`result`: _string_ - deleted privacy group ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_deletePrivacyGroup","params":["ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk="],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "ewuTVoc5nlvWMwTFdRRK/wvV0dcyQo/Pauvx5bNEbTk=" +} +``` + + + +### `priv_distributeRawTransaction` + +Distributes a signed, RLP encoded [private transaction](../../how-to/send-transactions/private-transactions.md). + +:::tip + +If you want to sign the [privacy marker transaction](../../how-to/use-privacy/sign-pmts.md) outside of Besu, use [`priv_distributeRawTransaction`](../../how-to/send-transactions/private-transactions.md#priv_distributerawtransaction) instead of [`eea_sendRawTransaction`](#eea_sendrawtransaction). + +::: + +#### Parameters + +`transaction`: _string_ - signed RLP-encoded private transaction + +#### Returns + +`result`: _string_ - 32-byte enclave key (the enclave key is a pointer to the private transaction in [Tessera](https://docs.tessera.consensys.net/).) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_distributeRawTransaction","params": ["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xfd0d90ab824574abc19c0776ca0210e764561d0ef6d621f2bbbea316eccfe56b" +} +``` + + + +### `priv_findPrivacyGroup` + +Returns a list of privacy groups containing only the listed members. For example, if the listed members are A and B, a privacy group containing A, B, and C is not returned. + +#### Parameters + +`members`: _array_ of _strings_ - members specified by [Tessera](https://docs.tessera.consensys.net/) public keys + +#### Returns + +`result`: _array_ of _objects_ - privacy group objects containing only the specified members; privacy groups are [EEA-compliant](../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy) or [Besu-extended](../../concepts/privacy/privacy-groups.md#besu-extended-privacy) with types: + +- `LEGACY` for EEA-compliant groups. + +- `PANTHEON` for Besu-extended groups. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_findPrivacyGroup","params": [["negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="]],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "privacyGroupId": "GpK3ErNO0xF27T0sevgkJ3+4qk9Z+E3HtXYxcKIBKX8=", + "name": "Group B", + "description": "Description of Group B", + "type": "PANTHEON", + "members": [ + "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw=" + ] + } + ] +} +``` + + + +### `priv_getCode` + +Returns the code of the private smart contract at the specified address. Compiled smart contract code is stored as a hexadecimal value. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `address`: _string_ - 20-byte contract address + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _data_ - code stored at the specified address + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"priv_getCode","params":["1lJxSIP4JOp6uRn9wYsPeWwqoOP1c4nPQjylB4FExUA=", "0xeaf1c1bd00ef0bec5e39fba81740f1c5d05aa201", "latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" +} +``` + + + +### `priv_getEeaTransactionCount` + +Returns the private transaction count for the specified account and [group of sender and recipients]. + +::caution important +If sending more than one transaction to be mined in the same block (that is, you are not +waiting for the transaction receipt), you must calculate the private transaction nonce outside +Besu instead of using `priv_getEeaTransactionCount`. +::: + +#### Parameters + +- `address`: _string_ - account address + +- `sender`: _string_ - base64-encoded Tessera address of the sender + +- `recipients`: _array_ of _strings_ - base64-encoded Tessera addresses of recipients + +#### Returns + +`result`: _string_ - integer representing the number of private transactions sent from the address to the specified group of sender and recipients + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getEeaTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "GGilEkXLaQ9yhhtbpBT03Me9iYa7U/mWXxrJhnbl1XY=", ["KkOjNLmCI6r+mICrC6l+XuEDjFEzQllaMQMpWLl4y1s=","eLb69r4K8/9WviwlfDiZ4jf97P9czyS3DkKu0QYGLjg="]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + + + +### `priv_getFilterChanges` + +Polls the specified filter for a private contract and returns an array of changes that have occurred since the last poll. + +Filters for private contracts can only be created by [`priv_newFilter`](#priv_newfilter) so unlike [`eth_getFilterChanges`](../../../public-networks/reference/api/index.md#eth_getfilterchanges), `priv_getFilterChanges` always returns an array of log objects or an empty list. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object), or an empty list if nothing has changed since the last poll + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_getFilterChanges","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d0", + "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", + "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + + +### `priv_getFilterLogs` + +Returns an array of [logs](../../../public-networks/concepts/events-and-logs.md) for the specified filter for a private contract. + +For private contracts, `priv_getFilterLogs` is the same as [`eth_getFilterLogs`](../../../public-networks/reference/api/index.md#eth_getfilterlogs) for public contracts except there's no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) for private contracts. + +:::note + +`priv_getFilterLogs` is only used for filters created with [`priv_newFilter`](#priv_newfilter). To specify a filter object and get logs without creating a filter, use [`priv_getLogs`](#priv_getlogs). + +::: + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_getFilterLogs","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x493", + "blockHash": "0xd9cb3a852e1e02c95f035a2e32d57f82c10cab61faa3e8f5c010adf979bb4786", + "transactionHash": "0x78866dc51fdf189d8cca74f6a8fe54f172348fbd2163bbe80fa8b106cfc7deb4", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d0", + "blockHash": "0x1c8200667a869e99b945374c37277b5ee7a7ae67943e13c82563381387553dbb", + "transactionHash": "0xb1966b9b372ba68952f48f3a3e78f036f5ae82ceca2de972a782d07fb88f6d88", + "transactionIndex": "0x0", + "address": "0x991cc548c154b2953cc48c02f782e1314097dfbb", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + + +### `priv_getLogs` + +Returns an array of [logs](../../../public-networks/concepts/events-and-logs.md) matching a specified filter object. + +For private contracts, `priv_getLogs` is the same as [`eth_getLogs`](../../../public-networks/reference/api/index.md#eth_getlogs) for public contracts except there is no [automatic log bloom caching](../../../public-networks/reference/cli/options.md#auto-log-bloom-caching-enabled) for private contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterOptions`: _object_ - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](../../../public-networks/reference/api/objects.md#log-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc": "2.0","method": "priv_getLogs","params":["vGy/TZgO6y8VPMVeJAQ99MF1NaTf5ohA3TFfzoEF71k=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x630c507ff633312087dc33c513b66276abcd2fc3"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x342", + "blockHash": "0xf5954f068fa2f2f7741281e8c753a8e92047e27ab3c4971836d2c89fab86d92b", + "transactionHash": "0xa9ba5cffde9d4ad8997c5c4352d5d49eeea0e9def8a4ea69991b8837c49d4e4f", + "transactionIndex": "0x0", + "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x383", + "blockHash": "0x91b73a47d53e3a88d62ed091a89a4be7557ad91b552e7ff7d86bf78977d5d45d", + "transactionHash": "0xc2a185faf00e87434e55b7f70cc4c38be354c2128b4b96b5f5def0b54a2173ec", + "transactionIndex": "0x0", + "address": "0x630c507ff633312087dc33c513b66276abcd2fc3", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + ] +} +``` + + + +### `priv_getPrivacyPrecompileAddress` + +Returns the address of the [privacy precompiled contract](../../concepts/privacy/private-transactions/processing.md). The address is derived and based on the value of the [`privacy-flexible-groups-enabled`](../cli/options.md#privacy-flexible-groups-enabled) option. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - address of the privacy precompile + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getPrivacyPrecompileAddress","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x000000000000000000000000000000000000007e" +} +``` + + + +### `priv_getPrivateTransaction` + +Returns the private transaction if you are a participant, otherwise, `null`. + +#### Parameters + +`transaction`: _string_ - transaction hash returned by [`eea_sendRawTransaction`](#eea_sendrawtransaction) or [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +#### Returns + +`result`: _object_ - [private transaction object](objects.md#private-transaction-object), or `null` if not a participant in the private transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getPrivateTransaction","params":["0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x2dc6c0", + "gasPrice": "0x0", + "hash": "0x623c4ce5275a87b91f4f1c521012d39ca19311c787bde405490f4c0426a71498", + "input": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610221806100606000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f2451461005c5780636057361d1461008757806367e404ce146100b4575b600080fd5b34801561006857600080fd5b5061007161010b565b6040518082815260200191505060405180910390f35b34801561009357600080fd5b506100b260048036038101908080359060200190929190505050610115565b005b3480156100c057600080fd5b506100c96101cb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600254905090565b7fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f53382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18060028190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050905600a165627a7a723058208efaf938851fb2d235f8bf9a9685f149129a30fe0f4b20a6c1885dc02f639eba0029", + "nonce": "0x0", + "to": null, + "value": "0x0", + "v": "0xfe8", + "r": "0x654a6a9663ca70bb13e27cca14b3777cc92da184e19a151cdeef2ccbbd5c6405", + "s": "0x5dd4667b020c8a5af7ae28d4c3126f8dcb1187f49dcf0de9d7a39b1651892eef", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privateFor": ["g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="], + "restriction": "restricted" + } +} +``` + + + +### `priv_getTransactionCount` + +Returns the private transaction count for specified account and privacy group. + +:::important + +If sending more than one transaction to be mined in the same block (that is, you are not waiting for the transaction receipt), you must calculate the private transaction nonce outside Besu instead of using `priv_getTransactionCount`. + +::: + +#### Parameters + +- `address`: _string_ - account address + +- `privacyGroupId`: _string_ - privacy group ID + +#### Returns + +`result`: _string_ - integer representing the number of private transactions sent from the address to the specified privacy group + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getTransactionCount","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "kAbelwaVW7okoEn1+okO+AbA4Hhz/7DaCOWVQz9nx5M="], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + + + +### `priv_getTransactionReceipt` + +Returns information about the private transaction after mining the transaction. Receipts for pending transactions are not available. + +#### Parameters + +`transaction`: _string_ - 32-byte hash of a transaction + +#### Returns + +`result`: _object_ - [private Transaction receipt object](objects.md#private-transaction-receipt-object), or `null` if no receipt found + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"priv_getTransactionReceipt","params":["0xf3ab9693ad92e277bf785e1772f29fb1864904bbbe87b0470455ddb082caab9d"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": "0x493b76031593402e24e16faa81f677b58e2d53f3", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "logs": [], + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0x36219e92b5f53d4150aa9ef7d2d793118cced523de6724100da5b534e3ceb4b8", + "transactionIndex": "0x0", + "output": "0x6080604052600436106049576000357c010000000000000000000000000000000000000000000 + 0000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b3480156059 + 57600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b + 50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b8060008190555050560 + 0a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", + "commitmentHash": "0x79b9e6b0856db398ad7dc208f15b1d38c0c0b0c5f99e4a443a2c5a85510e96a5", + "status": "0x1", + "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", + "privacyGroupId": "cD636RZlcqVSpoxT/ExbkWQfBO7kPAZO0QlWHErNSL8=", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } +} +``` + + + +### `priv_newFilter` + +Creates a [log filter](../../../public-networks/concepts/events-and-logs.md) for a private contract. To poll for logs associated with the created filter, use [`priv_getFilterChanges`](#priv_getfilterchanges). To get all logs associated with the filter, use [`priv_getFilterLogs`](#priv_getfilterlogs). + +For private contracts, `priv_newFilter` is the same as [`eth_newFilter`](../../../public-networks/reference/api/index.md#eth_newfilter) for public contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy Group ID](../../concepts/privacy/privacy-groups.md) + +- `filterOptions`: _object_ - [filter options object](../../../public-networks/reference/api/objects.md#filter-options-object) + +:::note + +`fromBlock` and `toBlock` in the filter options object default to `latest`. + +::: + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_newFilter","params": ["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=",{"fromBlock": "earliest","toBlock": "latest","addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"],"topics": ["0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410"]}],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4a35b92809d73f4f53a2355d62125442" +} +``` + + + +### `priv_uninstallFilter` + +Uninstalls a filter for a private contract with the specified ID. When a filter is no longer required, call this method. + +Filters time out when not requested by [`priv_getFilterChanges`](#priv_getfilterchanges) or [`priv_getFilterLogs`](#priv_getfilterlogs) for 10 minutes. + +For private contracts, `priv_uninstallFilter` is the same as [`eth_uninstallFilter`](../../../public-networks/reference/api/index.md#eth_uninstallfilter) for public contracts. + +#### Parameters + +- `privacyGroupId`: _string_ - 32-byte [privacy group ID](../../concepts/privacy/privacy-groups.md) + +- `filterId`: _string_ - filter ID + +#### Returns + +`result`: _boolean_ - indicates if the filter is successfully uninstalled + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc": "2.0","method": "priv_uninstallFilter","params":["4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=","0x4a35b92809d73f4f53a2355d62125442"],"id": 1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `QBFT` methods + +The `QBFT` API methods provide access to the [QBFT](../../how-to/configure/consensus/qbft.md) consensus engine. + +:::note + +The `QBFT` API methods are not enabled by default for JSON-RPC. To enable the `QBFT` API methods, use the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../../public-networks/reference/cli/options.md#rpc-ws-api) options. + +::: + +### `qbft_discardValidatorVote` + +Discards a proposal to [add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with the specified address. + +#### Parameters + +`address`: _string_ - 20-byte address of proposed validator + +#### Returns + +`result`: _boolean_ - indicates if the proposal is discarded + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_discardValidatorVote","params":["0xef1bfb6a12794615c9b0b5a21e6741f01e570185"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `qbft_getPendingVotes` + +Returns [votes](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) cast in the current [epoch](../../how-to/configure/consensus/qbft.md#genesis-file). + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _booleans_ - map of account addresses to corresponding boolean values indicating the vote for each account; if `true`, the vote is to add a validator. If `false`, the proposal is to remove a validator. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_getPendingVotes","params":[], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185": true, + "0x42d4287eac8078828cf5f3486cfe601a275a49a5": true + } +} +``` + + + +### `qbft_getSignerMetrics` + +Provides the following validator metrics for the specified range: + +- Number of blocks from each validator + +- Block number of the last block proposed by each validator (if any proposed in the specified range) + +- All validators present in the last block of the range + +#### Parameters + +- `fromBlockNumber`: _string_ - integer representing a block number or the string tag `earliest` as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlockNumber`: _string_ - integer representing a block number or one of the string tags `latest` or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +If you specify: + +- No parameters, the call provides metrics for the last 100 blocks, or all blocks if there are less than 100 blocks. + +- Only the first parameter, the call provides metrics for all blocks from the block specified to the latest block. + +#### Returns + +`result`: _array_ of _objects_ - list of validator objects + +:::note + +The proposer of the genesis block has address `0x0000000000000000000000000000000000000000`. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"qbft_getSignerMetrics","params":["1", "100"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "address": "0x7ffc57839b00206d1ad20c69a1981b489f772031", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x61" + }, + { + "address": "0x42eb768f2244c8811c63729a21a3569731535f06", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x63" + }, + { + "address": "0xb279182d99e65703f0076e4812653aab85fca0f0", + "proposedBlockCount": "0x21", + "lastProposedBlockNumber": "0x62" + } + ] +} +``` + + + +### `qbft_getValidatorsByBlockHash` + +Lists the validators defined in the specified block. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockHash","params":["0xbae7d3feafd743343b9a4c578cab5e5d65eb735f6855fb845c00cab356331256"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `qbft_getValidatorsByBlockNumber` + +Lists the validators defined in the specified block. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [Block Parameter](../../../public-networks/how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _strings_ - list of validator addresses + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x42d4287eac8078828cf5f3486cfe601a275a49a5", + "0xb1b2bc9582d2901afdc579f528a35ca41403fa85", + "0xef1bfb6a12794615c9b0b5a21e6741f01e570185" + ] +} +``` + + + +### `qbft_proposeValidatorVote` + +Proposes to [add or remove a validator](../../how-to/configure/consensus/qbft.md#add-and-remove-validators) with the specified address. + +#### Parameters + +- `address`: _string_ - account address + +- `proposal`: _boolean_ - `true` to propose adding validator or `false` to propose removing validator + +#### Returns + +`result`: _boolean_ - `true` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["42d4287eac8078828cf5f3486cfe601a275a49a5",true], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + + + +[add or remove a signer with the specified address]: ../../how-to/configure/consensus/clique.md#add-and-remove-signers +[signers for the specified block]: ../../how-to/configure/consensus/clique.md#adding-and-removing-signers +[add or remove a validator]: ../../how-to/configure/consensus/ibft.md#add-and-remove-validators +[permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file +[group of sender and recipients]: ../../concepts/privacy/privacy-groups.md#enterprise-ethereum-alliance-privacy + +\*[EEA]: Enterprise Ethereum Alliance diff --git a/versioned_docs/version-stable/private-networks/reference/api/objects.md b/versioned_docs/version-stable/private-networks/reference/api/objects.md new file mode 100644 index 00000000000..747a50db098 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/api/objects.md @@ -0,0 +1,59 @@ +--- +title: Private network API objects +sidebar_position: 2 +description: Hyperledger Besu private network API objects reference +tags: + - private networks +--- + +# Private network API objects + +The following objects are parameters for or returned by Besu private network API methods. + +:::warning + +This reference contains API objects that apply to only private networks. For API objects that apply to both private and public networks, see the [public network API objects reference](../../../public-networks/reference/api/objects.md). + +::: + +## Private transaction object + +Returned by [`priv_getPrivateTransaction`](index.md#priv_getprivatetransaction). + +| Key | Type | Value | +| --- | :-: | --- | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | Gas price, in Wei, provided by the sender. | +| `input` | Data | The data to create or invoke a contract. | +| `nonce` | Quantity | Number of transactions made by the sender to the privacy group before this one. | +| `to` | Data, 20 bytes | `null` if a contract creation transaction, otherwise, the contract address. | +| `value` | Quantity | `null` because private transactions cannot transfer Ether. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | +| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | +| `privateFor` | Array of Data, 32 bytes each | [Tessera](https://docs.tessera.consensys.net/) public keys of recipients. Not returned if using `privacyGroupId` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | +| `privacyGroupId` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) privacy group ID of recipients. Not returned if using `privateFor` to [send the transaction](../../../private-networks/concepts/privacy/privacy-groups.md#privacy-types). | +| `restriction` | String | Must be [`restricted`](../../../private-networks/concepts/privacy/private-transactions/index.md). | + +## Private transaction receipt object + +Returned by [`priv_getTransactionReceipt`](index.md#priv_gettransactionreceipt). + +| Key | Type | Value | +| --- | :-: | --- | +| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | +| `blockNumber` | Quantity | Block number of block containing this transaction. | +| `contractAddress` | Data, 20 bytes | Contract address created if a contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | +| `from` | Data, 20 bytes | Address of the sender. | +| `logs` | Array | Array of [log objects](../../../public-networks/reference/api/objects.md#log-object) generated by this private transaction. | +| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | +| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | +| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | +| `output` | Data | RLP-encoded return value of a contract call if a value returns, otherwise, `null`. | +| `commitmentHash` | Data, 32 bytes | Hash of the privacy marker transaction. | +| `status` | Quantity | Either `0x1` (success) or `0x0` (failure). | +| `privateFrom` | Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public key of the sender. | +| `privateFor` or `privacyGroupId` | Array or Data, 32 bytes | [Tessera](https://docs.tessera.consensys.net/) public keys or privacy group ID of the recipients. | +| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | diff --git a/versioned_docs/version-stable/private-networks/reference/cli/_category_.json b/versioned_docs/version-stable/private-networks/reference/cli/_category_.json new file mode 100644 index 00000000000..bec3b04721b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/cli/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu CLI", + "position": 1 +} diff --git a/versioned_docs/version-stable/private-networks/reference/cli/options.md b/versioned_docs/version-stable/private-networks/reference/cli/options.md new file mode 100644 index 00000000000..064549d46f2 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/cli/options.md @@ -0,0 +1,709 @@ +--- +title: Private network options +sidebar_position: 1 +description: Hyperledger Besu private networks CLI reference +tags: + - private networks +--- + +# Private network command line options + +This reference describes the syntax of the Hyperledger Besu private network command line interface (CLI) options. + +:::danger + +This reference contains options that apply to only private networks. For options that apply to both private and public networks, see the [public network options reference](../../../public-networks/reference/cli/options.md). + +::: + +## Specify options + +You can specify Besu options: + +- On the command line. + + ```bash + besu [OPTIONS] [SUBCOMMAND] + ``` + +- As an environment variable. For each command line option, the equivalent environment variable is: + + - Uppercase. + - `_` replaces `-`. + - Has a `BESU_` prefix. + + For example, set `--miner-coinbase` using the `BESU_MINER_COINBASE` environment variable. + +- In a [configuration file](../../../public-networks/how-to/configuration-file.md). + +If you specify an option in more than one place, the order of priority is command line, environment variable, configuration file. + +If using Bash or Z shell, you can view option suggestions by entering `--` and pressing the Tab key twice. + +```bash +besu --Tab+Tab +``` + +:::caution + +Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em hyphens. + +::: + +## Options + +### `permissions-accounts-config-file` + + + +# Syntax + +```bash +--permissions-accounts-config-file= +``` + +# Example + +```bash +--permissions-accounts-config-file=/home/me/me_configFiles/myPermissionsFile +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile +``` + +# Configuration file + +```bash +permissions-accounts-config-file="/home/me/me_configFiles/myPermissionsFile" +``` + + + +The [accounts permissions configuration file]. The default is the `permissions_config.toml` file in the [data directory](../../../public-networks/reference/cli/options.md#data-path). + +:::tip + +`--permissions-accounts-config-file` and [`--permissions-nodes-config-file`](#permissions-nodes-config-file) can use the same file. + +::: + +### `permissions-accounts-config-file-enabled` + + + +# Syntax + +```bash +--permissions-accounts-config-file-enabled[=] +``` + +# Example + +```bash +--permissions-accounts-config-file-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONFIG_FILE_ENABLED=true +``` + +# Configuration file + +```bash +permissions-accounts-config-file-enabled=true +``` + + + +Enables or disables file-based account level permissions. The default is `false`. + +### `permissions-accounts-contract-address` + + + +# Syntax + +```bash +--permissions-accounts-contract-address= +``` + +# Example + +```bash +--permissions-accounts-contract-address=xyz +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ADDRESS=xyz +``` + +# Configuration file + +```bash +permissions-accounts-contract-address="xyz" +``` + + + +The contract address for [onchain account permissioning](../../concepts/permissioning/onchain.md). + +### `permissions-accounts-contract-enabled` + + + +# Syntax + +```bash +--permissions-accounts-contract-enabled[=] +``` + +# Example + +```bash +--permissions-accounts-contract-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_ACCOUNTS_CONTRACT_ENABLED=true +``` + +# Configuration file + +```bash +permissions-accounts-contract-enabled=true +``` + + + +Enables or disables contract-based [onchain account permissioning](../../concepts/permissioning/onchain.md). The default is `false`. + +### `permissions-nodes-config-file` + + + +# Syntax + +```bash +--permissions-nodes-config-file= +``` + +# Example + +```bash +--permissions-nodes-config-file=/home/me/me_configFiles/myPermissionsFile +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONFIG_FILE=/home/me/me_configFiles/myPermissionsFile +``` + +# Configuration file + +```bash +permissions-nodes-config-file="/home/me/me_configFiles/myPermissionsFile" +``` + + + +The [nodes permissions configuration file]. The default is the `permissions_config.toml` file in the [data directory](../../../public-networks/reference/cli/options.md#data-path). + +:::tip + +`--permissions-nodes-config-file` and [`--permissions-accounts-config-file`](#permissions-accounts-config-file) can use the same file. + +::: + +### `permissions-nodes-config-file-enabled` + + + +# Syntax + +```bash +--permissions-nodes-config-file-enabled[=] +``` + +# Example + +```bash +--permissions-nodes-config-file-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONFIG_FILE_ENABLED=true +``` + +# Configuration file + +```bash +permissions-nodes-config-file-enabled=true +``` + + + +Enables or disables file-based node level permissions. The default is `false`. + +### `permissions-nodes-contract-address` + + + +# Syntax + +```bash +--permissions-nodes-contract-address= +``` + +# Example + +```bash +--permissions-nodes-contract-address=xyz +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_ADDRESS=xyz +``` + +# Configuration file + +```bash +permissions-nodes-contract-address="xyz" +``` + + + +The contract address for [onchain node permissioning](../../concepts/permissioning/onchain.md). + +### `permissions-nodes-contract-enabled` + + + +# Syntax + +```bash +--permissions-nodes-contract-enabled[=] +``` + +# Example + +```bash +--permissions-nodes-contract-enabled=true +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_ENABLED=true +``` + +# Configuration file + +```bash +permissions-nodes-contract-enabled=true +``` + + + +Enables or disables contract-based [onchain node permissioning](../../concepts/permissioning/onchain.md). The default is `false`. + +### `permissions-nodes-contract-version` + + + +# Syntax + +```bash +--permissions-nodes-contract-version= +``` + +# Example + +```bash +--permissions-nodes-contract-version=2 +``` + +# Environment variable + +```bash +BESU_PERMISSIONS_NODES_CONTRACT_VERSION=2 +``` + +# Configuration file + +```bash +permissions-nodes-contract-version=2 +``` + + + +Version of the EEA [node permissioning interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version). The default is 1. + +### `privacy-enabled` + + + +# Syntax + +```bash +--privacy-enabled[=] +``` + +# Example + +```bash +--privacy-enabled=false +``` + +# Environment variable + +```bash +BESU_PRIVACY_ENABLED=false +``` + +# Configuration file + +```bash +privacy-enabled=false +``` + + + +Enables or disables [private transactions](../../concepts/privacy/index.md). The default is `false`. + +:::important + +Using private transactions with [pruning](../../../public-networks/concepts/data-storage-formats.md) or [fast sync](../../../public-networks/reference/cli/options.md#sync-mode) is not supported. + +::: + +### `privacy-marker-transaction-signing-key-file` + + + +# Syntax + +```bash +--privacy-marker-transaction-signing-key-file= +``` + +# Example + +```bash +--privacy-marker-transaction-signing-key-file=/home/me/me_node/myPrivateKey +``` + +# Environment variable + +```bash +BESU_PRIVACY_MARKER_TRANSACTION_SIGNING_KEY_FILE=/home/me/me_node/myPrivateKey +``` + +# Configuration file + +```bash +privacy-marker-transaction-signing-key-file="/home/me/me_node/myPrivateKey" +``` + + + +`` is the name of the private key file used to [sign privacy marker transactions](../../how-to/use-privacy/sign-pmts.md). + +:::note + +This can be the same file used by [`--node-private-key-file`](../../../public-networks/reference/cli/options.md#node-private-key-file), or a different key file to identify who signed the privacy marker transaction. + +::: + +You must specify this option if you're using: + +- a privacy network where you pay gas. Also, the associated account must contain adequate funds. +- [account permissioning] and privacy. You must include the corresponding public key in the accounts allowlist. + +If you do not specify this option (for example, in a free gas network), Besu signs each transaction with a different randomly generated key. + +### `privacy-multi-tenancy-enabled` + + + +# Syntax + +```bash +--privacy-multi-tenancy-enabled[=] +``` + +# Example + +```bash +--privacy-multi-tenancy-enabled=false +``` + +# Environment variable + +```bash +BESU_PRIVACY_MULTI_TENANCY_ENABLED=false +``` + +# Configuration file + +```bash +privacy-multi-tenancy-enabled=false +``` + + + +Enables or disables [multi-tenancy](../../concepts/privacy/multi-tenancy.md) for private transactions. The default is `false`. + +### `privacy-flexible-groups-enabled` + + + +# Syntax + +```bash +--privacy-flexible-groups-enabled[=] +``` + +# Example + +```bash +--privacy-flexible-groups-enabled=true +``` + +# Environment variable + +```bash +BESU_PRIVACY_FLEXIBLE_GROUPS_ENABLED=true +``` + +# Configuration file + +```bash +privacy-flexible-groups-enabled=true +``` + + + +Enables or disables [flexible privacy groups](../../concepts/privacy/flexible-privacy.md). The default is `false`. + +Deprecated syntax for this option is `--privacy-onchain-groups-enabled`. + +### `privacy-public-key-file` + + + +# Syntax + +```bash +--privacy-public-key-file= +``` + +# Example + +```bash +--privacy-public-key-file=Tessera/nodeKey.pub +``` + +# Environment variable + +```bash +BESU_PRIVACY_PUBLIC_KEY_FILE=Tessera/nodeKey.pub +``` + +# Configuration file + +```bash +privacy-public-key-file="Tessera/nodeKey.pub" +``` + + + +The [public key of the Tessera node](https://docs.tessera.consensys.net/). + +:::important + +You cannot specify `privacy-public-key-file` when [`--privacy-multi-tenancy-enabled`](#privacy-multi-tenancy-enabled) is `true` + +::: + +### `privacy-tls-enabled` + + + +# Syntax + +```bash +--privacy-tls-enabled[=] +``` + +# Example + +```bash +--privacy-tls-enabled=false +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_ENABLED=false +``` + +# Configuration file + +```bash +privacy-tls-enabled=false +``` + + + +Enables or disables [TLS on communication with the private transaction manager]. The default is false. + +### `privacy-tls-keystore-file` + + + +# Syntax + +```bash +--privacy-tls-keystore-file= +``` + +# Example + +```bash +--privacy--keystore-file=/home/me/me_node/key +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_KEYSTORE_FILE=/home/me/me_node/key +``` + +# Configuration file + +```bash +privacy-tls-keystore-file="/home/me/me_node/key" +``` + + + +The keystore file (in PKCS #12 format) containing the private key and the certificate presented during authentication. + +You must specify `privacy-tls-keystore-file` if [`--privacy-tls-enabled`](#privacy-tls-enabled) is `true`. + +### `privacy-tls-keystore-password-file` + + + +# Syntax + +```bash +--privacy-tls-keystore-password-file= +``` + +# Example + +```bash +--privacy-tls-keystore-password-file=/home/me/me_node/password +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password +``` + +# Configuration file + +```bash +privacy-tls-keystore-password-file="/home/me/me_node/password" +``` + + + +The path to the file containing the password to decrypt the keystore. + +### `privacy-tls-known-enclave-file` + + + +# Syntax + +```bash +--privacy-tls-known-enclave-file= +``` + +# Example + +```bash +--privacy-tls-known-enclave-file=/home/me/me_node/knownEnclave +``` + +# Environment variable + +```bash +BESU_PRIVACY_TLS_KNOWN_ENCLAVE_FILE=/home/me/me_node/knownEnclave +``` + +# Configuration file + +```bash +privacy-tls-known-enclave-file="/home/me/me_node/knownEnclave" +``` + + + +The path to the file containing the hostnames, ports, and SHA256 certificate fingerprints of the [authorized privacy enclave](../../how-to/configure/tls/client-and-server.md#create-the-known-servers-file). + +### `privacy-url` + + + +# Syntax + +```bash +--privacy-url= +``` + +# Example + +```bash +--privacy-url=http://127.0.0.1:8888 +``` + +# Environment variable + +```bash +BESU_PRIVACY_URL=http://127.0.0.1:8888 +``` + +# Configuration file + +```bash +privacy-url="http://127.0.0.1:8888" +``` + + + +The URL on which the [Tessera node](../../tutorials/privacy/index.md#3-create-tessera-configuration-files) is running. + + + +[accounts permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file +[nodes permissions configuration file]: ../../how-to/use-permissioning/local.md#permissions-configuration-file +[account permissioning]: ../../concepts/permissioning/index.md#account-permissioning +[TLS on communication with the private transaction manager]: ../../concepts/privacy/index.md#private-transaction-manager diff --git a/versioned_docs/version-stable/private-networks/reference/cli/subcommands.md b/versioned_docs/version-stable/private-networks/reference/cli/subcommands.md new file mode 100644 index 00000000000..5b8b07c4dbd --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/cli/subcommands.md @@ -0,0 +1,143 @@ +--- +title: Private network subcommands +sidebar_position: 2 +description: Hyperledger Besu command line interface subcommands +tags: + - private networks +--- + +# Private network subcommands + +This reference describes the syntax of the Hyperledger Besu private network command line interface (CLI) subcommands. + +:::danger + +This reference contains subcommands that apply to only private networks. For subcommands that apply to both private and public networks, see the [public network subcommands reference](../../../public-networks/reference/cli/subcommands.md). + +::: + +To start a Besu node using subcommands, run: + +```bash +besu [OPTIONS] [SUBCOMMAND] [SUBCOMMAND OPTIONS] +``` + +If using Bash or Z shell, you can view subcommand suggestions by pressing the Tab key twice. + +```bash +besu Tab+Tab +``` + +## `operator` + +Provides operator actions. + +### `generate-blockchain-config` + + + +# Syntax + +```bash +besu operator generate-blockchain-config --config-file= --to= [--genesis-file-name=] [--private-key-file-name=] [--public-key-file-name=] +``` + +# Example + +```bash +besu operator generate-blockchain-config --config-file=config.json --to=myNetworkFiles +``` + + + +Generates an [IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) or [QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 or QBFT genesis file, except for the `extraData` string. The second is the `blockchain` property defining the number of key pairs to generate. + +## `rlp` + +Provides RLP related actions. + +### `encode` + + + +# Syntax + +```bash +besu rlp encode [--from=] [--to=] [--type=] +``` + +# File example + + ```bash + besu rlp encode --from=ibft_extra_data.json --to=extra_data_for_ibft_genesis.txt --type=IBFT_EXTRA_DATA + ``` + +# Standard input/output example + +```bash +cat extra_data.json | besu rlp encode > rlp.txt +``` + + + +Encodes the RLP hexadecimal string for use in an [IBFT 2.0](../../how-to/configure/consensus/ibft.md#genesis-file) or [QBFT](../../how-to/configure/consensus/qbft.md#genesis-file) genesis file. The default type is `IBFT_EXTRA_DATA`. + +Supported types are: + +- `IBFT_EXTRA_DATA` - The IBFT 2.0 genesis file includes the `IBFT_EXTRA_DATA` type in the [`extraData`](../../how-to/configure/consensus/ibft.md#extra-data) property. + +- `QBFT_EXTRA_DATA` - The QBFT genesis file includes the `QBFT_EXTRA_DATA` type in the [`extraData`](../../how-to/configure/consensus/qbft.md#extra-data) property. + +## IBFT 2.0 extra data + +To generate the RLP encoded `extraData` string, specify a JSON input that is an array of validator addresses in ascending order. + +:::tip JSON Schema for IBFT_EXTRA_DATA + +Use the following JSON Schema to validate that your JSON data is well formed. To validate your JSON content, use an online validation tool, such as [JSON Schema Validator](https://www.jsonschemavalidator.net/). + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://org.hyperledger.besu/cli_rlp_ibft_extra_data.json", + "type": "array", + "definitions": {}, + "title": "IBFT extra data", + "description": "JSON format used as input to generate an IBFT extra data RLP string", + "items": { + "$id": "#/address", + "type": "string", + "title": "Validator address", + "description": "The validator node address", + "default": "", + "examples": [ + "be068f726a13c8d46c44be6ce9d275600e1735a4", + "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" + ], + "pattern": "^([0-9a-f]{40})$" + } +} +``` + +Example IBFT_EXTRA_DATA encoding + + + +# JSON input + +```json +[ + "be068f726a13c8d46c44be6ce9d275600e1735a4", + "5ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193" +] +``` + +# RLP output + +``` +0xf853a00000000000000000000000000000000000000000000000000000000000000000ea94be068f726a13c8d46c44be6ce9d275600e1735a4945ff6f4b66a46a2b2310a6f3a93aaddc0d9a1c193808400000000c0 +``` + + diff --git a/versioned_docs/version-stable/private-networks/reference/index.md b/versioned_docs/version-stable/private-networks/reference/index.md new file mode 100644 index 00000000000..079ea80b12b --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/index.md @@ -0,0 +1,23 @@ +--- +description: private networks reference overview +tags: + - private networks +--- + +# Reference + +This section provides reference material for private network features. + +The following features and resources are shared with [public networks](../../public-networks/index.md) and the content can be found in the public networks section: + +- Besu command line: + - [Standard options](../../public-networks/reference/cli/options.md) + - [Standard subcommands](../../public-networks/reference/cli/subcommands.md) +- Besu API: + - [Standard Besu API methods](../../public-networks/reference/api/index.md) + - [Standard Besu API objects](../../public-networks/reference/api/objects.md) +- [Genesis file items](../../public-networks/reference/genesis-items.md) +- [EVM tool options](../../public-networks/reference/evm-tool.md) +- [Transaction trace types](../../public-networks/reference/trace-types.md) +- [Projects using Besu](../../public-networks/reference/projects-using-besu.md) +- [Security disclosure policy](../../public-networks/reference/disclosure.md) diff --git a/versioned_docs/version-stable/private-networks/reference/plugin-api-interfaces.md b/versioned_docs/version-stable/private-networks/reference/plugin-api-interfaces.md new file mode 100644 index 00000000000..54d4beda062 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/reference/plugin-api-interfaces.md @@ -0,0 +1,61 @@ +--- +title: Plugin API interfaces +sidebar_position: 4 +description: Plugin interfaces +tags: + - private networks +--- + +# Plugin API interfaces + +API interfaces in Hyperledger Besu allow users to [build plugins](../concepts/plugins.md) to extend Besu functionality. + +For more information about the available interfaces, see the [Plugin API Javadoc](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/index.html). + +:::note Javadoc issue + +The plugin API documentation is currently not being updated. We're working on a fix, but in the meantime, some links are temporarily pointing to wiki.hyperledger.org. + +::: + +## Core plugin classes + +The following table lists the interfaces providing core plugin classes. + +| Interface | Description | +| --- | --- | +| [**BesuContext**](https://wiki.hyperledger.org/display/BESU/BesuContext) | Allows plugins to access Besu services. | +| [**BesuPlugin**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/BesuPlugin.html) | Used to manage the plugin lifecycle. | + +## Plugin services + +The following table lists interfaces providing services you can retrieve. + +| Interface | Description | +| --- | --- | +| [**BesuEvents**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuEvents.html) | Allows plugins to attach to events during Besu operation. | +| [**BesuConfiguration**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/BesuConfiguration.html) | Provides file system locations of Besu's storage. | +| [**IbftQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/IbftQueryService.html) | Allows query of the IBFT 2.0 aspects of the blockchain. | +| [**MetricCategoryRegistry**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/metrics/MetricCategoryRegistry.html) | Adds a new metrics category to the CLI. | +| [**MetricsSystem**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/MetricsSystem.html) | Register metrics with the Prometheus endpoint. | +| [**PoaQueryService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/query/PoaQueryService.html) | Query the current state of Clique and IBFT 2.0 consensus protocols. | +| [**PicoCLIOptions**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/PicoCLIOptions.html) | Adds CLI commands to the Besu command line. | +| [**SecurityModuleService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/SecurityModuleService.html) | Allows plugins to register a security module. | +| [**StorageService**](https://javadoc.io/doc/org.hyperledger.besu/plugin-api/latest/org/hyperledger/besu/plugin/services/StorageService.html) | Allows plugins to register as a storage engine. For example, to connect to a hardware security module (HSM). | +| [**PermissioningService**](https://wiki.hyperledger.org/display/BESU/PermissioningService) | Allows for fine grain control of node connection and node messaging permissioning. | +| [**PrivacyPluginService**](https://wiki.hyperledger.org/display/BESU/PrivacyPluginService) | Provides a way to define how [privacy marker transactions] are created, and what private genesis to use. | +| [**RpcEndpointService**](https://wiki.hyperledger.org/display/BESU/RpcEndpointService) | Register custom RPC endpoints. | + +To use the interfaces in your plugin, ensure the [Gradle build file](https://github.com/ConsenSys/PluginsAPIDemo/blob/957628b3c6f533f3c3f405e2a17e369cd1f02c31/build.gradle) contains the `https://hyperledger.jfrog.io/hyperledger/besu-maven` repository and the `plugin-api` dependency. + +:::warning Known issue + +As indicated in [issue #406](https://github.com/hyperledger/besu-docs/issues/406), plugins may need to access the parsed command line during registration, but the command line is not yet initialized at this stage. + +It's in our roadmap to improve lifecycle steps and provide additional visibility for some data. A workaround is to create a supplier during the `register` step and store it in memory. + +The `start` step can be ignored and your plugin module will be instantiated when the command line interface is parsed and available. + +::: + +[privacy marker transactions]: ../concepts/privacy/private-transactions/processing.md diff --git a/versioned_docs/version-stable/private-networks/tutorials/_category_.json b/versioned_docs/version-stable/private-networks/tutorials/_category_.json new file mode 100644 index 00000000000..25d3afe68ac --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Tutorials", + "position": 5, + "link": { + "type": "generated-index", + "slug": "private-networks/tutorials" + } +} diff --git a/versioned_docs/version-stable/private-networks/tutorials/azure.md b/versioned_docs/version-stable/private-networks/tutorials/azure.md new file mode 100644 index 00000000000..ab62e978fcc --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/azure.md @@ -0,0 +1,98 @@ +--- +title: Deploy using Microsoft Azure +sidebar_position: 10 +description: Deploy a private IBFT 2.0 network using Microsoft Azure. +tags: + - private networks +--- + +# Deploy private network example on Azure + +The [Quorum Dev Quickstart on Azure Marketplace] enables deploying a private IBFT 2.0 network, which includes: + +- A bootnode. +- An RPC node. +- Three regular nodes. +- A block explorer. +- Prometheus and Grafana with the Besu dashboard installed. + +These are deployed on a single Azure VM in minutes. + +Once deployed, you can develop and test applications and connect to the Visual Studio Code (VSCode) plugin using the RPC endpoint `http:///jsonrpc`. + +## Overview + +The following is a high-level overview of the deployed network. + +![Image landing](../../assets/images/sampleNetworks-poa.png) + +## Deploy + +To deploy the private network example on Azure: + +1. Create a Resource Group in the [Azure Portal](https://portal.azure.com). + +1. Go to the [Quorum Dev Quickstart on Azure Marketplace]. + +1. Click **Get It Now** and **Continue**. The Quickstart landing page is displayed. + + ![Image landing](../../assets/images/mp_0_landing.png) + +1. Click **Create**. The **Basics** page is displayed. + + ![Image basics](../../assets/images/mp_1_basics.png) + +1. Enter: + + - Details of the Resource Group you created earlier. + - Basic user credentials to start a VM. + - Prefix for your new VM and any other resources created. + - Region to which you wish to deploy the VM. + +1. Click **Next: Size** and select the size of the VM you want to use. + +1. To start the deployment, click **Review + create** at the bottom left of the page. + + The deployment typically takes 3--5 minutes. The progress of your deployment is displayed. + + When the deployment is complete, the resources created are displayed. + +1. Click **Go to Resource**. Everything created in the deployment is displayed. + +1. Click on the VM name. The VM details such as the IP and DNS name are displayed. Use the IP and DNS name displayed to connect to the VM, either in browser or via RPC calls. + +## Block explorer + +To display the block explorer, open a new tab and enter either the IP of the VM or the DNS name. + +![Image be](../../assets/images/mp_8_block_explorer.png) + +## Metrics + +The deployment includes Prometheus metrics and Grafana with a custom Besu Dashboard installed. To display the dashboard: + +1. Open a new tab and enter the IP or DNS name appended with `/grafana`. For example: `http:///grafana`. + +1. Click on home and select the Besu dashboard. + + ![Grafana screenshot](../../assets/images/mp_9_grafana.png) + +The dashboard provides a visual way to monitor your network and nodes as the chain progresses. Alerting can also be configured. + +## Connect to VM RPC endpoint + +You can connect dapps or develop directly from the IDE by using VSCode and connecting to the VM RPC endpoint. The endpoint is the DNS name appended with `/jsonrpc`: `http:///jsonrpc`. + +## SSH + +You can SSH into the VM to see how everything is set up and working. Use the credentials from step 5 of [deployment](#deploy) and your preferred client: + +```bash +ssh username@ +``` + +To list all containers running, run `docker ps`. Find the complete setup in `/home//besu-quickstart`. + +![Image ssh](../../assets/images/mp_10_ssh.png) + +[Quorum Dev Quickstart on Azure Marketplace]: https://azuremarketplace.microsoft.com/en-us/marketplace/apps/consensys.quorum-dev-quickstart diff --git a/versioned_docs/version-stable/private-networks/tutorials/clique.md b/versioned_docs/version-stable/private-networks/tutorials/clique.md new file mode 100644 index 00000000000..5a92e40122f --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/clique.md @@ -0,0 +1,272 @@ +--- +title: Create a Clique network +sidebar_position: 4 +description: Create a private network using the Clique consensus protocol. +tags: + - private networks +--- + +# Create a private network using Clique + +A private network provides a configurable network for testing. This private network uses the [Clique (proof of authority) consensus protocol]. + +:::danger + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +::: + +## Prerequisites + +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using Clique. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. When the node starts, Besu saves the [node key](../../public-networks/concepts/node-keys.md) in this directory. + +Create directories for your private network, each of the three nodes, and a data directory for each node: + +```bash +Clique-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 + ├── data +``` + +### 2. Get the address for Node-1 + +In Clique networks, you must include the address of at least one initial signer in the genesis file. For this Clique network, we'll use Node-1 as the initial signer. This requires obtaining the address for Node-1. + +To get the address for Node-1, in the `Node-1` directory, use the [`public-key export-address`](../../public-networks/reference/cli/subcommands.md#export-address) subcommand to write the node address to the specified file (`node1Address` in this example). + + + +# MacOS + +```bash +besu --data-path=data public-key export-address --to=data/node1Address +``` + +# Windows + +```bash +besu --data-path=data public-key export-address --to=data\node1Address +``` + + + +### 3. Create the genesis file + +The genesis file defines the genesis block of the blockchain (that is, the start of the blockchain). The [Clique genesis file](../how-to/configure/consensus/clique.md#genesis-file) includes the address of Node-1 as the initial signer in the `extraData` field. + +All nodes in a network must use the same genesis file. + +Copy the following genesis definition to a file called `cliqueGenesis.json` and save it in the `Clique-Network` directory: + +```json +{ + "config": { + "chainId": 1337, + "berlinBlock": 0, + "clique": { + "blockperiodseconds": 15, + "epochlength": 30000 + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0xa00000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0", + "timestamp": "0x5c51a607", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +In `extraData`, replace `` with the [address for Node-1](#2-get-the-address-for-node-1), excluding the 0x prefix. + +```json +{ + ... +"extraData":"0x0000000000000000000000000000000000000000000000000000000000000000b9b81ee349c3807e46bc71aa2632203c5b4620340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + ... +} +``` + +:::warning + +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 4. Start the first node as the bootnode + +Start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --network-id 123 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line enables: + +- The JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option +- The ETH, NET, and CLIQUE APIs using the [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option +- All-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option +- All-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../assets/images/EnodeStartup.png) + +### 5. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + + +The command line specifies: + +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- The data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). + +### 6. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\cliqueGenesis.json --bootnodes= --network-id 123 --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,CLIQUE --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- The bootnode as for [Node-2](#5-start-node-2). +- Other options as for [Node-1](#4-start-the-first-node-as-the-bootnode). + +### 7. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 +``` + +The result confirms Node-1 has two peers (Node-2 and Node-3): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x2" +} +``` + +## Next steps + +Look at the logs displayed to confirm Node-1 is producing blocks and Node-2 and Node-3 are importing blocks. + +Use the [Clique API to add] Node-2 or Node-3 as a signer. + +:::note + +To add Node-2 or Node-3 as a signer you need the [node address as when specifying Node-1](#2-get-the-address-for-node-1) as the initial signer. + +::: + +Import accounts to MetaMask and send transactions, as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::info + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the Clique network in the future, start from [4. Start First Node as Bootnode](#4-start-the-first-node-as-the-bootnode). + +::: + + + +[Clique (proof of authority) consensus protocol]: ../how-to/configure/consensus/clique.md +[Clique API to add]: ../how-to/configure/consensus/clique.md#add-and-remove-signers diff --git a/versioned_docs/version-stable/private-networks/tutorials/contracts/_category_.json b/versioned_docs/version-stable/private-networks/tutorials/contracts/_category_.json new file mode 100644 index 00000000000..3ba8177fcc1 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/contracts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy a smart contract", + "position": 8 +} diff --git a/versioned_docs/version-stable/private-networks/tutorials/contracts/index.md b/versioned_docs/version-stable/private-networks/tutorials/contracts/index.md new file mode 100644 index 00000000000..2b7d7f039cc --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/contracts/index.md @@ -0,0 +1,275 @@ +--- +title: Deploy a smart contract +sidebar_position: 1 +description: deploying smart contracts +tags: + - private networks +--- + +# Deploy smart contracts to an Ethereum chain + +This tutorial shows you how to deploy smart contracts as transactions to a network. + +## Prerequisites + +This tutorial requires a local blockchain network. You can use the [Developer Quickstart](../quickstart.md) to rapidly generate one. If deploying a private contract, enable privacy on the network (public contracts can also be deployed on privacy-enabled networks). + +## Use `eth_sendSignedTransaction` + +To deploy a smart contract using [`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sendsignedtransaction), use an account's private key to sign and serialize the transaction, and send the API request. + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. + +Using the [`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) smart contract as an example, create a new file called `compile.js` with the following content: + +```js title="compile.js" +const fs = require("fs").promises; +const solc = require("solc"); + +async function main() { + // Load the contract source code + const sourceCode = await fs.readFile("SimpleStorage.sol", "utf8"); + // Compile the source code and retrieve the ABI and bytecode + const { abi, bytecode } = compile(sourceCode, "SimpleStorage"); + // Store the ABI and bytecode into a JSON file + const artifact = JSON.stringify({ abi, bytecode }, null, 2); + await fs.writeFile("SimpleStorage.json", artifact); +} + +function compile(sourceCode, contractName) { + // Create the Solidity Compiler Standard Input and Output JSON + const input = { + language: "Solidity", + sources: { main: { content: sourceCode } }, + settings: { outputSelection: { "*": { "*": ["abi", "evm.bytecode"] } } }, + }; + // Parse the compiler output to retrieve the ABI and bytecode + const output = solc.compile(JSON.stringify(input)); + const artifact = JSON.parse(output).contracts.main[contractName]; + return { + abi: artifact.abi, + bytecode: artifact.evm.bytecode.object, + }; +} + +main().then(() => process.exit(0)); +``` + +Run `compile.js` to get the smart contract's output JSON: + +```bash +node compile.js +``` + +Run `solc` to get the contract's bytecode and ABI: + +```bash +solc SimpleStorage.sol --bin --abi +``` + +Once you have the bytecode and ABI, you can rename the output files to make them easier to use; this tutorial refers to them as `SimpleStorage.bin` and `SimpleStorage.abi`. + +Create a new file named `public_tx.js` to send the transaction (or run the following commands in a JavaScript console). The Developer Quickstart provides an [example of a public transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js). + +```js titl="public_tx.js" +const web3 = new Web3(host); +// use an existing account, or make an account +const privateKey = + "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63"; +const account = web3.eth.accounts.privateKeyToAccount(privateKey); + +// read in the contracts +const contractJsonPath = path.resolve(__dirname, "SimpleStorage.json"); +const contractJson = JSON.parse(fs.readFileSync(contractJsonPath)); +const contractAbi = contractJson.abi; +const contractBinPath = path.resolve(__dirname, "SimpleStorage.bin"); +const contractBin = fs.readFileSync(contractBinPath); +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +// get txnCount for the nonce value +const txnCount = await web3.eth.getTransactionCount(account.address); + +const rawTxOptions = { + nonce: web3.utils.numberToHex(txnCount), + from: account.address, + to: null, //public tx + value: "0x00", + data: "0x" + contractBin + contractInit, // contract binary appended with initialization value + gasPrice: "0x0", //ETH per unit of gas + gasLimit: "0x24A22", //max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const tx = new Tx(rawTxOptions); +console.log("Signing transaction..."); +tx.sign(privateKey); +console.log("Sending transaction..."); +var serializedTx = tx.serialize(); +const pTx = await web3.eth.sendSignedTransaction( + "0x" + serializedTx.toString("hex").toString("hex"), +); +console.log("tx transactionHash: " + pTx.transactionHash); +console.log("tx contractAddress: " + pTx.contractAddress); +``` + +`rawTxOptions` contains the following fields: + +- `nonce` - the number of transactions sent from an address. +- `from` - address of the sending account. For example `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73`. +- `to` - address of the receiver. To deploy a contract, set to `null`. +- `gas` - amount of gas provided by the sender for the transaction. +- `gasPrice` - price for each unit of gas the sender is willing to pay. +- `data` - binary of the contract (in this example there's also a constructor initialization value, so we append that to the binary value). +- `value` - amount of Ether/Wei transferred from the sender to the recipient. + +Run the `public_tx.js` to send the transaction: + +```bash +node public_tx.js +``` + +This example code creates the transaction `tx`, signs it with the private key of the account, serializes it, then calls `eth_sendSignedTransaction` to deploy the contract. + +## Use `eth_sendTransaction` + +You can use [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) as an alternative to `eth_sendSignedTransaction`. However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account management separate for stronger security. Configure [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) with your Besu node to make the `eth_sendTransaction` API call. + +An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC node is paired with EthSigner. Refer to the [EthSigner documentation](https://docs.ethsigner.consensys.net/) for configuration details. + +Pass the following parameters to the [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods/#eth_sendtransaction) call to EthSigner; EthSigner then converts the request to an [`eth_sendRawTransaction`](../../../public-networks/reference/api/index.md#eth_sendrawtransaction) call that Besu uses: + +- `to` - address of the receiver. To deploy a contract, set to `null`. +- `from` - address of the sender account. For example `0x9b790656b9ec0db1936ed84b3bea605873558198`. +- `gas` - amount of gas provided by the sender for the transaction +- `gasPrice` - price for each unit of gas the sender is willing to pay +- `data` - one of the following: + - For contract deployments (this use case) - compiled code of the contract + - For contract interactions - hash of the invoked method signature and encoded parameters (see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html)) + - For simple ether transfers - empty + +```json title="'eth_sendTransaction' parameters" +params: { + "to": null, + "from": "0x9b790656b9ec0db1936ed84b3bea605873558198", + "gas": "0x76c0", + "gasPrice": "0x9184e72a000", + "data": "0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033" +} +``` + +Make the request using `eth_sendTransaction`: + +```bash title="'eth_sendTransaction' curl HTTP request" +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0x9b790656b9ec0db1936ed84b3bea605873558198", "to":null, "gas":"0x7600","gasPrice":"0x9184e72a000", "data":"0x608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"}], "id":1}' +``` + +## Use `eea_sendRawTransaction` for private contracts with web3js-quorum + +To deploy a private contract to another node or [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. + +The Developer Quickstart provides an [example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. + +Use [`web3.priv.generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) by running the following commands in a JavaScript console, or by including them in a `private_tx.js` file and running `node private_tx.js`: + +```js title="'private_tx.js' using 'web3.priv.generateAndSendRawTransaction'" +const Web3 = require("web3"); +const Web3Quorum = require("web3js-quorum"); + +const bytecode = + "608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +const chainId = 1337; +const web3 = new Web3(clientUrl); +const web3quorum = new Web3Quorum(web3, chainId); + +const txOptions = { + data: "0x" + bytecode + contractConstructorInit, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], +}; +console.log("Creating contract..."); +const txHash = await web3quorum.priv.generateAndSendRawTransaction(txOptions); +console.log("Getting contractAddress from txHash: ", txHash); + +const privateTxReceipt = await web3quorum.priv.waitForTransactionReceipt( + txHash, +); +console.log("Private Transaction Receipt: ", privateTxReceipt); +return privateTxReceipt; +``` + +`txOptions` contains the following field: + +- `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append that to the bytecode). + +The deployment process includes creating the client as in the previous examples, but rather than deploying the contract with `to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the contract's address. + +:::note + +This example doesn't use a privacy group and makes a simple node-to-node transaction. To use a privacy group: + +- Create the privacy group using the public keys of the nodes in the group. +- Specify the `privacyGroupId` instead of the `privateFor` option in the txOptions above and then send the transaction. + +The Developer Quickstart provides an [example of a private transaction with a privacy group](https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/besu/smart_contracts/privacy/scripts/private_tx_privacy_group.js). + +::: + +## Use `eea_sendRawTransaction` for private contracts with web3js-eea + +:::warning + +This web3js-eea library will be deprecated on December 31, 2021. Please use the [web3js-quorum](https://www.npmjs.com/package/web3js-quorum) library instead and refer to the previous section. + +::: + +To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. + +The Developer Quickstart provides an [example of a private transaction script](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js). + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls. + +Use `eea_sendRawTransaction` by running the following commands in a JavaScript console, or by including them in a `private_tx.js` file and running `node private_tx.js`: + +```js title="'private_tx.js' using 'eea_sendRawTransaction'" +const Web3 = require("web3"); +const EEAClient = require("web3-eea"); + +const bytecode = + "608060405234801561001057600080fd5b5060405161014d38038061014d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806000819055505060f38061005a6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80632a1afcd914604157806360fe47b114605d5780636d4ce63c146088575b600080fd5b604760a4565b6040518082815260200191505060405180910390f35b608660048036036020811015607157600080fd5b810190808035906020019092919050505060aa565b005b608e60b4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b6000805490509056fea2646970667358221220e6966e446bd0af8e6af40eb0d8f323dd02f771ba1f11ae05c65d1624ffb3c58264736f6c63430007060033"; +// initialize the default constructor with a value `47 = 0x2F`; this value is appended to the bytecode +const contractConstructorInit = + "000000000000000000000000000000000000000000000000000000000000002F"; + +const web3 = new Web3(clientUrl); +const web3eea = new EEAClient(web3, 1337); +const txOptions = { + data: "0x" + bytecode + contractConstructorInit, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], +}; +console.log("Creating contract..."); +const txHash = await web3eea.eea.sendRawTransaction(txOptions); +console.log("Getting contractAddress from txHash: ", txHash); + +const privateTxReceipt = await web3.priv.getTransactionReceipt( + txHash, + fromPublicKey, +); +// console.log("Private Transaction Receipt: ", privateTxReceipt); +return privateTxReceipt; +``` + +`txOptions` contains the following field: + +- `data` - compiled code of the contract (in this example there's also a constructor initialization value, so we append that to the bytecode). + +The deployment process includes creating the client as in the previous examples, but rather than deploying the contract with `to: null`, it instead sends the transaction with `privateFor: [memberPublicKey/s]`. Once you make the API call, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the contract's address. diff --git a/versioned_docs/version-stable/private-networks/tutorials/contracts/interact.md b/versioned_docs/version-stable/private-networks/tutorials/contracts/interact.md new file mode 100644 index 00000000000..11da4b07e28 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/contracts/interact.md @@ -0,0 +1,194 @@ +--- +title: Interact with a deployed contract +sidebar_position: 2 +description: calling smart contracts functions +tags: + - private networks +--- + +# Interact with deployed smart contracts + +You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate local blockchain networks. + +This tutorial shows you how to interact with smart contracts that have been deployed to a network. + +## Prerequisites + +- A network with a deployed smart contract as in the [deploying smart contracts tutorial](index.md) + +## Interact with public contracts + +This tutorial uses the [`SimpleStorage.sol`](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/common/smart_contracts/privacy/contracts/SimpleStorage.sol) contract: + +```js +pragma solidity ^0.7.0; + +contract SimpleStorage { + uint public storedData; + + constructor(uint initVal) public { + storedData = initVal; + } + + function set(uint x) public { + storedData = x; + } + + function get() view public returns (uint retVal) { + return storedData; + } +} +``` + +Once the contract is deployed, you can perform a read operation using the `get` function call and a write operation using the `set` function call. This tutorial uses the [web3js](https://www.npmjs.com/package/web3) library to interact with the contract. A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/public_tx.js) of these calls can be found in the [Developer Quickstart]. + +### 1. Perform a read operation + +To perform a read operation, you need the address that the contract was deployed to and the contract's ABI. The contract's ABI can be obtained from compiling the contract; see the [deploying smart contracts tutorial](index.md) for an example. + +Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new instance of the smart contract, then make the `get` function call from the contract's list of methods, which will return the value stored: + +```js +async function getValueAtAddress( + host, + deployedContractAbi, + deployedContractAddress, +) { + const web3 = new Web3(host); + const contractInstance = new web3.eth.Contract( + deployedContractAbi, + deployedContractAddress, + ); + const res = await contractInstance.methods.get().call(); + console.log("Obtained value at deployed contract is: " + res); + return res; +} +``` + +### 2. Perform a write operation + +To perform a write operation, send a transaction to update the stored value. As with the [`get` call](#1-perform-a-read-operation), you need to use the address that the contract was deployed to and the contract's ABI. The account address must correspond to an actual account with some ETH in it to perform the transaction. Because Besu doesn't manage accounts, this address is the address you use in [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) (or equivalent) to manage your accounts. + +Make the `set` call passing in your account address, `value` as the updated value of the contract, and the amount of gas you are willing to spend for the transaction: + +```js +// You need to use the accountAddress details provided to Besu to send/interact with contracts +async function setValueAtAddress( + host, + accountAddress, + value, + deployedContractAbi, + deployedContractAddress, +) { + const web3 = new Web3(host); + const contractInstance = new web3.eth.Contract( + deployedContractAbi, + deployedContractAddress, + ); + const res = await contractInstance.methods + .set(value) + .send({ from: accountAddress, gasPrice: "0xFF", gasLimit: "0x24A22" }); + return res; +} +``` + +### 3. Verify an updated value + +To verify that a value has been updated, perform a `get` call after a `set` update call. + +## Interact with private contracts + +This private contracts example uses the same `SimpleStorage.sol` contract as in the [public contracts example](#interact-with-public-contracts), but it uses the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`generateAndSendRawTransaction`](https://consensys.github.io/web3js-quorum/latest/module-priv.html#~generateAndSendRawTransaction) method to interact with the contract. Both read and write operations are performed using the `generateAndSendRawTransaction` API call. A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/private_tx.js) can be found in the [Developer Quickstart]. + +### 1. Perform a read operation + +As in the public contracts example, to perform a read operation, you need the address that the contract was deployed to and the contract's ABI. You also need your private and public keys and the recipient's public key. + +Use the [`web3.eth.Contract`](https://web3js.readthedocs.io/en/v1.3.4/web3-eth-contract.html) object to create a new instance of the smart contract, extract the signature of function's ABI for the `get` method, and then use this value as the `data` parameter for the `generateAndSendRawTransaction` transaction. + +The keys remain the same for the sender and recipient, and the `to` field is the contract's address. Once you make the request, you receive a `transactionHash`, which you can use to get a `transactionReceipt` containing the value stored: + +```js +async function getValueAtAddress( + clientUrl, + address, + contractAbi, + fromPrivateKey, + fromPublicKey, + toPublicKey, +) { + const Web3 = require("web3"); + const Web3Quorum = require("web3js-quorum"); + const web3 = new Web3Quorum(new Web3("http://localhost:22000")); + // eslint-disable-next-line no-underscore-dangle + const functionAbi = contract._jsonInterface.find((e) => { + return e.name === "get"; + }); + const functionParams = { + to: address, + data: functionAbi.signature, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], + }; + const transactionHash = await web3quorum.priv.generateAndSendRawTransaction( + functionParams, + ); + // console.log(`Transaction hash: ${transactionHash}`); + const result = await web3quorum.priv.waitForTransactionReceipt( + transactionHash, + ); + console.log( + "" + nodeName + " value from deployed contract is: " + result.output, + ); + return result; +} +``` + +### 2. Perform a write operation + +Performing a write operation is almost the same process as the read operation, except that you encode the new value to the `set` function's ABI, and then append these arguments to the `set` function's ABI and use this as the `data` field: + +```js +async function setValueAtAddress( + clientUrl, + address, + value, + contractAbi, + fromPrivateKey, + fromPublicKey, + toPublicKey, +) { + const Web3 = require("web3"); + const Web3Quorum = require("web3js-quorum"); + const web3 = new Web3Quorum(new Web3("http://localhost:22000")); + // eslint-disable-next-line no-underscore-dangle + const functionAbi = contract._jsonInterface.find((e) => { + return e.name === "set"; + }); + const functionArgs = web3quorum.eth.abi + .encodeParameters(functionAbi.inputs, [value]) + .slice(2); + const functionParams = { + to: address, + data: functionAbi.signature + functionArgs, + privateKey: fromPrivateKey, + privateFrom: fromPublicKey, + privateFor: [toPublicKey], + }; + const transactionHash = await web3quorum.priv.generateAndSendRawTransaction( + functionParams, + ); + console.log(`Transaction hash: ${transactionHash}`); + const result = await web3quorum.priv.waitForTransactionReceipt( + transactionHash, + ); + return result; +} +``` + +### 3. Verify an updated value + +To verify that a value has been updated, perform a `get` call after a `set` update call. + +[Developer Quickstart]: ../quickstart.md diff --git a/versioned_docs/version-stable/private-networks/tutorials/contracts/transfer-funds.md b/versioned_docs/version-stable/private-networks/tutorials/contracts/transfer-funds.md new file mode 100644 index 00000000000..d2ae16ca8f4 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/contracts/transfer-funds.md @@ -0,0 +1,128 @@ +--- +title: Transfer account funds +sidebar_position: 1 +description: funds transfer transactions +tags: + - private networks +--- + +# Transfer funds between accounts in a transaction + +You can get started with the [Developer Quickstart](../quickstart.md) to rapidly generate local blockchain networks. + +This tutorial shows you how to transfer funds (ETH) between accounts in a transaction. + +## Prerequisites + +- A [private network](../quickstart.md) + +## Use `eth_sendSignedTransaction` + +The simplest way to transfer funds between externally-owned accounts is using [`eth_sendSignedTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendsignedtransaction). This example uses `eth_sendSignedTransaction` and one of the [test accounts](../../reference/accounts-for-testing.md) to transfer funds to a newly created account. + +:::danger Do not use the test accounts on Ethereum Mainnet or any production network + +The private key is publicly displayed, which means the account is not secure. + +::: + +Before making the transaction, check the balances of both accounts to verify the funds transfer after the transaction. + +```js +const web3 = new Web3(host); +// Pre-seeded account with 90000 ETH +const privateKeyA = + "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; +const accountA = web3.eth.accounts.privateKeyToAccount(privateKeyA); +var accountABalance = web3.utils.fromWei( + await web3.eth.getBalance(accountA.address), +); +console.log("Account A has balance of: " + accountABalance); + +// Create a new account to transfer ETH to +var accountB = web3.eth.accounts.create(); +var accountBBalance = web3.utils.fromWei( + await web3.eth.getBalance(accountB.address), +); +console.log("Account B has balance of: " + accountBBalance); +``` + +Use the test account address (Account A) for the `from` parameter, the recipient account address (Account B) for the `to` parameter, and the amount of ETH to transfer between accounts for the `value` parameter. Sign the transaction with Account A's private key and send it using `eth_sendSignedTransaction`. + +```js +// Send some ETH from A to B +const rawTxOptions = { + nonce: web3.utils.numberToHex( + await web3.eth.getTransactionCount(accountA.address), + ), + from: accountA.address, + to: accountB.address, + value: "0x100", // Amount of ETH to transfer + gasPrice: "0x0", // ETH per unit of gas + gasLimit: "0x24A22", // Max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const tx = new Tx(rawTxOptions); +console.log("Signing transaction..."); +tx.sign(Buffer.from(accountA.privateKey.substring(2), "hex")); +console.log("Sending transaction..."); +var serializedTx = tx.serialize(); +const pTx = await web3.eth.sendSignedTransaction( + "0x" + serializedTx.toString("hex").toString("hex"), +); +console.log("tx transactionHash: " + pTx.transactionHash); +``` + +Once it completes, you can see the updated balances. + +```js +// After the transaction, there should be some ETH transferred +var accountABalance = await getAccountBalance(host, accountA); +console.log("Account A has an updated balance of: " + accountABalance); +var accountBBalance = await getAccountBalance(host, accountB); +console.log("Account B has an updatedbalance of: " + accountBBalance); +} +``` + +A [full example](https://github.com/ConsenSys/quorum-dev-quickstart/blob/1e8cc281098923802845cd829ec20c88513c2e1c/files/besu/smart_contracts/privacy/scripts/eth_tx.js) can be found in the Developer Quickstart. + +## Use `eth_sendTransaction` + +An alternative to using `eth_sendSignedTransaction` is [`eth_sendTransaction`](https://web3js.readthedocs.io/en/v1.2.11/web3-eth.html#sendtransaction). However, Hyperledger Besu does not support the `eth_sendTransaction` API call and keeps account management separate for stronger security. Instead, Besu uses [EthSigner](https://docs.ethsigner.consensys.net/en/stable/) to make the `eth_sendTransaction` API call. + +An example can be found in the [Developer Quickstart](../quickstart.md) where the RPC node is paired with EthSigner. Refer to the [EthSigner documentation](https://docs.ethsigner.consensys.net/en/stable/) configuration details. + +Use `eth_sendTransaction` similarly to [using `eth_sendSignedTransaction`](#use-eth_sendsignedtransaction) (without the signing step which is done by EthSigner): + +```js +const web3 = new Web3(host); +// Pre-seeded account with 90000 ETH +const privateKeyA = "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; +const accountA = web3.eth.accounts.privateKeyToAccount(privateKeyA); +var accountABalance = web3.utils.fromWei(await web3.eth.getBalance(accountA.address)); +console.log("Account A has balance of: " + accountABalance); + +// Create a new account to transfer ETH to +var accountB = web3.eth.accounts.create(); +var accountBBalance = web3.utils.fromWei(await web3.eth.getBalance(accountB.address)); +console.log("Account B has balance of: " + accountBBalance); + +// Send some ETH from A to B +const txOptions = { + from: accountA.address, + to: accountB.address, + value: "0x100", // Amount of ETH to transfer + gasPrice: "0x0", // ETH per unit of gas + gasLimit: "0x24A22" // Max number of gas units the tx is allowed to use +}; +console.log("Creating transaction..."); +const pTx = await web3.eth.sendTransaction(txOptions); +console.log("tx transactionHash: " + pTx.transactionHash); + +// After the transaction, there should be some ETH transferred +var accountABalance = await getAccountBalance(host, accountA); +console.log("Account A has an updated balance of: " + accountABalance); +var accountBBalance = await getAccountBalance(host, accountB); +console.log("Account B has an updatedbalance of: " + accountBBalance); +} +``` diff --git a/versioned_docs/version-stable/private-networks/tutorials/ethash.md b/versioned_docs/version-stable/private-networks/tutorials/ethash.md new file mode 100644 index 00000000000..ea464438383 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/ethash.md @@ -0,0 +1,225 @@ +--- +title: Create an Ethash network +sidebar_position: 5 +description: Create a private network using the Ethash consensus protocol. +tags: + - private networks +--- + +# Create a private network using Ethash + +A private network provides a configurable network for testing. By configuring a low difficulty and enabling mining, this allows for fast block creation. + +You can test multi-block and multi-user scenarios on a private network before moving to one of the public testnets. + +:::danger + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +::: + +## Prerequisites + +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using Ethash. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. When the node starts, Besu saves the [node key](../../public-networks/concepts/node-keys.md) in this directory. + +Create directories for your private network, each of the three nodes, and a data directory for each node: + +```bash +Private-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 + ├── data +``` + +### 2. Create a genesis file + +The genesis file defines the genesis block of the blockchain (that is, the start of the blockchain). The genesis file includes entries for configuring the blockchain, such as the mining difficulty and initial accounts and balances. + +All nodes in a network must use the same genesis file. The [network ID](../../public-networks/concepts/network-and-chain-id.md) defaults to the `chainID` in the genesis file. The `fixeddifficulty` enables fast block mining. + +Copy the following genesis definition to a file called `privateNetworkGenesis.json` and save it in the `Private-Network` directory: + +```json +{ + "config": { + "berlinBlock": 0, + "ethash": { + "fixeddifficulty": 1000 + }, + "chainID": 1337 + }, + "nonce": "0x42", + "gasLimit": "0x1000000", + "difficulty": "0x10000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +:::warning + +Don't use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Start the first node as a bootnode + +Start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-enabled --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line enables: + +- Mining and specifies the account to pay mining rewards to using the [`--miner-enabled`](../../public-networks/reference/cli/options.md#miner-enabled) and [`--miner-coinbase`](../../public-networks/reference/cli/options.md#miner-coinbase) options. +- JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- All-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. +- All-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. + +:::info + +The miner coinbase account is one of the accounts defined in the genesis file. + +::: + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../assets/images/EnodeStartup.png) + +### 4. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30304 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30304 +``` + + + +The command line specifies: + +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- A data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A genesis file as for Node-1. + +### 5. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../privateNetworkGenesis.json --bootnodes= --p2p-port=30305 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\privateNetworkGenesis.json --bootnodes= --p2p-port=30305 +``` + + + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery. +- A data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A bootnode and genesis file as for Node-2. + +### 6. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 +``` + +The result confirms Node-1 (the node running the JSON-RPC service) has two peers (Node-2 and Node-3): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x2" +} +``` + +## Next steps + +Import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::info + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: + +Send transactions using `eth_sendRawTransaction` to [send ether or, deploy or invoke contracts](../how-to/send-transactions/index.md). + +Use the [JSON-RPC API](../../public-networks/how-to/use-besu-api/json-rpc.md). + +Start a node with the [`--rpc-ws-enabled`](../../public-networks/reference/cli/options.md#rpc-ws-enabled) option and use the [RPC Pub/Sub API](../../public-networks/how-to/use-besu-api/rpc-pubsub.md). + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the private network in the future, start from [3. Start the first node as a bootnode](#3-start-the-first-node-as-a-bootnode). + +::: diff --git a/versioned_docs/version-stable/private-networks/tutorials/ibft/_category_.json b/versioned_docs/version-stable/private-networks/tutorials/ibft/_category_.json new file mode 100644 index 00000000000..c90421ed03c --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/ibft/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create an IBFT 2.0 network", + "position": 3 +} diff --git a/versioned_docs/version-stable/private-networks/tutorials/ibft/index.md b/versioned_docs/version-stable/private-networks/tutorials/ibft/index.md new file mode 100644 index 00000000000..c93d9fc271c --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/ibft/index.md @@ -0,0 +1,376 @@ +--- +description: Hyperledger Besu private network using the IBFT 2.0 (Proof of Authority) consensus protocol +tags: + - private networks +--- + +# Create a private network using IBFT 2.0 + +A private network provides a configurable network for testing. This private network uses the [IBFT 2.0 (proof of authority) consensus protocol](../../how-to/configure/consensus/ibft.md). + +:::danger + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires 4 validators to be Byzantine fault tolerant. + +::: + +## Prerequisites + +- [Hyperledger Besu](../../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using IBFT 2.0 with four nodes. The four nodes are all validators. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. + +Create directories for your private network, each of the four nodes, and a data directory for each node: + +```bash +IBFT-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +├── Node-3 +│   ├── data +└── Node-4 + ├── data +``` + +### 2. Create a configuration file + +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `IBFT-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the configuration file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +:::warning + +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `IBFT-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```bash +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │   ├── key + │   └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │   ├── key + │   └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │   ├── key + │   └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the IBFT-Network directory + +Copy the `genesis.json` file to the `IBFT-Network` directory. + +### 5. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```bash +IBFT-Network/ +├── genesis.json +├── Node-1 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-2 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-3 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-4 +│ ├── data +│ │    ├── key +│ │    ├── key.pub +``` + +### 6. Start the first node as the bootnode + +In the `Node-1` directory, start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line: + +- Specifies the data directory for Node-1 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- Enables the JSON-RPC API using the [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables the ETH, NET, and IBFT APIs using the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) option. +- Enables all-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist) option. +- Enables all-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) + +### 7. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + + +The command line specifies: + +- The data directory for Node-2 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 8. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + + +The command line specifies: + +- The data directory for Node-3 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 9. Start Node-4 + +Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + + ```bash + besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 + ``` + +# Windows + + ```bash + besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 + ``` + + + +The command line specifies: + +- The data directory for Node-4 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 10. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`ibft_getvalidatorsbyblocknumber`](../../reference/api/index.md#ibft_getvalidatorsbyblocknumber) method and confirm the network has four validators: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' localhost:8545 +``` + +The result displays the four validators: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x1e326b6da177ede2d3eb6d7247bd9f6901d40234", + "0x4aaac297fefe4466ebcb0b23ab90c5f466b11556", + "0xa267ead2e91e1673e0943b925176b51d9cd4f6d2", + "0xe3e680bc0ff485d1d415a384721f19e0db65fea7" + ] +} +``` + +Look at the logs to confirm Besu is producing blocks: + +```bash +2020-12-21 07:22:17.883+10:00 | EthScheduler-Workers-0 | INFO | PersistBlockTask | Imported #1 / 0 tx / 0 om / 0 (0.0%) gas / (0xde088192f27ca376eea969cb7a4a1de445bd923fde0444194c88e630f7705584) in 0.010s. Peers: 4 +2020-12-21 07:22:19.057+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=2, Round=0}, hash=0x2ca2652fa79ae2b3b6aadcfb13d5d362ffd6207c3b5ae47971e04eb9d05deaa9 +2020-12-21 07:22:21.044+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=3, Round=0}, hash=0x5d9a06cd17127712cfae7d1c25f705f302e146f4b64a73de3c814e1b5a3f9a16 +2020-12-21 07:22:23.049+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=4, Round=0}, hash=0x843981375f4cb2bb0f33a09b647ac27da5df2c539d940d8344c907eede57829c +2020-12-21 07:22:25.060+10:00 | pool-8-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=5, Round=0}, hash=0x82b2069961d9185f7857cad1123de72d715729e122441335db486ea436834d6e +``` + +:::info + +If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), the network will not start producing blocks. + +The logs for each node should indicate the public key was loaded from the `data/key` directory: + +```bash +2020-12-21 07:16:18.360+10:00 | main | INFO | KeyPairUtil | Loaded public key 0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc from /IBFT-Network/Node-1/data/key +``` + +If the keys were not copied to the correct directory, Besu creates a key when starting up: + +```bash +2020-12-21 07:33:11.458+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /IBFT-Network/Node-1/data/key +``` + +If a new key was created, the validator key specified in the configuration does not match the created key and the node cannot participate in creating blocks. + +::: + +## Next steps + +Use the [IBFT API](../../reference/api/index.md#ibft-20-methods) to remove or add validators. + +:::note + +To add or remove nodes as validators you need the node address. The directory [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the name. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires four validators to be Byzantine fault tolerant. + +::: + +Import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](../quickstart.md#create-a-transaction-using-metamask). + +:::info + +Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). + +::: + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the IBFT 2.0 network in the future, start from [6. Start First Node as Bootnode](#6-start-the-first-node-as-the-bootnode). + +::: + + + +[IBFT 2.0 (proof of authority)consensus protocol]: ../../how-to/configure/consensus/ibft.md + + + +\*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. diff --git a/versioned_docs/version-stable/private-networks/tutorials/ibft/validators.md b/versioned_docs/version-stable/private-networks/tutorials/ibft/validators.md new file mode 100644 index 00000000000..1e74b04d01d --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/ibft/validators.md @@ -0,0 +1,125 @@ +--- +title: Add and removing IBFT 2.0 validators +sidebar_position: 1 +description: Adding and removing IBFT 2.0 validators +tags: + - private networks +--- + +# Add and remove IBFT 2.0 validators + +This example walks through [adding and removing an IBFT 2.0 validator](../../how-to/configure/consensus/ibft.md#add-and-remove-validators). + +## Prerequisites + +- [IBFT 2.0 network as configured in the IBFT 2.0 tutorial](index.md) + +## Add a validator + +### 1. Create directories + +Create a working directory and a data directory for the new node that needs to be added: + +```bash +mkdir -p Node-5/data +``` + +### 2. Start the node + +Change into the working directory for the new Node-5 and start the node, specifying the [Node-1 enode URL](index.md#6-start-the-first-node-as-the-bootnode) as the bootnode: + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30307 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8549 +``` + +The command line specifies: + +- The data directory for Node-5 using the [`--data-path`](../../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](index.md#6-start-the-first-node-as-the-bootnode). + +### 3. Copy the address of the node + +Copy the address of the node. You can find the address in the logs when starting the new node: + +```bash +2021-05-28 09:49:00.881+10:00 | main | INFO | DefaultP2PNetwork | Node address 0x90626e6a67445aabf1c0615410d108d4733aa90b +``` + +Or use the [`public-key export-address`](../../../public-networks/reference/cli/subcommands.md#export-address) subcommand: + + + +# Subcommand + +```bash +besu --data-path=IBFT-Network/Node-5/data public-key export-address +``` + +# Output + +```bash +0x90626e6a67445aabf1c0615410d108d4733aa90b +``` + + + +### 4. Propose adding the new validator + +Propose adding the new validator from more than half the number of current validators, using [`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote), specifying the address of the proposed validator and `true`: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0x90626e6a67445aabf1c0615410d108d4733aa90b", true], "id":1}' http://127.0.0.1:8545 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +Repeat the proposal process for this candidate node from at least two of the other nodes. + +### 5. Verify the addition of the new validator + +Verify that the new validator is now in the list of validators using [`ibft_getValidatorsByBlockNumber`](../../../public-networks/reference/api/index.md#ibft_getvalidatorsbyblocknumber): + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545 +``` + +# JSON result + +```json +[ + "0x189d23d201b03ae1cf9113672df29a5d672aefa3", + "0x2aabbc1bb9bacef60a09764d1a1f4f04a47885c1", + "0x44b07d2c28b8ed8f02b45bd84ac7d9051b3349e6", + "0x4c1ccd426833b9782729a212c857f2f03b7b4c0d", + "0x90626e6a67445aabf1c0615410d108d4733aa90b" +] +``` + + + +The list of validators contains 5 addresses now. + +## Remove a validator + +The process for removing a validator is similar to [adding a validator](#add-a-validator) starting from step 2, except you specify `false` as the second parameter of [`ibft_proposeValidatorVote`](../../../public-networks/reference/api/index.md#ibft_proposevalidatorvote). diff --git a/versioned_docs/version-stable/private-networks/tutorials/kubernetes/_category_.json b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/_category_.json new file mode 100644 index 00000000000..5a498fa215c --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deploy using Kubernetes", + "position": 9 +} diff --git a/versioned_docs/version-stable/private-networks/tutorials/kubernetes/charts.md b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/charts.md new file mode 100644 index 00000000000..8172d66e5c7 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/charts.md @@ -0,0 +1,504 @@ +--- +title: Deploying Charts +sidebar_position: 3 +description: Deploying Besu Helm Charts for a Kubernetes cluster +tags: + - private networks +--- + +# Deploy charts + +You can deploy Besu Helm charts for a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) + +## Provision with Helm charts + +Helm is a method of packaging a collection of objects into a chart which can then be deployed to the cluster. After you have cloned the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change the directory to `helm` for the rest of this tutorial. + +```bash +cd helm +``` + +Each helm chart has the following key-map values which you will need to set depending on your needs. The `cluster.provider` is used as a key for the various cloud features enabled. Please specify only one cloud provider, not both. At present, the charts have full support for cloud native services in both AWS and Azure. Please note that if you use GCP, IBM etc please set `cluster.provider: local` and set `cluster.cloudNativeServices: false`. + +Please update the `aws` or `azure` map as shown below if you deploy to either cloud provider. + +```bash +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) + reclaimPolicy: Delete # set to either Retain or Delete; note that PVCs and PVs will still exist after a 'helm delete'. Setting to Retain will keep volumes even if PVCs/PVs are deleted in kubernetes. Setting to Delete will remove volumes from EC2 EBS when PVC is deleted + +quorumFlags: + privacy: false + removeKeysOnDelete: false + +aws: + # the aws cli commands uses the name 'quorum-node-secrets-sa' so only change this if you altered the name + serviceAccountName: quorum-node-secrets-sa + # the region you are deploying to + region: ap-southeast-2 + +azure: + # the script/bootstrap.sh uses the name 'quorum-pod-identity' so only change this if you altered the name + identityName: quorum-pod-identity + # the clientId of the user assigned managed identity created in the template + identityClientId: azure-clientId + keyvaultName: azure-keyvault + # the tenant ID of the key vault + tenantId: azure-tenantId + # the subscription ID to use - this needs to be set explictly when using multi tenancy + subscriptionId: azure-subscriptionId +``` + +Setting the `cluster.cloudNativeServices: true`: + +- Stores keys in Azure Key Vault or AWS Secrets Manager. +- Uses Azure Managed Identities or AWS Identity and Access Management for pod identity access. + +:::note + +You can customize any of the charts in this repository to suit your requirements, and make pull requests to extend functionality. + +::: + +### 1. Check that you can connect to the cluster with `kubectl` + +Verify kubectl is connected to cluster using: (use the latest version) + +```bash +kubectl version +``` + +The result looks similar to: + +```bash +Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.1", GitCommit:"86ec240af8cbd1b60bcc4c03c20da9b98005b92e", GitTreeState:"clean", BuildDate:"2021-12-16T11:41:01Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"} +Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"} +``` + +### 2. Create the namespace + +This tutorial isolates groups of resources (for example, StatefulSets and Services) within a single cluster. + +:::note + +The rest of this tutorial uses `besu` as the namespace, but you're free to pick any name when deploying, as long as it's consistent across the [infrastructure scripts](cluster.md) and charts. + +::: + +Run the following in a terminal window: + +```bash +kubectl create namespace besu +``` + +### 3. Deploy the monitoring chart + +This chart deploys Prometheus and Grafana to monitor the metrics of the cluster, nodes and state of the network. + +Update the admin `username` and `password` in the [monitoring values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/monitoring.yml). Configure alerts to the receiver of your choice (for example, email or Slack), then deploy the chart using: + +```bash +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm repo update +helm install monitoring prometheus-community/kube-prometheus-stack --version 34.10.0 --namespace=besu --values ./values/monitoring.yml --wait +kubectl --namespace besu apply -f ./values/monitoring/ +``` + +Metrics are collected via a [ServiceMonitor](https://github.com/prometheus-operator/prometheus-operator/blob/7c77626e5e270a2530e187b185d45eeed8a773bf/Documentation/user-guides/getting-started.md) that scrapes each Besu pod, using given [`annotations`](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) which specify the port and path to use. For example: + +```bash + template: + metadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: 9545 + prometheus.io/path: "/metrics" +``` + +:::warning + +For production use cases, configure Grafana with one of the supported [native auth mechanisms](https://grafana.com/docs/grafana/latest/auth/). + +::: + +![k8s-metrics](../../../assets/images/kubernetes-grafana.png) + +Optionally you can also deploy the [Elastic Stack](https://www.elastic.co/elastic-stack/) to view logs (and metrics). + +```bash +helm repo add elastic https://helm.elastic.co +helm repo update +# if on cloud +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace quorum --values ./values/elasticsearch.yml +# if local - set the replicas to 1 +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace quorum --values ./values/elasticsearch.yml --set replicas=1 --set minimumMasterNodes: 1 +helm install kibana --version 7.17.1 elastic/kibana --namespace quorum --values ./values/kibana.yml +helm install filebeat --version 7.17.1 elastic/filebeat --namespace quorum --values ./values/filebeat.yml +``` + +If you install `filebeat`, please create a `filebeat-*` index pattern in `kibana`. All the logs from the nodes are sent to the `filebeat` index. If you use The Elastic stack for logs and metrics, please deploy `metricbeat` in a similar manner to `filebeat` and create an index pattern in Kibana. + +![k8s-elastic](../../../assets/images/kubernetes-elastic.png) + +To connect to Kibana or Grafana, we also need to deploy an ingress so you can access your monitoring endpoints publicly. We use Nginx as our ingress here, and you are free to configure any ingress per your requirements. + +```bash +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +helm install quorum-monitoring-ingress ingress-nginx/ingress-nginx \ + --namespace quorum \ + --set controller.ingressClassResource.name="monitoring-nginx" \ + --set controller.ingressClassResource.controllerValue="k8s.io/monitoring-ingress-nginx" \ + --set controller.replicaCount=1 \ + --set controller.nodeSelector."kubernetes\.io/os"=linux \ + --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.service.externalTrafficPolicy=Local + +kubectl apply -f ../ingress/ingress-rules-monitoring.yml +``` + +Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard or on the command line `kubectl -n quorum get services quorum-monitoring-ingress-ingress-nginx-controller`. + +:::note + +We refer to the ingress here as `external-nginx` because it deals with monitoring endpoints specifically. We also deploy a second ingress called `network-ingress` which is for the blockchain nodes only in [step 8](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) + +::: + +![`k8s-ingress-external`](../../../assets/images/kubernetes-ingress-ip.png) + +You can view the Besu dashboard by going to: + +```bash +http:///d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s +``` + +You can view the Kibana dashboard (if deployed) by going to: + +```bash +http:///kibana +``` + +### 4. Deploy the genesis chart + +The genesis chart creates the genesis file and keys for the validators. + +:::warning + +It's important to keep the release names of the initial validator pool as per this tutorial, that is `validator-n`, where `n` is the node number. Any validators created after the initial pool can be named to anything you like. + +::: + +The override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) looks like below: + +```bash +--- +quorumFlags: + removeGenesisOnDelete: true + +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false + +aws: + # the aws cli commands uses the name 'quorum-node-secrets-sa' so only change this if you altered the name + serviceAccountName: quorum-node-secrets-sa + # the region you are deploying to + region: ap-southeast-2 + +azure: + # the script/bootstrap.sh uses the name 'quorum-pod-identity' so only change this if you altered the name + identityName: quorum-pod-identity + # the clientId of the user assigned managed identity created in the template + identityClientId: azure-clientId + keyvaultName: azure-keyvault + # the tenant ID of the key vault + tenantId: azure-tenantId + # the subscription ID to use - this needs to be set explictly when using multi tenancy + subscriptionId: azure-subscriptionId + +# the raw Genesis config +# rawGenesisConfig.blockchain.nodes set the number of validators/signers +rawGenesisConfig: + genesis: + config: + chainId: 1337 + algorithm: + consensus: qbft # choose from: ibft | qbft | raft | clique + blockperiodseconds: 10 + epochlength: 30000 + requesttimeoutseconds: 20 + gasLimit: '0x47b760' + difficulty: '0x1' + coinbase: '0x0000000000000000000000000000000000000000' + blockchain: + nodes: + generate: true + count: 4 + accountPassword: 'password' +``` + +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeGenesisOnDelete: true` tells the chart to delete the genesis file when the chart is deleted. If you may wish to retain the genesis on deletion, please set that value to `false`. + +The last config item is `rawGenesisConfig` which has details of the chain you are creating, please edit any of the parameters in there to match your requirements. To set the number of initial validators set the `rawGenesisConfig.blockchain.nodes` to the number that you'd like. We recommend using the Byzantine formula of `N=3F+1` when setting the number of validators. + +One more thing to note is that when `cluster.cloudNativeServices: true` is set, the genesis job will not add the [Quickstart](../quickstart.md) test accounts into the genesis file. + +When you are ready deploy the chart with : + +```bash +cd helm +helm install genesis ./charts/besu-genesis --namespace besu --create-namespace --values ./values/genesis-besu.yml +``` + +Once completed, view the genesis and enodes (the list of static nodes) configuration maps that every Besu node uses, and the validator and bootnode node keys as secrets. + +![k8s-genesis-configmaps](../../../assets/images/kubernetes-genesis-configmaps.png) + +![k8s-genesis-secrets](../../../assets/images/kuberenetes-genesis-secrets.png) + +### 5. Deploy the bootnodes + +This is an optional but recommended step. In a production setup we recommend the use of two ore more bootnodes for best practices. Each Besu node has a map that tells the StatefulSet what to deploy and how to clean up. The default `values.yml` for the StatefulSet define the following flags which are present in all the override values files. + +```bash +--- +quorumFlags: + privacy: false + removeKeysOnDelete: true + isBootnode: true # set this to true if this node is a bootnode + usesBootnodes: true # set this to true if the network you are connecting to use a bootnode/s that are deployed in the cluster + +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false + reclaimPolicy: Delete # set to either Retain or Delete; note that PVCs and PVs will still exist after a 'helm delete'. Setting to Retain will keep volumes even if PVCs/PVs are deleted in kubernetes. Setting to Delete will remove volumes from EC2 EBS when PVC is deleted + +aws: + # the aws cli commands uses the name 'quorum-node-secrets-sa' so only change this if you altered the name + serviceAccountName: quorum-node-secrets-sa + # the region you are deploying to + region: ap-southeast-2 + +azure: + # the script/bootstrap.sh uses the name 'quorum-pod-identity' so only change this if you altered the name + identityName: quorum-pod-identity + # the clientId of the user assigned managed identity created in the template + identityClientId: azure-clientId + keyvaultName: azure-keyvault + # the tenant ID of the key vault + tenantId: azure-tenantId + # the subscription ID to use - this needs to be set explictly when using multi tenancy + subscriptionId: azure-subscriptionId + +node: + besu: + metrics: + serviceMonitorEnabled: true + resources: + cpuLimit: 1 + cpuRequest: 0.1 + memLimit: "2G" + memRequest: "1G" +``` + +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. If you may wish to retain the keys on deletion, please set that value to `false`. + +For the bootnodes only, set the `quorumFlags.isBootnode: true`. When using bootnodes you have to also set `quorumFlags.usesBootnodes: true` to indicate that all nodes on the network will use these bootnodes. + +:::note + +If you use bootnodes, you must set `quorumFlags.usesBootnodes: true` in the override values.yaml for every other node type, that is validators.yaml, txnode.yaml and reader.yaml + +::: + +```bash +helm install bootnode-1 ./charts/besu-node --namespace besu --values ./values/bootnode.yml +helm install bootnode-2 ./charts/besu-node --namespace besu --values ./values/bootnode.yml +``` + +Once complete, you see two StatefulSets, and the two bootnodes discover themselves and peer. Because there are no validators present yet, there are no blocks created, as seen in the following logs. + +![k8s-bootnode-logs](../../../assets/images/kubernetes-bootnode-logs.png) + +### 6. Deploy the validators + +The validators peer with the bootnodes and themselves, and when a majority of the validators have peered, blocks are proposed and created on the chain. + +These are the next set of nodes that we will deploy. The charts use four validators (default) to replicate best practices for a network. The override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/validator.yml) for the StatefulSet looks like below: + +```bash +--- +quorumFlags: + privacy: false + removeKeysOnDelete: false + isBootnode: false # set this to true if this node is a bootnode + usesBootnodes: true # set this to true if the network you are connecting to use a bootnode/s that are deployed in the cluster +``` + +Please set the `aws`, `azure` and `cluster` keys are as per the [Provisioning](#provision-with-helm-charts) step. `quorumFlags.removeKeysOnDelete: true` tells the chart to delete the node's keys when the chart is deleted. If you may wish to retain the keys on deletion, please set that value to `false`. + +:::warning + +Please note that if you delete a majority of the validators, the network will halt. Additionally, if the validator keys are deleted you may not be able to recover as you need a majority of the validators up to vote to add new validators into the pool + +::: + +When using bootnodes (if deployed in the previous step) you have to also set `quorumFlags.usesBootnodes: true` to indicate that all nodes on the network will use these bootnodes. + +For the initial validator pool we set all the node flags to `false` and then deploy. + +```bash +helm install validator-1 ./charts/besu-node --namespace besu --values ./values/validator.yml +helm install validator-2 ./charts/besu-node --namespace besu --values ./values/validator.yml +helm install validator-3 ./charts/besu-node --namespace besu --values ./values/validator.yml +helm install validator-4 ./charts/besu-node --namespace besu --values ./values/validator.yml +``` + +:::warning + +It's important to keep the release names of the validators the same as it is tied to the keys that the genesis chart creates. So we use `validator-1`, `validator-2`, etc. in the following command. + +::: + +Once completed, you may need to give the validators a few minutes to peer and for round changes, depending on when the first validator was spun up, before the logs display blocks being created. + +![k8s-validator-logs](../../../assets/images/kubernetes-validator-logs.png) + +### 7. Add/Remove additional validators to the validator pool + +To add (or remove) more validators to the initial validator pool, you need to deploy a node such as an RPC node (step 8) and then [vote](../../how-to/configure/consensus/ibft.md#add-and-remove-validators) that node in. The vote API call must be made on a majority of the existing pool and the new node will then become a validator. + +Please refer to the [Ingress Section](#9-connect-to-the-node-from-your-local-machine-via-an-ingress) for details on making the API calls from your local machine or equivalent. + +### 8. Deploy RPC or Transaction nodes + +An RPC node is simply a node that can be used to make public transactions or perform read heavy operations such as when connected to a chain explorer like [BlockScout](https://github.com/blockscout/blockscout). + +The RPC override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/reader.yml) for the StatefulSet looks identical to that of the validators above, and will create it's own node keys before the node starts. + +To deploy an RPC node: + +```bash +helm install rpc-1 ./charts/besu-node --namespace besu --values ./values/reader.yml +``` + +A Transaction or Member node in turn is one which has an accompanying Private Transaction Manager, such as Tessera; which allow you to make private transactions between nodes. + +The Transaction override [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) for the StatefulSet looks identical to that of the validators above and only has `quorumFlags.privacy: true` to indicate that it is deploying a pair of GoQuorum and Tessera nodes. + +To deploy a Transaction or Member node: + +```bash +helm install member-1 ./charts/besu-node --namespace besu --values ./values/txnode.yml +``` + +Logs for `member-1` resemble the following for Tessera: + +![`k8s-tx-tessera-logs`](../../../assets/images/kubernetes-tx-tessera-logs.png) + +Logs for Besu resemble the following: + +![`k8s-tx-Besu-logs`](../../../assets/images/kubernetes-tx-Besu-logs.png) + +:::note + +In these examples we use `member-1` and `rpc-1` as release names for the deployments. You can pick any release name that you'd like to use in place of those as per your requirements. + +::: + +### 9. Connect to the node from your local machine via an ingress + +In order to view the Grafana dashboards or connect to the nodes to make transactions from your local machine you can deploy an ingress controller with rules. We use the `ingress-nginx` ingress controller which can be deployed as follows: + +```bash +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +helm install quorum-network-ingress ingress-nginx/ingress-nginx \ + --namespace quorum \ + --set controller.ingressClassResource.name="network-nginx" \ + --set controller.ingressClassResource.controllerValue="k8s.io/network-ingress-nginx" \ + --set controller.replicaCount=1 \ + --set controller.nodeSelector."kubernetes\.io/os"=linux \ + --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \ + --set controller.service.externalTrafficPolicy=Local +``` + +Use [pre-defined rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) to test functionality, and alter to suit your requirements (for example, restrict access for API calls to trusted CIDR blocks). + +Edit the [rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) file so that the service names match your release name. In the example, we deployed a transaction node with the release name `member-1` so the corresponding service is called `besu-node-member-1`. Once you have settings that match your deployments, deploy the rules as follows: + +```bash +kubectl apply -f ../ingress/ingress-rules-besu.yml +``` + +Once complete, view the IP address listed under the `Ingress` section if you're using the Kubernetes Dashboard or on the command line `kubectl -n quorum get services quorum-network-ingress-ingress-nginx-controller`. + +![`k8s-ingress`](../../../assets/images/kubernetes-ingress-ip.png) + +The following is an example RPC call, which confirms that the node running the JSON-RPC service is syncing: + + + +# curl HTTP request + +```bash +curl -v -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http:///rpc +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4e9" +} +``` + + + +### 10. Blockchain explorer + +You can deploy [BlockScout](https://github.com/blockscout/blockscout) to aid with monitoring the blockchain. To do this, update the [BlockScout values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/blockscout-besu.yml) and set the `database` and `secret_key_base` values. + +:::important + +Changes to the database requires changes to both the `database` and the `blockscout` dictionaries. + +::: + +Once completed, deploy the chart using: + +```bash +helm dependency update ./charts/blockscout +helm install blockscout ./charts/blockscout --namespace quorum --values ./values/blockscout-goquorum.yaml +``` + +You can optionally deploy the [Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight blockchain explorer. The Quorum Explorer is not recommended for use in production and is intended for demonstration or Development purposes only. The Explorer can give an overview over the whole network, such as querying each node on the network for node or block information, voting (add/remove) validators from the network, demonstrating a SimpleStorage smart contract with privacy enabled, and sending transactions between wallets as you would do in MetaMask. Please see the [Explorer](quorum-explorer.md) page for details on how to use the application. + +:::warning + +The accounts listed in the file below are for test purposes only and should not be used on a production network. + +::: + +To deploy the application, update the [Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) with details of your nodes and endpoints and then deploy. + +```bash +helm install quorum-explorer ./charts/explorer --namespace besu --values ./values/explorer-besu.yaml +``` + +You will also need deploy the ingress (if not already done in [Monitoring](#3-deploy-the-monitoring-chart) to access the endpoint on `http:///explorer` + +![`k8s-explorer`](../../../assets/images/kubernetes-explorer.png) diff --git a/versioned_docs/version-stable/private-networks/tutorials/kubernetes/cluster.md b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/cluster.md new file mode 100644 index 00000000000..ba2772510b6 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/cluster.md @@ -0,0 +1,230 @@ +--- +title: Create a cluster +sidebar_position: 2 +description: Create a cluster for deployment +tags: + - private networks +--- + +# Create a cluster + +You can create a [local](#local-clusters) or [cloud](#cloud-clusters) cluster to deploy a Besu network using Kubernetes. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) +- Install [AWS CLI](https://aws.amazon.com/cli/) and [`eksctl`](https://eksctl.io/) for AWS EKS clusters +- Install [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) for Azure AKS clusters +- Install the cloud-specific CLI + +## Local Clusters + +Use one of several options to create a local cluster. Select one listed below, or another that you're comfortable with. + +### Minikube + +[Minikube](https://minikube.sigs.k8s.io/docs/start/) is one of the most popular options to spin up a local Kubernetes cluster for development. You can [install a version](https://minikube.sigs.k8s.io/docs/start/) based on your architecture. + +:::note + +We recommend at least 2 CPUs and 16GB of RAM. + +::: + +To start the cluster, run the following command: + +```bash +minikube start --cpus 2 --memory 16384 --cni auto +``` + +### kind + +[kind (Kubernetes in Docker)](https://kind.sigs.k8s.io) is a lightweight tool for running local Kubernetes clusters. The [installation](https://kind.sigs.k8s.io/docs/user/quick-start#installation) is similar to [Minikube](#minikube). + +To start the cluster, run the following command: + +```bash +kind create cluster +``` + +### Rancher + +[Rancher](https://github.com/rancher-sandbox/rancher-desktop/) is a lightweight open source desktop application for Mac, Windows, and Linux. It provides Kubernetes and container management, and allows you to choose the version of Kubernetes to run. + +It can build, push, pull, and run container images. Built container images can be run without needing a registry. + +:::note + +The official Docker-CLI is not supported but rather uses [nerdctl](https://github.com/containerd/nerdctl) which is a Docker-CLI compatible tool for containerd, and is automatically installed with Rancher Desktop. + +::: + +:::note + +For Windows, you must [install Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install) to install Rancher Desktop. + +Refer to the [official Rancher Desktop documentation](https://docs.rancherdesktop.io/) for system requirements and installation instructions. + +::: + +## Cloud clusters + +### AWS EKS + +[AWS Elastic Kubernetes Service (AWS EKS)](https://aws.amazon.com/eks/) is one of the most popular platforms to deploy Hyperledger Besu. + +To create a cluster in AWS, you must install the [AWS CLI](https://aws.amazon.com/cli/) and [`eksctl`](https://eksctl.io/). + +The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) comprises the base infrastructure used to build the cluster and other resources in AWS. We also use some native services with the cluster for performance and best practices, these include: + +- [Pod identities](https://github.com/aws/amazon-eks-pod-identity-webhook). +- [Secrets Store CSI drivers](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html). +- Dynamic storage classes backed by AWS EBS. The [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) are fixed sizes and can be updated as you grow via helm updates, and won't need to re-provision the underlying storage class. +- [CNI](https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html) networking mode for EKS. By default, EKS clusters use `kubenet` to create a virtual network and subnet. Nodes get an IP address from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods receive an IP address "hidden" behind the node IP. + + :::note + + This approach reduces the number of IP addresses that you must reserve in your network space for pods, but constrains what can connect to the nodes from outside the cluster (for example, on-premise nodes or those on another cloud provider). + + ::: + +AWS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed directly. The IP addresses must be unique across your network space, and must be planned in advance. Each node has a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses per node are then reserved up front for that node. This approach requires more planning, and can lead to IP address exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. + +:::warning + +EKS clusters must not use 169.254.0.0/16, 172.30.0.0/16, 172.31.0.0/16, or 192.0.2.0/24 for the Kubernetes service address range. + +::: + +To provision the cluster: + +1. Update [cluster.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/aws/templates/cluster.yml) + +2. Deploy the template: + + ```bash + eksctl create cluster -f ./templates/cluster.yml + ``` + +3. Your `.kube/config` should be connected to the cluster automatically, but if not, run the commands below and replace `AWS_REGION` and `CLUSTER_NAME` with details that are specific to your deployment. + + ```bash + aws sts get-caller-identity + aws eks --region AWS_REGION update-kubeconfig --name CLUSTER_NAME + ``` + +4. After the deployment completes, provision the EBS drivers for the volumes. While it is possible to use the in-tree `aws-ebs` driver that's natively supported by Kubernetes, it is no longer being updated and does not support newer EBS features such as the [cheaper and better gp3 volumes](https://stackoverflow.com/questions/68359043/whats-the-difference-between-ebs-csi-aws-com-vs-kubernetes-io-aws-ebs-for-provi). The `cluster.yml` file (from the steps above) that is included in this folder automatically deploys the cluster with the EBS IAM policies, but you need to install the EBS CSI drivers. This can be done through the AWS Management Console for simplicity, or via a CLI command as below. Replace `CLUSTER_NAME`, `AWS_REGION` and `AWS_ACCOUNT` with details that are specific to your deployment. + + ```bash + eksctl create iamserviceaccount --name ebs-csi-controller-sa --namespace kube-system --cluster CLUSTER_NAME --region AWS_REGION --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --approve --role-only --role-name AmazonEKS_EBS_CSI_DriverRole + + eksctl create addon --name aws-ebs-csi-driver --cluster CLUSTER_NAME --region AWS_REGION --service-account-role-arn arn:aws:iam::AWS_ACCOUNT:role/AmazonEKS_EBS_CSI_DriverRole --force + ``` + +5. Once the deployment is completed, provision the Secrets Manager IAM and CSI driver. Use `besu` (or equivalent) for `NAMESPACE` and replace `CLUSTER_NAME`, `AWS_REGION` and `AWS_ACCOUNT` with details that are specific to your deployment. + + ```bash + helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts + helm install --namespace kube-system --create-namespace csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver + kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml + + POLICY_ARN=$(aws --region AWS_REGION --query Policy.Arn --output text iam create-policy --policy-name quorum-node-secrets-mgr-policy --policy-document '{ + "Version": "2012-10-17", + "Statement": [ { + "Effect": "Allow", + "Action": ["secretsmanager:CreateSecret","secretsmanager:UpdateSecret","secretsmanager:DescribeSecret","secretsmanager:GetSecretValue","secretsmanager:PutSecretValue","secretsmanager:ReplicateSecretToRegions","secretsmanager:TagResource"], + "Resource": ["arn:aws:secretsmanager:AWS_REGION:AWS_ACCOUNT:secret:besu-node-*"] + } ] + }') + + # If you have deployed the above policy before, you can acquire its ARN: + POLICY_ARN=$(aws iam list-policies --scope Local \ + --query 'Policies[?PolicyName==`quorum-node-secrets-mgr-policy`].Arn' \ + --output text) + + eksctl create iamserviceaccount --name quorum-node-secrets-sa --namespace NAMESPACE --region=AWS_REGION --cluster CLUSTER_NAME --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts + ``` + + :::warning + + The above command creates a service account called `quorum-node-secrets-sa` and is preconfigured in the helm charts override `values.yml` files, for ease of use. + + ::: + +6. Optionally, deploy the [kubernetes dashboard](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws/templates/k8s-dashboard). + +7. You can now use your cluster and you can deploy [Helm charts](charts.md) to it. + +### Azure Kubernetes Service + +[Azure Kubernetes Service (AKS)](https://azure.microsoft.com/en-us/services/kubernetes-service/) is another popular cloud platform that you can use to deploy Besu. To create a cluster in Azure, you must install the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) and have admin rights on your Azure subscription to enable some preview features on AKS. + +The [template](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) comprises the base infrastructure used to build the cluster and other resources in Azure. We also make use Azure native services and features after the cluster is created. These include: + +- [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity). +- [Secrets Store CSI drivers](https://docs.microsoft.com/en-us/azure/key-vault/general/key-vault-integrate-kubernetes). +- Dynamic storage classes backed by Azure Files. The [volume claims](https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv) are fixed sizes and can be updated as you grow via helm updates, and won't need to re-provision the underlying storage class. +- [CNI](https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni) networking mode for AKS. By default, AKS clusters use `kubenet`, to create a virtual network and subnet. Nodes get an IP address from a virtual network subnet. Network address translation (NAT) is then configured on the nodes, and pods receive an IP address "hidden" behind the node IP. + + :::note + + This approach reduces the number of IP addresses you must reserve in your network space for pods to use, but constrains what can connect to the nodes from outside the cluster (for example, on-premise nodes or other cloud providers). + + ::: + +AKS Container Networking Interface (CNI) provides each pod with an IP address from the subnet, and can be accessed directly. These IP addresses must be unique across your network space, and must be planned in advance. Each node has a configuration parameter for the maximum number of pods that it supports. The equivalent number of IP addresses per node are then reserved up front for that node. This approach requires more planning, and can leads to IP address exhaustion as your application demands grow, however makes it easier for external nodes to connect to your cluster. + +:::warning + +Please do not create more than one AKS cluster in the same subnet. AKS clusters may not use `169.254.0.0/16`, `172.30.0.0/16`, `172.31.0.0/16`, or `192.0.2.0/24` for the Kubernetes service address range. + +::: + +To provision the cluster: + +1. Enable the preview features that allow you to use AKS with CNI, and a managed identity to authenticate and run cluster operations with other services. We also enable [AAD pod identities](https://docs.microsoft.com/en-us/azure/aks/use-azure-ad-pod-identity) which use the managed identity. This is in preview, so you must enable this feature by registering the `EnablePodIdentityPreview` feature: + + ```bash + az feature register --name EnablePodIdentityPreview --namespace Microsoft.ContainerService + ``` + + This takes a little while and you can check on progress by running: + + ```bash + az feature list --namespace Microsoft.ContainerService -o table + ``` + + Install or update your local Azure CLI with preview features: + + ```bash + az extension add --name aks-preview + az extension update --name aks-preview + ``` + +1. Create a resource group if you don't already have one: + + ```bash + az group create --name BesuGroup --location "East US" + ``` + +1. Deploy the template: + + 1. Navigate to the [Azure portal](https://portal.azure.com), select **+ Create a resource** in the upper left corner. + 1. Search for `Template deployment (deploy using custom templates)` and select **Create**. + 1. Select **Build your own template in the editor**. + 1. Remove the contents (JSON) in the editor and paste in the contents of [`azuredeploy.json`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/arm/azuredeploy.json) + 1. Select **Save**. + 1. Input provisioning parameters in the displayed user interface. + +1. Provision the drivers: + + 1. Run the [bootstrap](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/azure/scripts/bootstrap.sh) script. + 1. Use `besu` for `AKS_NAMESPACE`, and update `AKS_RESOURCE_GROUP`, `AKS_CLUSTER_NAME`, and `AKS_MANAGED_IDENTITY` in the commands below to match your settings and deployed resources from step 3. + + ```bash + ./scripts/bootstrap.sh "AKS_RESOURCE_GROUP" "AKS_CLUSTER_NAME" "AKS_MANAGED_IDENTITY" "AKS_NAMESPACE" + ``` + +1. You can now use your cluster and you can deploy [Helm charts](charts.md) to it. diff --git a/versioned_docs/version-stable/private-networks/tutorials/kubernetes/index.md b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/index.md new file mode 100644 index 00000000000..bd1dea65869 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/index.md @@ -0,0 +1,138 @@ +--- +title: Deploy a Hyperledger Besu private network with Kubernetes +description: Deploying Hyperledger Besu with Kubernetes +tags: + - private networks +--- + +# Deploy Besu using Kubernetes + +Use the [reference implementations](https://github.com/ConsenSys/besu-kubernetes) to install private networks using Kubernetes (K8s). Reference implementations are available using: + +- [Helm](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm). +- [Helmfile](https://github.com/roboll/helmfile). +- [`kubectl`](https://github.com/ConsenSys/besu-kubernetes/tree/master/playground/kubectl). + +Familiarize yourself with the reference implementations and customize them for your requirements. + +## Quorum-Kubernetes + +[Quorum-Kubernetes](https://github.com/ConsenSys/quorum-Kubernetes) is a repository containing Kubernetes manifests and Helm charts that you can customize and deploy on a local cluster or in the cloud. + +:::important + +We recommend starting with the [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) directory and working through the example setups before moving to the [`Helm charts`](https://github.com/ConsenSys/quorum-kubernetes/tree/master/helm/) directory. + +::: + +The `helm` directory contains charts for the various components, and each chart has a `cluster` map with features that you can toggle. + +```bash +cluster: + provider: local # choose from: local | aws | azure + cloudNativeServices: false # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) +``` + +Setting `cluster.cloudNativeServices: true` stores keys in AWS Secrets Manager or Azure Key Vault instead of Kubernetes Secrets, and will also make use of AWS IAM or Azure Managed Identities for the pods. + +### Cloud support + +The repository's `helm` charts support on-premise and cloud providers such as AWS, Azure, GCP, IBM etc. You can configure the provider in the [values.yml](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/genesis-besu.yml) file of the respective charts by setting `cluster.provider` to `local`, `aws`, or `azure`. If you use GCP, IBM etc., please set `cluster.provider: local` and `cluster.cloudNativeServices: false`. + +The repository also contains [Azure ARM templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/azure) and [AWS `eksctl` templates](https://github.com/ConsenSys/quorum-kubernetes/tree/master/aws) to deploy the required base infrastructure. + +## Limitations + +When using multi-clusters, Kubernetes load balancers disallow TCP and UDP traffic on the same port, which inhibits discovery working natively for each pod. Use the following solutions to mitigate this limitation: + +- Disallow discovery and use static nodes to allow only TCP traffic. This isn't an issue for load balancers or exposing nodes publicly. +- If you need to use discovery, use something such as [CNI](#cni) which is supported by all major cloud providers, and the cloud templates already have CNI implemented. + +### CNI + +With the traditional `kubenet` networking mode, nodes get an IP from the virtual network subnet. Each node in turn uses NAT to configure the pods so that they reach other pods on the virtual network. This limits where they can reach but also more specifically what can reach them. For example, an external VM which must have custom routes does not scale well. + +![without-CNI](../../../assets/images/kubernetes-1.jpeg) + +CNI, on the other hand, allows every pod to get a unique IP directly from the virtual subnet which removes this restriction. Therefore, it has a limit on the maximum number of pods that can be spun up, so you must plan ahead to avoid IP exhaustion. + +![with-CNI](../../../assets/images/kubernetes-2.jpeg) + +## Multi-cluster + +You must enable [CNI](#cni) to use multi-cluster, or to connect external nodes to an existing Kubernetes cluster. To connect multiple clusters, they must each have different CIDR blocks to ensure no conflicts, and the first step is to peer the VPCs or VNets together and update the route tables. From that point on you can use static nodes and pods to communicate across the cluster. + +The same setup also works to connect external nodes and business applications from other infrastructure, either in the cloud or on premise. + +![multi-cluster](../../../assets/images/kubernetes-3.png) + +## Concepts + +### Namespaces + +In Kubernetes, [namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) provide a mechanism for isolating groups of resources within a single cluster. Both namespaces and resources (for example, Stateful Sets or Services) within a namespace must be unique, but resources across namespaces don't need to be. + +:::note + +Namespace-based scoping is not applicable for cluster-wide objects (for example, Storage Class or Persistent Volumes). + +::: + +### Nodes + +Consider using Stateful Sets instead of Deployments for Besu. The term 'client node' refers to bootnode, validator and member/RPC nodes. For Besu nodes, we only use CLI arguments to keep things consistent. + +### Role-based access controls + +We encourage using role-based access controls (RBACs) for access to the private key of each node, that is, only a specific pod or statefulset is allowed to access a specific secret. + +If you need to specify a Kube configuration file for each pod, use the `KUBE_CONFIG_PATH` variable. + +### Storage + +We use separate data volumes to store the blockchain data. This is similar to using separate volumes to store data when using docker containers natively or docker-compose. This is done for a few reasons: + +- Containers are mortal and we do not want to store data on them. +- Kubernetes host nodes can fail and we want the chain data to persist. + +Ensure that you provide enough data storage capacity for all nodes on the cluster. Select the appropriate type of [Storage Class](https://kubernetes.io/docs/concepts/storage/storage-classes/) based on your cloud provider. In the templates, the size of the [volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) is set to 20Gb by default; you can change this depending on your needs. If you have a different storage account than the one in the charts, you may edit those [Storage Classes](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/charts/besu-node/templates/node-storage.yaml). + +When using Persistent Volume Claims, set the `allowVolumeExpansion` to `true`. This helps keep costs low and enables growing the volume over time rather than creating new volumes and copying data across. + +### Monitoring + +We recommend deploying metrics to get an overview of the network, nodes, and volumes. You can also create alerts. + +Besu publishes metrics to Prometheus, and you can configure metrics using the kubernetes scraper configuration. We also have custom Grafana dashboards to monitor the blockchain. + +:::note + +Refer to `values/monitoring.yml` to configure the alerts per your requirements (for example slack or email). + +::: + +```bash +cd helm +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm repo update +helm install monitoring prometheus-community/kube-prometheus-stack --version 34.10.0 --namespace=besu --create-namespace --values ./values/monitoring.yml --wait +kubectl --namespace besu apply -f ./values/monitoring/ +``` + +You can configure Besu to suit your environment. For example, use the Elastic charts to log to a file that you can parse using Logstash into an ELK cluster. + +```bash +cd helm +helm repo add elastic https://helm.elastic.co +helm repo update +# if on cloud +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace besu --create-namespace --values ./values/elasticsearch.yml +# if local - set the replicas to 1 +helm install elasticsearch --version 7.17.1 elastic/elasticsearch --namespace besu --create-namespace --values ./values/elasticsearch.yml --set replicas=1 --set minimumMasterNodes: 1 +helm install kibana --version 7.17.1 elastic/kibana --namespace besu --values ./values/kibana.yml +helm install filebeat --version 7.17.1 elastic/filebeat --namespace besu --values ./values/filebeat.yml +``` + +### Ingress Controllers + +If you require the ingress controllers for the RPC calls or the monitoring dashboards, we have provided example [rules](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/ingress/ingress-rules-besu.yml) that are pre-configured for common use cases. Use these as a reference and develop solutions to match your network topology and requirements. diff --git a/versioned_docs/version-stable/private-networks/tutorials/kubernetes/maintenance.md b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/maintenance.md new file mode 100644 index 00000000000..a32bf1a15b2 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/maintenance.md @@ -0,0 +1,64 @@ +--- +title: Maintenance +sidebar_position: 5 +description: Maintenance for Besu on a Kubernetes cluster +tags: + - private networks +--- + +# Maintenance + +You can perform maintenance for Besu on a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) with a [network](charts.md) +- Install [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- Install [Helm3](https://helm.sh/docs/intro/install/) + +## Update a persistent volume claim size + +Over time, as the chain grows, so will the amount of space used by the persistent volume claim (PVC). As of Kubernetes v1.11, [certain types of Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/#allow-volume-expansion) allow volume resizing. Production charts for Azure use Azure Files, and on AWS use EBS Block Store which allow for volume expansion. + +To update the volume size, you must update the override values file. For example, to increase the size on the transaction nodes volumes, add the following snippet to the [`txnode values.yml`](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/txnode.yml) file, with the new size limit (the following example uses 50Gi). + +```bash +storage: + sizeLimit: "50Gi" + pvcSizeLimit: "50Gi" +``` + +Once complete, update the node via helm: + +```bash +helm upgrade tx-1 ./charts/besu-node --namespace besu --values ./values/txnode.yml +``` + +## Update Besu versions + +:::important + +When updating Besu nodes across a cluster, perform the updates as a rolling update and not all at once, especially for the validator pool. If all the validators are taken offline, the chain halts, and you must wait for round changes to expire before blocks are created again. + +::: + +Updates for Besu can be done via Helm in exactly the same manner as other applications. Alternatively, this can be done via `kubectl`. This example updates a node called `besu-validator-3`: + +1. Set the update policy to use rolling updates (if not done already): + + ```bash + kubectl patch statefulset besu-validator-3 --namespace besu -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}' + ``` + +2. Update the Besu version via Helm: + + ```bash + helm upgrade bootnode-1 ./charts/besu-node --namespace besu --values ./values/bootnode.yml --set image.besu.tag=21.10.0 + ``` + + Or via `kubectl`: + + ```bash + kubectl patch statefulset besu-validator-3 --namespace besu --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"hyperledger/besu:21.10.0"}]' + ``` diff --git a/versioned_docs/version-stable/private-networks/tutorials/kubernetes/nat-manager.md b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/nat-manager.md new file mode 100644 index 00000000000..5a66ede1f48 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/nat-manager.md @@ -0,0 +1,221 @@ +--- +title: Configure Kubernetes mode in NAT manager +sidebar_position: 9 +description: Tutorial to configure Kubernetes mode for Hyperledger Besu Nat Manager +tags: + - private networks +--- + +# Configure Kubernetes mode in NAT Manager + +Use [`--nat-method=AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) or [`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) CLI options to let the Besu node automatically configure its IP address and ports. + +Use mode [`--nat-method=NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) to be able to set your Besu ports and IP address manually. + +Default mode is [`AUTO`](../../../public-networks/how-to/connect/specify-nat.md#auto) but Besu will fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode if automatic configuration fails. + +:::info The following log shows fallback to [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode after an automatic detection failure. + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: + +## Automatic configuration + +Follow 3 steps to configure Besu for automatic IP address and ports detection on Kubernetes: + +1. [Create a load balancer](#1-create-a-load-balancer) +1. [Check if the load balancer is properly deployed](#2-check-if-the-load-balancer-is-properly-deployed) +1. [Deploy Besu](#3-deploy-besu) + +### 1. Create a load balancer + +Deploy a `LoadBalancer` service for Besu to recover IP address and ports. + +Here is an example that you can customize with your own ports and routing rules. + +```yaml +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + name: besu +spec: + ports: + - name: "json-rpc" + port: 8545 + targetPort: 8545 + - name: "rlpx" + port: 30303 + targetPort: 30303 + selector: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + type: LoadBalancer +``` + +This service example lists the rules for the different ports used by Besu (`json-rpc` and` rlpx`). The default value is used for `discovery`. + +### 2. Check if the load balancer is properly deployed + +Verify the load balancer readiness before launching Besu. + +Run `kubectl describe services besu` to check the service status. + +The command should display the following information: + +```bash +Name: besu +Namespace: default +Labels: app.kubernetes.io/name=besu + app.kubernetes.io/release=1.0.0 +Annotations: kubectl.kubernetes.io/last-applied-configuration: + {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"besu","app.kubernetes.io/release":"1.... +Selector: app.kubernetes.io/name=besu,app.kubernetes.io/release=1.0.0 +Type: LoadBalancer +IP: -------- +LoadBalancer Ingress: ****** +``` + +The load balancer must have an IP address displayed in place of `******` on the `LoadBalancer Ingress` line to be ready. + +Run the `kubectl describe services besu` command again until the load balancer IP address appears in the output. + +### 3. Deploy Besu + +When steps 1 and 2 are completed, deploy Besu using the following YAML example: + +```yaml +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: besu-config + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: 1.0.0 +data: + BESU_LOGGING: "INFO" + BESU_NETWORK: "dev" + BESU_P2P_ENABLED: "true" + BESU_RPC_HTTP_ENABLED: "true" + BESU_RPC_HTTP_APIS: "eth,net,web3,debug,admin" + KUBE_CONFIG_PATH: "/opt/besu/shared/kube-config" +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: besu + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" +spec: + replicas: 1 + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + app.kubernetes.io/name: besu + app.kubernetes.io/release: "1.0.0" + spec: + containers: + - name: besu + image: "hyperledger/besu:latest" + imagePullPolicy: Always + ports: + - containerPort: 8545 + - containerPort: 30303 + envFrom: + - configMapRef: + name: besu-config + restartPolicy: Always +status: {} +``` + +## Automatic detection errors + +:::danger + +Automatic detection error messages do not prevent you to use Besu. + +Try the fix indicated for each error or use [`--nat-method=KUBERNETES`](../../../public-networks/how-to/connect/specify-nat.md#kubernetes) CLI option and [set IP address and port manually](../../../public-networks/how-to/connect/configure-ports.md). + +::: + +Possible errors messages for Kubernetes automatic detection failure: + +- [`Service not found`](#service-not-found-error-message) +- [`Forbidden`](#forbidden-error-message) +- [`Ingress not found`](#ingress-not-found-error-message) + +### `Service not found` error message + +- **Error message:** `Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used` +- **Cause:** load balancer did start correctly or has the incorrect name. +- **Fix:** check and modify load balancer YAML configuration and restart service. + +:::info Example error log + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: + +### `Forbidden` error message + +- **Error message:** `Nat manager failed to configure itself automatically due to the following reason Forbidden. NONE mode will be used` +- **Cause:** Besu don't have permission to list the services via the Kubernetes API to retrieve IP address and ports from the load balancer. +- **Fix:** Give it the required permissions using [Role-based access control](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). + + If you can't manage permissions, define the IP address and ports manually with [`NONE`](../../../public-networks/how-to/connect/specify-nat.md#none) mode + +:::info Example error log + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Forbidden. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: + +:::tip + +For development environment, the permission issue can be fixed by running `kubectl create clusterrolebinding myapp-view-binding --clusterrole=admin --serviceaccount=default:default` + +This command should only be used on development environment and not in production environment. + +In production environment, require a finer management of permissions using Kubernetes [Role-based access control](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). + +::: + +### `Ingress not found` error message + +- **Error message:** `Nat manager failed to configure itself automatically due to the following reason Ingress not found. NONE mode will be used` +- **Cause:** Load balancer did not finish to recover an IP address. +- **Fix:** [Check that the load balancer is properly deployed](#2-check-if-the-load-balancer-is-properly-deployed) before launching Besu. + +:::info Example error log + + ``` + INFO | KubernetesNatManager | Starting kubernetes NAT manager. + DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. + DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Ingress not found. NONE mode will be used + INFO | NetworkRunner | Starting Network. + ``` + +::: diff --git a/versioned_docs/version-stable/private-networks/tutorials/kubernetes/playground.md b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/playground.md new file mode 100644 index 00000000000..67962456a62 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/playground.md @@ -0,0 +1,28 @@ +--- +title: Local playground +sidebar_position: 1 +description: Deploying a Hyperledger Besu private network locally with Kubernetes +tags: + - private networks +--- + +# Deploy in a local environment + +The [playground](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground) was created to provide an opportunity to deploy [quorum-kubernetes](https://github.com/ConsenSys/quorum-kubernetes/) in a local environment before attempting in a live environment (such as in the cloud or on-premise). Local deployment can be done with any local Kubernetes tool. Minikube and Rancher Desktop have been tested to work, but any complete Kubernetes solution with support for `kubectl` should suffice. + +## Steps + +1. Navigate to the playground [`README`](https://github.com/ConsenSys/quorum-kubernetes/tree/master/playground). +1. Ensure that your system meets the requirements specified. +1. Choose your Ethereum client (Hyperledger Besu or GoQuorum): `quorum-besu` or `quorum-go`. +1. Choose your consensus algorithm. The playground supports Clique, Ethash (PoW), and IBFT2 for Besu, and IBFT for GoQuorum. +1. Follow the instructions from the `README` for the chosen client and consensus algorithm folder. + +## Important notes + +Consider the following when deploying and developing with the playground: + +- The playground is created specifically for developers and operators to become familiar with the deployment of Besu in a Kubernetes environment in preparation for going into a cloud or on-premise environment. Thus, it should **not** be deployed into a production environment. +- The playground is not a complete reflection of the `helm` charts as it does not use `Helm`, but rather static or non-templated code that is deployed through `kubectl apply -f`. This means that without `Helm` there's a significant amount of repeated code. This is fine for development but not ideal for a production environment. +- The playground uses static/hard-coded keys. Automatic key generation is only supported in `helm` charts. +- As the playground is for local development, no cloud integration or lifecycle support is offered. diff --git a/versioned_docs/version-stable/private-networks/tutorials/kubernetes/production.md b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/production.md new file mode 100644 index 00000000000..a9cd60d9da3 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/production.md @@ -0,0 +1,89 @@ +--- +title: Production +sidebar_position: 6 +description: Deploying Besu Helm Charts for production on a Kubernetes cluster +tags: + - private networks +--- + +# Deploy for production + +You can deploy Besu for production on a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- [Helm3](https://helm.sh/docs/intro/install/) + +## Overview + +To get things production-ready, we'll use the same charts, and set a few of the values in the `cluster` map as in the [Deploy](#deploy-the-network) section. + +:::warning + +The following tutorial ONLY supports AWS and Azure currently. Other cloud providers will be added in time. + +::: + +:::warning + +We recommend using AWS RDS or Azure PostgreSQL in High Availability mode for any Tessera nodes that you use. The templates don't include that functionality. They can be provisioned with CloudFormation or Azure Resource Manager, respectively. Once created, please specify the connection details to the `values.yml`. + +::: + +## Deploy + +### Check that you can connect to the cluster with `kubectl` + +Once you have a [cluster running](cluster.md), verify `kubectl` is connected to cluster with: + +```bash +kubectl version +Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.1", GitCommit:"86ec240af8cbd1b60bcc4c03c20da9b98005b92e", GitTreeState:"clean", BuildDate:"2021-12-16T11:41:01Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"} +Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"} +``` + +### Deploy the network + +For the rest of this tutorial we use Helm charts. After you have cloned the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository, change the directory to `helm` for the rest of this tutorial. + +```bash +cd helm +``` + +Each helm chart has the following keys that must be set. + +Specify either `aws` or `azure` for the `cluster.provider`. Additionally, set `cloudNativeServices: true` and `reclaimPolicy: Retain` so that it looks like the following for AWS: + +```bash +cluster: + provider: aws # choose from: aws | azure + cloudNativeServices: true # set to true to use Cloud Native Services (SecretsManager and IAM for AWS; KeyVault & Managed Identities for Azure) + reclaimPolicy: Retain # set to either Retain or Delete; note that PVCs and PVs will still exist after a 'helm delete'. Setting to Retain will keep volumes even if PVCs/PVs are deleted in kubernetes. Setting to Delete will remove volumes from EC2 EBS when PVC is deleted +``` + +Follow the steps outlined in the [deploy charts](charts.md) tutorial to deploy the network. + +## Best practices + +The most important thing is to plan your network out on paper first and then test it in a Dev cluster to make sure connectivity works with your applications and you get the required throughput in transactions per second (TPS). We also recommend you test the entire process, from provisioning infrastructure to updating nodes on a Dev cluster, prior to launching your production network. + +By default, the cloud Kubernetes clusters take care of availability and do multi-zones within a region. The scheduler also ensures that deployments are spread out across zones. Where possible, we recommend you use multiple bootnodes and static nodes to speed up peering. + +You can connect to APIs and services outside the cluster normally, but connecting into your network (such as adding an on-premise node to the network) might require more configuration. Please check the [limitations](index.md#limitations) and use CNI where possible. To connect an external node to your cluster, the easiest way is to use a VPN as seen in the following [multi-cluster](#multi-cluster-support) setup. + +Finally, we recommend setting up monitoring and alerting from the beginning, so you can get early warnings of issues rather than after failure. We have a monitoring chart which uses Grafana and you can use it with Alertmanager to create alerts or alternatively alert via Cloudwatch or Azure Monitoring. + +## Multi-cluster support + +When CNI is used, multi-cluster support is simple, but you have to cater for cross-cluster DNS names. Ideally, you want to create two separate VPCs (or VNets) and make sure they have different base CIDR blocks so that IP addresses don't conflict. Once done, peer the VPCs together and update the subnet route table, so they are effectively a giant single network. + +![multi-cluster](../../../assets/images/kubernetes-3.png) + +When you [spin up clusters](cluster.md), use [CNI](index.md#limitations) and CIDR blocks to match the subnet's CIDR settings. Then deploy the genesis chart on one cluster and copy across the genesis file and static nodes config maps. Depending on your DNS settings, they might be fine as is, or they might need to be actual IP addresses. That is, you can provision cluster B only after cluster A has Besu nodes up and running. + +Deploy the network on cluster A, and then on cluster B. Besu nodes on cluster A should work as expected, and Besu nodes on cluster B should use the list of peers provided to communicate with the nodes on cluster A. + +Keeping the list of peers on the clusters live and up to date can be challenging, so we recommend using the cloud service provider's DNS service such as Route 53 or Azure DNS and adapting the charts to create entries for each node when it comes up. diff --git a/versioned_docs/version-stable/private-networks/tutorials/kubernetes/quorum-explorer.md b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/quorum-explorer.md new file mode 100644 index 00000000000..cd69831c806 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/kubernetes/quorum-explorer.md @@ -0,0 +1,69 @@ +--- +title: Using the Quorum Explorer +sidebar_position: 4 +description: Using the Quorum Explorer on a Kubernetes cluster +tags: + - private networks +--- + +# Use the Quorum Explorer + +You can use the Quorum Explorer on a Kubernetes cluster. + +## Prerequisites + +- Clone the [Quorum-Kubernetes](https://github.com/ConsenSys/quorum-kubernetes) repository +- A [running Kubernetes cluster](cluster.md) +- [Kubectl](https://kubernetes.io/docs/tasks/tools/) +- [Helm3](https://helm.sh/docs/intro/install/) +- [Existing network](charts.md) + +## Deploy the Quorum Explorer helm chart + +[Quorum-Explorer](https://github.com/ConsenSys/quorum-explorer) as a lightweight blockchain explorer. The Quorum Explorer is **not** recommended for use in production and is intended for demonstration or development purposes only. + +The explorer can provide an overview over the whole network, such as block information, voting or removing validators from the network, and demonstrates using the `SimpleStorage` smart contract with privacy enabled, and sending transactions between wallets in one interface. + +To use the explorer, update the [Quorum-Explorer values file](https://github.com/ConsenSys/quorum-kubernetes/blob/5920caff6dd15b4ca17f760ad9e4d7d2e43b41a1/helm/values/explorer-besu.yaml) with your node details and endpoints, and then [deploy](charts.md). + +## Nodes + +The **Nodes** page provides an overview of the nodes on the network. Select the node you would like to interact with from the drop-down on the top right, and you'll get details of the node, block height, peers, queued transactions etc. + +![`k8s-explorer`](../../../assets/images/kubernetes-explorer.png) + +## Validators + +The **Validators** page simulates a production environment or consortium where each node individually runs API calls to vote to add a validator or remove an existing validator. + +When using the buttons to remove, discard pending validators, or proposing a validator, the app sends an API request to the selected node in the drop-down only. To add or remove a validator you need to select a majority of the existing validator pool individually, and perform the vote API call by clicking the button. Each node can call a discard on the voting process during or after the validator has been added. + +The vote calls made from non-validator nodes have no effect on overall consensus. + +![`k8s-explorer-validators`](../../../assets/images/kubernetes-explorer-validators.png) + +## Explorer + +The **Explorer** page gives you the latest blocks from the chain and the latest transactions as they occur on the network. In addition, you can search by block number or transaction hash using the respective search bar. + +![`k8s-explorer-explorer`](../../../assets/images/kubernetes-explorer-explorer.png) + +## Contracts + +Use the **Contracts** page to compile and deploy a smart contract. Currently, the only contract available for deployment through the app is the `SimpleStorage` contract. However, in time, we plan to add more contracts to that view. + +In this example, we deploy from `member-1` and select `member-1` and `member-3` in the **Private For** multi-select. Then click on `Compile` and `Deploy` + +![`k8s-explorer-contracts-1`](../../../assets/images/kubernetes-explorer-contracts-1.png) + +Once deployed, you can interact with the contract. As this is a new transaction, select `member-1` and `member-3` in **Interact** multi-select, and then click on the appropriate method call to `get` or `set` the value at the deployed contract address. + +![`k8s-explorer-contracts-set`](../../../assets/images/kubernetes-explorer-contracts-set.png) + +To test the private transaction functionality, select `member-2` from the drop-down on the top right, you'll notice that you are unable to interact with the contract because `member-2` was not part of the transaction. Only `members-1` and `member-3` responds correctly. + +## Wallet + +The **Wallet** page gives you the functionality to send simple ETH transactions between accounts by providing the account's private key, the recipient's address, and transfer amount in Wei. + +![`k8s-explorer-wallet`](../../../assets/images/kubernetes-explorer-wallet.png) diff --git a/versioned_docs/version-stable/private-networks/tutorials/permissioning/_category_.json b/versioned_docs/version-stable/private-networks/tutorials/permissioning/_category_.json new file mode 100644 index 00000000000..da14c12d4b3 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/permissioning/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create a permissioned network", + "position": 7 +} diff --git a/versioned_docs/version-stable/private-networks/tutorials/permissioning/index.md b/versioned_docs/version-stable/private-networks/tutorials/permissioning/index.md new file mode 100644 index 00000000000..054469e436d --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/permissioning/index.md @@ -0,0 +1,497 @@ +--- +title: Create a permissioned network +sidebar_position: 1 +description: Hyperledger Besu create a permissioned network +tags: + - private networks +--- + +# Create a permissioned network + +The following steps set up a permissioned network with local node and account permissions. The network uses the [IBFT 2.0 proof of authority consensus protocol]. + +:::danger + +A permissioned Ethereum network as described here is not protected against all attack vectors. We recommend applying defense in depth to protect your infrastructure. + +::: + +## Prerequisites + +- [Hyperledger Besu](../../get-started/install/binary-distribution.md) +- [curl (or similar Web service client)](https://curl.haxx.se/download.html) + +## Steps + +### 1. Create folders + +Each node requires a data directory for the blockchain data. + +Create directories for your permissioned network and each of the three nodes, and a data directory for each node: + +```bash +Permissioned-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 +│   ├── data +└── Node-4 + ├── data +``` + +### 2. Create the configuration file + +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `Permissioned-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::danger Security warning + +Don't use the accounts in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `Permissioned-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```bash +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │   ├── key + │   └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │   ├── key + │   └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │   ├── key + │   └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the Permissioned-Network directory + +Copy the `genesis.json` file to the `Permisssioned-Network` directory. + +### 5. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```bash +Permissioned-Network/ +├── genesis.json +├── Node-1 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-2 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-3 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-4 +│ ├── data +│ │    ├── key +│ │    ├── key.pub +``` + +### 6. Create the permissions configuration file + +The [permissions configuration file](../../how-to/use-permissioning/local.md#permissions-configuration-file) defines the nodes and accounts allowlists. + +Copy the following permissions configuration to a file called `permissions_config.toml` and save a copy in the `Node-1/data`, `Node-2/data`, `Node-3/data`, and `Node-4/data` directories: + +```toml title="permissions_config.toml" +accounts-allowlist=["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "0x627306090abaB3A6e1400e9345bC60c78a8BEf57"] + +nodes-allowlist=[] +``` + +The permissions configuration file includes the first two accounts from the genesis file. + +Use the [`perm_addNodesToAllowlist`](../../reference/api/index.md#perm_addnodestoallowlist) JSON-RPC API method to add permissioned nodes after starting the nodes. + +### 7. Start Node-1 + +Use the following command: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" +``` + + + +The command line allows you to enable: + +- Nodes and accounts permissions using [`--permissions-nodes-config-file-enabled`](../../reference/cli/options.md#permissions-nodes-config-file-enabled) and [`--permissions-accounts-config-file-enabled`](../../reference/cli/options.md#permissions-accounts-config-file-enabled). +- The JSON-RPC API using [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled). +- The `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). +- All-host access to the HTTP JSON-RPC API using [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). +- All-domain access to the node through the HTTP JSON-RPC API using [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to specify Node-1 as a peer and update the permissions configuration file in the following steps. + +![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) + +### 8. Start Node-2 + +Start another terminal, change to the `Node-2` directory, and start Node-2: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30304 --rpc-http-port=8546 +``` + + + +The command line specifies: + +- A different port to Node-1 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- A data directory for Node-2 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). +- Other options as for [Node-1](#7-start-node-1). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. + +### 9. Start Node-3 + +Start another terminal, change to the `Node-3` directory, and start Node-3: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30305 --rpc-http-port=8547 +``` + + + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- A data directory for Node-3 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). +- Other options as for [Node-1](#7-start-node-1). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. + +### 10. Start Node-4 + +Start another terminal, change to the `Node-4` directory, and start Node-4: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --permissions-nodes-config-file-enabled --permissions-accounts-config-file-enabled --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30306 --rpc-http-port=8548 +``` + + + +The command line specifies: + +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- A data directory for Node-4 using [`--data-path`](../../../public-networks/reference/cli/options.md#data-path). +- Other options as for [Node-1](#7-start-node-1). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. You need the enode URL to update the permissions configuration file in the following steps. + +### 11. Add enode URLs for nodes to permissions configuration file + +Start another terminal and use the [`perm_addNodesToAllowlist`](../../reference/api/index.md#perm_addnodestoallowlist) JSON-RPC API method to add the nodes to the permissions configuration file for each node. + +Replace ``, ``, ``, and `` with the enode URL displayed when starting each node. + + + +# Node-1 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8545 +``` + +# Node-2 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8546 +``` + +# Node-3 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"perm_addNodesToAllowlist","params":[["","","","EnodeNode4"]], "id":1}' http://127.0.0.1:8548 +``` + + + +:::tip + +The curl call is the same for each node except for the JSON-RPC endpoint. + +::: + +### 12. Add nodes as peers + +Use the [`admin_addPeer`](../../../public-networks/reference/api/index.md#admin_addpeer) JSON-RPC API method to add Node-1 as a peer for Node-2, Node-3, and Node-4. + +Replace `` with the enode URL displayed when starting Node-1. + + + +# Node-2 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8546 +``` + +# Node-3 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` + + + +:::tip + +The curl call is the same for each node except for the JSON-RPC endpoint. + +::: + +Replace `` with the enode URL displayed when starting Node-2. + + + +# Node-3 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8547 +``` + +# Node-4 + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` + + + +Replace `` with the enode URL displayed when starting Node-3. + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":[""],"id":1}' http://127.0.0.1:8548 +``` + +### 13. Confirm permissioned network is working + +#### Check peer count + +Use curl to call the JSON-RPC API [`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method and confirm the nodes are functioning as peers: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8545 +``` + +The result confirms Node-1 (the node running the JSON-RPC service) has three peers (Node-2, Node-3 and Node-4): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x3" +} +``` + +#### Send a transaction from an account in the allowlist + +Import the first account from the genesis file into MetaMask and send transactions, as described in [Quickstart tutorial]: + +:::info Account 1 + +- Address: `0xfe3b557e8fb62b89f4916b721be55ceb828dbd73` +- Private key : `0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63` +- Initial balance : `0xad78ebc5ac6200000` (200000000000000000000 in decimal) + +::: + +:::info + +Besu doesn't support [private key management](../../../public-networks/how-to/send-transactions.md). + +::: + +### Try sending a transaction from an account not in the accounts allowlist + +Import the third account from the genesis file into MetaMask and try to send a transaction, as described in [Quickstart tutorial]: + +:::info Account 3 + +- Address: `0xf17f52151EbEF6C7334FAD080c5704D77216b732` +- Private key: `0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f` +- Initial balance: `0x90000000000000000000000` (2785365088392105618523029504 in decimal) + +::: + +### Start a node not on the nodes allowlist + +In your `Permissioned-Network` directory, create a `Node-5` directory and `data` directory inside it. + +Change to the `Node-5` directory and start Node-5 specifying the Node-1 enode URL as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --bootnodes="" --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 +``` + +# Windows + +```bash +besu --data-path=data --bootnodes="" --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --rpc-http-cors-origins="*" --p2p-port=30307 --rpc-http-port=8549 +``` + + + +Start another terminal and use curl to call the JSON-RPC API [`net_peerCount`](../../../public-networks/reference/api/index.md#net_peercount) method: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' localhost:8549 +``` + +The result confirms Node-5 has no peers even though it specifies Node-1 as a bootnode: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x0" +} +``` + +## Stop nodes + +When finished using the permissioned network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the permissioned network in the future, start from [step 7](#7-start-node-1). + +::: + + + +[IBFT 2.0 proof of authority consensus protocol]: ../../how-to/configure/consensus/ibft.md +[Private network example tutorial]: ../quickstart.md#create-a-transaction-using-metamask diff --git a/versioned_docs/version-stable/private-networks/tutorials/permissioning/onchain.md b/versioned_docs/version-stable/private-networks/tutorials/permissioning/onchain.md new file mode 100644 index 00000000000..e9d2353a0cd --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/permissioning/onchain.md @@ -0,0 +1,340 @@ +--- +title: Get started with onchain permissioning +sidebar_position: 1 +description: Setting up and using Hyperledger Besu onchain permissioning +tags: + - private networks +--- + +# Get started with onchain permissioning + +The following steps describe bootstrapping a permissioned network using a Hyperledger Besu node. + +This tutorial configures permissioning on a [IBFT 2.0 proof of authority (PoA)] network. + +## Prerequisites + +- [Node.js](https://nodejs.org/en/) v10.16.0 or later +- [Yarn](https://yarnpkg.com/en/) v1.15 or later +- Browser with [MetaMask installed](https://metamask.io/) + +## Steps + +### 1. Create folders + +Each node requires a data directory for the blockchain data. + +Create directories for your permissioned network and each of the three nodes, and a data directory for each node: + +```bash +Permissioned-Network/ +├── Node-1 +│   ├── data +├── Node-2 +│   ├── data +└── Node-3 +│   ├── data +└── Node-4 + ├── data +``` + +### 2. Create the configuration file + +The configuration file defines the [IBFT 2.0 genesis file](../../how-to/configure/consensus/ibft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the IBFT 2.0 genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `ibftConfigFile.json` and save it in the `Permissioned-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::critical Security warning + +Don't use the accounts in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `Permissioned-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```bash +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │   ├── key + │   └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │   ├── key + │   └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │   ├── key + │   └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the Permissioned-Network directory + +Copy the `genesis.json` file to the `Permisssioned-Network` directory. + +### 5. Add the Ingress contracts to the genesis file + +:::tip + +If the network is using only account or node permissioning, add only the relevant Ingress contract to the genesis file. + +::: + +Add the Ingress contracts to the genesis file for your network by copying them from [`genesis.json`](https://github.com/ConsenSys/permissioning-smart-contracts/blob/e6c2d4d5a728c11cdb8e97a07ddda3c0bfb57b5d/genesis.json) in the [`permissioning-smart-contracts` repository](https://github.com/ConsenSys/permissioning-smart-contracts) to the `alloc` section of the contract: + +```json +"0x0000000000000000000000000000000000008888": { + "comment": "Account Ingress smart contract", + "balance": "0", + "code": , + "storage": { + + } +} + +"0x0000000000000000000000000000000000009999": { + "comment": "Node Ingress smart contract", + "balance": "0", + "code": , + "storage": { + + } +} +``` + +:::info + +To support the permissioning contracts, ensure your genesis file includes at least the `constantinopleFixBlock` milestone. + +The permissioning contract has multiple interfaces, and each interface maps to a specific version of the [Enterprise Ethereum Alliance Client Specification](https://entethalliance.org/technical-specifications/). Ensure that you specify the [permissioning contract interface](../../how-to/use-permissioning/onchain.md) being used when starting Besu. + +::: + +### 6. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```bash +Permissioned-Network/ +├── genesis.json +├── Node-1 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-2 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-3 +│   ├── data +│ │    ├── key +│ │    ├── key.pub +├── Node-4 +│ ├── data +│ │    ├── key +│ │    ├── key.pub +``` + +### 7. Start Node-1 + +:::info + +The specified node must be producing blocks, that is, be a miner (PoW networks) or validator (PoA networks). + +To allow MetaMask to connect, the node must have JSON-RPC HTTP enabled, and have `--rpc-http-cors-origins` set to allow MetaMask. + +If your network is not a [free gas network](../../how-to/configure/free-gas.md), the account used to interact with the permissioning contracts must have a balance. + +::: + +Start the first node with command line options to enable onchain permissioning and the location of the **data** folder and genesis file: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" +``` + +On the command line: + +- Enable onchain accounts permissioning using [`--permissions-accounts-contract-enabled`](../../reference/cli/options.md#permissions-accounts-contract-enabled). +- Set the address of the Account Ingress contract in the genesis file using [`--permissions-accounts-contract-address`](../../reference/cli/options.md#permissions-accounts-contract-address). +- Enable onchain nodes permissioning using [`--permissions-nodes-contract-enabled`](../../reference/cli/options.md#permissions-nodes-contract-enabled). +- Set the address of the Node Ingress contract in the genesis file using [`--permissions-nodes-contract-address`](../../reference/cli/options.md#permissions-nodes-contract-address). +- Set the version of the [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) using [`--permissions-nodes-contract-version`](../../reference/cli/options.md#permissions-nodes-contract-version). +- Enable the JSON-RPC API using [`--rpc-http-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-enabled). +- Enable the `ADMIN`, `ETH`, `NET`, `PERM`, and `IBFT` APIs using [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api). +- Allow all-host access to the HTTP JSON-RPC API using [`--host-allowlist`](../../../public-networks/reference/cli/options.md#host-allowlist). +- Allow all-domain access to the node through the HTTP JSON-RPC API using [`--rpc-http-cors-origins`](../../../public-networks/reference/cli/options.md#rpc-http-cors-origins). + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to use when starting Node-2, Node-3, and Node-4. + +### 8. Start Node-2 + +Use the following command to start Node-2: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --p2p-port=30304 --rpc-http-port=8546 +``` + +The command line specifies: + +- A different port to Node-1 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- The enode URL of Node-1 using [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes). +- Other options as for [Node-1](#7-start-node-1). + +### 9. Start Node-3 + +Use the following command to start Node-3: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --p2p-port=30305 --rpc-http-port=8547 +``` + +The command line specifies: + +- A different port to Node-1 and Node-2 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- The enode URL of Node-1 using [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes). +- Other options as for [Node-1](#7-start-node-1). + +### 10. Start Node-4 + +Use the following command to start Node-4: + +```cmd +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x0000000000000000000000000000000000009999" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" --p2p-port=30306 --rpc-http-port=8548 +``` + +The command line specifies: + +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using [`--p2p-port`](../../../public-networks/reference/cli/options.md#p2p-port). +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using [`--rpc-http-port`](../../../public-networks/reference/cli/options.md#rpc-http-port). +- The enode URL of Node-1 using [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes). +- Other options as for [Node-1](#7-start-node-1). + +:::tip + +If your nodes are having trouble connecting as peers, update the `--bootnodes` option for each node to include all four enode URLs. + +::: + +### 11. Clone the contracts and install dependencies + +Clone the `permissioning-smart-contracts` repository: + +```bash +git clone https://github.com/ConsenSys/permissioning-smart-contracts.git +``` + +Change into the `permissioning-smart-contracts` directory. + +### 12. Set the environment variables + +Create the following environment variables and set to the specified values: + +- `BESU_NODE_PERM_ACCOUNT` - Account to deploy the permissioning contracts and become the first admin account. +- `BESU_NODE_PERM_KEY` - Private key of the account to deploy the permissioning contracts. +- `ACCOUNT_INGRESS_CONTRACT_ADDRESS` - Address of the Account Ingress contract in the genesis file. +- `NODE_INGRESS_CONTRACT_ADDRESS` - Address of the Node Ingress contract in the genesis file. +- `BESU_NODE_PERM_ENDPOINT` - Required only if your node is not using the default JSON-RPC host and port (`http://127.0.0.1:8545`). Set to JSON-RPC host and port. When bootstrapping the network, Besu uses the specified node to deploy the contracts and is the first node in the network. +- `CHAIN_ID` - The chain ID from the genesis file. +- `INITIAL_ALLOWLISTED_NODES`(optional) - The enode URLs of permitted nodes. Specify multiple nodes (Node-1, Node-2, Node-3) as a comma-separated list. + +:::tip + +A simple way to set multiple environment variables is to create a file called `.env` with the required settings: + +```env +NODE_INGRESS_CONTRACT_ADDRESS=0x0000000000000000000000000000000000009999 +ACCOUNT_INGRESS_CONTRACT_ADDRESS=0x0000000000000000000000000000000000008888 +BESU_NODE_PERM_ACCOUNT=627306090abaB3A6e1400e9345bC60c78a8BEf57 +BESU_NODE_PERM_KEY=c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 +BESU_NODE_PERM_ENDPOINT=http://127.0.0.1:8545 +CHAIN_ID=1337 +INITIAL_ALLOWLISTED_NODES=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` + +If using a `.env` file, save the file to the `permissioning-smart-contracts` directory. + +::: + +### 13. Deploy the contracts + +In the `permissioning-smart-contracts` directory, while your network is running, deploy the Admin and Rules contracts: + +```bash +yarn truffle migrate --reset --network besu +``` + +This also updates the Ingress contract with the name and version of the Admin and Rules contracts. The migration logs the addresses of the Admin and Rules contracts. + +:::important + +The account that deploys the contracts is automatically an admin account. + +::: + + + +[Node-1, Node-2, Node-3, and Node-4 to the allowlist]: ../../how-to/use-permissioning/onchain.md#update-nodes-allowlist +[IBFT 2.0 proof of authority (PoA)]: ../../how-to/configure/consensus/ibft.md diff --git a/versioned_docs/version-stable/private-networks/tutorials/permissioning/upgrade-contracts.md b/versioned_docs/version-stable/private-networks/tutorials/permissioning/upgrade-contracts.md new file mode 100644 index 00000000000..00078d551b2 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/permissioning/upgrade-contracts.md @@ -0,0 +1,155 @@ +--- +title: Upgrade permissioning contracts +sidebar_position: 2 +description: Upgrade the permissioning contracts for onchain permissioning +tags: + - private networks +--- + +# Upgrade permissioning contracts + +The following tutorial describes the steps to upgrade the onchain permissioning contracts to the latest version. + +## Prerequisites + + + +- [Node.js](https://nodejs.org/en/) v10.16.0 or later + +- [Yarn](https://yarnpkg.com/en/) v1.15 or later +- Browser with [MetaMask installed](https://metamask.io/). + +## Steps + +### 1. Get the latest contracts and install dependencies + +:::note + +Pull the latest changes if you already have a cloned repository using the `git pull` command inside the `permissioning-smart-contracts` directory. + +::: + +1. Clone the `permissioning-smart-contracts` repository: + + ```bash + git clone https://github.com/ConsenSys/permissioning-smart-contracts.git + ``` + +### 3. Update environment variables + +If using a `.env` file to configure environment variables, then the file must be in the `permissioning-smart-contracts` directory. + +:::tip + +You can use environment variables to retain existing contracts if required. For example: + +- `RETAIN_ADMIN_CONTRACT=true` to retain the current admin list +- `RETAIN_NODE_RULES_CONTRACT=true` to retain the current Node rules contract +- `RETAIN_ACCOUNT_RULES_CONTRACT=true` to retain the current Account rules contract + +::: + +1. Legacy: If they exist, rename the following environment variables: + + - `PANTHEON_NODE_PERM_ACCOUNT` to `BESU_NODE_PERM_ACCOUNT` + - `PANTHEON_NODE_PERM_KEY` to `BESU_NODE_PERM_KEY` + - `PANTHEON_NODE_PERM_ENDPOINT` to `BESU_NODE_PERM_ENDPOINT` + +2. If updating from v1 to v2, you need to re-deploy the `NodeIngress` contract. In order to do this, first delete the `NODE_INGRESS_CONTRACT_ADDRESS` environment variable. + + :::important + + This step is only required if upgrading from v1 of the node permissioning contract to v2 (because the interface changed, a new `NodeIngress` contract must be deployed). + + ::: + +### 4. Optional: Export current allowlists + +:::note + +This step enables you to export the current allowlists to assist in updating. + +::: + +1. Export the current allowlists by setting the following environment variables: + + ```bash + RETAIN_ADMIN_CONTRACT=true + RETAIN_NODE_RULES_CONTRACT=true + RETAIN_ACCOUNT_RULES_CONTRACT=true + ``` + +2. Log the current allowlists to console: + + ```bash + truffle migrate --reset + ``` + + The migration scripts will log the existing allowlists to the console, but no contracts will be deployed. + +3. Set initial values for updated deployment using the values logged in the previous step: + + ```bash + INITIAL_ADMIN_ACCOUNTS= + INITIAL_ALLOWLISTED_ACCOUNTS= + INITIAL_ALLOWLISTED_NODES= + ``` + +4. Update environment variables for contracts that are to be deployed. For example: + + ```bash + RETAIN_ADMIN_CONTRACT=true + RETAIN_NODE_RULES_CONTRACT=false + RETAIN_ACCOUNT_RULES_CONTRACT=false + ``` + +### 5. Deploy the contracts + +1. In the `permissioning-smart-contracts` directory, deploy the contracts: + + ```bash + truffle migrate --reset + ``` + + :::important + + - If updating from v1 to v2, the new `NodeIngress` contract address must be specified when restarting the Besu nodes. Copy this address from the migration output. For example: + + ```bash + > Deployed NodeIngress contract to address = 0x12B1f953395080A13AeED0dC4d0bb14e787A91cF + ``` + + - If upgrading from v2 (using separate storage contracts) copy the `Storage` contract addresses displayed in the output. For example: + + ``` + > Deployed NodeStorage contract to address = 0x4F3e35A3Be3C1b77Ade39969D175C743ad3484Ee + ... + > Deployed AccountStorage contract to address = 0x2362187023D738034B516438Af187356b31E8Fb8 + ``` + + ::: + +1. Set the storage contract address environment variables to ensure that the storage contracts are not re-deployed. For example: + + ```bash + NODE_STORAGE_CONTRACT_ADDRESS=0xE0bF6021e023a197DBb3fABE64efA880E13D3f4b + ACCOUNT_STORAGE_CONTRACT_ADDRESS=0x7153CCD1a20Bbb2f6dc89c1024de368326EC6b4F + ``` + +1. Deploy the updated contracts: + + ```bash + truffle migrate --reset + ``` + +### 6. Restart Besu nodes + +Restart the Besu nodes with the updated [`NodeIngress`](#5-deploy-the-contracts) contract address and [permissioning contract interface](../../how-to/use-permissioning/onchain.md#specify-the-permissioning-contract-interface-version) version 2. + +```besu +cmd besu --data-path=data --genesis-file=../genesis.json --permissions-accounts-contract-enabled --permissions-accounts-contract-address "0x0000000000000000000000000000000000008888" --permissions-nodes-contract-enabled --permissions-nodes-contract-address "0x4E72770760c011647D4873f60A3CF6cDeA896CD8" --permissions-nodes-contract-version=2 --rpc-http-enabled --rpc-http-cors-origins="*" --rpc-http-api=ADMIN,ETH,NET,PERM,IBFT --host-allowlist="*" +``` + + + +[nodes to the allowlist]: ../../how-to/use-permissioning/onchain.md#update-nodes-allowlist diff --git a/versioned_docs/version-stable/private-networks/tutorials/privacy/_category_.json b/versioned_docs/version-stable/private-networks/tutorials/privacy/_category_.json new file mode 100644 index 00000000000..c6e33f3bea4 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/privacy/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Create a privacy enabled network", + "position": 6 +} diff --git a/versioned_docs/version-stable/private-networks/tutorials/privacy/index.md b/versioned_docs/version-stable/private-networks/tutorials/privacy/index.md new file mode 100644 index 00000000000..f3991a18afd --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/privacy/index.md @@ -0,0 +1,433 @@ +--- +title: Create a privacy enabled network using the Quickstart +sidebar_position: 1 +description: Configure Hyperledger Besu privacy +tags: + - private networks +--- + +# Create a privacy-enabled network + +Configuring a network that supports private transactions requires starting a [Tessera] node for each Hyperledger Besu node. Besu command line options associate the Besu node with the Tessera node. + +This tutorial assumes you have completed setting up an IBFT 2.0 network to the point where you have [created the genesis file and copied the private keys](../ibft/index.md#5-copy-the-node-private-keys-to-the-node-directories). If not, complete steps 1 to 5 of the [Create an IBFT 2.0](../ibft/index.md) tutorial before continuing. + +:::important + +To support privacy, ensure your genesis file includes at least the `byzantium` milestone. + +This tutorial configures a private network using IBFT 2.0 for educational purposes only. IBFT 2.0 requires 4 validators to be Byzantine fault tolerant. + +::: + +In this tutorial we start Tessera nodes for the four Besu nodes and associate each Besu node with a Tessera node. + +## Prerequisites + +- [Install Tessera](https://docs.tessera.consensys.net/category/install). + +## 1. Create Tessera directories + +Inside each `Node-*` directory, create a `Tessera` directory: + +```bash +IBFT-Network/ +├── Node-1 +│   ├── data +│ ├── Tessera +├── Node-2 +│   ├── data +│ ├── Tessera +├── Node-3 +│   ├── data +│ ├── Tessera +└── Node-4 + ├── data + ├── Tessera +``` + +## 2. Generate Tessera keys + +This example creates an unlocked private key, meaning you do not need a password to decrypt the private key file. + +In each `Tessera` directory, generate a public/private key pair for the Tessera node: + +```bash +tessera -keygen -filename nodeKey +``` + +At the prompt, press **Enter** to create an unlocked key. + +Tessera generates the public/private key pair and saves the keys in the `nodeKey.pub` and `nodeKey.key` files. + +## 3. Create Tessera configuration files + +In the `Tessera` directory for each node, create a file called `tessera.conf`, with the following configuration: + +:::important + +In production environments, only specify [`tls`](https://docs.tessera.consensys.net/HowTo/Configure/TLS/) as `OFF` if another transport security mechanism, such as WireGuard, is in place. + +::: + + + +# Node-1 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9101", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9102", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9103", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +# Node-2 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9201", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9202", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9203", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +# Node-3 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9301", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9302", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9303", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +# Node-4 + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9401", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9402", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9403", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9103" + }, + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + + + +In the configuration file, specify: + +- Different port numbers for the various servers in the [`serverConfigs`](https://docs.tessera.consensys.net/HowTo/Configure/TesseraAPI/) section. +- The address of the Tessera nodes to discover, in the [`peer`](https://docs.tessera.consensys.net/HowTo/Configure/Peer-discovery/#specify-peers) section. +- The location of the public/private key pair. + +## 4. Start the Tessera nodes + +In each `Tessera` directory, start Tessera specifying the [configuration file](#3-create-tessera-configuration-files) created in the previous step: + +```bash +tessera -configfile tessera.conf +``` + +:::info + +After starting the first Tessera node and before starting the other nodes, the log message `failed to connect to node` displays. This is normal behavior. Until you start the other peer nodes, your node is not connected and displays this warning. You can continue to start the other nodes. + +::: + +## 5. Start Besu Node-1 + +In the `Node-1` directory, start Besu Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies privacy options: + +- [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy +- [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the Q2T server address of the Tessera node (`Q2T` in `tessera.conf`) +- [`--privacy-public-key-file`](../../reference/cli/options.md#privacy-public-key-file) specifies the file containing Tessera node public key (created in [3. Generate Tessera Keys](#2-generate-tessera-keys)) +- [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) includes `EEA` and `PRIV` in the list of JSON-RPC APIs to enable privacy JSON-RPC API methods. +- [`--min-gas-price`](../../../public-networks/reference/cli/options.md#min-gas-price) is 0 for a [free gas network](../../how-to/configure/free-gas.md). + +:::note + +Use the [`--privacy-marker-transaction-signing-key-file`](../../reference/cli/options.md#privacy-marker-transaction-signing-key-file) command line option to sign [privacy marker transactions](../../concepts/privacy/private-transactions/processing.md) using a supplied key. The command line option is mandatory in privacy-enabled paid gas networks. + +::: + +When the node starts, the [enode URL](../../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../../assets/images/EnodeStartup.png) + +## 6. Start Besu Node-2 + +In the `Node-2` directory, start Besu Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 --privacy-enabled --privacy-url=http://127.0.0.1:9202 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + +:::note + +When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), [expose ports](../../get-started/install/run-docker-image.md#expose-ports). + +::: + +## 7. Start Besu Node-3 + +In the `Node-3` directory, start Besu Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 --privacy-enabled --privacy-url=http://127.0.0.1:9302 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + +## 8. Start Besu Node-4 + +In the `Node-4` directory, start Besu Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera/nodeKey.pub --min-gas-price=0 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 --privacy-enabled --privacy-url=http://127.0.0.1:9402 --privacy-public-key-file=Tessera\nodeKey.pub --min-gas-price=0 +``` + + + +The command line specifies the same options as for Node-1 with different ports and Tessera node URL. The [`--bootnodes`](../../../public-networks/reference/cli/options.md#bootnodes) option specifies the enode URL of Node-1. + + + +[Tessera]: https://docs.tessera.consensys.net/ diff --git a/versioned_docs/version-stable/private-networks/tutorials/privacy/multi-tenancy.md b/versioned_docs/version-stable/private-networks/tutorials/privacy/multi-tenancy.md new file mode 100644 index 00000000000..c077e8910e5 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/privacy/multi-tenancy.md @@ -0,0 +1,187 @@ +--- +title: Create a multi-tenant network +sidebar_position: 2 +description: Configure multi-tenancy +tags: + - private networks +--- + +# Configure a multi-tenant node + +You can configure Besu and associated Tessera node in a privacy-enabled network to host [multiple tenants](../../concepts/privacy/multi-tenancy.md). + +In this tutorial we'll add tenants to the `Node-1` Besu and Tessera node in a [privacy-enabled network](index.md). + +```bash +IBFT-Network/ +├── Node-1 +│   ├── data +│ ├── Tessera +├── Node-2 +│   ├── data +│ ├── Tessera +├── Node-3 +│   ├── data +│ ├── Tessera +└── Node-4 + ├── data + ├── Tessera +``` + +:::info + +This tutorial uses [JWT public key authentication] to create the tenant's JWT, but you can also use [username and password authentication]. + +::: + +## Prerequisites + +- A [Privacy-enabled network](index.md). + +## 1. Generate a private and public key pair + +In the `Node-1` directory, [generate the private and public key pair]. The key pair, which must be in `.pem` format, belongs to the operator who uses the key pair to authenticate the [tenant JWTs](#6-generate-the-tenant-jwts). + +:::info + +This step is not required when using [username and password authentication] to create the required JWTs. + +::: + +## 2. Generate Tessera keys + +In the `Node-1/Tessera` directory, [generate a public/private key pair for each tenant](index.md#2-generate-tessera-keys). + +:::note + +The instructions creates an unlocked private key, meaning you do not need a password to decrypt the private key file. + +::: + +Name the key pair `nodeKey2` and `nodeKey3`. + +## 3. Update the Tessera configuration file + +In the `Node-1/Tessera` directory, update the `tessera.conf` file by adding the new key pairs: + +```json +{ + "mode": "orion", + "useWhiteList": false, + "jdbc": { + "username": "sa", + "password": "", + "url": "jdbc:h2:./target/h2/tessera1", + "autoCreateTables": true + }, + "serverConfigs": [ + { + "app": "ThirdParty", + "serverAddress": "http://localhost:9101", + "communicationType": "REST" + }, + { + "app": "Q2T", + "serverAddress": "http://localhost:9102", + "communicationType": "REST" + }, + { + "app": "P2P", + "serverAddress": "http://localhost:9103", + "sslConfig": { + "tls": "OFF" + }, + "communicationType": "REST" + } + ], + "peer": [ + { + "url": "http://localhost:9203" + }, + { + "url": "http://localhost:9303" + }, + { + "url": "http://localhost:9403" + } + ], + "keys": { + "passwords": [], + "keyData": [ + { + "privateKeyPath": "nodeKey.key", + "publicKeyPath": "nodeKey.pub" + }, + { + "privateKeyPath": "nodeKey2.key", + "publicKeyPath": "nodeKey2.pub" + }, + { + "privateKeyPath": "nodeKey3.key", + "publicKeyPath": "nodeKey3.pub" + } + ] + }, + "alwaysSendTo": [] +} +``` + +:::info + +Besu requires [`orion` mode](https://docs.tessera.consensys.net/HowTo/Configure/Orion-Mode). Add the line `"mode": "orion",` to the Tessera configuration file. + +::: + +## 4. Start Tessera + +[Start the Tessera nodes](index.md#4-start-the-tessera-nodes) and specify the configuration file. + +## 5. Start Besu Node-1 + +In the `Node-1` directory, start Besu Node-1: + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-authentication-enabled --rpc-http-authentication-jwt-public-key-file=publicKey.pem --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT,EEA,PRIV --host-allowlist="*" --rpc-http-cors-origins="all" --privacy-enabled --privacy-url=http://127.0.0.1:9102 --privacy-multi-tenancy-enabled --min-gas-price=0 +``` + +The command line specifies privacy options: + +- [`--rpc-http-authentication-enabled`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-enabled) enables authentication for JSON-RPC APIs. +- [`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) specifies the Operator's [public key file](#1-generate-a-private-and-public-key-pair). Used to authenticate the [tenant JWTs](#6-generate-the-tenant-jwts). +- [`--privacy-enabled`](../../reference/cli/options.md#privacy-enabled) enables privacy. +- [`--privacy-url`](../../reference/cli/options.md#privacy-url) specifies the [Quorum to Tessera (Q2T)] server address of the Tessera node (`Q2T` in `tessera.conf`). +- [`--privacy-multi-tenancy-enabled`](../../reference/cli/options.md#privacy-multi-tenancy-enabled) enables multi-tenancy. + +:::note + +[`--rpc-http-authentication-jwt-public-key-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) is only required when using [JWT public key authentication]. If using [username and password authentication], use [`--rpc-http-authentication-credentials-file`](../../../public-networks/reference/cli/options.md#rpc-http-authentication-credentials-file) instead. + +::: + +[Start the remaining Besu nodes](index.md#6-start-besu-node-2). + +## 6. Generate the tenant JWTs + +[Generate the JWT](../../../public-networks/how-to/use-besu-api/authenticate.md#2-create-the-jwt) for each tenant and specify the [tenant's Tessera public key](#2-generate-tessera-keys) in the `privacyPublicKey` field. + +Ensure you apply the appropriate [JSON-RPC API permissions](../../../public-networks/how-to/use-besu-api/authenticate.md#json-rpc-permissions) to the token. For example, ensure you enable the `PRIV` and `EEA` APIs for privacy. + +:::note + +This step is not required when using [username and password authentication] to create the required JWTs. + +::: + +[Use the authentication token to make requests]. + + + +[JWT public key authentication]: ../../../public-networks/how-to/use-besu-api/authenticate.md#jwt-public-key-authentication +[username and password authentication]: ../../../public-networks/how-to/use-besu-api/authenticate.md#username-and-password-authentication +[generate the private and public key pair]: ../../../public-networks/how-to/use-besu-api/authenticate.md#1-generate-a-private-and-public-key-pair +[Use the authentication token to make requests]: ../../../public-networks/how-to/use-besu-api/authenticate.md#using-an-authentication-token-to-make-requests +[Quorum to Tessera (Q2T)]: https://docs.tessera.consensys.net/Reference/TesseraAPI + + + +\*[JWT]: JSON Web Token diff --git a/versioned_docs/version-stable/private-networks/tutorials/privacy/quickstart.md b/versioned_docs/version-stable/private-networks/tutorials/privacy/quickstart.md new file mode 100644 index 00000000000..147c617dcb9 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/privacy/quickstart.md @@ -0,0 +1,160 @@ +--- +description: Hyperledger Besu privacy-enabled private network tutorial +tags: + - private networks +--- + +# Create a privacy-enabled network using the Quorum Developer Quickstart + +You can create a privacy-enabled network using the [Quorum Developer Quickstart](../quickstart.md). It runs a private Hyperledger Besu network that uses [Tessera](https://docs.tessera.consensys.net/en/stable/) as its private transaction manager. + +You can use the [Block Explorer](../quickstart.md#block-explorer), make [JSON-RPC requests](../quickstart.md#run-json-rpc-requests), and [create transactions using MetaMask](../quickstart.md#create-a-transaction-using-metamask). This tutorial describes how to make private transactions between nodes, and perform read and write operations on private contracts. + +:::important + +This tutorial runs a private network suitable for education or demonstration purposes and is not intended for running production networks. + +::: + +## Prerequisites + +To run this tutorial, you must have the following installed: + +- [Docker and Docker-compose](https://docs.docker.com/compose/install/) + + :::important + + If using [MacOS](https://docs.docker.com/docker-for-mac/) or [Windows](https://docs.docker.com/docker-for-windows/), enable Docker to use up to 6GB of memory on the _Advanced_ tab in _Preferences_. + + ::: + +- [Nodejs](https://nodejs.org/en/download/) +- [Git command line](https://git-scm.com/) +- [Curl command line](https://curl.haxx.se/download.html). + +## Create Docker-compose file + +## Usage + +To create the docker-compose file and artifacts, run: + +```bash +npx quorum-dev-quickstart +``` + +Follow the prompts displayed to run Hyperledger Besu, private transactions, and [logging with ELK](../../how-to/monitor/elastic-stack.md). Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/). + +## Start the network + +:::caution + +If running in Windows, please run commands from the GitBash shell + +::: + +In the installation directory, start the network: + +```bash +./run.sh +``` + +The script pulls the Docker images starts the network. Pulling the images takes a few minutes the first time. The network details display. + +```bash +************************************* +Quorum Dev Quickstart +************************************* +Setting up the index patterns in kibana ................. +---------------------------------- +List endpoints and services +---------------------------------- +JSON-RPC HTTP service endpoint : http://localhost:8545 +JSON-RPC WebSocket service endpoint : ws://localhost:8546 +Web block explorer address : http://localhost:25000/ +Prometheus address : http://localhost:9090/graph +Grafana address : http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All +Collated logs using Kibana endpoint : http://localhost:5601/app/kibana#/discover + +For more information on the endpoints and services, refer to README.md in the installation directory. +**************************************************************** +``` + +## Deploy the private contract and interact with the nodes + +To deploy a private contract to another [privacy group](../../concepts/privacy/privacy-groups.md) member, use the [web3js-quorum](https://consensys.github.io/web3js-quorum/latest/index.html) library and the [`eea_sendRawTransaction`](../../../public-networks/reference/api/index.md#eea_sendrawtransaction) API call. You must use this API call instead of [`eth_sendTransaction`](https://ethereum.github.io/execution-apis/api-documentation) because Hyperledger Besu keeps account management separate for stronger security. + +This example uses the [web3js](https://www.npmjs.com/package/web3) library to make the API calls, the example creates three Besu nodes, with each node having a corresponding Tessera node for privacy. You can access the Besu member nodes for API calls on the following ports: + +```bash +Member1Besu RPC: http://localhost:20000 +Member1Tessera: http://localhost:9081 + +Member2Besu RPC: http://localhost:20002 +Member2Tessera: http://localhost:9082 + +Member3Besu RPC: http://localhost:20004 +Member3Tessera: http://localhost:9083 +``` + +Navigate to the `smart_contracts` directory and deploy the private transaction: + +```bash +cd smart_contracts +npm install +node scripts/private_tx.js +``` + +The script deploys the contract and sends an arbitrary value (47) from `Member1` to `Member3`. Once done, it queries all three members (Tessera) to check the value at an address. Only `Member1` & `Member3` has this information as they were involved in the transaction, `Member2` responds with a `0x` to indicate it is unaware of the transaction. + +```bash +node scripts/private_tx.js +Creating contract... +Getting contractAddress from txHash: 0xc1b57f6a7773fe887afb141a09a573d19cb0fdbb15e0f2b9ed0dfead6f5b5dbf +Waiting for transaction to be mined ... +Address of transaction: 0x8220ca987f7bb7f99815d0ef64e1d8a072a2c167 +Use the smart contracts 'get' function to read the contract's constructor initialized value .. +Waiting for transaction to be mined ... +Member1 value from deployed contract is: 0x000000000000000000000000000000000000000000000000000000000000002f +Use the smart contracts 'set' function to update that value to 123 .. - from member1 to member3 +Transaction hash: 0x387c6627fe87e235b0f2bbbe1b2003a11b54afc737dca8da4990d3de3197ac5f +Waiting for transaction to be mined ... +Verify the private transaction is private by reading the value from all three members .. +Waiting for transaction to be mined ... +Member1 value from deployed contract is: 0x000000000000000000000000000000000000000000000000000000000000007b +Waiting for transaction to be mined ... +Member2 value from deployed contract is: 0x +Waiting for transaction to be mined ... +Member3 value from deployed contract is: 0x000000000000000000000000000000000000000000000000000000000000007b +``` + +The general contract deployment flow is: + +1. Deploy a contract, which returns a transaction hash. + +1. Obtain the privacy transaction receipt from the transaction hash. + +1. Use the contract address in the privacy transaction receipt to [interact with the contract](../contracts/interact.md) from that point on. + +## Further examples + +View the [web3js-quorum client library example](web3js-quorum.md) and view the [sample code examples](https://github.com/ConsenSys/web3js-quorum/tree/master/example). + +You can also test the erc20 token example by executing `erc20.js` which deploys a `HumanStandardToken` contract and transfers 1 token to Node2. + +This can be verified from the `data` field of the `logs` which is `1`. + +## Stop the network + +Do one of the following to stop the network: + +- Stop the network: + + ```bash + ./stop.sh + ``` + +- Stop the network and remove the containers and volumes: + + ```bash + ./remove.sh + ``` diff --git a/versioned_docs/version-stable/private-networks/tutorials/privacy/web3js-quorum.md b/versioned_docs/version-stable/private-networks/tutorials/privacy/web3js-quorum.md new file mode 100644 index 00000000000..c4c7fd0f92d --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/privacy/web3js-quorum.md @@ -0,0 +1,120 @@ +--- +title: Use the web3js-quorum multi-node example +sidebar_position: 3 +description: web3js-quorum client library multi-node example +tags: + - private networks +--- + +# Use the multi-node example in the web3js-quorum client library + +To use the examples provided in the web3js-quorum library with [your privacy network](index.md): + +:::note + +This example uses 3 of the 4 nodes configured in the [privacy tutorial](index.md). + +::: + +1. Clone the **ConsenSys/web3js-quorum** repository: + + ```bash + git clone https://github.com/ConsenSys/web3js-quorum + ``` + +2. In the `web3js-quorum` directory: + + ```bash + npm install + ``` + +3. In the `example` directory, update the `keys.js` file to include: + + - chain ID + - Tessera node public keys + - Hyperledger Besu node RPC URLs + - [Hyperledger Besu node private keys](../../../public-networks/concepts/node-keys.md#node-private-key). + +4. In the `example/multiNodeExample` directory, deploy the contract: + + ```bash + node deployContract.js + ``` + + A private transaction receipt returns. + + ```text + Transaction Hash 0x23b57ddc3ecf9c9a548e4401a411420ffc0002fd259a86d5656add7c6108beeb + Waiting for transaction to be mined ... + Private Transaction Receipt + { contractAddress: '0xfee84481da8f4b9a998dfacb38091b3145bb01ab', + from: '0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb', + to: null, + output: + '0x6080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f245811461005b5780636057361d1461008257806367e404ce146100ae575b600080fd5b34801561006757600080fd5b506100706100ec565b60408051918252519081900360200190f35b34801561008e57600080fd5b506100ac600480360360208110156100a557600080fd5b50356100f2565b005b3480156100ba57600080fd5b506100c3610151565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60025490565b604080513381526020810183905281517fc9db20adedc6cf2b5d25252b101ab03e124902a73fcb12b753f3d1aaa2d8f9f5929181900390910190a16002556001805473ffffffffffffffffffffffffffffffffffffffff191633179055565b60015473ffffffffffffffffffffffffffffffffffffffff169056fea165627a7a72305820c7f729cb24e05c221f5aa913700793994656f233fe2ce3b9fd9a505ea17e8d8a0029', + logs: [] } + ``` + + :::note + + If you receive a `Method not enabled` error, ensure you enabled the appropriate APIs using the [`--rpc-http-api`](../../../public-networks/reference/cli/options.md#rpc-http-api) + + ::: + +5. Copy the contract address from the private transaction receipt and set the `CONTRACT_ADDRESS` environment variable: + + ```bash + export CONTRACT_ADDRESS= + ``` + + :::tip example + ```bash + export CONTRACT_ADDRESS=0xfee84481da8f4b9a998dfacb38091b3145bb01ab + ``` + ::: + +6. Store a value in the contract from Node 1: + + ```bash + node storeValueFromNode1.js + ``` + + Node 1 stores the value of 1000 (3e8 in hex) and is visible to Node 1 and Node 2. + + ```bash + Transaction Hash: 0xd9d71cc6f64675e1a48183ded8f08930af317eb883ebae4c4eec66ae68618d85 + Waiting for transaction to be mined ... + Event Emited: 0x0000000000000000000000009811ebc35d7b06b3fa8dc5809a1f9c52751e1deb00000000000000000000000000000000000000000000000000000000000003e8 + Waiting for transaction to be mined ... + Get Value from http://localhost:8545: 0x00000000000000000000000000000000000000000000000000000000000003e8 + Waiting for transaction to be mined ... + Get Value from http://localhost:8546: 0x00000000000000000000000000000000000000000000000000000000000003e8 + Waiting for transaction to be mined ... + Get Value from http://localhost:8547: 0x + ``` + +7. Store a value in the contract from Node 2: + + ```bash + node storeValueFromNode2.js + ``` + + Node 2 stores the value of 42 (2a in hex) and is visible to Node 1 and Node 2. + + ```text + Transaction Hash: 0xa025433aec47a71b0230f12f43708812fd38ff7b7c1dc89a715f71dcbd5fbdbf + Waiting for transaction to be mined ... + Event Emited: 0x000000000000000000000000372a70ace72b02cc7f1757183f98c620254f9c8d000000000000000000000000000000000000000000000000000000000000002a + Waiting for transaction to be mined ... + Get Value from http://localhost:8545: 0x000000000000000000000000000000000000000000000000000000000000002a + Waiting for transaction to be mined ... + Get Value from http://localhost:8546: 0x000000000000000000000000000000000000000000000000000000000000002a + Waiting for transaction to be mined ... + Get Value from http://localhost:8547: 0x + ``` + + :::note + + As expected, log messages indicate that Node 3 Tessera cannot find payloads because Node 3 does not have access to the private transactions between Node 1 and Node 2. + + ::: diff --git a/versioned_docs/version-stable/private-networks/tutorials/qbft.md b/versioned_docs/version-stable/private-networks/tutorials/qbft.md new file mode 100644 index 00000000000..a8c2234ee1a --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/qbft.md @@ -0,0 +1,377 @@ +--- +title: Create a QBFT network +sidebar_position: 2 +description: Create a private network using the QBFT consensus protocol. +tags: + - private networks +--- + +# Create a private network using QBFT + +A private network provides a configurable network for testing. This private network uses the [QBFT (proof of authority) consensus protocol](../how-to/configure/consensus/qbft.md). + +The QBFT network in this tutorial implements the [block header validator selection method] to manage validators. For a tutorial on how to implement the [contract validator selection method], follow the steps in the [example smart contract repository]. + +:::important + +The steps in this tutorial create an isolated, but not protected or secure, Ethereum private network. We recommend running the private network behind a properly configured firewall. + +This tutorial configures a private network using QBFT for educational purposes only. QBFT requires 4 validators to be Byzantine fault tolerant. + +::: + +## Prerequisites + +- [Hyperledger Besu](../get-started/install/binary-distribution.md) +- [Curl (or similar webservice client)](https://curl.haxx.se/download.html). + +## Steps + +Listed on the right-hand side of the page are the steps to create a private network using QBFT with four nodes. The four nodes are all validators. + +### 1. Create directories + +Each node requires a data directory for the blockchain data. + +Create directories for your private network, each of the four nodes, and a data directory for each node: + +```bash +QBFT-Network/ +├── Node-1 +│ ├── data +├── Node-2 +│ ├── data +├── Node-3 +│ ├── data +└── Node-4 + ├── data +``` + +### 2. Create a configuration file + +The configuration file defines the [QBFT genesis file](../how-to/configure/consensus/qbft.md#genesis-file) and the number of node key pairs to generate. + +The configuration file has two nested JSON nodes. The first is the `genesis` property defining the QBFT genesis file, except for the `extraData` string, which Besu generates automatically in the resulting genesis file. The second is the `blockchain` property defining the number of key pairs to generate. + +Copy the following configuration file definition to a file called `qbftConfigFile.json` and save it in the `QBFT-Network` directory: + +```json +{ + "genesis": { + "config": { + "chainId": 1337, + "berlinBlock": 0, + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } + }, + "blockchain": { + "nodes": { + "generate": true, + "count": 4 + } + } +} +``` + +:::note + +We recommend specifying the latest [milestone](../../public-networks/reference/genesis-items.md#milestone-blocks) when creating the genesis file for a private network. This ensures you are using the most up-to-date protocol and have access to the most recent opcodes. + +::: + +:::warning + +Do not use the accounts in `alloc` in the genesis file on Mainnet or any public network except for testing. The private keys display, which means the accounts are not secure. + +::: + +### 3. Generate node keys and a genesis file + +In the `QBFT-Network` directory, generate the node key and genesis file: + +```bash +besu operator generate-blockchain-config --config-file=qbftConfigFile.json --to=networkFiles --private-key-file-name=key +``` + +Besu creates the following in the `networkFiles` directory: + +- `genesis.json` - The genesis file including the `extraData` property specifying the four nodes are validators. +- A directory for each node named using the node address and containing the public and private key for each node. + +```text +networkFiles/ +├── genesis.json +└── keys + ├── 0x438821c42b812fecdcea7fe8235806a412712fc0 + │ ├── key + │ └── key.pub + ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5 + │ ├── key + │ └── key.pub + ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184 + │ ├── key + │ └── key.pub + └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a + ├── key + └── key.pub +``` + +### 4. Copy the genesis file to the QBFT-Network directory + +Copy the `genesis.json` file to the `QBFT-Network` directory. + +### 5. Copy the node private keys to the node directories + +For each node, copy the key files to the `data` directory for that node + +```text +QBFT-Network/ +├── genesis.json +├── Node-1 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +├── Node-2 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +├── Node-3 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +├── Node-4 +│ ├── data +│ │ ├── key +│ │ ├── key.pub +``` + +### 6. Start the first node as the bootnode + +In the `Node-1` directory, start Node-1: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" +``` + + + +The command line: + +- Specifies the data directory for Node-1 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- Enables the JSON-RPC API using the [`--rpc-http-enabled`](../../public-networks/reference/cli/options.md#rpc-http-enabled) option. +- Enables the ETH, NET, and QBFT APIs using the [`--rpc-http-api`](../../public-networks/reference/cli/options.md#rpc-http-api) option. +- Enables all-host access to the HTTP JSON-RPC API using the [`--host-allowlist`](../../public-networks/reference/cli/options.md#host-allowlist) option. +- Enables all-domain access to the node through the HTTP JSON-RPC API using the [`--rpc-http-cors-origins`](../../public-networks/reference/cli/options.md#rpc-http-cors-origins) option. + +When the node starts, the [enode URL](../../public-networks/concepts/node-keys.md#enode-url) displays. Copy the enode URL to specify Node-1 as the bootnode in the following steps. + +![Node 1 Enode URL](../../assets/images/EnodeStartup.png) + +### 7. Start Node-2 + +Start another terminal, change to the `Node-2` directory and start Node-2 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546 +``` + + + +The command line specifies: + +- The data directory for Node-2 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The enode URL of Node-1 using the [`--bootnodes`](../../public-networks/reference/cli/options.md#bootnodes) option. +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 8. Start Node-3 + +Start another terminal, change to the `Node-3` directory and start Node-3 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547 +``` + + + +The command line specifies: + +- The data directory for Node-3 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1 and Node-2 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1 and Node-2 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 9. Start Node-4 + +Start another terminal, change to the `Node-4` directory and start Node-4 specifying the Node-1 enode URL copied when starting Node-1 as the bootnode: + + + +# MacOS + +```bash +besu --data-path=data --genesis-file=../genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 +``` + +# Windows + +```bash +besu --data-path=data --genesis-file=..\genesis.json --bootnodes= --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,QBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548 +``` + + + +The command line specifies: + +- The data directory for Node-4 using the [`--data-path`](../../public-networks/reference/cli/options.md#data-path) option. +- A different port to Node-1, Node-2, and Node-3 for P2P discovery using the [`--p2p-port`](../../public-networks/reference/cli/options.md#p2p-port) option. +- A different port to Node-1, Node-2, and Node-3 for HTTP JSON-RPC using the [`--rpc-http-port`](../../public-networks/reference/cli/options.md#rpc-http-port) option. +- The bootnode as for [Node-2](#7-start-node-2). +- Other options as for [Node-1](#6-start-the-first-node-as-the-bootnode). + +### 10. Confirm the private network is working + +Start another terminal, use curl to call the JSON-RPC API [`qbft_getvalidatorsbyblocknumber`](../reference/api/index.md#qbft_getvalidatorsbyblocknumber) method and confirm the network has four validators: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"], "id":1}' localhost:8545 +``` + +The result displays the four validators: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x73ced0bd3def2e2d9859e3bd0882683a2e6835fb", + "0x7a175f3542ceb60bf80fb536b3f42e7a30c0a6d7", + "0x7f6efa6e34f8c9b591a9ad4763e21b3fca31bcd6", + "0xc64140f1c9d5bb82e54976e568ad39958c3e94be" + ] +} +``` + +Look at the logs to confirm Besu is producing blocks: + +```bash +2021-05-26 08:47:00.221+10:00 | EthScheduler-Workers-0 | INFO | PersistBlockTask | Imported #1 / 0 tx / 0 om / 0 (0.0%) gas / (0x4ee4456536e2793523df87288fae76518089eec91c3f7e05e220f1f4d3f6f95b) in 0.016s. Peers: 4 +2021-05-26 08:47:02.071+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #2 / 0 tx / 0 pending / 0 (0.0%) gas / (0x6fc47ada7146d75f6a46911d8d4038795b0c99970bbd4ce0c6d6aa60955f66fe) +2021-05-26 08:47:04.051+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #3 / 0 tx / 0 pending / 0 (0.0%) gas / (0x3cb663880a65103266b11a8d8631beca5c482d515ac287125aa077b2e31b80b0) +2021-05-26 08:47:06.058+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Produced #4 / 0 tx / 0 pending / 0 (0.0%) gas / (0xc2927915ac0c94bab5fc9acea6608455f1c857d69e97191dc2c39e4ac411817b) +2021-05-26 08:47:08.058+10:00 | pool-8-thread-1 | INFO | QbftBesuControllerBuilder | Imported #5 / 0 tx / 0 pending / 0 (0.0%) gas / (0xba63471d62c936733add9b884f5213c3842af9f52460268e39e0666ab82f02a5) +``` + +:::important + +If the key files were not copied to the correct directory in [step 5](#5-copy-the-node-private-keys-to-the-node-directories), the network will not start producing blocks. + +The logs for each node should indicate the public key was loaded from the `data/key` directory: + +```bash +2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Loaded public key 0x931d32f1aec4e45b150ee38f3c74157a750fc53f523e63fe2b07bf3fce43a3de64587fc9aaf3736444f2e3eef0eea90be3b67d18be7b5b2b7cb2fcd670416a7e from /QBFT-Network/Node-1/data/key +``` + +If the keys were not copied to the correct directory, Besu creates a key when starting up: + +```bash +2021-05-26 08:43:16.592+10:00 | main | INFO | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to /QBFT-Network/Node-1/data/key +``` + +If a new key was created, the validator key specified in the configuration does not match the created key and the node cannot participate in creating blocks. + +::: + +## Next steps + +Use the [QBFT API](../reference/api/index.md#qbft-methods) to remove or add validators, or import accounts to MetaMask and send transactions as described in the [Quickstart tutorial](quickstart.md#create-a-transaction-using-metamask). + +:::note + +To add or remove nodes as validators you need the node address. The directory [created for each node](#3-generate-node-keys-and-a-genesis-file) has the node address as the name. + +Besu doesn't support [private key management](../../public-networks/how-to/send-transactions.md). + +::: + +You can switch from the [block header validator selection method] configured here, to the [contract validator selection method] by updating the genesis file and [configuring a transition]. + +## Stop the nodes + +When finished using the private network, stop all nodes using ++ctrl+c++ in each terminal window. + +:::tip + +To restart the QBFT network in the future, start from [step 6](#6-start-the-first-node-as-the-bootnode). + +::: + + + +[block header validator selection method]: ../how-to/configure/consensus/qbft.md#add-and-remove-validators-using-block-headers +[contract validator selection method]: ../how-to/configure/consensus/qbft.md#add-and-remove-validators-using-a-smart-contract +[example smart contract repository]: https://github.com/ConsenSys/validator-smart-contracts +[configuring a transition]: ../how-to/configure/consensus/qbft.md#transitions + + + +\*[Byzantine fault tolerant]: Ability to function correctly and reach consensus despite nodes failing or propagating incorrect information to peers. diff --git a/versioned_docs/version-stable/private-networks/tutorials/quickstart.md b/versioned_docs/version-stable/private-networks/tutorials/quickstart.md new file mode 100644 index 00000000000..54760801e41 --- /dev/null +++ b/versioned_docs/version-stable/private-networks/tutorials/quickstart.md @@ -0,0 +1,594 @@ +--- +title: Quorum Developer Quickstart +sidebar_position: 1 +description: Rapidly generate a local blockchain network using the Quickstart. +tags: + - private networks +--- + +import TestAccounts from '../../global/test_accounts.md'; + +import Postman from '../../global/postman.md'; + +# Developer Quickstart + +The Quorum Developer Quickstart uses the Hyperledger Besu Docker image to run a private [IBFT 2.0](../how-to/configure/consensus/ibft.md) network of Besu nodes managed by Docker Compose. + +:::danger + +This tutorial runs a private network suitable for education or demonstration purposes and is not intended for running production networks. + +::: + +## Prerequisites + +- One of the following operating systems: + - Linux on x86_64 architecture + - macOS on an Intel processor (M1 processor not supported yet) + - Windows 64-bit edition, with: + - Windows Subsystem for Linux 2 + - Docker desktop configured to use the WSL2-based engine +- [Docker and Docker Compose](https://docs.docker.com/compose/install/) +- [Node.js](https://nodejs.org/en/download/) version 12 or higher +- [Truffle](https://www.trufflesuite.com/truffle) +- [cURL command line](https://curl.haxx.se/download.html) +- [MetaMask](https://metamask.io/) + +:::info + +Allow Docker up to 4G of memory or 6G if running the privacy examples. Refer to the **Resources** section in [Docker for Mac](https://docs.docker.com/docker-for-mac/) and [Docker Desktop](https://docs.docker.com/docker-for-windows/) for details. + +::: + +## Generate the tutorial blockchain configuration files + +To create the tutorial `docker-compose` files and artifacts, run: + +```bash +npx quorum-dev-quickstart +``` + +Follow the prompts displayed to run Hyperledger Besu and [logging with ELK](../how-to/monitor/elastic-stack.md). Enter `n` for [Codefi Orchestrate](https://docs.orchestrate.consensys.net/en/stable/) and [private transactions](../concepts/privacy/index.md). + +:::note + +If you enter `y` for private transactions, you get three Besu nodes with corresponding Tessera nodes for privacy. You can follow the [privacy walk-through](privacy/index.md), which details how to send private transactions and interact with deployed private contracts. + +::: + +## Start the network + +To start the network, go to the installation directory (`quorum-test-network` if you used the default value) and run: + +```bash +./run.sh +``` + +The script builds the Docker images, and runs the Docker containers. + +Four Besu IBFT 2.0 validator nodes and a non-validator node are created to simulate a base network. + +When execution is successfully finished, the process lists the available services: + +```log title="Services list" +************************************* +Quorum Dev Quickstart +************************************* +---------------------------------- +List endpoints and services +---------------------------------- +JSON-RPC HTTP service endpoint : http://localhost:8545 +JSON-RPC WebSocket service endpoint : ws://localhost:8546 +Web block explorer address : http://localhost:25000/ +Prometheus address : http://localhost:9090/graph +Grafana address : http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All +Kibana logs address : http://localhost:5601/app/kibana#/discover +Collated logs using Grafana Loki : http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search= + +For more information on the endpoints and services, refer to README.md in the installation directory. +**************************************************************** +``` + +- Use the **JSON-RPC HTTP service endpoint** to access the RPC node service from your dapp or from cryptocurrency wallets such as MetaMask. +- Use the **JSON-RPC WebSocket service endpoint** to access the Web socket node service from your dapp. +- Use the **Web block explorer address** to display the [block explorer Web application](http://localhost:25000). +- Use the **Prometheus address** to access the [Prometheus dashboard](http://localhost:9090/graph). [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). +- Use the **Grafana address** to access the [Grafana dashboard](http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All). [Read more about metrics](../../public-networks/how-to/monitor/metrics.md). +- Use the **Kibana logs address** to access the [logs in Kibana](http://localhost:5601/app/kibana#/discover). [Read more about log management](../how-to/monitor/elastic-stack.md). +- Use the **Grafana Loki logs address** to access the [logs in Grafana](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=besu&var-search=). [Read more about log management](../how-to/monitor/loki.md). + +To display the list of endpoints again, run: + +```bash +./list.sh +``` + +## Use a block explorer + +You can [use Sirato Blockchain Explorer](../how-to/monitor/sirato-explorer.md) to analyze block information, contract metadata, transaction searches, and more. Sirato has built-in support for privacy-enabled Besu networks. + +:::note + +You must connect to one of the privacy nodes (for example, `member1besu`), not the dedicated RPC, in order to allow access for Besu [privacy API methods](../reference/api/index.md#priv-methods). In production networks, you must [secure access](../../public-networks/how-to/use-besu-api/authenticate.md) to RPC nodes. + +::: + +Clone the [Sirato GitHub repository](https://github.com/web3labs/sirato-free): + +```bash +git clone https://github.com/web3labs/sirato-free +``` + +From the Sirato directory, run the following command: + +```bash +cd docker-compose +NODE_ENDPOINT=member1besu PORT=26000 docker-compose -f docker-compose.yml -f sirato-extensions/docker-compose-quorum-dev-quickstart.yml up +``` + +Open `http://localhost/` on your browser. You’ll see the new initialization page while it boots up. This may take 5–10 minutes for the all services to start and the ingestion sync to complete. + +To stop all the services from running, run the following script from the `docker-compose` directory: + +```bash +docker-compose down -v +``` + +## Monitor nodes with Prometheus and Grafana + +The sample network also includes Prometheus and Grafana monitoring tools to let you visualize node health and usage. You can directly access these tools from your browser at the addresses displayed in the endpoint list. + +- [Prometheus dashboard](http://localhost:9090/graph) +- [Grafana dashboard](http://localhost:3000/d/XE4V0WGZz/besu-overview?orgId=1&refresh=10s&from=now-30m&to=now&var-system=All) +- [Grafana Loki logs dashboard](http://localhost:3000/d/Ak6eXLsPxFemKYKEXfcH/quorum-logs-loki?orgId=1&var-app=quorum&var-search=) + +For more details on how to configure and use these tools for your own nodes, see the [performance monitoring documentation](../../public-networks/how-to/monitor/metrics.md), [Prometheus documentation](https://prometheus.io/docs/introduction/overview/) and [Grafana documentation](https://grafana.com/docs/). + +![Grafana dashboard screenshot](../../assets/images/grafana.png) + +and collated logs via Grafana Loki + +![Grafana Loki dashboard screenshot](../../assets/images/grafana_loki.png) + +## Run JSON-RPC requests + +You can run JSON-RPC requests on: + +- HTTP with `http://localhost:8545`. +- WebSockets with `ws://localhost:8546`. + +### Run with `cURL` + +This tutorial uses [cURL](https://curl.haxx.se/download.html) to send JSON-RPC requests over HTTP. + +### Run with Postman + +You can also run all the requests with the Besu Postman collection. + + + +### Request the node version + +Run the following command from the host shell: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://localhost:8545 +``` + +The result displays the client version of the running node: + + + +# Result example + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "besu/v21.1.2/linux-x86_64/oracle_openjdk-java-11" +} +``` + +# Result explanation + +- `"jsonrpc" : "2.0"` indicates that the JSON-RPC 2.0 spec format is used. +- `"id" : 1` is the request identifier used to match the request and the response. This tutorial always uses 1. +- `"result"` contains the running Besu information: + - `v21.1.2` is the running Besu version number. This may be different when you run this tutorial. + - `linux-x86_64` is the architecture used to build this version. + - `oracle_openjdk-java-11` is the JVM type and version used to build this version. This may be different when you run this tutorial. + + + +Successfully calling this method shows that you can connect to the nodes using JSON-RPC over HTTP. + +From here, you can walk through more interesting requests demonstrated in the rest of this section, or skip ahead to [Create a transaction using MetaMask](#create-a-transaction-using-metamask). + +### Count the peers + +Peers are the other nodes connected to the node receiving the JSON-RPC request. + +Poll the peer count using [`net_peerCount`](../../public-networks/reference/api/index.md#net_peercount): + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' http://localhost:8545 +``` + +The result indicates that there are four peers (the validators): + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x4" +} +``` + +### Request the most recent block number + +Call [`eth_blockNumber`](../../public-networks/reference/api/index.md#eth_blockNumber) to retrieve the number of the most recently synchronized block: + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http://localhost:8545 +``` + +The result indicates the highest block number synchronized on this node. + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x2a" +} +``` + +Here the hexadecimal value `0x2a` translates to decimal as `42`, the number of blocks received by the node so far, about two minutes after the new network started. + +## Create a transaction using MetaMask + +You can use [MetaMask](https://metamask.io/) to send a transaction on your private network. + +1. Open MetaMask and connect it to your private network RPC endpoint by selecting `Localhost 8545` in the network list. +1. Choose one of the following test accounts and [import it into MetaMask by copying the corresponding private key](https://metamask.zendesk.com/hc/en-us/articles/360015489331-How-to-import-an-Account). + + + +:::note + +Besu doesn't incorporate [account management](../../public-networks/how-to/send-transactions.md). To create your own account, you have to use a third-party tool, such as MetaMask. + +::: + +1. After importing an existing test account, [create another test account from scratch] to use as the recipient for a test Ether transaction. + +1. In MetaMask, select the new test account and [copy its address](https://metamask.zendesk.com/hc/en-us/articles/360015289512-How-to-copy-your-MetaMask-Account-Public-Address). + +1. In the [Block Explorer](http://localhost:25000), search for the new test account by selecting the :mag: and pasting the test account address into the search box. + + The new test account displays with a zero balance. + +1. [Send test Ether](https://metamask.zendesk.com/hc/en-us/articles/360015488931-How-to-send-ETH-and-ERC-20-tokens-from-your-MetaMask-Wallet) from the first test account (containing test Ether) to the new test account (which has a zero balance). + + :::tip + + You can use a zero gas price here as this private test network is a [free gas network](../how-to/configure/free-gas.md), but the maximum amount of gas that can be used (the gas limit) for a value transaction must be at least 21000. + + ::: + +1. Refresh the Block Explorer page in your browser displaying the target test account. + + The updated balance reflects the transaction completed using MetaMask. + +## Smart contract and dapp usage + +You can use a demo dapp called Pet Shop, provided by [Truffle](https://www.trufflesuite.com/tutorial). + +The dapp runs a local website using Docker, and uses smart contracts deployed on the network. + +The directory created by `quorum-dev-quickstart` includes a `dapps` directory with a `pet-shop` subdirectory, which contains the source code for the dapp, including the smart contracts, website, and configurations to run this tutorial. + +With the blockchain running and MetaMask connected to `Localhost 8545` via the browser, run the following command to start the Pet Shop dapp: + +```bash +cd dapps/pet-shop +./run_dapp.sh +``` + +The script: + +1. Installs the dapp Node dependencies (you may see some warnings here, but it will not prevent the dapp from running). +1. Compiles the contracts. +1. Deploys the contracts to the blockchain. +1. Runs tests. +1. Builds and runs a Docker image to serve the dapp website. + +```text './run_dapp.sh' example output +Compiling your contracts... +=========================== +> Compiling ./contracts/Adoption.sol +> Compiling ./contracts/Migrations.sol +> Artifacts written to /Users/demo/quorum-test-network/dapps/pet-shop/pet-shop-box/build/contracts +> Compiled successfully using: + - solc: 0.5.16+commit.9c3226ce.Emscripten.clang + +Starting migrations... +====================== +> Network name: 'quickstartWallet' +> Network id: 1337 +> Block gas limit: 16234336 (0xf7b760) + +1_initial_migration.js +====================== + + Deploying 'Migrations' + ---------------------- + > transaction hash: 0xdd27f5bc5b0c4a42bb4f4d9ba00b4d33742de10ba8f03484cbf095ee824ba11a + > Blocks: 0 Seconds: 0 + > contract address: 0xFB88dE099e13c3ED21F80a7a1E49f8CAEcF10df6 + > block number: 2747 + > block timestamp: 1618000437 + > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 + > balance: 89999.97435026 + > gas used: 221555 (0x36173) + > gas price: 20 gwei + > value sent: 0 ETH + > total cost: 0.0044311 ETH + + + > Saving migration to chain. + > Saving artifacts + ------------------------------------- + > Total cost: 0.0044311 ETH + +2_deploy_contracts.js +===================== + + Deploying 'Adoption' + -------------------- + > transaction hash: 0xd6f5b11807a0727a92b6063c95b9101769d310592b0d3cf35d6df233d05d50e6 + > Blocks: 0 Seconds: 0 + > contract address: 0xf204a4Ef082f5c04bB89F7D5E6568B796096735a + > block number: 2749 + > block timestamp: 1618000441 + > account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 + > balance: 89999.968712 + > gas used: 239915 (0x3a92b) + > gas price: 20 gwei + > value sent: 0 ETH + > total cost: 0.0047983 ETH + + + > Saving migration to chain. + > Saving artifacts + ------------------------------------- + > Total cost: 0.0047983 ETH + +Summary +======= +> Total deployments: 2 +> Final cost: 0.0092294 ETH + + +Using network 'quickstartWallet'. + +Compiling your contracts... +=========================== +> Compiling ./test/TestAdoption.sol + +TestAdoption +✓ testUserCanAdoptPet (2071ms) +✓ testGetAdopterAddressByPetId (6070ms) +✓ testGetAdopterAddressByPetIdInArray (6077ms) + +3 passing (37s) +``` + +After these tests are successful, the script builds a container for the Pet Shop dapp and deploys it, binding it to port 3001 on your system. + +```text +Sending build context to Docker daemon 489.4MB +Step 1/5 : FROM node:12.14.1-stretch-slim +---> 2f7e25ad14ea +Step 2/5 : EXPOSE 3001 +---> Using cache +---> 2ef0665a040a +Step 3/5 : WORKDIR /app +---> Using cache +---> e8e97cedb575 +Step 4/5 : COPY . /app +---> f70e4265e598 +Step 5/5 : CMD npm run dev +---> Running in 3c6e8bdb3f3b +Removing intermediate container 3c6e8bdb3f3b +---> ce2588e47ab0 +Successfully built ce2588e47ab0 +Successfully tagged quorum-dev-quickstart_pet_shop:latest +b1615ab765656bc027f63fc60019dba1ca572305766c820f41eaf113b7e14cf8 +``` + +In the browser where you have MetaMask enabled and one of the test accounts loaded, open a new tab and navigate to [the Pet Shop dapp](http://localhost:3001) where you can adopt lovely pets (sorry, not for real, it's a demo). + +When you select **Adopt**, a MetaMask window pops up and requests your permission to continue with the transaction. + +After the transaction is complete and successful, the status of the pet you adopted shows **Success**. + +![Dapp UI](../../assets/images/dapp-ui.png) + +You can also search for the transaction and view its details in the [Block Explorer](http://localhost:25000/). + +![Dapp UI](../../assets/images/dapp-explorer-tx.png) + +The MetMask UI also keeps a record of the transaction. + +![Dapp UI](../../assets/images/dapp-metamask-tx.png) + +### Deploy your own dapp + +You can deploy your own dapp to the Quorum Developer Quickstart, by configuring your dapp to point to the Quickstart network. + +If you're using [Truffle](https://trufflesuite.com/truffle/), update the `networks` object in the [Truffle configuration file](https://trufflesuite.com/docs/truffle/reference/configuration#networks) to specify which networks to connect to for deployments and testing. The Quickstart RPC service endpoint is `http://localhost:8545`. + +For example, the following is the Truffle configuration file for the Pet Shop dapp used in the Quickstart Besu network: + +```js +const PrivateKeyProvider = require("@truffle/hdwallet-provider"); + +// insert the private key of the account used in MetaMask, e.g. Account 1 (Miner Coinbase Account) +const privateKey = + "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; + +module.exports = { + networks: { + development: { + host: "127.0.0.1", + port: 7545, + network_id: "*", // Match any network id + }, + develop: { + port: 8545, + }, + quickstartWallet: { + provider: () => + new PrivateKeyProvider(privateKey, "http://localhost:8545"), + network_id: "*", + }, + }, +}; +``` + +Deploy the dapp using: + +```bash +truffle migrate --network quickstartWallet +``` + +## Stop and restart the private network without removing containers + +To shut down the private network without deleting the containers: + +```bash +./stop.sh +``` + +This command stops the containers related to the services specified in the `docker-compose.yml` file. + +To restart the private network: + +```bash +./resume.sh +``` + +## Stop the private network and remove containers + +To shut down the private network and delete all containers and images created from running the sample network and the Pet Shop dapp: + +```bash +./remove.sh +``` + +## Add a new node to the network + +New nodes joining an existing network require the following: + +- The same genesis file used by all other nodes on the running network. +- A list of nodes to connect to; this is done by specifying [bootnodes], or by providing a list of [static nodes]. +- A node key pair and optionally an account. If the running network is using permissions, then you need to add the new node's enode details to the [permissions file] used by existing nodes, or update the onchain permissioning contract. + +The following steps describe the process to add a new node to the Developer Quickstart. + +### 1. Create the node key files + +Create a node key pair and account for a new node by running the following script: + +```bash +cd ./extra +npm install +node generate_node_keys.js --password "Password" +``` + +:::note + +The `--password` parameter is optional. + +::: + +### 2. Create new node directory + +Navigate to the directory where the configuration files for the network were created. + +:::note + +The directory was specified in an earlier step when running `npx quorum-dev-quickstart`. The default location is `./quorum-test-network`. + +::: + +In the `config/nodes` directory, create a subdirectory for the new node (for example, `newnode`), and move the `nodekey`, `nodekey.pub`, `address` and `accountkey` files from the previous step into this directory. + +### 3. Update docker-compose + +Add an entry for the new node into the docker-compose file: + +```yaml +newnode: + <<: *besu-def + container_name: newnode + volumes: + - public-keys:/opt/besu/public-keys/ + - ./config/besu/:/config + - ./config/nodes/newnode:/opt/besu/keys + - ./logs/besu:/tmp/besu + depends_on: + - validator1 + networks: + quorum-dev-quickstart: + ipv4_address: 172.16.239.41 +``` + +:::caution important +Select an IP address and port map not being used for the other containers. +Mount the newly created folder `./config/nodes/newnode` to the `/opt/besu/keys` directory of the new node, as seen +in this example. +::: + +### 4. Update Prometheus configuration + +Update `prometheus.yml` in the `./config/prometheus/` directory to configure metrics to display in Grafana. + +Insert the following under `scrape_configs` section in the file. Change `job_name` and `targets` appropriately if you've updated them. + +```yaml +- job_name: newnode + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: [newnode:9545] +``` + +### 5. Update files with the enode address + +Add the new node's enode address to the [static nodes] file and [permissions file]. The enode uses the format `enode://pubkey@ip_address:30303`. If the `nodekey.pub` is `4540ea...9c1d78` and the IP address is `172.16.239.41`, then the enode address is `"enode://4540ea...9c1d78@172.16.239.41:30303"`, which must be added to both files. + +Alternatively, call the [`perm_addNodesToAllowlist`](../../public-networks/reference/api/index.md#perm_addnodestoallowlist) API method on existing nodes to add the new node without restarting. + +:::note + +Calling the API method by itself only persists for as long as the nodes remain online and is lost on the next restart. + +On a live network, the new node must be added to the [permissions file] so that subsequent restarts of the nodes are aware of the change. + +::: + +### 6. Start the network + +Once complete, start the network up with `./run.sh`. When using the smart contract you can either make changes via a [dapp](https://github.com/ConsenSys/permissioning-smart-contracts) or via [RPC API calls](../../public-networks/reference/api/index.md#perm_addnodestoallowlist). + + + +[bootnodes]: ../how-to/configure/bootnodes.md +[permissions file]: ../how-to/use-permissioning/local.md +[static nodes]: ../../public-networks/how-to/connect/static-nodes.md +[allow list]: ../how-to/use-permissioning/local.md#node-allowlisting +[Import one of the existing accounts above into MetaMask]: https://metamask.zendesk.com/hc/en-us/articles/360015489331-Importing-an-Account-New-UI- +[create another test account from scratch]: https://metamask.zendesk.com/hc/en-us/articles/360015289452-Creating-Additional-MetaMask-Wallets-New-UI- diff --git a/versioned_docs/version-stable/public-networks/.meta.yml b/versioned_docs/version-stable/public-networks/.meta.yml new file mode 100644 index 00000000000..47f9110472f --- /dev/null +++ b/versioned_docs/version-stable/public-networks/.meta.yml @@ -0,0 +1,6 @@ +--- +# Meta items setting with yaml files is an insider only feature +# see https://squidfunk.github.io/mkdocs-material/reference/#built-in-meta-plugin + +tags: + - public networks diff --git a/versioned_docs/version-stable/public-networks/concepts/_category_.json b/versioned_docs/version-stable/public-networks/concepts/_category_.json new file mode 100644 index 00000000000..0eb56feedb7 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Concepts", + "position": 4, + "link": { + "type": "generated-index", + "slug": "public-networks/concepts" + } +} diff --git a/versioned_docs/version-stable/public-networks/concepts/data-storage-formats.md b/versioned_docs/version-stable/public-networks/concepts/data-storage-formats.md new file mode 100644 index 00000000000..30802b9a080 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/data-storage-formats.md @@ -0,0 +1,93 @@ +--- +title: Data storage formats +sidebar_position: 3 +description: Learn about storing data using Forest of Tries and Bonsai Tries. +tags: + - public networks +--- + +# Data storage formats + +Besu offers two formats for storing the world state, [Forest of Tries](#forest-of-tries) and [Bonsai Tries](#bonsai-tries). + +## Forest of Tries + +Forest of Tries, also called forest mode, is the default storage format. + +In forest mode, each node in the trie is saved in a key-value store by hash. For each block, the world state is updated with new nodes, leaf nodes, and a new state root. Old leaf nodes remain in the underlying data store. Data is accessed and stored by hash, which increases the size of the database and increases the resources and time needed to access account data. + +

+ +![forest_of_tries](../../assets/images/forest_of_tries.png) + +

+ +### Pruning + +Pruning reduces the storage required by removing state trie nodes unreachable from [recent blocks](../../public-networks/reference/cli/options.md#pruning-blocks-retained). + +Pruning is disabled by default, and can be enabled with the [`--pruning-enabled`](../../public-networks/reference/cli/options.md#pruning-enabled) command line option. + +:::info + +Using pruning with [private transactions](../../private-networks/concepts/privacy/private-transactions)\ +isn't supported. + +::: + +Pruning might increase block import times, but it doesn't affect the ability of nodes to stay in sync. + +:::caution + +Pruning is being deprecated for [Bonsai Tries](#bonsai-tries) and is currently not being updated. + +::: + +## Bonsai Tries + +Bonsai Tries is a data storage layout policy designed to reduce storage requirements and increase read performance. + +Bonsai stores leaf values in a trie log, separate from the branches of the trie. Bonsai stores nodes by the location of the node instead of the hash of the node. Bonsai can access the leaf from the underlying storage directly using the account key. This greatly reduces the disk space needed for storage and allows for less resource-demanding and faster read performance. Bonsai inherently prunes orphaned nodes and old branches. + +To run a node with Bonsai Tries data storage format, use the command line option [`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). + +

+ +![Bonsai_tries](../../assets/images/Bonsai_tries.png) + +

+ +## Forest of Tries vs. Bonsai Tries + +### Storage requirements + +Forest mode uses significantly more memory than Bonsai. With an [archive node](../get-started/connect/sync-node.md#run-an-archive-node), forest mode uses an estimated 12 TB of storage, while Bonsai uses an estimated 1100 GB of storage. With a [full node](../get-started/connect/sync-node.md#run-a-full-node), forest mode uses an estimated 750 GB of storage, while Bonsai uses an estimated 650 GB of storage. + +### Accessing data + +Forest mode must go through all the branches by hash to read a leaf value. Bonsai can access the leaf from the underlying storage directly using the account key. Bonsai will generally read faster than forest mode, particularly if the blocks are more recent. + +However, Bonsai becomes increasingly more resource-intensive the further in history you try to read data. To prevent this, you can limit how far Bonsai looks back while reconstructing data. The default limit Bonsai looks back is 512. To change the parameter, use the [`--bonsai-historical-block-limit`](../reference/cli/options.md#bonsai-historical-block-limit) option. + +:::note + +Using `--bonsai-historical-block-limit` doesn't affect the size of the database being stored, only how far back to load. This means there is no "safe minimum" value to use with this option. + +::: + +### Syncing nodes + +The following table shows the ways you can [sync a full node](../get-started/connect/sync-node.md#run-a-full-node) with the different data storage formats using [fast](../get-started/connect/sync-node.md#fast-synchronization) and [snap](../get-started/connect/sync-node.md#snap-synchronization) sync. + +| Data storage format | Sync mode | Storage estimate | Can other nodes sync to your node? | +| --- | --- | --- | --- | +| Bonsai | Fast | 650 GB | No | +| Bonsai | Snap | 650 GB | To be implemented | +| Forest | Fast | 750 GB | Yes | +| Forest | Snap | 750 GB | No | + +:::tip + +We recommend using snap sync with Bonsai for the fastest sync and lowest storage requirements. + +::: diff --git a/versioned_docs/version-stable/public-networks/concepts/events-and-logs.md b/versioned_docs/version-stable/public-networks/concepts/events-and-logs.md new file mode 100644 index 00000000000..c5b78fe2bbb --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/events-and-logs.md @@ -0,0 +1,186 @@ +--- +title: Events and logs +sidebar_position: 6 +description: Learn about events and logs in Besu. +tags: + - public networks + - private networks +--- + +# Events and logs + +Transaction mining causes smart contracts to emit events and write logs to the blockchain. + +The smart contract address is the link to the logs and the blockchain includes the logs, but contracts cannot access logs. Log storage is cheaper than contract storage (that is, it costs less gas) so storing and accessing the required data in logs reduces the cost. For example, use logs to display all transfers made using a specific contract, but not the current state of the contract. + +A Dapp front end can either access logs using the [JSON-RPC API filter methods](../how-to/use-besu-api/access-logs.md) or subscribe to logs using the [RPC Pub/Sub API](../how-to/use-besu-api/rpc-pubsub.md#logs). + +Use [`admin_generateLogBloomCache`](../reference/api/index.md#admin_generatelogbloomcache) to improve log retrieval performance. + +## Topics + +Log entries contain up to four topics. The first topic is the [event signature hash](#event-signature-hash) and up to three topics are the indexed [event parameters](#event-parameters). + +```json title="A log entry for an event with one indexed parameter" +{ + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x84", + "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", + "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] +} +``` + +## Event parameters + +Up to three event parameters can have the `indexed` attribute. Logs store these indexed parameters as `topics`. Indexed parameters are searchable and filterable. + +Topics are 32 bytes. If an indexed argument is an array (including `string` and `byte` datatypes), the log stores the keccak-256 hash of the parameter as a topic. + +Log `data` includes non-indexed parameters but is difficult to search or filter. + +A Solidity contract storing one indexed and one non-indexed parameter and has an event emitting the value of each parameter: + +```solidity +pragma solidity ^0.5.1; +contract Storage { + uint256 public valueIndexed; + uint256 public valueNotIndexed; + + event Event1(uint256 indexed valueIndexed, uint256 valueNotIndexed); + + function setValue(uint256 _valueIndexed, uint256 _valueNotIndexed) public { + valueIndexed = _valueIndexed; + valueNotIndexed = _valueNotIndexed; + emit Event1(_valueIndexed, _valueNotIndexed); + } +} +``` + +A log entry created by invoking the contract in the previous example with `valueIndexed` set to 5 and `valueNotIndexed` set to 7: + +```json +{ + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x4d6", + "blockHash": "0x7d0ac7c12ac9f622d346d444c7e0fa4dda8d4ed90de80d6a28814613a4884a67", + "transactionHash": "0xe994022ada94371ace00c4e1e20663a01437846ced02f18b3f3afec827002781", + "transactionIndex": "0x0", + "address": "0x43d1f9096674b5722d359b6402381816d5b22f28", + "data": "0x0000000000000000000000000000000000000000000000000000000000000007", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] +} +``` + +## Event signature hash + +The first topic in a log entry is always the event signature hash. The event signature hash is a keccak-256 hash of the event name and input argument types, with argument names ignored. For example, the event `Hello(uint256 worldId)` has the signature hash `keccak('Hello(uint256)')`. The signature identifies to which event log topics belong. + +A Solidity contract with two different events: + +```solidity +pragma solidity ^0.5.1; +contract Storage { + uint256 public valueA; + uint256 public valueB; + + event Event1(uint256 indexed valueA); + event Event2(uint256 indexed valueB); + + function setValue(uint256 _valueA) public { + valueA = _valueA; + emit Event1(_valueA); + } + + function setValueAgain(uint256 _valueB) public { + valueB = _valueB; + emit Event2(_valueB); + } +} +``` + +The event signature hash for event 1 is `keccak('Event1(uint256)')` and the event signature hash for event 2 is `keccak('Event2(uint256)')`. The hashes are: + +- `04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3` for event 1 +- `06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e` for event 2. + +:::tip + +You can use a library keccak (sha3) hash function, such as provided in [Web3.js](https://web3js.readthedocs.io/en/v1.2.11/web3-utils.html?highlight=sha3#sha3), or an online tool, such as https://emn178.github.io/online-tools/keccak_256.html, to generate event signature hashes. + +::: + +Log entries from invoking the Solidity contract in the previous example: + +```json +[ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x84", + "blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336", + "transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x87", + "blockHash": "0x6643a1e58ad857f727552e4572b837a85b3ca64c4799d085170c707e4dad5255", + "transactionHash": "0xa95295fcea7df3b9e47ab95d2dadeb868145719ed9cc0e6c757c8a174e1fcb11", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x", + "topics": [ + "0x06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } +] +``` + +## Topic filters + +[Filter options objects](../reference/api/objects.md#filter-options-object) have a `topics` key to filter logs by topics. + +Topics are order-dependent. A transaction with a log containing topics `[A, B]` matches with the following topic filters: + +- `[]` - Match any topic +- `[A]` - Match A in first position +- `[[null], [B]]` - Match any topic in first position AND B in second position +- `[[A],[B]]` - Match A in first position AND B in second position +- `[[A, C], [B, D]]` - Match (A OR C) in first position AND (B OR D) in second position. + +The following filter option object returns log entries for the [Event Parameters example contract](#event-parameters) with `valueIndexed` set to 5 or 9: + +```json +{ + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x43d1f9096674b5722d359b6402381816d5b22f28", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + [ + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000009" + ] + ] +} +``` diff --git a/versioned_docs/version-stable/public-networks/concepts/genesis-file.md b/versioned_docs/version-stable/public-networks/concepts/genesis-file.md new file mode 100644 index 00000000000..d91a237e096 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/genesis-file.md @@ -0,0 +1,50 @@ +--- +title: Genesis file +sidebar_position: 7 +description: Learn about configuring a network using the genesis file. +tags: + - public networks + - private networks +--- + +# Genesis file + +The genesis file defines the first block in the chain, and the first block defines which chain you want to join. + +For Ethereum Mainnet and public testnets (for example, Goerli) the genesis configuration definition is in Besu and used when specifying a public network using the [`--network`](../reference/cli/options.md#network) command line option. + +For private networks, [create a JSON genesis file](https://consensys.net/blog/quorum/hyperledger-besu-how-to-create-an-ethereum-genesis-file/), then specify the genesis file using the [`--genesis-file`](../reference/cli/options.md#genesis-file) command line option. + +The genesis file specifies the [network-wide settings](../reference/genesis-items.md), such as those for a [free gas network](../../private-networks/how-to/configure/free-gas.md), so all nodes in a network must use the same genesis file. + +:::note + +You can specify node-level settings on the command line or in the [node configuration file](../how-to/configuration-file.md). + +::: + +```json title="Example IBFT 2.0 genesis file" +{ + "config": { + "chainId": 2018, + "berlinBlock": 0, + "ibft2": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "extraData": "0xf83ea00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000c0", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb": { + "balance": "0xad78ebc5ac6200000" + } + } +} +``` diff --git a/versioned_docs/version-stable/public-networks/concepts/network-and-chain-id.md b/versioned_docs/version-stable/public-networks/concepts/network-and-chain-id.md new file mode 100644 index 00000000000..85db0c4b7da --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/network-and-chain-id.md @@ -0,0 +1,76 @@ +--- +title: Network ID and chain ID +sidebar_position: 5 +description: Learn about network ID and chain ID in Besu. +tags: + - public networks + - private networks +--- + +# Network ID and chain ID + +Ethereum networks have two identifiers, a network ID and a chain ID. Although they often have the same value, they have different uses. + +Peer-to-peer communication between nodes uses the _network ID_, while the transaction signature process uses the _chain ID_. + +:::note + +[EIP-155](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md) introduced using the chain ID as part of the transaction signing process to protect against transaction replay attacks. + +::: + +For most networks, including Mainnet and the public testnets, the network ID and the chain ID are the same, with the network ID defaulting to the chain ID, as specified in the genesis file. + +```json title="Chain ID in the genesis file" +{ + "config": { + "ethash": { + }, + "chainID": 1981 + }, + ... +} +``` + +Besu sets the chain ID (and by default the network ID) automatically, using either the [`--genesis-file`](../reference/cli/options.md#genesis-file) option or when specifying a network using the [`--network`](../reference/cli/options.md#network) option. The following table lists the available networks and their chain and network IDs. + +| Network | Chain | Chain ID | Network ID | Type | +| --------- | ----- | -------- | ---------- | ----------- | +| `mainnet` | ETH | 1 | 1 | Production | +| `goerli` | ETH | 5 | 5 | Test | +| `sepolia` | ETH | 11155111 | 11155111 | Test | +| `dev` | ETH | 2018 | 2018 | Development | +| `classic` | ETC | 61 | 1 | Production | +| `mordor` | ETC | 63 | 7 | Test | +| `kotti` | ETC | 6 | 6 | Test | +| `astor` | ETC | 212 | 212 | Test | + +:::info + +The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: + +## Specify a different network ID + +Usually the network ID is the same as the chain ID, but if you want to separate specific nodes from the rest of the network so they can't connect or synchronize with other nodes, you can override the default network ID for those nodes using the [`--network-id`](../reference/cli/options.md#network-id) option. + +## Start a new chain with a new chain ID + +If you update the chain ID (or network ID) of existing nodes, they can no longer peer with other nodes in the network. Nodes need to have a matching [genesis file](genesis-file.md), including the chain ID, in order to peer. In this case, you're effectively running two chains that can't communicate with each other. + +To change a chain ID and start a new chain: + +1. Stop all your nodes using ctrl+c in each terminal window. +2. Update the [genesis file](genesis-file.md) with the new chain ID. +3. Make sure all nodes have the same genesis file. +4. Delete the old data directory or point to a new location for each node. +5. [Restart the nodes](../../private-networks/tutorials/ibft/index.md#6-start-the-first-node-as-the-bootnode). + +:::danger Warning + +Starting a new chain is starting from block zero. + +This means when you start a new chain with a new chain ID, you lose all previous data. + +::: diff --git a/versioned_docs/version-stable/public-networks/concepts/node-keys.md b/versioned_docs/version-stable/public-networks/concepts/node-keys.md new file mode 100644 index 00000000000..01f1c98a31a --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/node-keys.md @@ -0,0 +1,104 @@ +--- +title: Node keys +sidebar_position: 8 +description: Learn about node public and private keys, and the node address. +tags: + - public networks + - private networks +--- + +# Node keys and node address + +Each node has a private and public key pair, and a node address. Hyperledger Besu uses the private and public key pair to sign and verify transactions, and the node address as an identifier for the node. + +## Node private key + +When starting Hyperledger Besu, if the [`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option is not specified and a `key` file does not exist in the data directory for the node, Besu generates a node private key and writes it to the `key` file. + +If a `key` file does exist in the data directory when starting Besu, the node starts using the private key in the `key` file. + +:::info + +The private key is not encrypted. + +::: + +## Node public key + +The node public key displays in the log after starting Besu. Also referred to as the node ID, the node public key forms part of the enode URL of a node. + +You can export the node public key, either to standard output or to a specified file, using the [`public-key export`](../reference/cli/subcommands.md#public-key) subcommand. + +## Node address + +Besu generates the node address by creating a hash of the node public key and using the last 20 bytes of the hash as the node address. It is also displayed in the logs after starting Besu. + +You can export the node address, either to standard output or to a specified file, using the [`public-key export-address`](../reference/cli/subcommands.md#public-key) subcommand. + +## Specify a custom node private key file + +Use the [`--node-private-key-file`](../reference/cli/options.md#node-private-key-file) option to specify a custom `key` file in any location. + +If the `key` file exists, the node starts with the private key in the `key` file. If the `key` file does not exist, Besu generates a node private key and writes it to the `key` file. + +For example, the following command either reads the node private key from `privatekeyfile` or writes a generated private key to `privatekeyfile`. + +```bash +besu --node-private-key-file="/Users/username/privatekeyfile" +``` + +## Enode URL + +The enode URL identifies a node. For example, the [`--bootnodes`](../reference/cli/options.md#bootnodes) option and the [`perm_addNodesToAllowlist`](../reference/api/index.md#perm_addnodestoallowlist) method specify nodes by enode URL. + +The enode URL format is `enode://@[?discport=]` where: + +- `` is the node public key, excluding the initial 0x. +- `` is the host and TCP port the bootnode is listening on for P2P discovery. Specify the host and TCP port using the [`--p2p-host`](../reference/cli/options.md#p2p-host) and [`--p2p-port`](../reference/cli/options.md#p2p-port) options. The default host is `127.0.0.1` and the default port is `30303`. + + :::note + + Standard Ethereum enode URLs allow hostnames as IP addresses only, however Besu provides [domain name support](#domain-name-support) in private permissioned networks. + + ::: + +- If the TCP listening and UDP discovery ports differ, the UDP port is specified as query parameter `discport`. + +:::info + +If the node public key is `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, the host is `10.3.58.6`, the TCP listening port is `30303`, and the UDP discovery port is `30301`, then the enode URL is `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@10.3.58.6:30303?discport=30301` + +If the [`--p2p-host`](../reference/cli/options.md#p2p-host) or [`--p2p-port`](../reference/cli/options.md#p2p-port) options are not specified and the node public key is `0xc35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f`, then the enode URL is `enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@127.0.0.1:30303` + +::: + +The enode URL displays when starting a Besu node. Use the [`net_enode`](../reference/api/index.md#net_enode) JSON-RPC API method to get the enode URL of the node. + +The enode advertised to other nodes during discovery is the external IP address and port, as defined by [`--nat-method`](../how-to/connect/specify-nat.md). + +### Domain name support + +:::caution + +Enode URL domain name support is an early access feature that you can use in private [permissioned networks](../../private-networks/concepts/permissioning/index.md) only. + +::: + +To use domain names in enode URLs: + +- Configure DNS reverse lookup. +- Enable DNS support using the early access option `--Xdns-enabled`. + +```bash title="Example enode URL using a domain name" +enode://c35c3ec90a8a51fd5703594c6303382f3ae6b2ecb9589bab2c04b3794f2bc3fc2631dabb0c08af795787a6c004d8f532230ae6e9925cbbefb0b28b79295d615f@mydomain.dev.example.net:30301 +``` + +:::tip + +If deploying Besu using Kubernetes in private permissioned networks, use the `--Xdns-enabled` and `--Xdns-update-enabled` options to ensure that Besu can connect to a container after restarting even if the IP address of the container changes. + +Use the [`--Xhelp`](../reference/cli/options.md#xhelp) command line option to view early access options and their descriptions. + +::: + +If nodes are not connecting as expected, set the [log level to TRACE](../reference/api/index.md#admin_changeloglevel) to help troubleshoot the issue. diff --git a/versioned_docs/version-stable/public-networks/concepts/proof-of-stake/_category_.json b/versioned_docs/version-stable/public-networks/concepts/proof-of-stake/_category_.json new file mode 100644 index 00000000000..47b2323cd5d --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/proof-of-stake/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Proof of stake consensus", + "position": 2 +} diff --git a/versioned_docs/version-stable/public-networks/concepts/proof-of-stake/attestations.md b/versioned_docs/version-stable/public-networks/concepts/proof-of-stake/attestations.md new file mode 100644 index 00000000000..765320567b6 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/proof-of-stake/attestations.md @@ -0,0 +1,76 @@ +--- +title: Attestations +sidebar_position: 1 +description: Proof of stake attestations +tags: + - public networks +--- + +# Attestations + +Ethereum's move to [proof of stake consensus](./index.md) has brought many changes to the way the network operates. An important aspect of proof of stake is the need for validators to provide attestations in a timely and accurate manner. However, missed attestations have become a common occurrence among validators, leading to a loss of rewards and earnings. This page explores the context behind missing attestations. + +## What are attestations? + +Every epoch (6.4 minutes), a validator proposes an attestation to the network. The attestation is for a specific slot (every 12 seconds) in the epoch. The attestation votes in favor of the validator's view of the chain, in particular, the most recent justified block and the first block in the current epoch (known as _source_ and _target_ checkpoints). This information is collected for all participating validators, enabling the network to reach consensus about the state of the blockchain. + +Honest nodes have 1/3 \* `SECONDS_PER_SLOT` (4 seconds) from the start of the slot to either receive the block or decide there was no block produced and attest to an “empty” or “skip” slot. Once this time has elapsed, attesters should broadcast their attestation reflecting their local view of the chain. + +See the [official specification](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) for more information about attestations. + +## Attestation rewards + +Around 85% of validators' rewards come from making attestations. Although committee and slot assignments for attesting are randomized, every active validator will be selected to make exactly one attestation each epoch. + +Attestations receive rewards only if they're included in Beacon Chain blocks. An attestation contains three votes. Each vote is eligible for a reward, subject to the following conditions: + +- Getting attestations included with the correct source checkpoint within 5 slots +- Getting attestations included with the correct target checkpoint within 32 slots +- Getting attestations included with the correct head within 1 slot immediately + +Each of these duties carries a reward rate, a portion of the entire "weight denominator," or the sum of weighted rewards for each attestation. The remaining weights relate to participating in sync committees and proposing blocks (excluding any tips/MEV, the bulk of block rewards). The following table (from [Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/)) breaks down these weights for cumulative rewards: + +| Name | Percentage | Value | +| ---------------------- | ---------- | ------------ | +| `TIMELY_SOURCE_WEIGHT` | 21.9% | `uint64(14)` | +| `TIMELY_TARGET_WEIGHT` | 40.6% | `uint64(26)` | +| `TIMELY_HEAD_WEIGHT` | 21.9% | `uint64(14)` | +| `SYNC_REWARD_WEIGHT` | 3.1% | `uint64(2)` | +| `PROPOSER_WEIGHT` | 12.5% | `uint64(8)` | +| `WEIGHT_DENOMINATOR` | 100% | `uint64(64)` | + +## Incorrect attestations + +If you have attestations with incorrect head votes, your node might be experiencing slow block imports. However, block producers can also be slow to publish blocks, resulting in a majority of validators getting the head vote wrong. A <100% head vote doesn't necessarily imply a problem with your node. + +In case of a slowdown, identify whether the issue is with the beacon node or the execution client. Block timing logs can be helpful in determining this. + +If you're using [Teku](https://docs.teku.consensys.net/) as a consensus layer client, identify late blocks (the block didn't get to Teku in time) with the following kind of log: + +```bash +Late Block Import *** Block: c2b911533a8f8d5e699d1a334e0576d2b9aa4caa726bde8b827548b579b47c68 (4765916) proposer 6230 arrival 3475ms, pre-state_retrieved +5ms, processed +185ms, execution_payload_result_received +1436ms, begin_importing +0ms, transaction_prepared +0ms, transaction_committed +0ms, completed +21ms +``` + +The time of arrival indicates how much time elapsed after the start of the slot before your node received the block. In this example, the block arrived after 3475ms, which is slower than optimal, but still enough time for Teku to create an attestation 4 seconds into the slot. + +Typically, delayed arrivals occur when the block producer is slow in generating the block. It's also possible that the block was published on time but took longer to propagate to your node through peer-to-peer gossip. If delayed arrivals are a recurring issue, it might be a problem with your node, such as an incorrect system clock, network issues, or a reduction in the number of peers. + +## Conclusion + +Attestations are complicated. Rewards can be impacted by: + +- The contents of a block (how long it takes to compute). +- The hardware processing that block (execution speed). +- How long it takes for the block to arrive to Besu from the consensus layer. +- The arrival time of the block from other consensus layer peers. Besu and your consensus layer client have no control over how late into a slot they receive blocks. +- General network latency. +- The status of either Besu or the consensus layer client. + +[Monitoring](../../how-to/monitor/index.md) your validator carefully for uptime, execution speed, and a valid consensus layer connection will help you explore attestation performance for your node. + +## References + +- [Upgrading Ethereum](https://eth2book.info/bellatrix/part2/incentives/rewards/) +- [Understanding Attestation Misses](https://www.symphonious.net/2022/09/25/understanding-attestation-misses/) +- [Block production in Ethereum after the Merge](https://notes.ethereum.org/DaWh-02HQ4qftum1xdphkg?view#Broadcast-attestation) +- [Ethereum Consensus Specs](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting) diff --git a/versioned_docs/version-stable/public-networks/concepts/proof-of-stake/index.md b/versioned_docs/version-stable/public-networks/concepts/proof-of-stake/index.md new file mode 100644 index 00000000000..8fad0be6237 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/proof-of-stake/index.md @@ -0,0 +1,47 @@ +--- +description: Ethereum proof of stake consensus +tags: + - public networks +--- + +# Proof of stake consensus + +[The Merge](../the-merge.md) transitioned Ethereum Mainnet to [proof of stake +(PoS)](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/) consensus. + +In Ethereum's PoS, you must run a [full node](../the-merge.md#execution-and-consensus-clients) and +[stake 32 ETH](https://ethereum.org/en/staking/) to become a validator. + +:::note +You must run a beacon node and an execution client to operate a full node on Mainnet. +To become a validator, you must also run a validator client (either [in the same process as the +beacon node](https://docs.teku.consensys.net/get-started/start-teku#start-the-clients-in-a-single-process) +or [separately](https://docs.teku.consensys.net/get-started/start-teku#run-the-clients-separately)). +::: + +PoS is preferred over proof of work and proof of authority as a consensus mechanism because it is +more secure, requires less energy, and lowers the barrier to entry. + +The PoS mechanism randomly chooses validators to propose or validate blocks on the [Beacon +Chain](https://ethereum.org/en/upgrades/beacon-chain/) in defined time frames. + +Proposers are responsible for proposing new consensus blocks, and non-proposing validators are +responsible for validating (attesting to) proposed blocks. +Validators earn [rewards](https://www.blocknative.com/ethereum-staking-calculator) for proposing and +attesting to consensus blocks eventually included in the Beacon Chain, and penalized for malicious behavior. +[Attestations](./attestations.md) make up the bulk of validator rewards (~85%). +Validators also receive transaction fees for included blocks. + +Each consensus block contains an execution payload, which contains a list of transactions and other data required to execute and validate the payload. + +When a node validates a consensus block, its [consensus client](../the-merge.md#consensus-clients) processes the block and sends the execution payload to the [execution client](../the-merge.md#execution-clients), which: + +1. Assembles a block on the execution layer. +2. Verifies pre-conditions. +3. Executes transactions. +4. Verifies post-conditions. +5. Sends the validity result back to the consensus client. + +If the block is valid, the execution client includes it in the execution chain and stores the new state in execution state storage. + +If a consensus block receives attestations backed by enough staked ETH, the block is included in the Beacon Chain. diff --git a/versioned_docs/version-stable/public-networks/concepts/the-merge.md b/versioned_docs/version-stable/public-networks/concepts/the-merge.md new file mode 100644 index 00000000000..a84e7f428ae --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/the-merge.md @@ -0,0 +1,85 @@ +--- +title: The Merge +sidebar_position: 1 +description: Learn about The Merge, and execution and consensus clients. +tags: + - public networks +--- + +# The Merge + +:::info + +The Merge was executed on **September 15, 2022**. + +::: + +[The Merge](https://ethereum.org/en/upgrades/merge/) was an Ethereum upgrade that merged the +[Beacon Chain] into Ethereum Mainnet, turning Mainnet into a combination of an [execution layer and +consensus layer](#execution-and-consensus-clients). +The Merge transitioned Mainnet from proof of work to [proof of stake consensus](proof-of-stake/index.md). + +You can run Besu as an execution client with: + +- [Any consensus client on Mainnet](../get-started/connect/mainnet.md). +- [Any consensus client on a testnet](../get-started/connect/testnet.md). +- [Teku on Mainnet](../tutorials/besu-teku-mainnet.md). +- [Teku on a testnet](../tutorials/besu-teku-testnet.md). + +## Execution and consensus clients + +After The Merge, a full Ethereum Mainnet node is a combination of an execution client (previously +called an [Ethereum 1.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client) and +a consensus client (previously called an [Ethereum +2.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client). + +Execution and consensus clients communicate with each other using the [Engine API](../how-to/use-engine-api.md). + +![Ethereum Merge node](../../assets/images/Execution-Consensus-Clients.png) + +### Execution clients + +Execution clients, such as Besu, manage the execution layer, including executing transactions and +updating the world state. +Execution clients serve [JSON-RPC API](../reference/engine-api/index.md) requests and communicate +with each other in a peer-to-peer network. + +### Consensus clients + +Consensus clients, such as [Teku], contain beacon node and validator client implementations. +The beacon node is the primary link to the [Beacon Chain] (consensus layer). +The validator client performs [validator duties](proof-of-stake/index.md) on the consensus layer. +Consensus clients serve [REST API](https://docs.teku.consensys.net/reference/rest) requests and +communicate with each other in a peer-to-peer network. + +## What happened during The Merge + +Before The Merge, the execution and consensus clients' configurations were updated to listen for a +certain total terminal difficulty (TTD) to be reached. + +:::info +The TTD is a specific value for the total difficulty, which is the sum of the proof-of-work mining +difficulty for all blocks up to some point in the blockchain. +::: + +The consensus layer enabled the Merge configuration (Bellatrix) before reaching the TTD. +Once the execution layer blocks reached the TTD, the Beacon Chain merged into Ethereum Mainnet, and +Ethereum transitioned to a proof of stake network. + +:::tip +After The Merge, a Mainnet node operator must run both an execution client and a beacon node at the +same time. +To become a validator, you must also run a validator client (either [in the same process as the +beacon node](https://docs.teku.consensys.net/get-started/start-teku#start-the-clients-in-a-single-process) +or [separately](https://docs.teku.consensys.net/get-started/start-teku#run-the-clients-separately). +::: + +After The Merge, validators earn [rewards](https://www.blocknative.com/ethereum-staking-calculator) +for performing [validator duties](proof-of-stake/index.md), and [fee +recipients](https://docs.teku.consensys.net/reference/cli#validators-proposer-default-fee-recipient) +also earn rewards for the inclusion of execution layer transactions. + + + +[Beacon Chain]: https://ethereum.org/en/upgrades/beacon-chain/ +[Teku]: https://docs.teku.consensys.net/en/stable/ diff --git a/versioned_docs/version-stable/public-networks/concepts/transactions/_category_.json b/versioned_docs/version-stable/public-networks/concepts/transactions/_category_.json new file mode 100644 index 00000000000..e82ef121922 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/transactions/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Transactions", + "position": 4 +} diff --git a/versioned_docs/version-stable/public-networks/concepts/transactions/pool.md b/versioned_docs/version-stable/public-networks/concepts/transactions/pool.md new file mode 100644 index 00000000000..87f2e499e8c --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/transactions/pool.md @@ -0,0 +1,48 @@ +--- +title: Transaction pool +sidebar_position: 2 +description: Transaction pool overview +tags: + - public networks + - private networks +--- + +# Transaction pool + +All nodes maintain a transaction pool to store pending transactions before processing. + +Options and methods for configuring and monitoring the transaction pool include: + +- [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions) JSON-RPC API method to list transactions in the transaction pool. +- [`--tx-pool-max-size`](../../reference/cli/options.md#tx-pool-max-size) command line option to specify the maximum number of transactions in the transaction pool. +- [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) command line option to specify the price bump percentage to replace an existing transaction. +- [`--tx-pool-retention-hours`](../../reference/cli/options.md#tx-pool-retention-hours) command line option to specify the maximum number of hours to keep pending transactions in the transaction pool. +- [`newPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#pending-transactions) and [`droppedPendingTransactions`](../../how-to/use-besu-api/rpc-pubsub.md#dropped-transactions) RPC subscriptions to notify of transactions added to and dropped from the transaction pool. + +:::tip + +When submitting [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md#nonce-validation), the [privacy marker transaction](../../../private-networks/concepts/privacy/private-transactions/processing.md) is submitted to the transaction pool, not the private transaction itself. + +::: + +## Dropping transactions when the transaction pool is full + +When the transaction pool is full, it accepts and retains local transactions in preference to remote transactions. If the transaction pool is full of local transactions, Besu drops the oldest local transactions first. That is, a full transaction pool continues to accept new local transactions by first dropping remote transactions and then by dropping the oldest local transactions. + +## Replacing transactions with the same sender and nonce + +You can replace a pending transaction with a transaction that has the same sender and nonce but a higher gas price. + +If sending a [legacy transaction](types.md#frontier-transactions), the old transaction is replaced if the new transaction has a gas price higher than the existing gas price by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). + +If sending an [`EIP1559` transaction](types.md#eip1559-transactions), the old transaction is replaced if one of the following is true: + +- The new transaction's effective gas price is higher than the existing gas price by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) AND the new effective priority fee is greater than or equal to the existing priority fee. + +- The new transaction's effective gas price is the equal to the existing gas price AND the new effective priority fee is higher than the existing priority fee by the percentage specified by [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump). + +The default value for [`--tx-pool-price-bump`](../../reference/cli/options.md#tx-pool-price-bump) is 10%. + +## Size of the transaction pool + +Decreasing the maximum size of the transaction pool reduces memory use. If the network is busy and there is a backlog of transactions, increasing the size of the transaction pool reduces the risk of removing transactions from the transaction pool. diff --git a/versioned_docs/version-stable/public-networks/concepts/transactions/types.md b/versioned_docs/version-stable/public-networks/concepts/transactions/types.md new file mode 100644 index 00000000000..91306fa3d4d --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/transactions/types.md @@ -0,0 +1,41 @@ +--- +title: Transaction types +sidebar_position: 1 +description: Description of the different transaction types +tags: + - public networks + - private networks +--- + +# Transaction types + +You can interact with the Hyperledger Besu JSON-RPC API using different transaction types (specified by the `transactionType` parameter). + +The following API objects use a unique format for each `transactionType`: + +- [Pending transaction object](../../reference/api/objects.md#pending-transaction-object) +- [Transaction object](../../reference/api/objects.md#transaction-object) +- [Transaction call object](../../reference/api/objects.md#transaction-call-object) +- [Transaction receipt object](../../reference/api/objects.md#transaction-receipt-object) + +## `FRONTIER` transactions + +Transactions with type `FRONTIER` are _legacy transactions_ that use the transaction format existing before typed transactions were introduced in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). They contain the parameters `chainId`, `nonce`, `gasPrice`, `gasLimit`, `to`, `value`, `data`, `v`, `r`, and `s`. Legacy transactions don't use [access lists](#access_list-transactions) or incorporate [EIP-1559 fee market changes](#eip1559-transactions). + +## `ACCESS_LIST` transactions + +Transactions with type `ACCESS_LIST` are transactions introduced in [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930). They contain, along with the [legacy parameters](#frontier-transactions), an `accessList` parameter, which specifies an array of addresses and storage keys that the transaction plans to access (an _access list_). `ACCESS_LIST` transactions must specify an access list, and they don't incorporate [EIP-1559 fee market changes](#eip1559-transactions). + +Use the [`eth_createAccessList`](../../reference/api/index.md#eth_createaccesslist) API to simulate a transaction which returns the addresses and storage keys that may be used to send the real transaction, and the approximate gas cost. + +## `EIP1559` transactions + +Transactions with type `EIP1559` are transactions introduced in [EIP-1559](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md). EIP-1559 addresses the network congestion and overpricing of transaction fees caused by the historical fee market, in which users send transactions specifying a gas price bid using the `gasPrice` parameter, and miners choose transactions with the highest bids. + +`EIP1559` transactions don't specify `gasPrice`, and instead use an in-protocol, dynamically changing _base fee_ per gas. At each block, the base fee per gas is adjusted to address network congestion as measured by a gas target. + +`EIP1559` transactions contain, along with the [`accessList`](#access_list-transactions) parameter and [legacy parameters](#frontier-transactions) except for `gasPrice`, a `maxPriorityFeePerGas` parameter, which specifies the maximum fee the sender is willing to pay per gas above the base fee (the maximum _priority fee_ per gas), and a `maxFeePerGas` parameter, which specifies the maximum total fee (base fee + priority fee) the sender is willing to pay per gas. + +An `EIP1559` transaction always pays the base fee of the block it's included in, and it pays a priority fee as priced by `maxPriorityFeePerGas` or, if the base fee per gas + `maxPriorityFeePerGas` exceeds `maxFeePerGas`, it pays a priority fee as priced by `maxFeePerGas` minus the base fee per gas. The base fee is burned, and the priority fee is paid to the miner that included the transaction. A transaction's priority fee per gas incentivizes miners to include the transaction over other transactions with lower priority fees per gas. + +`EIP1559` transactions must specify both `maxPriorityFeePerGas` and `maxFeePerGas`. They must not specify `gasPrice`. diff --git a/versioned_docs/version-stable/public-networks/concepts/transactions/validation.md b/versioned_docs/version-stable/public-networks/concepts/transactions/validation.md new file mode 100644 index 00000000000..39368ee1927 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/concepts/transactions/validation.md @@ -0,0 +1,30 @@ +--- +title: Transaction validation +sidebar_position: 3 +description: What transaction validation and when +tags: + - public networks + - private networks +--- + +# Transaction validation + +For transactions submitted and added to a block, Besu validates the transactions, as illustrated in the following diagram. + +![Transaction Validation](../../../assets/images/transaction-validation.png) + +Besu repeats the set of transaction pool validations after propagating the transaction. Besu repeats the same set of validations when importing the block that includes the transaction, except the nonce must be exactly right when importing the block. + +:::tip + +Private transactions are not added to the transaction pool. The privacy marker transaction is submitted to the transaction pool but the private transaction itself is directly distributed to the transaction participants. + +::: + +When adding the transaction to a block, Besu performs an additional validation to check that the transaction gas limit is less than the remaining block gas limit. After creating a block, the node imports the block and then repeats the transaction pool validations. + +:::info + +The transaction is only added if the entire transaction gas limit is less than the remaining gas for the block. The total gas used by the transaction is not relevant to this validation. That is, if the total gas used by the transaction is less than the remaining block gas, but the transaction gas limit is more than the remaining block gas, the transaction is not added. + +::: diff --git a/versioned_docs/version-stable/public-networks/get-started/_category_.json b/versioned_docs/version-stable/public-networks/get-started/_category_.json new file mode 100644 index 00000000000..25ee51d48e5 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Get started", + "position": 2, + "collapsed": false, + "link": { + "type": "generated-index", + "slug": "/public-networks/get-started" + } +} diff --git a/versioned_docs/version-stable/public-networks/get-started/connect/_category_.json b/versioned_docs/version-stable/public-networks/get-started/connect/_category_.json new file mode 100644 index 00000000000..f326ba7b151 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/connect/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Connect to a network", + "position": 4 +} diff --git a/versioned_docs/version-stable/public-networks/get-started/connect/index.md b/versioned_docs/version-stable/public-networks/get-started/connect/index.md new file mode 100644 index 00000000000..0ce16f25aba --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/connect/index.md @@ -0,0 +1,11 @@ +--- +title: Connect to a network overview +tags: + - public networks +hide: + - feedback +--- + +# Connect to a network + +This section provides information on connecting Besu to a public Ethereum network. diff --git a/versioned_docs/version-stable/public-networks/get-started/connect/mainnet.md b/versioned_docs/version-stable/public-networks/get-started/connect/mainnet.md new file mode 100644 index 00000000000..00722030e74 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/connect/mainnet.md @@ -0,0 +1,144 @@ +--- +title: Connect to Mainnet +sidebar_position: 2 +description: How to connect to Mainnet +tags: + - public networks +--- + +# Connect to Mainnet + +:::info + +[The Merge](../../concepts/the-merge.md) was executed on **September 15, 2022**. Ethereum is now a [proof of stake](../../concepts/proof-of-stake/index.md) network, and a full Ethereum node requires both [an execution client and a consensus client](../../concepts/the-merge.md#execution-and-consensus-clients). + +::: + +Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus client on Ethereum Mainnet. + +If you're using [Teku] as a consensus client, you can follow the [Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md). + +## Prerequisites + +- [Besu installed](../install/binary-distribution.md). +- A consensus client installed. For example, [Teku](https://docs.teku.consensys.net/en/latest/). + +## Steps + +### 1. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and the consensus client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../../how-to/use-engine-api.md). + +### 2. Generate validator keys + +If you're running the consensus client as a beacon node only, skip to the [next step](#3-start-besu). + +If you're also running the consensus client as a validator client, have a funded Ethereum address ready (32 ETH and gas fees for each validator). + +Generate validator keys for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: + +### 3. Start Besu + +Run the following command or specify the options in a [configuration file](../../how-to/configuration-file.md): + +```bash +besu \ + --sync-mode=X_SNAP \ + --data-storage-format=BONSAI \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist=,127.0.0.1,localhost \ + --engine-host-allowlist=,127.0.0.1,localhost \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. +- The IP address of your Besu node using the [`--host-allowlist`](../../reference/cli/options.md#host-allowlist) and [`--engine-host-allowlist`](../../reference/cli/options.md#engine-host-allowlist) options. + +Also, in the command: + +- [`--sync-mode`](../../reference/cli/options.md#sync-mode) specifies using [snap sync](sync-node.md#snap-synchronization). +- [`--data-storage-format`](../../reference/cli/options.md#data-storage-format) specifies using [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). +- [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC service. +- [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC service. +- [`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--engine-rpc-enabled`](../../reference/cli/options.md#engine-rpc-enabled) enables the [Engine API](../../reference/engine-api/index.md). + +You can modify the option values and add other [command line options](../../reference/cli/options.md) as needed. + +### 4. Start the consensus client + +Refer to your consensus client documentation to configure and start the consensus client. + +:::info + +If you're running a validator client, make sure you set a fee recipient address. + +::: + +If you're using Teku, follow the [Besu and Teku Mainnet tutorial](../../tutorials/besu-teku-mainnet.md#5-start-teku). + +### 5. Wait for the clients to sync + +After starting Besu and the consensus client, your node starts syncing and connecting to peers. + + + +# Besu logs + +```bash +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running the consensus client as a beacon node only, you're all set. If you're also running the consensus client as a validator client, ensure your clients are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. + +### 6. Stake ETH + +Stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +You can check your validator status by searching your Ethereum address on the [Beacon Chain explorer](https://beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + + + +[Teku]: https://docs.teku.consensys.net/en/stable/ diff --git a/versioned_docs/version-stable/public-networks/get-started/connect/sync-node.md b/versioned_docs/version-stable/public-networks/get-started/connect/sync-node.md new file mode 100644 index 00000000000..5a6fd8ddfca --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/connect/sync-node.md @@ -0,0 +1,163 @@ +--- +title: Sync Besu +sidebar_position: 1 +description: Full and archive node types +tags: + - public networks +--- + +# Sync Besu + +Besu supports two node types, commonly referred to as [full nodes](#run-a-full-node) and [archive nodes](#run-an-archive-node). + +Full nodes have the current state of the blockchain. They can't serve the network with all data requests (for example, the balance of an account at an old block). Full nodes can guarantee the latest state for the blockchain (and some older states, but not all). You can check current balances, sign and send transactions, and look at current dapp data. + +Archive nodes also store the intermediary state of every account and contract for every block since the genesis block. Archive nodes can do everything full nodes do, and they can access historical state data. Archive nodes require more disk space than full nodes. + +Besu must connect with other peers to sync with the network. If your node is having trouble peering, try [troubleshooting peering](../../how-to/troubleshoot/peering.md). + +## Sync times + +To sync with a public network, Besu runs two processes in parallel: the world state sync and the blockchain download. + +The following table shows the average world state sync time for each sync mode on Mainnet. All times are hardware dependent; this table is based on running AWS instances m6gd.2xlarge. Each sync mode also has its own world state database size. + +| Sync mode | Time to sync world state | Disk usage | +| ---------- | ------------------------ | ------------- | +| Snap | ~6 hours | Average disk | +| Checkpoint | ~5 hours | Smallest disk | +| Fast | ~1.5 days | Average disk | +| Full | ~weeks | Largest disk | + +:::note + +- As of late 2022, an average Mainnet snap sync consumes around 750 GB using Bonsai Tries. Read more about [storage requirements](../../concepts/data-storage-formats.md#storage-requirements) across data storage formats and sync modes. + +- Testnets take significantly less time and space to sync. + +::: + +While the world state syncs, Besu downloads and imports the blockchain in the background. The blockchain download time depends on CPU, the network, Besu's peers, and disk speed. It generally takes longer than the world state sync. + +Besu must catch up to the current chain head and sync the world state to participate on Mainnet. + +## Storage + +You can store the world state using [Forest of Tries](../../concepts/data-storage-formats.md#forest-of-tries) or [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries). We recommend using Bonsai Tries for the lowest storage requirements. + +## Run a full node + +You can run a full node using [snap synchronization (snap sync)](#snap-synchronization), [checkpoint synchronization (checkpoint sync)](#checkpoint-synchronization), or [fast synchronization (fast sync)](#fast-synchronization). + +### Snap synchronization + +:::tip + +We recommend using snap sync over fast sync because snap sync can be faster by several days. + +We recommend using snap sync with the [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries) data storage format for the fastest sync and lowest storage requirements. + +::: + +Enable snap sync using [`--sync-mode=X_SNAP`](../../reference/cli/options.md#sync-mode). You need Besu version 22.4.0 or later to use snap sync. + +Instead of downloading the [state trie](../../concepts/data-storage-formats.md) node by node, snap sync downloads as many leaves of the trie as possible, and reconstructs the trie locally. + +You can't switch from fast sync to snap sync. If your node is blocked in the middle of a fast sync, you can start over using snap sync instead by stopping the node, deleting the data directory, and starting over using `--sync-mode=X_SNAP`. + +You can restart Besu during a snap sync in case of hardware or software problems. The sync resumes from the last valid world state and continues to download blocks starting from the last downloaded block. + +See [how to read the Besu metrics charts](../../how-to/monitor/understand-metrics.md) when using snap sync. + +### Checkpoint synchronization + +:::caution + +Checkpoint sync is an early access feature. + +::: + +Enable checkpoint sync using [`--sync-mode=X_CHECKPOINT`](../../reference/cli/options.md#sync-mode). You need Besu version 22.4.3 or later to use checkpoint sync. + +Checkpoint sync behaves like [snap sync](#snap-synchronization), but instead of syncing from the genesis block, it syncs from a specific checkpoint block configured in the [Besu genesis file](../../concepts/genesis-file.md). + +Ethereum Mainnet and the Goerli testnet configurations already define default checkpoints, so you don't have to add this yourself. + +For other networks, you can configure a checkpoint in the genesis file by specifying the block hash, number, and total difficulty as in the following example. + +```json title="Checkpoint configuration example" +"checkpoint": { + "hash": "0x844d581cb00058d19f0584fb582fa2de208876ee56bbae27446a679baf4633f4", + "number": 14700000, + "totalDifficulty": "0xA2539264C62BF98CFC6" +} +``` + +:::note + +If using [Clique](../../../private-networks/how-to/configure/consensus/clique.md) consensus, the checkpoint must be the beginning of an epoch. + +::: + +If you enable checkpoint sync without a checkpoint configuration in the genesis file, Besu snap syncs from the genesis block. + +You can restart Besu during a checkpoint sync in case of hardware or software problems. The sync resumes from the last valid world state and continues to download blocks starting from the last downloaded block. + +### Fast synchronization + +:::caution + +It might become impossible to sync Ethereum Mainnet using fast sync in the future. If you sync for the first time or ever need to re-sync, update Besu to a version that supports newer sync methods. + +::: + +Enable fast sync using [`--sync-mode=FAST`](../../reference/cli/options.md#sync-mode). + +Fast sync downloads the block headers and transaction receipts, and verifies the chain of block headers from the genesis block. + +When starting fast sync, Besu first downloads the world state for a recent block verified by its peers (referred to as a pivot block), and then begins fast sync from the genesis block. + +Fast sync is the default for named networks specified using the [`--network`](../../reference/cli/options.md#network) option, except for the `dev` development network. It's also the default if connecting to Ethereum Mainnet by not specifying the [`--network`](../../reference/cli/options.md#network) or [`--genesis-file`](../../reference/cli/options.md#genesis-file) options. + +Using fast sync with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. + +You can observe the `besu_synchronizer_fast_sync_*` and `besu_synchronizer_world_state_*` [metrics](../../how-to/monitor/metrics.md#metrics-list) to monitor fast sync. + +:::note + +When fast syncing, block numbers increase until close to the head block, then the process pauses while the world state download completes. This may take a significant amount of time depending on world state size, during which the current head block doesn't increase. For example, Mainnet may take several days or more to fast sync. Fast sync time may increase because Besu picks new pivot blocks, or because peers prune the world state before it completes downloading. + +::: + +:::caution RocksDB error on AWS + +When running Besu on some cloud providers, a known [RocksDB](https://github.com/facebook/rocksdb/issues/6435) issue causes fast sync to fail occasionally. The following error is displayed repeatedly: + +``` +EthScheduler-Services-1 (importBlock) | ERROR | PipelineChainDownloader | Chain download failed. Restarting after short delay. +java.util.concurrent.CompletionException: org.hyperledger.besu.plugin.services.exception.StorageException: org.rocksdb.RocksDBException: block checksum mismatch: +``` + +The failure has been seen on AWS and Digital Ocean. On AWS, A full restart of the VM is required to restart the fast sync. Fast sync isn't [currently supported on Digital Ocean](https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/CHANGELOG.md#143). + +::: + +:::caution Pending state nodes stays constant + +When fast syncing, the pending state nodes count is the number of nodes yet to be downloaded, and it should change constantly. Pending state nodes trend to 0 during fast sync and then goes to 0. + +If the number stays constant, this could mean your node isn't syncing against any peers. + +In the following example, the pivot block is 0 and the pending state nodes value is constant. This means the node isn't syncing against any peers. The fact that state nodes have been downloaded means at some stage it was syncing. + +![Fast synchronization](../../../assets/images/fastsync.png) + +The easiest solution in this scenario is to restart fast sync to obtain a new pivot block. + +::: + +## Run an archive node + +To run an archive node, enable full synchronization (full sync) using [`--sync-mode=FULL`](../../reference/cli/options.md#sync-mode). + +Full sync starts from the genesis block and reprocesses all transactions. diff --git a/versioned_docs/version-stable/public-networks/get-started/connect/testnet.md b/versioned_docs/version-stable/public-networks/get-started/connect/testnet.md new file mode 100644 index 00000000000..ee8b4017f94 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/connect/testnet.md @@ -0,0 +1,155 @@ +--- +title: Connect to a testnet +sidebar_position: 3 +Description: How to connect to a testnet +tags: + - public networks +--- + +# Connect to a testnet + +Run Besu as an [execution client](../../concepts/the-merge.md#execution-clients) with any consensus client on the [Goerli](https://github.com/eth-clients/goerli) and [Sepolia](https://github.com/eth-clients/sepolia) testnets. + +If you're using [Teku](https://docs.teku.consensys.net/en/latest/) as a consensus client, you can follow the [Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md). + +:::note + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. You can connect your consensus client using the beacon node only, without any validator duties. + +::: + +## Prerequisites + +- [Besu installed](../install/binary-distribution.md). +- A consensus client installed. For example, [Teku](https://docs.teku.consensys.net/en/latest/). + +## Steps + +### 1. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and the consensus client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../../how-to/use-engine-api.md). + +### 2. Generate validator keys + +If you're running the consensus client as a beacon node only, skip to the [next step](#3-start-besu). + +If you're also running the consensus client as a validator client, create a test Ethereum address (you can do this in [MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and [Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). + +:::note + +If you can't get ETH using the faucet, you can ask for help on the [EthStaker Discord](https://discord.io/ethstaker). + +::: + +Generate validator keys for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or [request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: + +### 3. Start Besu + +Run the following command or specify the options in a [configuration file](../../how-to/configuration-file.md): + + + +# Goerli + +```bash +besu \ + --network=goerli \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +# Sepolia + +```bash +besu \ + --network=sepolia \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 1](#1-generate-the-shared-secret) using the [`--engine-jwt-secret`](../../reference/cli/options.md#engine-jwt-secret) option. + +You can modify the option values and add other [command line options](../../reference/cli/options.md) as needed. + +### 4. Start the consensus client + +Refer to your consensus client documentation to configure and start the consensus client. + +:::info + +If you're running a validator client, make sure you set a fee recipient address. + +::: + +If you're using Teku, follow the [Besu and Teku testnet tutorial](../../tutorials/besu-teku-testnet.md#5-start-teku). + +### 5. Wait for the clients to sync + +After starting Besu and the consensus client, your node starts syncing and connecting to peers. + + + +# Besu logs + +```bash +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running the consensus client as a beacon node only, you're all set. If you're also running the consensus client as a validator client, ensure your clients are fully synced before submitting your staking deposit in the next step. This can take several days. + +### 6. Stake ETH + +Stake your testnet ETH for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). + +You can check your validator status by searching your Ethereum address on the [Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. diff --git a/versioned_docs/version-stable/public-networks/get-started/install/_category_.json b/versioned_docs/version-stable/public-networks/get-started/install/_category_.json new file mode 100644 index 00000000000..043580c1474 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/install/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Install Besu", + "position": 2 +} diff --git a/versioned_docs/version-stable/public-networks/get-started/install/binary-distribution.md b/versioned_docs/version-stable/public-networks/get-started/install/binary-distribution.md new file mode 100644 index 00000000000..ae1e28a5b6c --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/install/binary-distribution.md @@ -0,0 +1,94 @@ +--- +title: Install binary distribution +sidebar_position: 2 +description: Install or upgrade Hyperledger Besu from binary distribution +tags: + - public networks +--- + +# Install binary distribution + +## MacOS with Homebrew + +### Prerequisites + +- [Homebrew](https://brew.sh/) +- Java JDK + +:::caution + +Hyperledger Besu supports: + +- MacOS High Sierra 10.13 or later versions. +- Java 17+. You can install Java using `brew install openjdk`. Alternatively, you can manually install the [Java JDK](https://www.oracle.com/java/technologies/downloads). + +::: + +### Install (or upgrade) using Homebrew + +To install Besu using Homebrew: + +```bash +brew tap hyperledger/besu +brew install hyperledger/besu/besu +``` + +To upgrade an existing Besu installation using Homebrew: + +```bash +brew upgrade hyperledger/besu/besu +``` + +:::note + +If you've upgraded your MacOS version between installing and upgrading Besu, when running `brew upgrade hyperledger/besu/besu` you may be prompted to reinstall command line tools with `xcode-select --install`. + +::: + +:::note + +When upgrading Besu, you might be prompted to fix the remote branch names in Homebrew by using the command `brew tap --repair`. + +::: + +To display the Besu version and confirm installation: + +```bash +besu --version +``` + +To display Besu command line help: + +```bash +besu --help +``` + +## Linux / Unix + +### Prerequisites + +- [Java JDK 17+](https://www.oracle.com/java/technologies/downloads/) + +:::note Linux open file limit + +If synchronizing to Mainnet on Linux or other chains with large data requirements, increase the maximum number of open files allowed using `ulimit`. If the open files limit is not high enough, a `Too many open files` RocksDB exception occurs. + +::: + +:::tip + +We recommend installing [jemalloc](https://jemalloc.net/) to reduce memory usage. If using Ubuntu, you can install it with the command: `apt install libjemalloc-dev`. + +::: + +### Install from packaged binaries + +Download the Besu [packaged binaries](https://github.com/hyperledger/besu/releases). + +Unpack the downloaded files and change into the `besu-` directory. + +Display Besu command line help to confirm installation: + +```bash +bin/besu --help +``` diff --git a/versioned_docs/version-stable/public-networks/get-started/install/index.md b/versioned_docs/version-stable/public-networks/get-started/install/index.md new file mode 100644 index 00000000000..c4717c1fe65 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/install/index.md @@ -0,0 +1,23 @@ +--- +title: Installation options +description: Options for getting started with Hyperledger Besu +tags: + - public networks +--- + +# Installation options + +- [Docker image](run-docker-image.md) +- [Binaries](binary-distribution.md) + +## Build from source + +If you want to use the latest development version of Hyperledger Besu or a specific commit, build from source. Otherwise, use the [binary] or [Docker image] for more stable versions. + +View the [Hyperledger Wiki] for instructions to install Hyperledger Besu from source. + + + +[Hyperledger Wiki]: https://wiki.hyperledger.org/display/BESU/Building+from+source +[binary]: binary-distribution.md +[Docker image]: run-docker-image.md diff --git a/versioned_docs/version-stable/public-networks/get-started/install/run-docker-image.md b/versioned_docs/version-stable/public-networks/get-started/install/run-docker-image.md new file mode 100644 index 00000000000..a2561f40c08 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/install/run-docker-image.md @@ -0,0 +1,143 @@ +--- +title: Run Besu from Docker image +sidebar_position: 1 +description: Run Hyperledger Besu using the official docker image +tags: + - public networks +--- + +# Run Besu from a Docker image + +Hyperledger Besu provides a Docker image to run a Besu node in a Docker container. + +Use this Docker image to run a single Besu node without installing Besu. + +## Prerequisites + +- [Docker](https://docs.docker.com/install/) + +- MacOS or Linux + + :::info + + The Docker image doesn't run on Windows. + + ::: + +## Default node for Mainnet + +To run a Besu node in a container connected to the Ethereum Mainnet: + +```bash +docker run hyperledger/besu:latest +``` + +:::note + +https://hub.docker.com/r/hyperledger/besu/tags lists the available tags for the image. + +If you previously pulled `latest`, Docker runs the cached version. + +To ensure your image is up to date, pull the `latest` version again using `docker pull hyperledger/besu:latest`. + +::: + +## Expose ports + +Expose ports for P2P discovery, GraphQL, metrics, and HTTP and WebSocket JSON-RPC. You need to expose the ports to use the default ports or the ports specified using [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), [`--p2p-port`](../../reference/cli/options.md#p2p-port), [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), [`--metrics-port`](../../reference/cli/options.md#metrics-port), [`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port), and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. + +To run Besu exposing local ports for access: + +```bash +docker run -p :8545 -p :8546 -p :30303 hyperledger/besu:latest --rpc-http-enabled --rpc-ws-enabled +``` + +:::note + +The examples on this page expose TCP ports only. To expose UDP ports, specify `/udp` at the end of the argument for the `-p` Docker subcommand option: + +```bash +docker run -p :/udp +``` + +See the [`docker run -p` documentation](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose). + +::: + +To enable JSON-RPC HTTP calls to `127.0.0.1:8545` and P2P discovery on `127.0.0.1:13001`: + +```bash +docker run -p 8545:8545 -p 13001:30303 hyperledger/besu:latest --rpc-http-enabled +``` + +## Start Besu + +:::danger + +Don't mount a volume at the default data path (`/opt/besu`). Mounting a volume at the default data path interferes with the operation of Besu and prevents Besu from safely launching. + +To run a node that maintains the node state (key and database), [`--data-path`](../../reference/cli/options.md#data-path) must be set to a location other than `/opt/besu` and a storage volume mounted at that location. + +When running in a Docker container, [`--nat-method`](../../how-to/connect/specify-nat.md) must be set to `DOCKER` or `AUTO` (default). Don't set [`--nat-method`](../../how-to/connect/specify-nat.md) to `NONE` or `UPNP`. + +::: + +You can specify [Besu environment variables](../../reference/cli/options.md#specify-options) with the Docker image instead of the command line options. + +```bash title="Example" +docker run -p 30303:30303 -p 8545:8545 -e BESU_RPC_HTTP_ENABLED=true -e BESU_NETWORK=goerli hyperledger/besu:latest +``` + +:::caution Unsupported address type exception + +When running Besu from a Docker image, you might get the following exception: + +```bash +Unsupported address type exception when connecting to peer {}, this is likely due to ipv6 not being enabled at runtime. +``` + +This happens when the IPv6 support in Docker is disabled while connecting to an IPv6 peer, preventing outbound communication. IPv6 is disabled by default in Docker. + +[Enable IPv6 support in Docker](https://docs.docker.com/config/daemon/ipv6/) to allow outbound IPv6 traffic and allow connection with IPv6 peers. + +::: + +### Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes with WebSocket enabled: + +```bash +docker run -p 8546:8546 --mount type=bind,source=/,target=/var/lib/besu hyperledger/besu:latest --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-ws-enabled --network=dev --data-path=/var/lib/besu +``` + +### Run a node on Goerli testnet + +To run a node on Goerli: + +```bash +docker run -p 30303:30303 --mount type=bind,source=/,target=/var/lib/besu hyperledger/besu:latest --network=goerli --data-path=/var/lib/besu +``` + +### Run a node on Ethereum Mainnet + +To run a node on Ethereum Mainnet with the HTTP JSON-RPC service enabled: + +```bash +docker run -p 8545:8545 --mount type=bind,source=/,target=/var/lib/besu -p 30303:30303 hyperledger/besu:latest --rpc-http-enabled --data-path=/var/lib/besu +``` + +## Stop Besu and clean up resources + +When done running nodes, you can shut down the node container without deleting resources or you can delete the container after stopping it. Run `docker container ls` and `docker volume ls` to get the container and volume names. + +To stop a container: + +```bash +docker stop +``` + +To delete a container: + +```bash +docker rm +``` diff --git a/versioned_docs/version-stable/public-networks/get-started/migrate-to-besu.md b/versioned_docs/version-stable/public-networks/get-started/migrate-to-besu.md new file mode 100644 index 00000000000..2693411ced0 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/migrate-to-besu.md @@ -0,0 +1,15 @@ +--- +description: Migrate to Besu from a different Ethereum execution client. +tags: + - public networks +--- + +# Migrate to Besu + +Migrate from a different Ethereum [execution client](../concepts/the-merge.md#execution-clients) to Besu to contribute to [client diversity](https://clientdiversity.org/). + +To migrate from a different client, [configure Besu as an execution client](connect/mainnet.md#2-start-besu) and connect your [consensus client](../concepts/the-merge.md#consensus-clients) to Besu instead of your original execution client. + +To minimize downtime while [Besu syncs](connect/sync-node.md) and avoid downtime penalties, you can sync Besu with a new consensus layer instance. Once Besu has fully synced you can connect it to your existing consensus client. + +Find guides to switch from specific clients on the [client diversity website](https://clientdiversity.org/#switch). diff --git a/versioned_docs/version-stable/public-networks/get-started/start-node.md b/versioned_docs/version-stable/public-networks/get-started/start-node.md new file mode 100644 index 00000000000..803f9345c97 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/start-node.md @@ -0,0 +1,151 @@ +--- +title: Start Besu +sidebar_position: 3 +description: Start Besu on a public Ethereum network. +tags: + - public networks +--- + +# Start Besu + +Nodes can connect to Ethereum Mainnet and public testnets. + +Use the [`besu`](../reference/cli/options.md) command with the required command line options to start a node. + +## Prerequisites + +[Besu installed](install/binary-distribution.md) + +## Local block data + +When connecting to a network other than the network previously connected to, you must either delete the local block data or use the [`--data-path`](../reference/cli/options.md#data-path) option to specify a different data directory. + +To delete the local block data, delete the `database` directory in the `besu/build/distribution/besu-` directory. + +## Genesis configuration + +Besu specifies the genesis configuration, and sets the network ID and bootnodes when connecting to [Goerli](#run-a-node-on-goerli-testnet), [Sepolia](#run-a-node-on-sepolia-testnet), and [Mainnet](#run-a-node-on-ethereum-mainnet). + +:::info + +The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: + +When you specify [`--network=dev`](../reference/cli/options.md#network), Besu uses the development mode genesis configuration with a fixed low difficulty. A node started with [`--network=dev`](../reference/cli/options.md#network) has an empty bootnodes list by default. + +The genesis files defining the genesis configurations are in the [Besu source files](https://github.com/hyperledger/besu/tree/master/config/src/main/resources). + +To define a genesis configuration, create a genesis file (for example, `genesis.json`) and specify the file using the [`--genesis-file`](../reference/cli/options.md#genesis-file) option. + +## Syncing and storage + +By default, Besu syncs to the current state of the blockchain using [fast sync](connect/sync-node.md#fast-synchronization) in: + +- Networks specified using [`--network`](../reference/cli/options.md#network) except for the `dev` development network. +- Ethereum Mainnet. + +We recommend using [snap sync](connect/sync-node.md#snap-synchronization) for a faster sync, by starting Besu with [`--sync-mode=X_SNAP`](../reference/cli/options.md#sync-mode). + +By default, Besu stores data in the [Forest of Tries](../concepts/data-storage-formats.md#forest-of-tries) format. We recommend using [Bonsai Tries](../concepts/data-storage-formats.md#bonsai-tries) for lower storage requirements, by starting Besu with [`--data-storage-format=BONSAI`](../reference/cli/options.md#data-storage-format). + +## Run a node for testing + +To run a node that mines blocks at a rate suitable for testing purposes: + +```bash +besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir +``` + +You can also use the following [configuration file](../how-to/configuration-file.md) on the command line to start a node with the same options as above: + +```toml +network="dev" +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +rpc-http-cors-origins=["all"] +host-allowlist=["*"] +rpc-ws-enabled=true +rpc-http-enabled=true +data-path="/tmp/tmpdata-path" +``` + +:::danger Warning + +The following settings are a security risk in production environments: + +- Enabling the HTTP JSON-RPC service ([`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled)) and setting [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) to 0.0.0.0 exposes the RPC connection on your node to any remote connection. +- Setting [`--host-allowlist`](../reference/cli/options.md#host-allowlist) to `"*"` allows JSON-RPC API access from any host. +- Setting [`--rpc-http-cors-origins`](../reference/cli/options.md#rpc-http-cors-origins) to `"all"` or `"*"` allows cross-origin resource sharing (CORS) access from any domain. + +::: + +## Run a node on Goerli testnet + +To run a node on [Goerli](https://github.com/goerli/testnet) specifying a data directory: + +```bash +besu --network=goerli --data-path=/ +``` + +Where `` and `` are the path and directory to save the Goerli chain data to. + +See the [guide on connecting to a testnet](connect/testnet.md) for more information. + +## Run a node on Sepolia testnet + +To run a node on [Sepolia](https://github.com/goerli/sepolia) specifying a data directory: + +```bash +besu --network=sepolia --data-path=/ +``` + +Where `` and `` are the path and directory to save the Sepolia chain data to. + +See the [guide on connecting to a testnet](connect/testnet.md) for more information. + +## Run a node on Ethereum Mainnet + +To run a node on the Ethereum Mainnet: + +```bash +besu +``` + +To run a node on Mainnet with the HTTP JSON-RPC service enabled and available for localhost only: + +```bash +besu --rpc-http-enabled +``` + +See the [guide on connecting to Mainnet](connect/mainnet.md) for more information. + +## Confirm node is running + +If you started Besu with the [`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) option, use [cURL](https://curl.haxx.se/) to call [JSON-RPC API methods](../reference/api/index.md) to confirm the node is running. + +- `eth_chainId` returns the chain ID of the network. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545 + ``` + +- `eth_syncing` returns the starting, current, and highest block. + + ```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545 + ``` + + For example, after connecting to Mainnet, `eth_syncing` will return something similar to: + + ```json + { + "jsonrpc": "2.0", + "id": 1, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x2d0", + "highestBlock": "0x66c0" + } + } + ``` diff --git a/versioned_docs/version-stable/public-networks/get-started/system-requirements.md b/versioned_docs/version-stable/public-networks/get-started/system-requirements.md new file mode 100644 index 00000000000..e0d9dfe7122 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/get-started/system-requirements.md @@ -0,0 +1,144 @@ +--- +title: System requirements +sidebar_position: 1 +description: Ensure you meet the system requirements to sync and run Besu. +tags: + - public networks +--- + +# System requirements + +Determine public network system requirements by checking CPU and disk space requirements using [Prometheus](../how-to/monitor/metrics.md). Grafana provides a [sample dashboard](https://grafana.com/grafana/dashboards/10273) for Besu. + +:::tip + +CPU requirements are highest when syncing to the network and typically reduce after the node is synchronized to the chain head. + +::: + +## Java distribution and installation + +Besu requires an installation of Java 17+ to run. +We currently recommend two Java distributions, [OpenJDK 17](https://jdk.java.net/17/) and +[OpenJ9](https://www.eclipse.org/openj9/), though you can experiment based on your needs. + +OpenJDK is the default for many Java users and is balanced in performance and garbage collection. +OpenJ9 consumes less memory and system resources, but can have worse performance on some setups. + +If you have more than 32GB RAM (for Besu and your [consensus client](../concepts/the-merge.md)), use OpenJDK. +If you have less RAM: + +* If you're on Linux (or Unix-based) and your CPU is x86-64 bit architecture (like Intel), use OpenJ9. +* If you're on ARM-64 CPU architecture (Mac M-series, Raspberry Pi), use OpenJDK. + +If you have OpenJDK installed or need a fresh installation of OpenJ9, you can pick up the OpenJ9 +docker image, or install the OpenJ9 JDK using the following steps: + +1. Get the [binaries](https://github.com/ibmruntimes/semeru17-binaries/releases) corresponding to + your OS architecture. + For example: + + ```bash + wget https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.5%2B8_openj9-0.35.0/ibm-semeru-open-jdk_x64_linux_17.0.5_8_openj9-0.35.0.tar.gz + ``` +2. Uncompress the binaries: + + + + # Command + + ```bash + tar -xvf YOUR_J9_IMAGE.tar.gz + ``` + # Example + + ```bash + tar -xvf ibm-semeru-open-jdk_x64_linux_17.0.5_8_openj9-0.35.0.tar.gz + ``` + + + +3. Move the binaries to `bin` directory: + + + + # Command + + ```bash + sudo cp -r YOUR_IMAGE/ /usr/bin/ + ``` + # Example + + ```bash + sudo cp -r jdk-17.0.5+8/ /usr/bin/ + ``` + + + +4. Specify OpenJ9 for Java on your machine: + + + + # Command + + ```bash + sudo update-alternatives --install "/usr/bin/java" "java" "/usr/bin/YOUR_IMAGE" 1 + sudo update-alternatives --config java (and choose OpenJ9) + ``` + + # Example + + ```bash + sudo update-alternatives --install "/usr/bin/java" "java" "/usr/bin/jdk-17.0.5+8/bin/java" + ``` + + + + Change your `JAVA_HOME` to OpenJ9 (if using the JDK implementation), where `jdk-install-dir` is + the installation location you specified: + + + + # Command + + ```bash + export JAVA_HOME=jdk-install-dir` + ``` + + # Example + + ```bash + export JAVA_HOME=/usr/bin/jdk-17.0.5+8 + ``` + + + +## Java Virtual Machine size + +For Mainnet and testnets, the minimum [Java Virtual Machine (JVM) memory requirement is 8 GB](../how-to/configure-jvm/manage-memory.md). + +JVM memory requirements are highest when syncing, but will reduce after the node is synchronized to the chain head. Monitor your system to determine your actual JVM memory needs. + +## Disk space + +[Fast synchronization](../reference/cli/options.md#sync-mode) with [pruning](../concepts/data-storage-formats.md) enabled requires approximately 750 GB of disk space. [Full synchronization](../reference/cli/options.md#sync-mode) requires approximately 3 TB. + +## Disk type + +Use [local SSD storage](https://cloud.google.com/compute/docs/disks) for high throughput nodes (validators and RPC nodes). Read-only nodes can use a lower performance setup. + +You can use local SSDs through [SCSI interfaces](https://en.wikipedia.org/wiki/SCSI). For higher performance in production settings, we recommend upgrading to [NVMe interfaces](https://cloud.google.com/compute/docs/disks/local-ssd#performance). + +## AWS requirements + +We are running 22.4.2 Mainnet nodes using `m6gd.2xlarge` boxes. + +We synchronized the 22.4.2 Mainnet nodes using `m6gd.2xlarge` boxes. + +Using a larger box while synchronizing speeds up the sync process by giving it more resources. When the sync is completed, the box size can be reduced. + +:::caution + +If you are using a more recent release than 22.4.2, resource requirements may have increased. + +::: diff --git a/versioned_docs/version-stable/public-networks/how-to/_category_.json b/versioned_docs/version-stable/public-networks/how-to/_category_.json new file mode 100644 index 00000000000..6a19126f23e --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "How to", + "position": 3, + "link": { + "type": "generated-index", + "slug": "public-networks/how-to" + } +} diff --git a/versioned_docs/version-stable/public-networks/how-to/configuration-file.md b/versioned_docs/version-stable/public-networks/how-to/configuration-file.md new file mode 100644 index 00000000000..8a70c92c997 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/configuration-file.md @@ -0,0 +1,66 @@ +--- +title: Use a configuration file +sidebar_position: 3 +description: Specify options in the Besu configuration file. +tags: + - public networks + - private networks +--- + +# Use the Hyperledger Besu configuration file + +To specify command line options in a file, use a TOML configuration file. + +Save the configuration file and reuse it across node startups. To specify the configuration file, use the [`--config-file`](../reference/cli/options.md#config-file) option. + +To override an option specified in the configuration file, either specify the same option on the command line or as an [environment variable](../reference/cli/options.md#specify-options). For options specified in more than one place, the order of precedence is command line, environment variable, configuration file. + +:::note + +The configuration file is used for node-level settings. You can specify network-wide settings in the [genesis file](../concepts/genesis-file.md). + +::: + +## TOML specification + +The configuration file must be a valid TOML file composed of key/value pairs. Each key is the same as the corresponding command line option name without the leading dashes (`--`). + +Values must conform to TOML specifications for string, numbers, arrays, and booleans. Specific differences between the command line and the TOML file format are: + +- Comma-separated lists on the command line are string arrays in the TOML file. +- Enclose file paths, hexadecimal numbers, URLs, and <host:port> values in quotes. + +:::tip + +The [command line reference](../reference/cli/options.md) includes configuration file examples for each option. + +::: + +```toml title="Sample TOML configuration file" +# Valid TOML config file +data-path="~/besudata" # Path + +# Network +bootnodes=["enode://001@123:4567", "enode://002@123:4567", "enode://003@123:4567"] + +p2p-host="1.2.3.4" +p2p-port=1234 +max-peers=42 + +rpc-http-host="5.6.7.8" +rpc-http-port=5678 + +rpc-ws-host="9.10.11.12" +rpc-ws-port=9101 + +# Chain +genesis-file="~/genesis.json" # Path to the custom genesis file + +# Mining +miner-enabled=true +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +``` + +```bash title="Starting Besu with a configuration file" +besu --config-file=/home/me/me_node/config.toml +``` diff --git a/versioned_docs/version-stable/public-networks/how-to/configure-ha/_category_.json b/versioned_docs/version-stable/public-networks/how-to/configure-ha/_category_.json new file mode 100644 index 00000000000..450cbdb623f --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/configure-ha/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure high availability", + "position": 7 +} diff --git a/versioned_docs/version-stable/public-networks/how-to/configure-ha/index.md b/versioned_docs/version-stable/public-networks/how-to/configure-ha/index.md new file mode 100644 index 00000000000..0f642295f0a --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/configure-ha/index.md @@ -0,0 +1,107 @@ +--- +description: Hyperledger Besu high availability +tags: + - public networks + - private networks +--- + +# High availability of JSON-RPC and RPC Pub/Sub APIs + +To enable high availability to the [RPC Pub/Sub API over WebSocket](../use-besu-api/rpc-pubsub.md) or the [JSON-RPC API](../use-besu-api/json-rpc.md), run and synchronize more than one Hyperledger Besu node to the network. Use a load balancer to distribute requests across nodes in the cluster that are ready to receive requests. + +![Load Balancer](../../../assets/images/LoadBalancer.png) + +:::tip + +We don't recommend putting [bootnodes](../../../private-networks/how-to/configure/bootnodes.md) behind a load balancer. + +::: + +:::info + +We recommend using load balancers over WebSockets because WebSockets are persistent connections associated with specific nodes. If you use load balancers configured in sticky mode over HTTP instead, the connection sticks to the associated node even when the node is congested and there is a lower load node available. If you use load balancers not configured in sticky mode over HTTP, the connections may switch from node to node, so some JSON-RPC requests may not provide expected results (for example, [`admin` methods](../../reference/api/index.md#admin-methods), [`net_enode`](../../reference/api/index.md#net_enode), [`net_peerCount`](../../reference/api/index.md#net_peercount), and [`eth_syncing`](../../reference/api/index.md#eth_syncing)). + +::: + +## Determine when a node is ready + +Use the [readiness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) to determine when a node is ready. + +:::note + +The minimum number of peers and number of blocks from the best known block for determining if a node considered ready is deployment specific. + +::: + +## Transaction nonces + +Besu obtains the nonce for the next transaction using [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). The nonce depends on the transactions in the [transaction pool](../../concepts/transactions/pool.md). If sending [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) and [`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction) requests for a specific account to more than one node, the [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) results might be incorrect. + +:::note + +If using [private transactions](../../../private-networks/concepts/privacy/private-transactions/index.md), retrieve the nonce using [`priv_getTransactionCount`](../../../private-networks/reference/api/index.md#priv_gettransactioncount) or [`priv_getEeaTransactionCount`](../../../private-networks/reference/api/index.md#priv_geteeatransactioncount) and send the private transactions using [`eea_sendRawTransaction`](../../../private-networks/reference/api/index.md#eea_sendrawtransaction). + +::: + +To get correct nonces when distributing requests across a cluster, either: + +- Track the next nonce outside of the Besu node (as MetaMask does). +- Configure the load balancer in sticky mode to send requests from a specific account to a single node, unless that node is unavailable. + +## Subscriptions + +You can subscribe to events using: + +- [RPC Pub/Sub over WebSockets](../use-besu-api/rpc-pubsub.md). +- [Filters over HTTP](../use-besu-api/access-logs.md). + +We recommend using [RPC Pub/Sub over WebSocket](../use-besu-api/rpc-pubsub.md) because WebSockets connections associate with a specific node and do not require using the load balancer in sticky mode. + +If using [filters over HTTP](../use-besu-api/access-logs.md), configure the load balancer in sticky mode to associate the subscription with a specific node. + +## Recover from dropped subscriptions + +Dropped subscriptions can occur because of: + +- A disconnected WebSockets connection +- The removal of the node serving the subscription from the ready pool. + +If there is a dropped subscription, missed events might occur while reconnecting to a different node. To recover dropped messages, create another subscription and follow the process for that [subscription type](../use-besu-api/rpc-pubsub.md#subscribe): + +- [`newHeads`](#new-headers) +- [`logs`](#logs) +- [`newPendingTransactions`](#new-pending-transactions) +- [`droppedPendingTransactions`](#dropped-pending-transactions) +- [`syncing`](#syncing). + +### New headers + +To request information on blocks from the last block before the subscription dropped to the first block received from the new subscription, use [`eth_getBlockByNumber`](../../reference/api/index.md#eth_getblockbynumber). + +### Logs + +To request logs from the block number of the last log received before the subscription dropped to the current chain head, use [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). + +### New pending transactions + +To request all pending transactions for the new node, use [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). + +:::note + +Nodes do not all store the same pending transactions. + +::: + +### Dropped pending transactions + +To request all pending transactions for the new node, use [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions). + +:::note + +Nodes do not all store the same pending transactions. + +::: + +### Syncing + +The syncing state of each node is specific to that node. To retrieve the syncing state of the new node, use [`eth_syncing`](../../reference/api/index.md#eth_syncing). diff --git a/versioned_docs/version-stable/public-networks/how-to/configure-ha/sample-configuration.md b/versioned_docs/version-stable/public-networks/how-to/configure-ha/sample-configuration.md new file mode 100644 index 00000000000..b018ba2a75b --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/configure-ha/sample-configuration.md @@ -0,0 +1,99 @@ +--- +title: Sample load balancer configurations +sidebar_position: 1 +description: Sample load balancers +tags: + - public networks + - private networks +--- + +# Sample load balancer configurations + +## AWS + +For AWS, we recommend the Classic Load Balancer. The Classic Load Balancer is the easiest to configure and work with. Register the Hyperledger Besu instances to the load balancer and use the [liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) for health checks. + +For finer grain control, use the Application Load Balancer: + +- Configure one target group with n nodes. +- Configure multiple listeners with one per port (for example, `30303`, `8545`) you are using and route to the target group. +- Use the [liveness endpoint](../use-besu-api/json-rpc.md#readiness-and-liveness-endpoints) for health checks. +- Register the Besu instances multiple times with different ports. This is like configuring microservices on Elastic Container Service (ECS) or Elastic Kubernetes Service (EKS). + +### HTTPS redirection + +With either AWS load balancer, you can add certificates using ACM (Amazon Certificate Manager), add them to the load balancers, and redirect all HTTP calls to HTTPS. + +## Elastic Kubernetes Service + +For Elastic Kubernetes Service (AWS Kubernetes service) use the same load balancer configuration as when running nodes in Kubernetes. Use labels to specify nodes for the load balanced group. + +## Manual configurations + +Where applicable, we strongly recommend using service discovery. That is, pair your load balancer configuration with something that dynamically detects new nodes and removed failed nodes. + +For Nginx, use multiple upstreams (one for each port). Pair each upstream with a separate server block. + +```conf title="Upstreams paired with server blocks" +upstream discovery_tcp_30303 { + server 10.0.1.1:30303; + server 10.0.1.2:30303; +} + +upstream rpc_tcp_8545 { + server 10.0.1.1:8545; + server 10.0.1.2:8545; +} + +server { + listen 30303; + server_name some.host; + location / { + proxy_pass http://discovery_tcp_30303; + } +} + +server { + listen 8545; + server_name some.host; + location / { + proxy_pass http://rpc_tcp_8545; + } +} +... +``` + +For HAProxy, create multiple backend and frontend sets. + +```text title="Multiple backend and frontend sets" +frontend discovery-tcp-30303 + bind *:30303 + acl ... + ... + default_backend back-discovery-tcp-30303 + +frontend rpc-tcp-8545 + bind *:8545 + acl ... + ... + default_backend back-rpc-tcp-8545 + +backend back-discovery-tcp-30303 + balance leastconn + server node-01 10.0.1.1:30303 weight 1 check + server node-02 10.0.1.2:30303 weight 1 check + option ... + timeout server 600s + +backend back-rpc-tcp-8545 + balance leastconn + server node-01 10.0.1.1:8545 weight 1 check + server node-02 10.0.1.2:8545 weight 1 check + option .... + timeout server 600s +... +``` + +### HTTPS redirection + +To add HTTPS capability, update the above server blocks to include the certificates and specific ciphers. If you require an HTTP to HTTPS redirection, add separate blocks to return a 301 code with the new URI. diff --git a/versioned_docs/version-stable/public-networks/how-to/configure-jvm/_category_.json b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/_category_.json new file mode 100644 index 00000000000..bb5cfebb77f --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Configure the Java Virtual Machine", + "position": 8 +} diff --git a/versioned_docs/version-stable/public-networks/how-to/configure-jvm/index.md b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/index.md new file mode 100644 index 00000000000..95bf95bfac3 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/index.md @@ -0,0 +1,12 @@ +--- +title: Configure Java and Besu +tags: + - public networks + - private networks +hide: + - feedback +--- + +# Configure the Java Virtual Machine + +This section contains information on configuring Besu and the Java Virtual Machine (JVM). diff --git a/versioned_docs/version-stable/public-networks/how-to/configure-jvm/java-flight-recorder.md b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/java-flight-recorder.md new file mode 100644 index 00000000000..b1cd6e32fcd --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/java-flight-recorder.md @@ -0,0 +1,36 @@ +--- +title: Use Java Flight Recorder +sidebar_position: 3 +description: Using Java Flight Recorder with Hyperledger Besu +tags: + - public networks + - private networks +--- + +# Use Java Flight Recorder + +[Java Flight Recorder (JFR)](https://docs.oracle.com/javacomponents/jmc-5-4/jfr-runtime-guide/about.htm#JFRUH170) is a monitoring tool that collects information about the Java Virtual Machine (JVM) when Hyperledger Besu is running. Use the JFR as a tool to analyze Besu performance. + +## Enable Java Flight Recorder + +To enable JFR, set `BESU_OPTS` to the JFR tags as follows: + +```bash +export BESU_OPTS=-XX:StartFlightRecording=disk=true,delay=15s,dumponexit=true,\ +filename=/tmp/recording.jfr,maxsize=1024m,maxage=1d,\ +settings=profile,path-to-gc-roots=true +``` + +:::tip + +When recording, cleanly exiting Besu results in better data. If not possible to cleanly exit, the file may be missing some information not flushed to disk. + +::: + +Inspect the file written to `/tmp/recording.jfr` with tools such as [Mission Control](https://docs.oracle.com/javacomponents/jmc-5-5/jmc-user-guide/intro.htm#JMCCI109). + +:::danger + +If providing the output file to [ConsenSys Quorum support](https://consensys.net/quorum/support/), be aware that while JFR files don't contain secrets such as private keys, some details about the user configuration can be inferred from the JFR output. + +::: diff --git a/versioned_docs/version-stable/public-networks/how-to/configure-jvm/manage-memory.md b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/manage-memory.md new file mode 100644 index 00000000000..9605ce18cfe --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/manage-memory.md @@ -0,0 +1,74 @@ +--- +title: Manage JVM memory +sidebar_position: 2 +description: Besu memory management +tags: + - public networks + - private networks +--- + +# Manage JVM memory + +You can manage Java Virtual Machine (JVM) memory usage for Besu by modifying the maximum heap size. + +By default, the JVM uses 25% of system RAM. For example, if you have 16 GB RAM installed, the JVM uses 4 GB by default. + +On public networks, we recommend setting the maximum heap size to: + +- 3 GB on an 8 GB RAM system. +- 5 GB on a 16 GB RAM system. +- 8 GB on a system with at least 24 GB RAM. + +:::note + +Setting a higher maximum heap size speeds up the sync period but doesn't have much impact after sync. Thus, we recommend setting it to 8 GB only when you have available RAM. + +::: + +You can set the maximum heap size using the `BESU_OPTS` environment variable and the `-Xmx` option. The following examples set the maximum heap size to 8 GB: + + + +# Exported environment variable example + +Set the variable for the whole shell before running Besu. + +```bash +export BESU_OPTS=-Xmx8g +``` + +# Inline environment variable example + +Set the variable only for the specific Besu command. + +```bash +BESU_OPTS=-Xmx8g besu [Besu options] +``` + +# `.service` file example + +```bash +[Service] +... +Environment="BESU_OPTS=-Xmx8g" +ExecStart=besu [Besu options] +... +``` + + + +## Manage the heap dump + +Heap dump file generation is disabled by default. To enable it, set the `-XX:+HeapDumpOnOutOfMemoryError` Java option. + +```bash +BESU_OPTS="-XX:+HeapDumpOnOutOfMemoryError" +``` + +When heap dump file generation is enabled, and an out-of-memory error occurs, the heap dump file is saved in the Besu runtime directory by default. + +The heap dump file might be large and can saturate your drive. It can be up to the size of the allocated memory. For example, for 8 GB heap memory, the file can be up to 8 GB. Specify the directory where you want the dump to be saved using the `-XX:HeapDumpPath` Java option. + +```bash +BESU_OPTS="-XX:HeapDumpPath=///" +``` diff --git a/versioned_docs/version-stable/public-networks/how-to/configure-jvm/pass-jvm-options.md b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/pass-jvm-options.md new file mode 100644 index 00000000000..39196ef84fb --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/configure-jvm/pass-jvm-options.md @@ -0,0 +1,21 @@ +--- +title: Pass JVM options +sidebar_position: 1 +description: Passing Java virtual machine JVM options to Hyperledger Besu at runtime +tags: + - public networks + - private networks +--- + +# Pass JVM options + +To perform tasks such as attaching a debugger or configuring the garbage collector, pass Java Virtual Machine (JVM) options to Hyperledger Besu. + +Besu passes the contents of the `BESU_OPTS` environment variable to the JVM. Set standard JVM options in the `BESU_OPTS` variable. + +For Bash-based executions, you can set the variable for only the scope of the program execution by setting it before starting Besu. + +```bash +BESU_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \ +besu --network=goerli +``` diff --git a/versioned_docs/version-stable/public-networks/how-to/connect/_category_.json b/versioned_docs/version-stable/public-networks/how-to/connect/_category_.json new file mode 100644 index 00000000000..cce59e7c3f8 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/connect/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Find and connect to peers", + "position": 5 +} diff --git a/versioned_docs/version-stable/public-networks/how-to/connect/configure-ports.md b/versioned_docs/version-stable/public-networks/how-to/connect/configure-ports.md new file mode 100644 index 00000000000..55df8aa0fd8 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/connect/configure-ports.md @@ -0,0 +1,48 @@ +--- +title: Configure ports +sidebar_position: 2 +description: To enable communication you must expose Hyperledger Besu ports appropriately +tags: + - public networks + - private networks +--- + +# Configure ports + +To enable communication you must expose Hyperledger Besu ports appropriately. The following shows an example port configuration for a Besu node on AWS. + +![Port Configuration](../../../assets/images/PortConfiguration.png) + +When running Besu from the [Docker image](../../get-started/install/run-docker-image.md), [expose ports](../../get-started/install/run-docker-image.md#exposing-ports). + +:::tip + +Besu supports [UPnP](specify-nat.md) for home or small office environments where a wireless router or modem provides NAT isolation. + +::: + +## P2P networking + +To enable peer discovery, the P2P UDP port must be open for inbound connections. Specify the P2P port using the [`--p2p-port`](../../reference/cli/options.md#p2p-port) option. The default is `30303`. + +We also recommend opening the P2P TCP port for inbound connections. This is not strictly required because Besu attempts to open outbound TCP connections. But if no nodes on the network are accepting inbound TCP connections, nodes cannot communicate. + +Combine the P2P port with the values for the [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-interface`](../../reference/cli/options.md#p2p-interface) options when specifying the [P2P host](../../reference/cli/options.md#p2p-host) and [P2P network interface](../../reference/cli/options.md#p2p-interface). + +:::info + +By default, peer discovery listens on `0.0.0.0:30303` (all interfaces). If the device Besu is running on must bind to a specific network interface, specify the interface using the [`--p2p-interface`](../../reference/cli/options.md#p2p-interface) option. + +::: + +## JSON-RPC API + +To enable access to the [JSON-RPC API](../use-besu-api/json-rpc.md), open the HTTP JSON-RPC and WebSockets JSON-RPC ports to the intended users of the JSON-RPC API on TCP. + +Specify the HTTP and WebSockets JSON-RPC ports using the [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) and [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port) options. The defaults are `8545` and `8546`. + +## Metrics + +To enable [Prometheus to access Besu](../monitor/metrics.md), open the metrics port or metrics push port to Prometheus or the Prometheus push gateway on TCP. + +Specify the ports for Prometheus and Prometheus push gateway using the [`--metrics-port`](../../reference/cli/options.md#metrics-port) and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. The defaults are `9545` and `9001`. diff --git a/versioned_docs/version-stable/public-networks/how-to/connect/manage-peers.md b/versioned_docs/version-stable/public-networks/how-to/connect/manage-peers.md new file mode 100644 index 00000000000..84e29fe2573 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/connect/manage-peers.md @@ -0,0 +1,88 @@ +--- +title: Manage peers +sidebar_position: 3 +description: Managing Hyperledger Besu peers +tags: + - public networks + - private networks +--- + +# Manage peers + +Hyperledger Besu peer-to-peer (P2P) discovery happens periodically based on the number of peers in a network and the node's [peer limit](#limit-peers). + +The frequency of discovery isn't configurable, but you can [limit remote connections](#limit-remote-connections) in public networks and [randomly prioritize connections](../../reference/cli/options.md#random-peer-priority-enabled) in small, stable networks. + +:::info + +You can use [`admin_addPeer`](../../reference/cli/options.md#admin_addpeer) to attempt a specific connection, but this isn't P2P discovery. + +::: + +In private networks, we recommend [using bootnodes](../../../private-networks/how-to/configure/bootnodes.md) to initially discover peers. + +## Limit peers + +You can limit peers to reduce the bandwidth, CPU time, and disk access Besu uses to manage and respond to peers. + +To reduce the maximum number of peers, use the [`--max-peers`](../../reference/cli/options.md#max-peers) option. The default is 25. + +:::caution + +The minimum number of peers is set by the `--Xp2p-peer-lower-bound` option, which also has a default of 25. If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` option to the same value or lower. For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. + +Note, `Xp2p-peer-lower-bound` is an early access option. + +::: + +## Limit remote connections + +Prevent eclipse attacks when using [`--sync-mode`](../../reference/cli/options.md#sync-mode) and [`--fast-sync-min-peers`](../../reference/cli/options.md#fast-sync-min-peers) on public networks by enabling the [remote connection limits](../../reference/cli/options.md#remote-connections-limit-enabled). + +In private and permissioned networks with only trusted peers, enabling the remote connection limits is unnecessary and might adversely affect the speed at which nodes can join the network. Limiting remote connections can cause a closed group of peers to form when the number of nodes in the network is slightly higher than [`--max-peers`](../../reference/cli/options.md#max-peers). The nodes in this closed group are all connected to each other and can't accept more connections. + +:::tip + +You can use [`--random-peer-priority-enabled`](../../reference/cli/options.md#random-peer-priority-enabled) to help prevent closed groups of peers in small, stable networks. + +::: + +## Monitor peer connections + +JSON-RPC API methods to monitor peer connections include: + +- [`net_peerCount`](../../reference/api/index.md#net_peercount). +- [`admin_peers`](../../reference/api/index.md#admin_peers). +- [`debug_metrics`](../../reference/api/index.md#debug_metrics). + +Each peer entry returned by [`admin_peers`](../../reference/api/index.md#admin_peers) includes a `protocols` section. Use the information in the `protocols` section to: + +- Determine the health of peers. For example, an external process can use [`admin_peers`](../../reference/api/index.md#admin_peers) and [`admin_removePeer`](../../reference/api/index.md#admin_removepeer) to disconnect from peers that are stalled at a single difficulty for an extended period of time. + +- Monitor node health. For example, if peers report increasing difficulties but the node is stuck at the same block number, the node may be on a different fork to most peers. + +- Determine which protocol level peers are communicating with. For example, you can see if `"version": 65` is being used to reduce transaction sharing traffic. + +## List node connections + +The default logging configuration doesn't list node connection and disconnection messages. To enable listing them, set the [`--logging`](../../reference/cli/options.md#logging) option to `DEBUG`. For more verbosity, set the option to `TRACE`. + +The console logs connection and disconnection events when the log level is `DEBUG` or higher. If the message `Successfully accepted connection from ...` displays, connections are getting through the firewalls. + +```bash title="Sample log output" +2018-10-16 12:37:35.479-04:00 | nioEventLoopGroup-3-1 | INFO | NettyP2PNetwork | Successfully accepted connection from 0xa979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c +``` + +## Disable discovery + +To disable P2P discovery, set the [`--discovery-enabled`](../../reference/cli/options.md#discovery-enabled) option to `false`. + +With discovery disabled, peers can't open connections with the node unless they were previously discovered or manually peered (for example, using [`admin_addPeer`](../../reference/api/index.md#admin_addpeer)). [Static nodes](static-nodes.md) can also open connections. + +## Troubleshoot + +If your nodes fail to connect, ensure the [required ports are open](configure-ports.md). + +If your nodes are running in AWS, check you have appropriate `SecurityGroups` to allow access to the required ports. + +Check that the [enode URLs](../../concepts/node-keys.md#enode-url) specified for [bootnodes](../../../private-networks/how-to/configure/bootnodes.md) or [static nodes](static-nodes.md) match the enode URLs displayed when starting the remote nodes. diff --git a/versioned_docs/version-stable/public-networks/how-to/connect/specify-nat.md b/versioned_docs/version-stable/public-networks/how-to/connect/specify-nat.md new file mode 100644 index 00000000000..6438ab2fc13 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/connect/specify-nat.md @@ -0,0 +1,93 @@ +--- +title: Specify NAT method +sidebar_position: 4 +description: Configuring NAT with Hyperledger Besu +tags: + - public networks + - private networks +--- + +# Specify the NAT method + +Use the [`--nat-method`](../../reference/cli/options.md#nat-method) option to specify the NAT method. Options are: [`UPNP`](#upnp), [`KUBERNETES`](#kubernetes), [`DOCKER`](#docker), [`AUTO`](#auto), and [`NONE`](#none). + +The [enode](../../concepts/node-keys.md#enode-url) advertised to other nodes during discovery is the external IP address and port. The [`admin_nodeInfo`](../../reference/api/index.md#admin_nodeinfo) JSON-RPC API method returns the external address and port for the `enode` and `listenAddr` properties. + +While Hyperledger Besu is running, the following are not supported: + +- IP address changes +- Changing NAT methods. To change the NAT method, restart the node with the [`--nat-method`](../../reference/cli/options.md#nat-method) option set. + +## Auto + +`AUTO` detects if Besu is running inside a Kubernetes cluster or a Docker container. + +- If Besu is running in a Kubernetes cluster, `AUTO` sets to [`KUBERNETES`](#kubernetes). +- If Besu is running in a Docker container, `AUTO` sets to [`DOCKER`](#docker). +- If Besu is not running in Kubernetes or Docker container, `AUTO` sets to [`NONE`](#none). + +`AUTO` is the default NAT method. + +The following log shows an automatic detection failure. + +```log title="The following log shows an automatic detection failure" +INFO | KubernetesNatManager | Starting kubernetes NAT manager. +DEBUG | KubernetesNatManager | Trying to update information using Kubernetes client SDK. +DEBUG | NatService | Nat manager failed to configure itself automatically due to the following reason Service not found. NONE mode will be used +INFO | NetworkRunner | Starting Network. +``` + +:::tip + +If automatic detection fails, set the IP and ports in [`NONE`](#none) mode. + +::: + +## UPnP + +Specify `UPNP` to quickly allow inbound peer connections without manual router configuration. Use UPnP in home or small office environments where a wireless router or modem provides NAT isolation. + +UPnP automatically detects if a node is running in a UPnP environment and provides port forwarding. UPnP might introduce delays during node startup, especially on networks without a UPnP gateway device. + +Use `UPNPP2PONLY` if you wish to enable UPnP only for p2p traffic. + +:::tip + +UPnP support is often disabled by default in networking firmware. If disabled by default, you must explicitly enable UPnP support. + +::: + +:::info + +When the NAT method is set to `UPNP`, the advertised port is the same as the [listening port](../../reference/cli/options.md#p2p-port). + +::: + +## Kubernetes + +Specify `KUBERNETES` to explicitly specify Hyperledger Besu is running inside a Kubernetes cluster. Besu automatically detects if it's running inside of a Kubernetes cluster and interacts with Kubernetes APIs as required to determine external IP addresses and exposed ports. + +In Kubernetes, the Ingress IP of the load balancer will be used as the external IP for Besu. A load balancer service can map any incoming port to a target port. These mapping rules will be the one retrieved by Besu. + +A tutorial to [Configure the Nat Manager for Kubernetes](../../../private-networks/tutorials/kubernetes/nat-manager.md) is available. + +## Docker + +Specify `DOCKER` to explicitly specify Hyperledger Besu is running inside a Docker container. If you specify `DOCKER`, you advertise the host IP address not the container IP address. + +The host IP address is the advertised host specified in the [`docker run` command](https://docs.docker.com/engine/reference/commandline/run/#add-entries-to-container-hosts-file---add-host). If not specified in the `docker run` command, the advertised host defaults to the values for [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-port`](../../reference/cli/options.md#p2p-port). + +## None + +Specify `NONE` to explicitly configure the external IP address and ports advertised using: + +- [`--p2p-host`](../../reference/cli/options.md#p2p-host) and [`--p2p-port`](../../reference/cli/options.md#p2p-port) for the P2P service. +- [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host) and [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port) for the JSON-RPC HTTP service. + +The P2P and JSON-RPC HTTP hosts and ports are advertised in the [`net_services`](../../reference/api/index.md#net_services) method. + +:::tip + +When the NAT method is set to `NONE`, the advertised port is the same as the [listening port](../../reference/cli/options.md#p2p-port). + +::: diff --git a/versioned_docs/version-stable/public-networks/how-to/connect/static-nodes.md b/versioned_docs/version-stable/public-networks/how-to/connect/static-nodes.md new file mode 100644 index 00000000000..aa0eb09641f --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/connect/static-nodes.md @@ -0,0 +1,65 @@ +--- +title: Configure static nodes +sidebar_position: 1 +description: Configuring static nodes +tags: + - public networks + - private networks +--- + +# Static nodes + +Static nodes are a configured set of trusted nodes. Static nodes are exempt from [maximum peer](manage-peers.md#limit-peers) and [remote connection](manage-peers.md#limit-remote-connections) limits. + +Besu attempts to maintain connections with static nodes by periodically initiating a connection to any unconnected static node. + +:::tip + +Bootnodes and static nodes are parallel methods for finding peers. Depending on your use case, you can use only bootnodes, only static nodes, or both bootnodes and static nodes. For example, you run multiple nodes on Mainnet (discovery using bootnodes), but want to ensure your nodes are always connected (using static nodes). + +To find peers, configure one or more [bootnodes](../../../private-networks/how-to/configure/bootnodes.md). To configure a specific set of peer connections, use static nodes. + +::: + +## Configure static nodes + +To configure a network of static nodes: + +1. List the [enode URLs](../../concepts/node-keys.md#enode-url) of the nodes in the [`static-nodes.json` file](#static-nodesjson-file). + +1. Save the `static-nodes.json` file in the data directory (specified by [`--data-path`](../../reference/cli/options.md#data-path)) of each node. Alternatively, you can explicitly specify the static nodes file on the command line using [`--static-nodes-file`](../../reference/cli/options.md#static-nodes-file). + +1. Start Besu with discovery disabled using [`--discovery-enabled=false`](../../reference/cli/options.md#discovery-enabled). + +To update the list of static peers at run time, use the [`admin_addPeer`](../../reference/api/index.md#admin_addpeer) and [`admin_removePeer`](../../reference/api/index.md#admin_removepeer) JSON-RPC API methods. + +:::note + +Runtime modifications of static nodes are not persisted between runs. The `static-nodes.json` file is not updated by the `admin_addPeer` and `admin_removePeer` methods. + +Nodes not in the list of the static nodes are not prevented from connecting. To prevent nodes from connecting, use [Permissioning](../../../private-networks/concepts/permissioning/index.md). + +::: + +:::tip + +If the added peer does not appear in the peer list (returned by [`admin_peers`](../../reference/api/index.md#admin_peers)), check the the supplied [enode URL](../../concepts/node-keys.md#enode-url) is correct, the node is running, and the node is listening for TCP connections on the endpoint. + +::: + +### `static-nodes.json` file + +The `static-nodes.json` file must be in the data directory (specified by [`--data-path`](../../reference/cli/options.md#data-path)) and contain a JSON array of [enode URLs](../../concepts/node-keys.md#enode-url). + +```json title="Example" +[ + "enode://cea71cb65a471037e01508cebcc178f176f9d5267bf29507ea1f6431eb6a5dc67d086dc8dc54358a72299dab1161febc5d7af49d1609c69b42b5e54544145d4f@127.0.0.1:30303", + "enode://ca05e940488614402705a6b6836288ea902169ecc67a89e1bd5ef94bc0d1933f20be16bc881ffb4be59f521afa8718fc26eec2b0e90f2cd0f44f99bc8103e60f@127.0.0.1:30304" +] +``` + +:::note + +Each node has a `static-nodes.json` file. We recommend each node in the network has the same `static-nodes.json` file. + +::: diff --git a/versioned_docs/version-stable/public-networks/how-to/develop/_category_.json b/versioned_docs/version-stable/public-networks/how-to/develop/_category_.json new file mode 100644 index 00000000000..8c8a280b930 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/develop/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Develop dapps", + "position": 9 +} diff --git a/versioned_docs/version-stable/public-networks/how-to/develop/client-libraries.md b/versioned_docs/version-stable/public-networks/how-to/develop/client-libraries.md new file mode 100644 index 00000000000..009e82d8d35 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/develop/client-libraries.md @@ -0,0 +1,31 @@ +--- +title: Use client libraries +sidebar_position: 2 +description: Hyperledger Besu client libraries +tags: + - public networks + - private networks +--- + +# Use client libraries + +Dapps use client libraries, such as [web3.js](https://github.com/ethereum/web3.js/), [web3j](https://github.com/web3j/web3j), or [ethereumj](https://github.com/ethereum/ethereumj), to forward JSON-RPC requests to Hyperledger Besu. Any client library implementing core Ethereum RPC methods works with Besu. + +Use the [web3js-quorum library](../../../private-networks/how-to/use-privacy/web3js-quorum.md) with Besu for [privacy features](../../../private-networks/concepts/privacy/index.md). + +![Client Libraries](../../../assets/images/Hyperledger-Besu-Client-Libraries.png) + +Use client libraries to: + +- Create signed transactions +- [Create and send private transactions]. + +:::note + +[Hyperledger Besu does not support key management inside the client](../send-transactions.md#use-wallets-for-key-management). + +::: + + + +[Create and send private transactions]: ../../../private-networks/how-to/send-transactions/private-transactions.md diff --git a/versioned_docs/version-stable/public-networks/how-to/develop/truffle.md b/versioned_docs/version-stable/public-networks/how-to/develop/truffle.md new file mode 100644 index 00000000000..a97d5d4620a --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/develop/truffle.md @@ -0,0 +1,65 @@ +--- +title: Use Truffle +sidebar_position: 1 +description: Using Hyperledger Besu with Truffle +tags: + - public networks + - private networks +--- + +# Use Truffle + +Developing for Hyperledger Besu using Truffle is the same as developing for public Ethereum networks using Truffle. Truffle supports Besu with the only difference being Besu does not support private key management. To use Besu with Truffle, you must configure a Truffle wallet. + +## Install a Truffle wallet + +To install a Truffle wallet: + +```bash +npm install --save @truffle/hdwallet-provider +``` + +:::note + +With Truffle 5, you must use a Web3 1.0 enabled wallet or the Truffle tasks hang. + +::: + +### Update the Truffle configuration file + +To add the wallet provider, update the `truffle-config.js` file in the project directory. Replace: + +- `` with the JSON-RPC endpoint (IP address and port) of a Besu node. +- `` with the private key of an Ethereum account containing Ether. + +```javascript +const PrivateKeyProvider = require("@truffle/hdwallet-provider"); +const privateKey = ""; +const privateKeyProvider = new PrivateKeyProvider( + privateKey, + "", +); + +module.exports = { + // See + // for more about customizing your Truffle configuration! + networks: { + besuWallet: { + provider: privateKeyProvider, + network_id: "*", + }, + }, +}; +``` + +### Start a Besu node + +Start a Besu node with JSON-RPC enabled on the endpoint specified in the Truffle configuration file. + +### Deploy a contract + +To deploy a contract onto the Besu network: + +```bash +truffle migrate --network besuWallet +``` diff --git a/versioned_docs/version-stable/public-networks/how-to/monitor/_category_.json b/versioned_docs/version-stable/public-networks/how-to/monitor/_category_.json new file mode 100644 index 00000000000..9be56b91890 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/monitor/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Monitor nodes", + "position": 6 +} diff --git a/versioned_docs/version-stable/public-networks/how-to/monitor/index.md b/versioned_docs/version-stable/public-networks/how-to/monitor/index.md new file mode 100644 index 00000000000..c2c49d0e9fd --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/monitor/index.md @@ -0,0 +1,15 @@ +--- +description: Monitoring using metrics and logging +tags: + - public networks + - private networks +--- + +# Monitor Besu + +Monitoring enables identification of node and network issues. Specifically, configuring metrics and logging enables: + +- [Visual representation of declining node or network performance](metrics.md) +- [Collection of log files to enable issue diagnosis](logging.md). + +For an overview of monitoring Hyperledger Besu, view [this recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be). diff --git a/versioned_docs/version-stable/public-networks/how-to/monitor/logging.md b/versioned_docs/version-stable/public-networks/how-to/monitor/logging.md new file mode 100644 index 00000000000..c994d6388c6 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/monitor/logging.md @@ -0,0 +1,77 @@ +--- +title: Configure logging +sidebar_position: 3 +description: Hyperledger Besu log level setting and log formatting +path: blob/master/besu/src/main/resources/ +source: log4j2.xml +tags: + - public networks + - private networks +--- + +# Use logging + +Hyperledger Besu uses Log4J2 for logging and provides two methods to configure logging behavior: + +- [Basic](#basic-logging) - Changes the log level. +- [Advanced](#advanced-logging) - Configures the output and format of the logs. + +[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) provides an [example implementation using Elastic Stack](../../../private-networks/how-to/monitor/elastic-stack.md) for log management. + +## Basic logging + +Use the [`--logging`](../../reference/cli/options.md#logging) command line option to specify logging verbosity. The [`--logging`](../../reference/cli/options.md#logging) option changes the volume of events displayed in the log. Valid log levels are `OFF`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. The default level is `INFO`. + +For most use cases, the basic method provides enough configurability. + +:::tip + +Use the [`admin_changeLogLevel`](../../reference/api/index.md#admin_changeloglevel) API method to change the log level while Besu is running. + +::: + +## Advanced logging + +You can provide your own logging configuration using the standard Log4J2 configuration mechanisms. For example, the following Log4J2 configuration is the same as the [default configuration] except for the exclusion of logging of stack traces for exceptions. + +```xml title="debug.xml" + + + + INFO + + + + + + + + + + + + + +``` + +To use your custom configuration, set the environment variable `LOG4J_CONFIGURATION_FILE` to the location of your configuration file. + +If you have more specific requirements, you can create your own [log4j2 configuration](https://logging.apache.org/log4j/2.x/manual/configuration.html). + +For Bash-based executions, you can set the variable for only the scope of the program execution by setting it before starting Besu. + +To set the debug logging and start Besu connected to the Goerli testnet: + +```bash +LOG4J_CONFIGURATION_FILE=./debug.xml besu --network=goerli +``` + +### Log rotation + +[Quorum Developer Quickstart](https://github.com/ConsenSys/quorum-dev-quickstart) logging configuration defines a [log rotation to restrict the size of the log files]. + + + +[default configuration]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/besu/src/main/resources/log4j2.xml +[log rotation to restrict the size of the log files]: https://github.com/ConsenSys/quorum-dev-quickstart/blob/b72a0f64d685c851bf8be399a8e33bbdf0e09982/files/besu/config/besu/log-config.xml +[default configuration]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/besu/src/main/resources/log4j2.xml diff --git a/versioned_docs/version-stable/public-networks/how-to/monitor/metrics.md b/versioned_docs/version-stable/public-networks/how-to/monitor/metrics.md new file mode 100644 index 00000000000..e76b90abbc2 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/monitor/metrics.md @@ -0,0 +1,297 @@ +--- +title: Use metrics +sidebar_position: 1 +description: Monitoring and metrics +tags: + - public networks + - private networks +--- + +# Use metrics to monitor node performance + +To enable the [Prometheus](https://prometheus.io/) monitoring and alerting service to access Hyperledger Besu metrics, use the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. Use [Grafana](https://grafana.com/) to visualize the collected data. See the sample [Besu Full Grafana dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). + +The Besu example networks have [monitoring with Prometheus and Grafana configured]. + +Use Prometheus to monitor the number of blocks your Besu node is behind the chain head, and to alert you that your node is not keeping up with the chain head. + +[This recording](https://www.youtube.com/watch?v=7BuutRe0I28&feature=youtu.be) shows examples of monitoring Hyperledger Besu. + +## Install Prometheus + +To use Prometheus with Besu, install the [Prometheus main component](https://prometheus.io/download/). On MacOS, install with [Homebrew](https://formulae.brew.sh/formula/prometheus): + +```bash +brew install prometheus +``` + +:::tip + +You can also install: + +- Exporters that send system metrics to Prometheus to monitor non-Besu-specific items such as disk and CPU usage. +- Other Prometheus components, such as the Alert Manager. Additional configuration is not required for these components because Prometheus handles and analyzes data directly from the feed. + +::: + +## Set up and run Prometheus with Besu + +To configure Prometheus and run with Besu: + +1. Configure Prometheus to poll Besu. For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: + + + + # Fragment to insert in prometheus.yml + + ```yml + - job_name: besu + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9545 + ``` + + # Full prometheus.yml example + + ```yml + global: + scrape_interval: 15s + + scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: besu + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9545 + ``` + + + + Prometheus requires 3 MB of space per node per hour for metrics, with a `scrape_interval` of 15 seconds. + +2. Start Besu with the [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option. To start a single node for testing with metrics enabled, run the following command: + + + + # Syntax + + ```bash + besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled + ``` + + # Example + + ```bash + besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-enabled + ``` + + + + To specify the host and port on which Prometheus accesses Besu, use the [`--metrics-host`](../../reference/cli/options.md#metrics-host) and [`--metrics-port`](../../reference/cli/options.md#metrics-port) options. The default host and port are 127.0.0.1 (`localhost`) and 9545. + + :::danger + + To avoid DNS rebinding attacks, if running Prometheus on a different host than your Besu node (any host other than `localhost`), add the hostname that Prometheus uses to [`--host-allowlist`](../../reference/cli/options.md#host-allowlist). + + For example, if Prometheus is configured to get metrics from `http://besu.local:8008/metrics`, then `besu.local` has to be in `--host-allowlist`. + + ::: + +3. In another terminal, run Prometheus specifying the `prometheus.yml` file: + + ```bash + prometheus --config.file=prometheus.yml + ``` + +4. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). + + :::tip + + Use a log ingestion tool, such as Logstash, to parse the logs and alert you to configured anomalies. + + ::: + +## Run Prometheus with Besu in push mode + +The [`--metrics-enabled`](../../reference/cli/options.md#metrics-enabled) option enables Prometheus polling of Besu, but sometimes metrics are hard to poll (for example, when running inside Docker containers with varying IP addresses). To enable Besu to push metrics to a [Prometheus push gateway](https://github.com/prometheus/pushgateway), use the [`--metrics-push-enabled`](../../reference/cli/options.md#metrics-push-enabled) option. + +To configure Prometheus and run with Besu pushing to a push gateway: + +1. Configure Prometheus to read from a push gateway. For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: + + ```yml + - job_name: push-gateway + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost:9091 + ``` + +1. Start the push gateway. You can deploy the push gateway using the Docker image: + + ```bash + docker pull prom/pushgateway + docker run -d -p 9091:9091 prom/pushgateway + ``` + +1. Start Besu specifying the `--metrics-push-enabled` option and port of the push gateway: + + + + # Syntax + + ```bash + besu --network=dev --miner-enabled --miner-coinbase --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 + ``` + + # Example + + ```bash + besu --network=dev --miner-enabled --miner-coinbase fe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --rpc-http-enabled --metrics-push-enabled --metrics-push-port=9091 --metrics-push-host=127.0.0.1 + ``` + + + +1. In another terminal, run Prometheus specifying the `prometheus.yml` file: + + ```bash + prometheus --config.file=prometheus.yml + ``` + +1. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). + +## View Prometheus graphical interface + +1. Open a Web browser to [`http://localhost:9090`](http://localhost:9090) to view the Prometheus graphical interface. + +1. Choose **Graph** from the menu bar and click the **Console** tab below. + +1. From the **Insert metric at cursor** drop-down, select a [metric](#metrics-list) such as `besu_blockchain_difficulty_total` or `ethereum_blockchain_height` and click **Execute**. The values display. + +1. Click the **Graph** tab to view the data as a time-based graph. The query string displays below the graph. For example, `{ethereum_blockchain_height{instance="localhost:9545",job="prometheus"}`. + +## Metrics list + +The following table lists available metrics. Each metric starts with a metric category prefix. Metrics specific to Besu use the `besu_` prefix, followed by another metric category. Metric categories can be enabled using the [`metrics-category`](../../reference/cli/options.md#metrics-category) command line option. If a metric has a JSON-RPC equivalent, it is included in the definition column. + +| Name | Metric type | Definition | +| --- | --- | --- | +| `besu_blockchain_chain_head_gas_limit` | Gauge | Block gas limit of the current chain head block | +| `besu_blockchain_chain_head_gas_used` | Gauge | Gas used by the current chain head block | +| `besu_blockchain_chain_head_ommer_count` | Gauge | Number of uncles in the current chain head block (JSON-RPC equivalent: [`eth_getUncleCountByBlockHash`](../../reference/api/index.md#eth_getunclecountbyblockhash) or [`eth_getUncleCountByBlockNumber`](../../reference/api/index.md#eth_getunclecountbyblocknumber)) | +| `besu_blockchain_chain_head_timestamp` | Gauge | Timestamp from the current chain head | +| `besu_blockchain_chain_head_transaction_count` | Gauge | Number of transactions in the current chain head block (JSON-RPC equivalent: [`eth_getBlockTransactionCountByHash`](../../reference/api/index.md#eth_getblocktransactioncountbyhash) or [`eth_getBlockTransactionCountByNumber`](../../reference/api/index.md#eth_getblocktransactioncountbynumber)) | +| `besu_blockchain_difficulty_total` | Gauge | Difficulty of the chain head (JSON-RPC equivalent: `difficulty` of [`admin_peers`](../../reference/api/index.md#admin_peers)) | +| `besu_executors_ethscheduler_computation_active_threads_current` | Gauge | Current number of threads executing computation tasks | +| `besu_executors_ethscheduler_computation_completed_tasks_total` | Gauge | Total number of computation tasks executed | +| `besu_executors_ethscheduler_computation_pool_size_current` | Gauge | Current number of threads in the computation thread pool | +| `besu_executors_ethscheduler_computation_queue_length_current` | Gauge | Current number of computation tasks awaiting execution | +| `besu_executors_ethscheduler_computation_rejected_tasks_total` | Counter | Total number of tasks rejected by this computation executor | +| `besu_executors_ethscheduler_computation_submitted_tasks_total` | Gauge | Total number of computation tasks submitted | +| `besu_executors_ethscheduler_timer_active_threads_current` | Gauge | Current number of threads executing timer tasks | +| `besu_executors_ethscheduler_timer_completed_tasks_total` | Gauge | Total number of timer tasks executed | +| `besu_executors_ethscheduler_timer_pool_size_current` | Gauge | Current number of threads in the timer thread pool | +| `besu_executors_ethscheduler_timer_queue_length_current` | Gauge | Current number of timer tasks awaiting execution | +| `besu_executors_ethscheduler_timer_rejected_tasks_total` | Counter | Total number of tasks rejected by this timer executor | +| `besu_executors_ethscheduler_timer_submitted_tasks_total` | Gauge | Total number of timer tasks submitted | +| `besu_executors_ethscheduler_workers_active_threads_current` | Gauge | Current number of threads executing worker tasks | +| `besu_executors_ethscheduler_workers_completed_tasks_total` | Gauge | Total number of worker tasks executed | +| `besu_executors_ethscheduler_workers_pool_size_current` | Gauge | Current number of threads in the worker thread pool | +| `besu_executors_ethscheduler_workers_queue_length_current` | Gauge | Current number of worker tasks awaiting execution | +| `besu_executors_ethscheduler_workers_rejected_tasks_total` | Counter | Total number of tasks rejected by this worker executor | +| `besu_executors_ethscheduler_workers_submitted_tasks_total` | Gauge | Total number of worker tasks submitted | +| `besu_network_discovery_inflight_interactions_current` | Gauge | Current number of inflight discovery interactions | +| `besu_network_discovery_interaction_count` | Counter | Total number of discovery interactions initiated | +| `besu_network_discovery_interaction_retry_count` | Counter | Total number of interaction retries performed | +| `besu_network_discovery_messages_inbound` | Counter | Total number of P2P discovery messages received | +| `besu_network_discovery_messages_outbound` | Counter | Total number of P2P discovery messages sent | +| `besu_network_netty_boss_pending_tasks` | Gauge | Number of pending tasks in Netty boss event loop | +| `besu_network_netty_workers_pending_tasks` | Gauge | Number of pending tasks in Netty workers event loop | +| `besu_network_p2p_messages_inbound` | Counter | Total number of P2P messages received | +| `besu_network_vertx_eventloop_pending_tasks` | Gauge | Number of pending tasks in Vertx event loop | +| `besu_network_vertx_worker_pool_completed_total` | Counter | Total number of tasks completed by Vertx worker pool | +| `besu_network_vertx_worker_pool_rejected_total` | Counter | Total number of tasks rejected by Vertx worker pool | +| `besu_network_vertx_worker_pool_submitted_total` | Counter | Total number of tasks submitted to Vertx worker pool | +| `besu_peers_connected_total` | Counter | Total number of peers connected | +| `besu_peers_disconnected_total` | Counter | Total number of peers disconnected | +| `besu_peers_pending_peer_requests_current` | Gauge | Current number of peer requests pending because peers are busy | +| `besu_pruner_mark_time_duration` | Gauge | Cumulative number of seconds spent marking the state trie across all pruning cycles | +| `besu_pruner_mark_operations_total` | Counter | Total number of mark operations performed | +| `besu_pruner_marked_nodes_total` | Counter | Total number of nodes marked as in use | +| `besu_pruner_sweep_operations_total` | Counter | Total number of sweep operations performed | +| `besu_pruner_swept_nodes_total` | Counter | Total number of unused nodes removed | +| `besu_stratum_connections` | Counter | Number of connections over time | +| `besu_stratum_difficulty` | Gauge | Current mining difficulty | +| `besu_stratum_disconnections` | Counter | Number of disconnections over time | +| `besu_stratum_miners` | Gauge | Number of connected miners | +| `besu_synchronizer_chain_download_pipeline_processed_total` | Counter | Number of entries processed by each chain download pipeline stage | +| `besu_synchronizer_chain_download_pipeline_restarts` | Counter | Number of times chain download pipeline has been restarted | +| `besu_synchronizer_fast_sync_pivot_block_current` | Gauge | The current fast sync pivot block | +| `besu_synchronizer_fast_sync_pivot_block_selected_count` | Counter | Number of times a fast sync pivot block has been selected | +| `besu_synchronizer_fast_sync_validation_mode` | Counter | Number of blocks validated using light vs full validation during fast sync | +| `besu_synchronizer_in_sync` | Gauge | Whether or not the local node has caught up to the best known peer (1 or 0) | +| `besu_synchronizer_task` | Summary | Internal processing tasks | +| `besu_synchronizer_world_state_completed_requests_total` | Counter | Total number of node data requests completed as part of fast sync world state download | +| `besu_synchronizer_world_state_existing_nodes_total` | Counter | Total number of node data requests completed using existing data | +| `besu_synchronizer_world_state_inflight_requests_current` | Gauge | Number of in progress requests for world state data | +| `besu_synchronizer_world_state_node_requests_since_last_progress_current` | Gauge | Number of world state requests made since the last time new data was returned | +| `besu_synchronizer_world_state_pending_requests_cache_size` | Gauge | Pending request cache size for fast sync world state download | +| `besu_synchronizer_world_state_pending_requests_current` | Gauge | Number of pending requests for fast sync world state download | +| `besu_synchronizer_world_state_pipeline_processed_total` | Counter | Number of entries processed by each world state download pipeline stage | +| `besu_synchronizer_world_state_retried_requests_total` | Counter | Total number of node data requests repeated as part of fast sync world state download | +| `besu_transaction_pool_pending_transactions_messages_skipped_total` | Counter | Total number of pending transactions messages skipped by the processor | +| `besu_transaction_pool_transactions` | Gauge | Current size of the transaction pool (JSON-RPC equivalent: result number of [`txpool_besuTransactions`](../../reference/api/index.md#txpool_besutransactions)) | +| `besu_transaction_pool_transactions_added_total` | Counter | Count of transactions added to the transaction pool | +| `besu_transaction_pool_transactions_messages_skipped_total` | Counter | Total number of transactions messages skipped by the processor. | +| `ethereum_best_known_block_number` | Gauge | Estimated highest block available (JSON-RPC equivalent: `highestBlock` of [`eth_syncing`](../../reference/api/index.md#eth_syncing), or [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) if not syncing) | +| `ethereum_blockchain_height` | Gauge | Current height of the canonical chain (JSON-RPC equivalent: [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber)) | +| `ethereum_peer_count` | Gauge | Current number of peers connected (JSON-RPC equivalent: [`net_peerCount`](../../reference/api/index.md#net_peercount)) | +| `ethereum_peer_limit` | Gauge | Maximum number of peers this node allows to connect | +| `jvm_buffer_pool_capacity_bytes` | Gauge | Bytes capacity of a given JVM buffer pool | +| `jvm_buffer_pool_used_buffers` | Gauge | Used buffers of a given JVM buffer pool | +| `jvm_buffer_pool_used_bytes` | Gauge | Used bytes of a given JVM buffer pool | +| `jvm_classes_loaded` | Gauge | Current number of classes loaded in the JVM | +| `jvm_classes_loaded_total` | Counter | Total number of classes loaded since the JVM started execution | +| `jvm_classes_unloaded_total` | Counter | Total number of classes unloaded since the JVM started execution | +| `jvm_gc_collection_seconds` | Summary | Seconds spent in a given JVM garbage collector | +| `jvm_memory_bytes_committed` | Gauge | Committed bytes of a given JVM memory area | +| `jvm_memory_bytes_init` | Gauge | Initial bytes of a given JVM memory area | +| `jvm_memory_bytes_max` | Gauge | Maximum bytes of a given JVM memory area | +| `jvm_memory_bytes_used` | Gauge | Used bytes of a given JVM memory area | +| `jvm_memory_pool_bytes_committed` | Gauge | Committed bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_init` | Gauge | Initial bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_max` | Gauge | Maximum bytes of a given JVM memory pool | +| `jvm_memory_pool_bytes_used` | Gauge | Used bytes of a given JVM memory pool | +| `jvm_threads_current` | Gauge | Current thread count of a JVM | +| `jvm_threads_daemon` | Gauge | Daemon thread count of a JVM | +| `jvm_threads_deadlocked` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors or ownable synchronizers | +| `jvm_threads_deadlocked_monitor` | Gauge | Cycles of JVM threads in deadlock waiting to acquire object monitors | +| `jvm_threads_peak` | Gauge | Peak thread count of a JVM | +| `jvm_threads_started_total` | Counter | Started thread count of a JVM | +| `jvm_threads_state` | Gauge | Current count of threads by state | +| `process_cpu_seconds_total` | Counter | Total user and system CPU time spent in seconds | +| `process_max_fds` | Gauge | Maximum number of open file descriptors | +| `process_open_fds` | Gauge | Number of open file descriptors | +| `process_start_time_seconds` | Gauge | Start time of the process since Unix epoch in seconds | + +:::info + +- The `ethereum_best_known_block_number` metric always has a value. When the [`eth_syncing` JSON-RPC method](../../reference/api/index.md#eth_syncing) returns false, the current chain height displays. +- Although the `ethereum_peer_limit` metric does not have a JSON-RPC equivalent, the [`max peers` command line option](../../reference/cli/options.md#max-peers) sets the maximum number of P2P connections that can be established. + +::: + + + +[monitoring with Prometheus and Grafana configured]: ../../../private-networks/tutorials/quickstart.md#monitor-nodes-with-prometheus-and-grafana diff --git a/versioned_docs/version-stable/public-networks/how-to/monitor/understand-metrics.md b/versioned_docs/version-stable/public-networks/how-to/monitor/understand-metrics.md new file mode 100644 index 00000000000..863798555be --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/monitor/understand-metrics.md @@ -0,0 +1,101 @@ +--- +title: Understand metrics +sidebar_position: 2 +description: Understand Besu performance metrics +tags: + - public networks +--- + +# Understand metrics + +When running Besu on Ethereum Mainnet using [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), you might notice graphical patterns that stand out in different metrics charts. These patterns are related to the [CPU usage](#cpu-usage) and [block time](#block-time) of the Besu sync process. + +## CPU usage + +The following screenshot from [monitoring Besu with Prometheus and Grafana] shows patterns related to CPU usage. + +![CPU Grafana Besu dashboard patterns screenshot](../../../assets/images/besu-cpu-pattern-during-sync.png) + +The CPU pattern is a "staircase" pattern, where each step represents one of the Besu running stages. + +### 1. Blocks import and world state download + +Step 1 highlights blocks import and world state download, two tasks executed in parallel in Besu. Besu manages these two tasks with two different pipelines. + +This step is CPU-bound.[^1] The two pipeline stages run on multiple threads. + +As displayed in the following screenshot (for a VM with 8 CPUs) the CPU load average is about 7.5 and sometimes exceeds 10 (a 100% load for the 8 CPUs is 8). This means there's more work to be done than what the CPUs can handle. + +![System load metrics screenshot](../../../assets/images/system-load.png) + +### 2. World state healing + +Step 2, world state healing, starts just after the world state download in step 1 is complete. The peak in system CPU is related to the high rate of input and output (IO) required during this step. IO usage is around 61% during healing, and it's only 39% during the remaining sync. + +![IO utilization metrics screenshot](../../../assets/images/io-utilization.png) + +### 3. Blocks import + +After steps 1 and 2, world state is downloaded and healed, and block import continues. + +The visible drop in CPU shows that Besu finished the world state nodes download. + +The block import step is long because Besu can't parallelize block import -- it must validate each parent block before importing a child. + +:::note + +The Besu team is currently working on other algorithm and implementations to make this block import faster. + +::: + +### 4. Blocks full import + +In step 4, Besu executes all transactions of each block. This is when Besu updates the world state after the healing step. + +The quantity of imported blocks in this step depends on the speed of the sync. This number indicates the cumulated blocks quantity behind head since the last healing step. + +This step consumes less CPU than the previous steps because the sequential part -- executing transactions on the EVM -- must be single-threaded, reducing the concurrent work at the CPU level. + +### 5. Blocks production and propagation + +Once Besu is completely synced, it propagates blocks and executes the transactions inside each block. Step 5, block production and propagation, shows a reduction in CPU consumption due to the idle time while waiting for the new block and the sequential nature of executing transactions on the EVM. + +## Block time + +Block time measures the duration of getting new blocks in Besu. Block time is closely related to [CPU usage](#cpu-usage). + +The following screenshot shows patterns related to block time as available in the [Besu Grafana full dashboard](https://grafana.com/grafana/dashboards/16455-besu-full/). + +![Block time Grafana Besu dashboard patterns screenshot](../../../assets/images/block-time.png) + +The block time pattern is also a "staircase" pattern. + +### 1. Block import time + +Step 1, block import time, is the duration of importing a block. + +Import includes: + +- Data retrieval over the network. +- Headers, body, and receipt validation. +- Persisting the block in the database. + +Block import takes between a few and tens of milliseconds. + +### 2. Block full import time + +Step 2, block full import time, is the duration of importing a block (step 1) and executing all its transactions. + +Block full import takes between 1 and 2 seconds per block, depending on the number and complexity of the transactions. + +### 3. Block network time + +Step 3, block network time, is the duration of propagating a block over the network and executing all its transactions. + +Block network takes between 13 and 16 seconds. + + + +[monitoring Besu with Prometheus and Grafana]: ../../../private-networks/tutorials/quickstart.md#monitor-nodes-with-prometheus-and-grafana + +[^1]: A CPU-bound task means that the time required to execute the task is determined only by the CPU speed. diff --git a/versioned_docs/version-stable/public-networks/how-to/send-transactions.md b/versioned_docs/version-stable/public-networks/how-to/send-transactions.md new file mode 100644 index 00000000000..56d74607621 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/send-transactions.md @@ -0,0 +1,65 @@ +--- +title: Create and send transactions +sidebar_position: 4 +description: Send transactions using eth_call or eth_sendRawTransaction. +tags: + - public networks +--- + +# Create and send transactions + +You can send signed transactions using the [`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction) JSON-RPC API method. + +Signed transactions can be simple value transfers, contract creation, or contract invocation. Set the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../reference/cli/options.md#rpc-tx-feecap) CLI option. + +To accept signed transactions from remote connections, set the [API listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0`. + +[Use client libraries](develop/client-libraries.md) to create and send a signed raw transaction to transfer Ether and create a smart contract. + +:::danger Private keys + +Don't use the accounts from the examples on Mainnet or any public network except for testing. The private keys are displayed which means the accounts are not secure. + +All accounts and private keys in the examples are from the `dev.json` genesis file in the [`/besu/config/src/main/resources`](https://github.com/hyperledger/besu/tree/master/config/src/main/resources) directory. + +In production environments avoid exposing your private keys by creating signed transactions offline, or use [EthSigner](https://docs.ethsigner.consensys.net/) to isolate your private keys and sign transactions with [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). + +::: + +:::caution + +Setting the [listening host](use-besu-api/index.md#service-hosts) to `0.0.0.0` exposes the API service connection on your node to any remote connection. In a production environment, ensure you are using a firewall to avoid exposing your node to the internet. + +::: + +:::tip + +Libraries such as [web3j](https://github.com/web3j/web3j) or [ethereumj](https://github.com/ethereum/ethereumj) and tools such as [MyCrypto](https://mycrypto.com/) can also create signed transactions. + +::: + +## `eth_call` vs `eth_sendRawTransaction` + +You can interact with contracts using [`eth_call`](../reference/api/index.md#eth_call) or [`eth_sendRawTransaction`](../reference/api/index.md#eth_sendrawtransaction). The table below compares the characteristics of both calls. + +| `eth_call` | `eth_sendRawTransaction` | +| --- | --- | +| Read-only | Write | +| Invokes contract function locally | Broadcasts to the network | +| Does not change state of blockchain | Updates the blockchain (for example, transfers ether between accounts) | +| Does not consume gas | Requires gas | +| Synchronous | Asynchronous | +| Returns the value of a contract function available immediately | Returns transaction hash only. A block might not include all possible transactions (for example, if the gas price is too low). | + +## Use wallets for key management + +Besu doesn't support key management inside the client. Use: + +- [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu to provide access to your key store and sign transactions. +- Third-party tools (for example, [MetaMask](https://metamask.io/) and [web3j](https://web3j.io/)) for creating accounts. + +:::tip + +[EthSigner](http://docs.ethsigner.consensys.net/en/latest/) implements [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction) and [`eea_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eea_sendtransaction). + +::: diff --git a/versioned_docs/version-stable/public-networks/how-to/troubleshoot/_category_.json b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/_category_.json new file mode 100644 index 00000000000..cf5f9653813 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Troubleshoot", + "position": 12 +} diff --git a/versioned_docs/version-stable/public-networks/how-to/troubleshoot/evm-tool.md b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/evm-tool.md new file mode 100644 index 00000000000..7e5a044180a --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/evm-tool.md @@ -0,0 +1,74 @@ +--- +title: Use EVM tool +sidebar_position: 1 +description: Hyperledger Besu EVM tool +tags: + - public networks + - private networks +--- + +# Use the EVM tool + +The Besu EVM tool is a CLI program that executes arbitrary EVM programs and Ethereum State Tests outside the context of an operating node. Use the EVM tool for benchmarking and fuzz testing. + +## Get the EVM tool + +The Besu EVM tool does not have a standard zip file distribution. To use, you need to either build from the source repository or use a pre-published docker image. + +### Build from source + +To build from source, run the following from the root of the Besu repository: + +```bash +./gradlew :ethereum:evmTool:installDist +``` + +An extractable archive files is created in `ethereum/evmtool/build/distributions` and an executable installation in `ethereum/evmtool/build/install/evmtool`. + +Execute the EVM tool: + +```bash +ethereum/evmtool/build/install/evmtool/bin/evm +``` + +### Execute with Docker + +To run the Besu EVM tool in a container: + +```bash +docker run -rm hyperledger/besu-evmtool:develop +``` + +- Because no data is stored in local directories we recommended using the `-rm` docker option. The `-rm` option deletes the container at the end of execution. +- If you use an option that requires input from standard in, use the `-i` docker option. The `-i` option pipes standard input to the EVM tool. +- If you need to reference files we recommend using a docker file binding, such as `-v ${PWD}:/opt/data`, which maps the current directory to the `/opt/data` directory in the container. + +:::note + +The `latest` tag is the latest released version of Besu, starting with 1.5.3. The `develop` tag is the current main branch code that will go into a future release version of Besu. + +::: + +## EVM tool run options + +The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. [Command line options](../../reference/evm-tool.md) specify the code and other contextual information. + +The EVM tool also has a [`state-test` subcommand](../../reference/evm-tool.md#state-test-options) that allows [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) to be evaluated, and a [`code-validate` subcommand](../../reference/evm-tool.md#eof-code-validation) that allows [Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. Most of the options from EVM execution don't apply. + + + +# `state-test` + +```bash +evm state-test --nomemory +``` + +# `code-validate` + +```bash +evm code-validate --file +``` + + + +The [EVM tool reference](../../reference/evm-tool.md) provides more information on these modes. diff --git a/versioned_docs/version-stable/public-networks/how-to/troubleshoot/peering.md b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/peering.md new file mode 100644 index 00000000000..a0b218f40ff --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/peering.md @@ -0,0 +1,69 @@ +--- +title: Troubleshoot peering +sidebar_position: 4 +description: How to troubleshoot peering +tags: + - public networks +--- + +# Troubleshoot peering + +Many factors can affect the ability of your node to find and maintain peers. Your network router, machine environment, and node configuration are all important. If you have peering issues, start by [configuring your ports](../connect/configure-ports.md) and [managing peers](../connect/manage-peers.md). + +## Peering FAQ + +### "Why can’t I find enough peers to sync?" + +One or more of the following may be the cause: + +- Your hardware doesn't have enough CPU, disk IOPS, or bandwidth to handle all the peers. +- Your ports aren't open in your firewall and/or router. +- Your node is sending large numbers of DNS requests. See [issue #4375](https://github.com/hyperledger/besu/issues/4375). +- You're using [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), which doesn't download all historical block data, so your peers may disconnect you when fetching those blocks. +- Your node is experiencing the normal behavior of peers connecting and disconnecting. This is especially normal soon after you start your node. + +You can try the following to find more peers: + +- Set [`p2p-host`](../../reference/cli/options.md#p2p-host) to your external IP address to allow inbound connections. +- Restart Besu. This can take a while to build up again. +- Set `-Xdns-enabled` to `true` (only for private networks). +- Set `-Xp2p-peer-lower-bound` to a minimum number of peers. +- Delete the node key (which is autogenerated in your data directory). There are two reasons that this might help find more peers: + 1. Your node (identified by the address associated with this key) has been put onto other peers' bad peer lists for some reason. + 2. Peer discovery is influenced by the value of the node key. This is related to the node "distance" in the [discovery algorithm](https://github.com/ethereum/devp2p/wiki/Discovery-Overview#kademlia). + +You can read the [Prysm EL and CL peering documentation](https://docs.prylabs.network/docs/prysm-usage/p2p-host-ip) for more information. + +### "What network or router/modem settings should I check?" + +Check the following settings: + +- Your machine and router's specified DNS should support TCP. You can check your DNS online for TCP support. Google and Cloudflare, 8.8.8.8 and 1.1.1.1, support TCP over port 853. Other DNS might as well. +- The appropriate ports should be open on your router, or your router should have UPNP enabled. See the next FAQ for more information on router settings. +- If you use [Docker](https://docs.docker.com/network/network-tutorial-host/) or virtualization, the container should be able to create outbound connections on the host machine. + +### "How do I open/forward my ports?" + +If you’re behind NAT, you probably need to set up port forwarding in your router. You might also need to configure your firewall. Forward and open `30303` (if using the default p2p port) for both UDP and TCP. If your router supports UPNP, you can set [`--nat-method`](../../reference/cli/options.md#nat-method) to [`UPNPP2PONLY`](../connect/specify-nat.md#upnp). + +### "How do I test that my ports are open?" + +You can use this [open port checker](https://www.yougetsignal.com/tools/open-ports/). + +### "What's the ideal number of peers for Besu?" + +The default maximum is 25. Increasing the number of peers increases the bandwidth, CPU, and disk access Besu uses to respond to peers. Hardware with low specifications might result in low peer numbers. You'll experience diminishing returns with a larger number of peers (>100). + +### question "What's the benefit of increasing the number of peers?" + +Increasing the number of max peers won't speed up Besu syncing, because the bottleneck during sync is disk IO and CPU. + +Note that Besu's peers are only used for the initial sync and transaction gossip, neither of which affects attestation performance. The beacon node connectivity controls how quickly you receive blocks and how attestations are published. Increasing Besu's peer count increases the load on your node, which may hurt attestations. + +## Metrics + +Capture [metrics](../monitor/index.md) to gain insights into peering behavior over time. + +To [enable Prometheus to access Besu](../monitor/metrics.md), open the metrics port or metrics push port to Prometheus or the Prometheus push gateway on TCP. + +Specify the ports for Prometheus and Prometheus push gateway using the [`--metrics-port`](../../reference/cli/options.md#metrics-port) and [`--metrics-push-port`](../../reference/cli/options.md#metrics-push-port) options. The defaults are `9545` and `9001`. diff --git a/versioned_docs/version-stable/public-networks/how-to/troubleshoot/performance.md b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/performance.md new file mode 100644 index 00000000000..ba2da3268ad --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/performance.md @@ -0,0 +1,45 @@ +--- +description: Troubleshoot poor performance and resource constraints. +sidebar_label: Troubleshoot performance +sidebar_position: 3 +tags: + - public networks +--- + +# Troubleshoot poor performance and resource constraints + +Your hardware, machine environment, and node configuration can affect your node's ability to serve +requests and perform [validator duties](../../concepts/proof-of-stake/index.md), including +[attestation performance](../../concepts/proof-of-stake/attestations.md). + +If you notice high resource usage when [monitoring your node](../monitor/index.md), you can +try the following suggestions: + +* Disable swapping. + Besu is an I/O intensive application, especially during sync, enabling swapping hurts Besu's performance. + You can disable swap at the OS level. + [This article](https://www.tecmint.com/disable-swap-partition/) provides information on how to + disable swap (and caveats). +* Use a high performance SSD disk with NVMe, since Besu's performance bottleneck is often slow disk I/O. +* Configure memory and RAM: + * If you have RAM constraints, use [OpenJ9](../../get-started/system-requirements.md) if you're + running on `x86_64` Linux architecture to reduce memory usage. + * Review and change your [Java heap size](../configure-jvm/manage-memory.md) if necessary. + 5GB is an appropriate limit. + Higher values may improve sync time, but can be reduced after completing sync. + * Ensure Besu is using [jemalloc](../../get-started/install/binary-distribution.md). + * If you have 32GB RAM or more, set the `Xplugin-rocksdb-high-spec-enabled` configuration option + to `true`. + Don't use this on RAM machines with 16GB RAM or less if you're running a consensus client on the + same hardware. +* If you're running on ARM64, make sure the glibc version is greater than 2.29. + If not, Besu uses a Java implementation instead of the native one for some precompiled contracts, + which results in lower performance. + * On Ubuntu, run `ldd --version`. + See [the methods for other environments](https://dev.to/0xbf/how-to-get-glibc-version-c-lang-26he). +* Pay attention to what processes are running on the same machine/VM as Besu. + Java applications, with default settings, are designed to run alone on the machine. + You can run your consensus client on the same machine, but this adds overhead on Besu, and vice + versa (on CPU cache misses, CPU scheduler latency, IO, etc.). + +You should continue to monitor your node after following these suggestions. \ No newline at end of file diff --git a/versioned_docs/version-stable/public-networks/how-to/troubleshoot/trace-transactions.md b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/trace-transactions.md new file mode 100644 index 00000000000..773b0d9fa05 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/troubleshoot/trace-transactions.md @@ -0,0 +1,40 @@ +--- +title: Trace transactions +sidebar_position: 2 +description: How to trace transactions +tags: + - public networks + - private networks +--- + +# Trace transactions + +To get detailed information about transaction processing, use the [`TRACE` API](../../reference/api/index.md#trace-methods). Enable the `TRACE` API using the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api) command line options. + +The `TRACE` API has two sets of trace calls, [ad-hoc tracing APIs](#ad-hoc-tracing-apis) and [transaction-trace filtering APIs](#transaction-trace-filtering-apis). + +## Ad-hoc tracing APIs + +These APIs allow you to use the [`trace`, `vmTrace`, or `stateDiff`](../../reference/trace-types.md) diagnostic options when tracing calls or transactions. + +To use the ad-hoc tracing APIs, the requested block or transaction must be within the number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) (by default, 1024). + +The ad-hoc tracing APIs are: + +- [`trace_call`](../../reference/api/index.md#trace_call) +- [`trace_callMany`](../../reference/api/index.md#trace_callmany) +- [`trace_rawTransaction`](../../reference/api/index.md#trace_rawtransaction) +- [`trace_replayBlockTransactions`](../../reference/api/index.md#trace_replayblocktransactions) + +## Transaction-trace filtering APIs + +These APIs allow you to filter and search by specific information such as the block, address, or transaction. These APIs only use the [`trace` type](../../reference/trace-types.md#trace). + +To use the transaction-trace filtering APIs, your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block or transaction must be within the number of [blocks retained](../../reference/cli/options.md#pruning-blocks-retained) with [pruning enabled](../../reference/cli/options.md#pruning-enabled) (by default, 1024). + +The transaction-trace filtering APIs are: + +- [`trace_block`](../../reference/api/index.md#trace_block) +- [`trace_filter`](../../reference/api/index.md#trace_filter) +- [`trace_get`](../../reference/api/index.md#trace_get) +- [`trace_transaction`](../../reference/api/index.md#trace_transaction) diff --git a/versioned_docs/version-stable/public-networks/how-to/upgrade-node.md b/versioned_docs/version-stable/public-networks/how-to/upgrade-node.md new file mode 100644 index 00000000000..4e33d3dce08 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/upgrade-node.md @@ -0,0 +1,33 @@ +--- +title: Upgrade Besu +sidebar_position: 11 +description: Upgrade your Besu node to a new version. +tags: + - public networks +--- + +# Upgrade your Besu node + +When upgrading your Besu node, we recommend: + +- Using an orchestration method (for example, Ansible or Chef) to keep all nodes in sync with your desired configuration. +- Storing your configuration under version control. + +## Ansible + +You can use the [Ansible role on Galaxy](https://galaxy.ansible.com/consensys/hyperledger_besu) directly or customize it to suit your needs. + +Upgrade the Besu version on nodes by running the play with the new version. For more information, For more information, select **Read Me** on the [Ansible Galaxy Besu page](https://galaxy.ansible.com/consensys/hyperledger_besu). + +The playbook: + +1. Stops Besu. +1. Downloads the updated version. +1. Applies any new configuration. +1. Starts Besu. + +## Find peers on restarting + +Nodes store known peers in the peer table. The peer table is not persisted to disk. When a node restarts, the node connects to the specified bootnodes and discovers other nodes through the peer discovery process. The node continues collecting data from where it left off before the restart (assuming there was no data corruption in a failure scenario). + +Before the node restarted, connected peers saved the node details in their peer tables. These peers can reconnect to the restarted node. The restarted node uses these peers and the bootnodes, to discover more peers. To ensure that the restarted node successfully rejoins the network, ensure you specify at least one operational bootnode. diff --git a/versioned_docs/version-stable/public-networks/how-to/use-besu-api/_category_.json b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/_category_.json new file mode 100644 index 00000000000..300deff1cbe --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use the Besu API", + "position": 1 +} diff --git a/versioned_docs/version-stable/public-networks/how-to/use-besu-api/access-logs.md b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/access-logs.md new file mode 100644 index 00000000000..04dbfd60d34 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/access-logs.md @@ -0,0 +1,194 @@ +--- +title: Access logs using JSON-RPC +sidebar_position: 5 +description: Accessing logs using the Hyperledger Besu API +tags: + - private networks +--- + +# Access logs using the Hyperledger Besu API + +Subscribe to events, such as logs, using either [RPC Pub/Sub over WebSockets](rpc-pubsub.md) or filters over HTTP. + +Access logs using the following Hyperledger Besu API methods: + +- [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) +- [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs) +- [`eth_getLogs`](../../reference/api/index.md#eth_getlogs). + +Use [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) to create the filter before using [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) and [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs)). + +Access logs for [private contracts](../../../private-networks/concepts/privacy/index.md) using the equivalent [`priv_*` methods and specifying the privacy group ID](#filters-for-private-contracts). For example, [`priv_getLogs`](../../reference/api/index.md#priv_getlogs). + +:::note + +The following examples use the sample contract included in [events and logs](../../concepts/events-and-logs.md). + +::: + +## Create a filter + +Create a filter using [`eth_newFilter`](../../reference/api/index.md#eth_newfilter). + +If the [example contract](../../concepts/events-and-logs.md) was deployed to 0x42699a7612a82f1d9c36148af9c77354759b210b, the following request for `eth_newFilter` creates a filter to log when `valueIndexed` is set to 5: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_newFilter", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + ["0x0000000000000000000000000000000000000000000000000000000000000005"] + ] + } + ], + "id": 1 +} +``` + +[`eth_newFilter`](../../reference/api/index.md#eth_newfilter) returns a filter ID hash (for example, `0x1ddf0c00989044e9b41cc0ae40272df3`). + +### Poll a filter for changes + +To poll the filter for changes since the last poll, use [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) with the filter ID hash returned by [`eth_newFilter`](../../reference/api/index.md#eth_newfilter). + +If the contract had been executed twice since the last poll, with `valueIndexed` set to 1 and 5, [`eth_getFilterChanges`](../../reference/api/index.md#eth_getfilterchanges) returns only the log where the [topic](../../concepts/events-and-logs.md#event-parameters) for `valueIndexed` is 5: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x21c", + "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", + "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + ] +} +``` + +### Get all logs for a filter + +To get all logs for a filter, use [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). + +If the contract had been executed twice with `valueIndexed` set to 5 since the filter was created using `eth_newFilter`, `eth_getFilterLogs` returns: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x1a7", + "blockHash": "0x4edda22a242ddc7bc51e2b6b11e63cd67be1af7389470cdea9c869768ff75d42", + "transactionHash": "0x9535bf8830a72ca7d0020df0b547adc4d0ecc4321b7d5b5d6beb1eccee5c0afa", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x21c", + "blockHash": "0xc7e6c9d5b9f522b2c9d2991546be0a8737e587beb6628c056f3c327a44b45132", + "transactionHash": "0xfd1a40f9fbf89c97b4545ec9db774c85e51dd8a3545f969418a22f9cb79417c5", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + ] +} +``` + +:::tip + +You can use [`eth_getLogs`](#get-logs-using-a-filter-options-object) with a filter options object to get all logs matching the filter options instead of using [`eth_newFilter`](../../reference/api/index.md#eth_newfilter) followed by [`eth_getFilterLogs`](../../reference/api/index.md#eth_getfilterlogs). + +::: + +## Uninstall a filter + +When a filter is no longer required, use [`eth_uninstallFilter`](../../reference/api/index.md#eth_uninstallfilter) to remove the filter. + +## Filters for private contracts + +Filters for private contracts are created, accessed, and uninstalled using: + +- [`priv_getFilterChanges`](../../reference/api/index.md#priv_getfilterchanges) +- [`priv_getFilterLogs`](../../reference/api/index.md#priv_getfilterlogs) +- [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) +- [`priv_newFilter`](../../reference/api/index.md#priv_newfilter) +- [`priv_uninstallFilter`](../../reference/api/index.md#priv_uninstallfilter). + +The [privacy group ID](../../../private-networks/concepts/privacy/index.md) must be specified as parameter 0 for the `priv` methods. + +```json +{ + "jsonrpc": "2.0", + "method": "priv_newFilter", + "params": [ + "4rFldHM792LeP/e2WPkTXZedjwKuTr/KwCFTt6mBbkI=", + { + "fromBlock": "earliest", + "toBlock": "latest", + "addresses": ["0x991cc548c154b2953cc48c02f782e1314097dfbb"], + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410" + ] + } + ], + "id": 1 +} +``` + +## Get logs using a filter options object + +To get all logs for a filter options object, use [`eth_getLogs`](../../reference/api/index.md#eth_getlogs) or [`priv_getLogs`](../../reference/api/index.md#priv_getlogs) for a private contract. + +The following request for `eth_getLogs` returns all the logs where the example contract has been deployed to `0x42699a7612a82f1d9c36148af9c77354759b210b` and executed with `valueIndexed` set to 5. + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "topics": [ + ["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"], + ["0x0000000000000000000000000000000000000000000000000000000000000005"] + ] + } + ], + "id": 1 +} +``` + +The above example returns the same result as calling [eth_newFilter](#creating-a-filter) followed by [eth_getFilterLogs](#getting-all-logs-for-a-filter). diff --git a/versioned_docs/version-stable/public-networks/how-to/use-besu-api/authenticate.md b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/authenticate.md new file mode 100644 index 00000000000..747debefe94 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/authenticate.md @@ -0,0 +1,272 @@ +--- +title: Authenticate over JSON-RPC requests +sidebar_position: 4 +description: Hyperledger Besu authentication and authorization for JSON-RPC +tags: + - private networks +--- + +# Authenticate and authorize JSON-RPC + +Authentication identifies a user, and authorization verifies user access to requested JSON-RPC methods. Hyperledger Besu verifies users using [JSON Web Tokens (JWT)](https://jwt.io/introduction/). JWT is also used in [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md) to verify tenant data access. + +Besu supports two mutually exclusive authentication methods: + +- [Username and password](#username-and-password-authentication) +- [JWT public key](#jwt-public-key-authentication). + +Besu creates JWT internally with [username and password authentication](#username-and-password-authentication), and externally with [JWT public key authentication](#jwt-public-key-authentication). + +:::info + +Using JSON-RPC authentication and authorization with [MetaMask](https://metamask.io/) is not supported. + +::: + +:::caution + +To prevent interception of authentication credentials and authenticated tokens, make authenticated requests over HTTPS. We recommend running production deployments behind a network layer that provides SSL termination. Besu does not provide a HTTPS connection natively. + +::: + +## Username and password authentication + +Enable authentication from the command line. Supply the credentials file and send a request to the `/login` endpoint using the username and password. The `/login` endpoint creates a JWT for making permitted JSON-RPC requests. + +Using [public key authentication](#jwt-public-key-authentication) disables the `/login` endpoint. + +### 1. Create the credentials file + +The `toml` credentials file defines user details and the JSON-RPC methods they can access. + +:::info Sample `auth.toml` credentials file + +```toml +[Users.username1] +password = "$2a$10$l3GA7K8g6rJ/Yv.YFSygCuI9byngpEzxgWS9qEg5emYDZomQW7fGC" +permissions=["net:*","eth:blockNumber"] +privacyPublicKey="U7ANiOOd5L9Z/dMxRFjdbhA1Qragw6fLuYgmgCvLoX4=" + +[Users.username2] +password = "$2b$10$6sHt1J0MVUGIoNKvJiK33uaZzUwNmMmJlaVLkIwinkPiS1UBnAnF2" +permissions=["net:version","admin:*"] +privacyPublicKey="quhb1pQPGN1w8ZSZSyiIfncEAlVY/M/rauSyQ5wVMRE=" +``` + +::: + +Each user requiring JSON-RPC access the configuration file lists the: + +- Username. `Users.` is mandatory and followed by the username. That is, replace `` in `[Users.]` with the username. +- Hash of the user password. Use the [`password hash`](../../reference/cli/subcommands.md#password) subcommand to generate the hash. +- [JSON-RPC permissions](#json-rpc-permissions). +- Optional. The tenant's Tessera public key using `privacyPublicKey`. Only used for [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). + + + +# Command + +```bash +besu password hash --password=MyPassword +``` + +# Hash output + +```text +$2a$10$L3Xb5G/AJOsEK5SuOn9uzOhpCCfuVWTajc5hwWerY6N5xBM/xlrMK +``` + + + +### 2. Enable authentication + +To require authentication for the JSON-RPC API, use the [`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) options. + +To specify the [credentials file](#1-create-the-credentials-file), use the [`--rpc-http-authentication-credentials-file`](../../reference/cli/options.md#rpc-http-authentication-credentials-file) and [`--rpc-ws-authentication-credentials-file`](../../reference/cli/options.md#rpc-ws-authentication-credentials-file) options. + +### 3. Generate an authentication token + +To generate an authentication token, make a request to the `/login` endpoint with your username and password. Specify the HTTP port or the WS port to generate a token to authenticate over HTTP or WS respectively. HTTP and WS requires a different token. + + + +# Generate a token for HTTP + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login +``` + +# Example for HTTP + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8545/login +``` + +# Generate a token for WS + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' /login +``` + +# Example for WS + +```bash +curl -X POST --data '{"username":"username1","password":"MyPassword"}' http://localhost:8546/login +``` + +# JSON result + +```json +{ + "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MDYwNCwiZXhwIjoxNTUwNDYwOTA0fQ.l2Ycqzl_AyvReXBeUSayOlOMS_E8-DCuz3q0Db0DKD7mqyl6q-giWoEtfdWzUEvZbRRi2_ecKO3N6JkXq7zMKQAJbVAEzobfbaaXWcQEpHOjtnK4_Yz-UPyKiXtu7HGdcdl5Tfx3dKoksbqkBl3U3vFWxzmFnuu3dAISfVJYUNA" +} +``` + + + +Authentication tokens expire five minutes after generation. If you require access after the token expires, you need to generate a new token. + +## JWT public key authentication + +Enable authentication from the command line and supply the external JWT provider's public key. + +:::danger + +JWT public authentication disables the Besu `/login` endpoint, meaning [username and password authentication](#username-and-password-authentication) will not work. + +::: + +### 1. Generate a private and public key pair + +The private and accompanying public key files must be in `.pem` format. + +The [key algorithm](https://datatracker.ietf.org/doc/html/rfc7518#section-3.1) can be: + +- RSA with private key length of at least 2048 bits using algorithm `RS256`, `RS384` or `RS512`. +- ECDSA private key, using `ES256` (`secp256r1` or `secp256k1`), `ES384` or `ES512`. + +Besu default is `RS256`. + + + +# `RS256` RSA Keys + +1. Generate the private key: + + ```bash + openssl genrsa -out privateRSAKey.pem 2048 + ``` + +2. Generate the public key: + + ```bash + openssl rsa -pubout -in privateRSAKey.pem -pubout -out publicRSAKey.pem + ``` + +# `ES256` `secp256r1` ECDSA Keys + +1. Generate the private key: + + ```bash + openssl ecparam -name secp256r1 -genkey -out privateECDSAKey.pem + ``` + +2. Generate the public key: + + ```bash + openssl ec -in privateECDSAKey.pem -pubout -out publicECDSAKey.pem + ``` + + + +:::danger Private key security + +The private key must be kept secret. Never share private keys publicly or on a Web site, even if advertised as secure. + +Always keep your private keys safe -- ideally using [hardware](https://connect2id.com/products/nimbus-jose-jwt/examples/pkcs11) or [vault](https://www.vaultproject.io/docs/secrets/identity/identity-token) -- and define a strong security policy and [best practices](https://auth0.com/docs/best-practices/token-best-practices). + +Compromised keys can provide attackers access to you nodes RPC-API. + +::: + +### 2. Create the JWT + +Create the JWT using a trusted authentication provider[^1] or [library](https://jwt.io/libraries) in your own code. + +[^1]: for example [Auth0](https://auth0.com/) or [Keycloak](https://www.keycloak.org/) + +See [Java code sample to generate JWT using Vertx](https://github.com/NicolasMassart/java-jwt-sample-generation/) for an example implementation. + +:::caution + +The JWT must use one of the `RS256`, `RS384`, `RS512`, `ES256`, `ES384`, or `ES512` algorithms. + +::: + +Each payload for the JWT must contain: + +- [JSON-RPC permissions](#json-rpc-permissions) +- [`exp` (Expiration Time) claim](https://tools.ietf.org/html/rfc7519#section-4.1.4) +- Optionally, the tenant's Tessera public key using `privacyPublicKey`. Only used for [multi-tenancy](../../../private-networks/concepts/privacy/multi-tenancy.md). + + + +# Example JSON Payload + +```json +{ + "permissions": ["*:*"], + "privacyPublicKey": "2UKH3VJThkOoKskrLFpwoxCnnRARyobV1bEdgseFHTs=", + "exp": 1600899999002 +} +``` + +# Example JWT result + +![Example result](jwt.png) + + + +### 3. Enable authentication + +To require authentication for the JSON-RPC API, use the [`--rpc-http-authentication-enabled`](../../reference/cli/options.md#rpc-http-authentication-enabled) or [`--rpc-ws-authentication-enabled`](../../reference/cli/options.md#rpc-ws-authentication-enabled) options. + +To specify the JWT provider's public key file to use with the externally created JWT, use the [`--rpc-http-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-http-authentication-jwt-public-key-file) or [`--rpc-ws-authentication-jwt-public-key-file`](../../reference/cli/options.md#rpc-ws-authentication-jwt-public-key-file) options. + +## JSON-RPC permissions + +Each user has a list of permissions strings defining the methods they can access. To give access to: + +- All API methods, specify `["*:*"]`. +- All API methods in an API group, specify `[":*"]`. For example, `["eth:*"]`. +- Specific API methods, specify `[":"]`. For example, `["admin:peers"]`. + +With authentication enabled, to explicitly specify a user cannot access any methods, include the user with an empty permissions list (`[]`). Users with an empty permissions list and users not included in the credentials file cannot access any JSON-RPC methods. + +## Use an authentication token to make requests + +Specify the authentication token as a `Bearer` token in the JSON-RPC request header. + +### Postman + +In the **Authorization** tab in the **TYPE** drop-down list, select **Bearer Token** and specify the token (generated either [externally](#2-create-the-jwt) or by the [`login` request](#3-generate-an-authentication-token)). + +### cURL + +Specify the `Bearer` in the header. + + + +# cURL Request with authentication placeholders + +```bash +curl -X POST -H 'Authorization: Bearer ' -d '{"jsonrpc":"2.0","method":"","params":[],"id":1}' +``` + +# cURL Request with authentication + +```bash +curl -X POST -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJwZXJtaXNzaW9ucyI6WyIqOioiXSwidXNlcm5hbWUiOiJ1c2VyMiIsImlhdCI6MTU1MDQ2MTQxNiwiZXhwIjoxNTUwNDYxNzE2fQ.WQ1mqpqzRLHaoL8gOSEZPvnRs_qf6j__7A3Sg8vf9RKvWdNTww_vRJF1gjcVy-FFh96AchVnQyXVx0aNUz9O0txt8VN3jqABVWbGMfSk2T_CFdSw5aDjuriCsves9BQpP70Vhj-tseaudg-XU5hCokX0tChbAqd9fB2138zYm5M' -d '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":1}' http://localhost:8545 +``` + + diff --git a/versioned_docs/version-stable/public-networks/how-to/use-besu-api/graphql.md b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/graphql.md new file mode 100644 index 00000000000..ba369af65a3 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/graphql.md @@ -0,0 +1,102 @@ +--- +title: Use GraphQL over HTTP +sidebar_position: 3 +description: How to access the Hyperledger Besu API using GraphQL +tags: + - private networks +--- + +# Use GraphQL over HTTP + +GraphQL can reduce the overhead needed for common queries. For example, instead of querying each receipt in a block, GraphQL can get the same result with a single query for the entire block. + +The [Besu GraphQL schema] describes the GraphQL implementation for Ethereum. Enable the GraphQL service using [command line options](index.md#enable-api-access). + +:::note + +GraphQL is not supported over WebSocket. + +::: + +Access the GraphQL endpoint at `http://:/graphql`. Configure `` and `` using [`graphql-http-host`](../../reference/cli/options.md#graphql-http-host) and [`graphql-http-port`](../../reference/cli/options.md#graphql-http-port). The default endpoint is `http://127.0.0.1:8547/graphql`. + +## GraphQL requests with cURL + +[Hyperledger Besu JSON-RPC API methods](../../reference/api/index.md) with an equivalent [GraphQL](graphql.md) query include a GraphQL request and result in the method example. + +The following [`syncing`](../../reference/api/index.md#eth_syncing) request returns data about the synchronization status. + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock}}"}' http://localhost:8547/graphql +``` + +## GraphQL requests with GraphiQL app + +The third-party tool, [GraphiQL](https://github.com/skevy/graphiql-app), provides a tabbed interface for editing and testing GraphQL queries and mutations. GraphiQL also provides access to the [Besu GraphQL schema] from within the app. + +![GraphiQL](../../../assets/images/GraphiQL.png) + +## Pending + +`transactionCount` and `transactions` supports the Pending query. + +:::info + +Besu does not execute pending transactions so results from `account`, `call`, and `estimateGas` for Pending do not reflect pending transactions. + +::: + + + +# Pending transaction count + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactionCount}}"}' http://localhost:8547/graphql +``` + +# Result + +```json +{ + "data": { + "pending": { + "transactionCount": 2 + } + } +} +``` + + + + + +# Pending transactions + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{pending {transactions{hash}}}"}' http://localhost:8547/graphql +``` + +# Result + +```json +{ + "data": { + "pending": { + "transactions": [ + { + "hash": "0xbb3ab8e2113a4afdde9753782cb0680408c0d5b982572dda117a4c72fafbf3fa" + }, + { + "hash": "0xf6bd6b1bccf765024bd482a71c6855428e2903895982090ab5dbb0feda717af6" + } + ] + } + } +} +``` + + + + + +[Besu GraphQL schema]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/ethereum/api/src/main/resources/schema.graphqls diff --git a/versioned_docs/version-stable/public-networks/how-to/use-besu-api/index.md b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/index.md new file mode 100644 index 00000000000..5fca272858e --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/index.md @@ -0,0 +1,98 @@ +--- +description: Hyperledger Besu API +tags: + - public networks + - private networks +--- + +# Access the Hyperledger Besu API + +Access the [Hyperledger Besu API](../../reference/api/index.md) using: + +- [JSON-RPC over HTTP, WebSocket, or IPC](json-rpc.md) +- [RPC Pub/Sub over WebSockets](rpc-pubsub.md) +- [GraphQL over HTTP](graphql.md). + +The following sections provide information about JSON-RPC, RPC Pub/Sub, and GraphQL. + +## Enable API access + +To enable API access, use the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled), [`--ws-http-enabled`](../../reference/cli/options.md#rpc-ws-enabled), [`--graphql-http-enabled`](../../reference/cli/options.md#graphql-http-enabled), and `--Xrpc-ipc-enabled` options. + +:::caution + +`--Xrpc-ipc-enabled` is an early access option. + +::: + +## Service hosts + +To specify the host the API service listens on, use the [`--rpc-http-host`](../../reference/cli/options.md#rpc-http-host), [`--rpc-ws-host`](../../reference/cli/options.md#rpc-ws-host), and [`--graphql-http-host`](../../reference/cli/options.md#graphql-http-host) options. The default host is `127.0.0.1`. + +To allow remote connections, set the host to `0.0.0.0`. + +:::caution + +Setting the host to `0.0.0.0` exposes the API service connection on your node to any remote connection. In a production environment, ensure you use a firewall to avoid exposing your node to the internet. + +::: + +## Service ports + +To specify the port the API service listens on, use the [`--rpc-http-port`](../../reference/cli/options.md#rpc-http-port), [`--rpc-ws-port`](../../reference/cli/options.md#rpc-ws-port), and [`--graphql-http-port`](../../reference/cli/options.md#graphql-http-port) options. + +The default ports are: + +- 8545 for JSON-RPC over HTTP. +- 8546 for JSON-RPC over WebSocket. +- 8547 for GraphQL over HTTP. + +Ports must be [exposed appropriately](../connect/configure-ports.md). + +## Socket path + +To specify the socket path for the IPC socket, use the `--Xrpc-ipc-path` option. The default path is `besu.ipc` in the Besu data directory. + +:::caution + +`--Xrpc-ipc-path` is an early access option. + +::: + +## Host allowlist + +To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL requests. Besu accepts requests only when hostnames specified using the [`--host-allowlist`](../../reference/cli/options.md#host-allowlist) option matches the request host headers. By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the API, we recommend using the [Besu authentication mechanism](authenticate.md) with username and password authentication or JWT public key authentication. + +::: + +If your application publishes RPC ports, specify the hostnames when starting Besu. + +```bash +besu --host-allowlist=example.com +``` + +Specify `*` for `--host-allowlist` to effectively disable host protection. + +:::caution + +Specifying `*` for `--host-allowlist` is not recommended for production code. + +::: + +## Not supported by Besu + +### Account management + +Account management relies on private key management in the client, which is not supported by Besu. + +To send signed transactions, use [`eth_sendRawTransaction`](../../reference/api/index.md#eth_sendrawtransaction). `eth_sendTransaction` is not implemented. + +For [account management](../send-transactions.md#use-wallets-for-key-management), use third-party wallets. + +### Protocols + +Besu does not support the Whisper and Swarm protocols. diff --git a/versioned_docs/version-stable/public-networks/how-to/use-besu-api/json-rpc.md b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/json-rpc.md new file mode 100644 index 00000000000..f7890d9bd12 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/json-rpc.md @@ -0,0 +1,291 @@ +--- +title: Use JSON-RPC over HTTP, WS, and IPC +sidebar_position: 1 +description: How to access the Hyperledger Besu API using JSON-RPC +tags: + - private networks +--- + +import Postman from '../../../global/postman.md'; + +# Use JSON-RPC over HTTP, WebSocket, and IPC + +JSON-RPC APIs allow you to interact with your node. JSON-RPC endpoints are not enabled by default. + +:::caution + +You should secure access to your node's JSON-RPC endpoints. Users with access to your node via JSON-RPC can make calls directly to your node, causing your node to consume resources. + +::: + +To enable JSON-RPC over HTTP or WebSocket, use the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) and [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) options. + +To enable JSON-RPC over an [IPC socket](index.md#socket-path), use the `--Xrpc-ipc-enabled` option. + +:::caution + +`--Xrpc-ipc-enabled` is an early access option. + +::: + + + +## Geth console + +The geth console is a REPL (Read, Evaluate, & Print Loop) JavaScript console. Use JSON-RPC APIs supported by geth and Hyperledger Besu directly in the console. + +To use the geth console with Besu: + +1. Start Besu with the [`--rpc-http-enabled`](../../reference/cli/options.md#rpc-http-enabled) or `--Xrpc-ipc-enabled` option. +1. Specify which APIs to enable using the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api) or `--Xrpc-ipc-api` option. +1. Start the geth console specifying the JSON-RPC endpoint: + + + +# HTTP endpoint + +```bash +geth attach http://localhost:8545 +``` + +# IPC endpoint + +```bash +geth attach /path/to/besu.ipc +``` + +Use the geth console to call [JSON-RPC API methods](../../reference/api/index.md) that geth and Besu share. + +```bash +eth.syncing +``` + +## JSON-RPC authentication + +Besu disables [Authentication](authenticate.md) by default. + +## HTTP and WebSocket requests + +### HTTP + +To make RPC requests over HTTP, you can use [`curl`](https://curl.haxx.se/download.html). + + + +# Syntax + +```bash +curl -X POST --data '{"jsonrpc":"2.0","id":,"method":"","params":[]}' +``` + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}' http://127.0.0.1:8555 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": "1", + "result": "0x60e" +} +``` + + + +You can use `curl` to make multiple RPC requests (batch requests) over HTTP at the same time. Send the requests as an array, and receive an array of responses. The default number of allowed requests in a RPC batch request is `1024`. Use the [`--rpc-http-max-batch-size`](../../reference/cli/options.md#rpc-http-max-batch-size) command line option to update the default value. + + + +# curl HTTP request + +```bash +curl -X POST --data '[{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}]' http://127.0.0.1:8555 +``` + +# JSON result + +```json +[ + { + "jsonrpc": "2.0", + "id": "1", + "result": "0x60e" + }, + { + "jsonrpc": "2.0", + "id": "2", + "result": [] + } +] +``` + + + +### WebSocket + +To make RPC requests over WebSocket, you can use [`wscat`](https://github.com/websockets/wscat), a Node.js based command-line tool. + +First connect to the WebSocket server using `wscat` (you only need to connect once per session): + +```bash +wscat -c ws:// +``` + +After you establish a connection, the terminal displays a '>' prompt. Send individual requests as a JSON data package at each prompt. + + + +# Syntax + +```bash +{"jsonrpc":"2.0","id":,"method":"","params":[]} +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": "1", + "result": "0x23" +} +``` + + + +You can use `wscat` to make multiple RPC requests over WebSocket at the same time. Send the requests as an array, and receive an array of responses. + + + +# wscat WS request + +```bash +[{"jsonrpc":"2.0","id":"1","method":"eth_blockNumber","params":[]}, {"jsonrpc":"2.0","id":"2","method":"admin_peers","params":[]}] +``` + +# JSON result + +```json +[ + { + "jsonrpc": "2.0", + "id": "1", + "result": "0x23" + }, + { + "jsonrpc": "2.0", + "id": "2", + "result": [] + } +] +``` + + + +:::note + +`wscat` does not support headers. [Authentication](authenticate.md) requires you to pass an authentication token in the request header. To use authentication with WebSocket, you need an app that supports headers. + +::: + +## Readiness and liveness endpoints + +Besu provides readiness and liveness endpoints to confirm the Besu node status. Both return a `200 OK` status when ready or live and a `503 Service Unavailable` status if not ready or live. + +### Readiness + +By default, the readiness check requires a connected peer and the node to be within two blocks of the best known block. If you have [disabled P2P communication](../../reference/cli/options.md#p2p-enabled), you do not need peers. A live node with P2P disabled is always ready. + +Use the query parameters `minPeers` and `maxBlocksBehind` to adjust the number of peers required and the number of blocks tolerance. + + + +# Readiness endpoint + +```bash +http:///readiness +``` + +# curl request example + +```bash +curl -v 'http://localhost:8545/readiness' +``` + +# Query parameters example + +```bash +curl -v 'http://localhost:8545/readiness?minPeers=0&maxBlocksBehind=10' +``` + + + +### Liveness + +The liveness check requires the JSON-RPC server to be up. You can use the endpoint to verify that the node can respond to RPC calls. The status in the response will always be `UP`. + + + +# Liveness endpoint + +```bash +http:///liveness +``` + +# curl request example + +```bash +curl -v 'http://localhost:8545/liveness' +``` + + + +## API methods enabled by default + +Besu enables the `ETH`, `NET`, and `WEB3` API methods by default. + +To enable the `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `IBFT`, `MINER`, `PERM`, `PLUGINS`, `PRIV`, `TRACE`, and `TXPOOL` API methods, use the [`--rpc-http-api`](../../reference/cli/options.md#rpc-http-api), [`--rpc-ws-api`](../../reference/cli/options.md#rpc-ws-api), or `--Xrpc-ipc-api` options. + +:::caution + +`--Xrpc-ipc-api` is an early access option. + +::: + +## Block parameter + +When you make requests that might have different results depending on the block accessed, the block parameter specifies the block. Methods such as [`eth_getTransactionByBlockNumberAndIndex`](../../reference/api/index.md#eth_gettransactionbyblocknumberandindex) have a block parameter. + +The block parameter can have one of the following values: + +- `blockNumber` : _quantity_ - The block number, specified in hexadecimal or decimal. 0 represents the genesis block. +- `blockHash` : _string_ or _object_ - 32-byte block hash or JSON object specifying the block hash. If using a JSON object, you can specify `requireCanonical` to indicate whether the block must be a canonical block. See [this example](https://github.com/hyperledger/besu/blob/a2dedb0b2c7980cdc35db8eb4c094f2eb0dc7deb/ethereum/api/src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/eth/eth_getBalance_blockHashObjectCanonical.json). + + :::note + + Only the following methods support the `blockHash` parameter: + + - [`eth_call`](../../reference/api/index.md#eth_call) + - [`eth_getBalance`](../../reference/api/index.md#eth_getbalance) + - [`eth_getCode`](../../reference/api/index.md#eth_getcode) + - [`eth_getProof`](../../reference/api/index.md#eth_getproof) + - [`eth_getStorageAt`](../../reference/api/index.md#eth_getstorageat) + - [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount) + + ::: + +- `earliest` : _tag_ - The earliest (genesis) block. +- `latest` : _tag_ - The last block mined. +- `pending` : _tag_ - The last block mined plus pending transactions. Use only with [`eth_getTransactionCount`](../../reference/api/index.md#eth_gettransactioncount). +- `finalized` : _tag_ - The most recent crypto-economically secure block. It cannot be reorganized outside manual intervention driven by community coordination. +- `safe` : _tag_ - The most recent block that is safe from reorganization under honest majority and certain synchronicity assumptions. diff --git a/versioned_docs/version-stable/public-networks/how-to/use-besu-api/jwt.png b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/jwt.png new file mode 100644 index 00000000000..ee676469c77 Binary files /dev/null and b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/jwt.png differ diff --git a/versioned_docs/version-stable/public-networks/how-to/use-besu-api/rpc-pubsub.md b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/rpc-pubsub.md new file mode 100644 index 00000000000..4bc56782d7b --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-besu-api/rpc-pubsub.md @@ -0,0 +1,532 @@ +--- +title: Use RPC Pub/Sub over WS +sidebar_position: 2 +description: Using RPC Pub/Sub with Hyperledger Besu WebSockets +tags: + - private networks +--- + +# Use RPC Pub/Sub over WebSockets + +## Introduction + +Subscribe to events by using either RPC Pub/Sub over WebSockets or [filters over HTTP](access-logs.md). + +Use RPC Pub/Sub over WebSockets to wait for events instead of polling for them. For example, dapps subscribe to logs and receive notifications when a specific event occurs. + +Methods specific to RPC Pub/Sub are: + +- `eth_subscribe` and `eth_unsubscribe` - create or cancel a subscription for specific events. +- `priv_subscribe` and `priv_unsubscribe` - create or cancel a subscription for [private logs](../../../private-networks/concepts/privacy/index.md). + +:::info + +Unlike other [Hyperledger Besu API methods](../../reference/api/index.md), you cannot call the RPC Pub/Sub methods over HTTP. Use the [`--rpc-ws-enabled`](../../reference/cli/options.md#rpc-ws-enabled) option to enable the WebSockets JSON-RPC service. + +::: + +### Use RPC Pub/Sub + +[WebSockets](json-rpc.md#http-and-websocket-requests) supports the RPC Pub/Sub API. + +To create subscriptions, use `eth_subscribe` or `priv_subscribe`. Once subscribed, the API publishes notifications using `eth_subscription` or `priv_subscription`. + +Subscriptions couple with connections. If a connection is closed, all subscriptions created over the connection are removed. + +### Subscription ID + +`eth_subscribe` and `priv_subscribe` return a subscription ID for each subscription created. Notifications include the subscription ID. + +For example, to create a synchronizing subscription: + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["syncing"] } +``` + +The result includes the subscription ID of `"0x1"`: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +The notifications also include the subscription ID of `"0x1"`: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": { + "startingBlock": "0x0", + "currentBlock": "0x50", + "highestBlock": "0x343c19" + } + } +} +``` + +### Notifications when synchronizing + +Subscribing to some events (for example, logs) can cause a flood of notifications while the node is synchronizing. + +## Subscribe + +Use `eth_subscribe` to create subscriptions for the following event types: + +- [Use RPC Pub/Sub over WebSockets](#use-rpc-pubsub-over-websockets) + - [Introduction](#introduction) + - [Use RPC Pub/Sub](#use-rpc-pubsub) + - [Subscription ID](#subscription-id) + - [Notifications when synchronizing](#notifications-when-synchronizing) + - [Subscribe](#subscribe) + - [New headers](#new-headers) + - [Logs](#logs) +- [All logs](#all-logs) +- [Specific address, topic, fromBlock and toBlock](#specific-address-topic-fromblock-and-toblock) +- [Result](#result) +- [Notification](#notification) +- [All logs for privacy group](#all-logs-for-privacy-group) +- [Specific address and topic](#specific-address-and-topic) +- [Result](#result-1) +- [Notification](#notification-1) + - [Pending transactions](#pending-transactions) + - [Dropped transactions](#dropped-transactions) + - [Synchronizing](#synchronizing) + - [Unsubscribe](#unsubscribe) + +Use `priv_subscribe` to [create subscriptions for logs on private contracts](#logs). + +:::tip + +Only logs subscriptions are relevant for private transactions because private transactions are anchored to the public chain rather than having their own private blockchain. + +::: + +### New headers + +To notify you about each block added to the blockchain, use the `newHeads` parameter with `eth_subscribe`. + +If a chain reorganization occurs, the subscription publishes notifications for blocks in the new chain. This means the subscription can publish notifications for multiple blocks at the same height on the blockchain. + +The new headers notification returns [block objects](../../reference/api/objects.md#block-object). The second parameter is optional. If specified, the notifications include whole [transaction objects](../../reference/api/objects.md#transaction-object), Otherwise, the notifications include transaction hashes. + +To subscribe to new header notifications: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newHeads", { "includeTransactions": true }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 2, "result": "0x1" } +``` + +Example notification without the `{"includeTransactions": true}` parameter included: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": { + "number": "0x40c22", + "hash": "0x16af2ee1672203c7ac13ff280822008be0f38e1e5bdc675760015ae3192c0e3a", + "parentHash": "0x1fcf5dadfaf2ab4d985eb05d40eaa23605b0db25d736610c4b87173bfe438f91", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00008000000000080000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000040000000000000000000000000000000000000000001000000000000000000000040000000000000000000000000000000000000400000000010000000000000000100000000000020000000000000000000000000000000000010000000000000000000000000000000000000000000", + "transactionsRoot": "0x5b2e3c1a49352f1ca9fb5dfe74b7ffbbb6d70e23a12693444e26058d8a8e6296", + "stateRoot": "0xbe8d3bc58bd982421a3ea8b66753404502df0f464ae78a17661d157c406dd38b", + "receiptsRoot": "0x81b175ec1f4d44fbbd6ba08f1bd3950663b307b7cb35751c067b535cc0b58f12", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x7c16e", + "extraData": "0xd783010600846765746887676f312e372e33856c696e757800000000000000002160f780bb1f61eda045c67cdb1297ba37d8349df8035533cb0cf82a7e45f23f3d72bbec125a9f499b3eb110b7d1918d466cb2ede90b38296cfe2aaf452c513f00", + "size": "0x3a1", + "gasLimit": "0x47e7c4", + "gasUsed": "0x11ac3a", + "timestamp": "0x592afc24", + "uncles": [], + "transactions": [ + "0x419c69d21b14e2e8f911def22bb6d0156c876c0e1c61067de836713043364d6c", + "0x70a5b2cb2cee6e0b199232a1757fc2a9d6053a4691a7afef8508fd88aeeec703", + "0x4b3035f1d32339fe1a4f88147dc197a0fe5bbd63d3b9dec2dad96a3b46e4fddd" + ] + } + } +} +``` + +Example notification with the `{"includeTransactions": true}` parameter included: + +```json +{ +"jsonrpc": "2.0", +"method": "eth_subscription", +"params":{ + "subscription":"0x1", + "result": { + .... + "transactions":[ + { + "blockHash":"0xa30ee4d7c271ae5150aec494131c5f1f34089c7aa8fb58bd8bb916a55275bb90", + "blockNumber":"0x63", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0x5208", + "gasPrice":"0x3b9aca00", + "hash":"0x11f66c3e96a92e3c14c1c33ad77381221bf8b58a887b4fed6aee456fc6f39b24", + "input":"0x", + "nonce":"0x1", + "to":"0x627306090abab3a6e1400e9345bc60c78a8bef57", + "transactionIndex":"0x0", + "value":"0x56bc75e2d63100000", + "v":"0xfe8", + "r":"0x4b57d179c74885ef5f9326fd000665ea7fae44095c1e2016a2817fc671beb8cc", + "s":"0x7ec060b115746dda392777df07ae1feacc0b83b3646f0a3de9a5fc3615af9bb8", + } + ], + }, + } +} +``` + +### Logs + +To notify you about [logs](../../concepts/events-and-logs.md) included in new blocks, use the `logs` parameter with `eth_subscribe` or `priv_subscribe`. Specify a filter object to receive notifications only for logs matching your filter. + +Logs subscriptions have an filter object parameter with the following fields: + +- `address` - (optional) Either an address or an array of addresses. Returns only logs created from these addresses. +- `topics` - (optional) Returns only logs that match the [specified topics](../../concepts/events-and-logs.md#topic-filters). +- `fromBlock` - (optional) The earliest block from which to return logs. +- `toBlock` - (optional) The last block from which to return logs. + +For private contracts, the privacy group ID must be specified. Only members of a privacy group receive logs for a private contract subscription. If you create a subscription for a privacy group you are not a member of, you will not receive any notifications. + +If a chain reorganization occurs, the subscription publishes notifications for logs from the old chain with the `removed` property in the [log object](../../reference/api/objects.md#log-object) set to `true`. This means the subscription can publish notifications for multiple logs for the same transaction. + +The logs subscription returns [log objects](../../reference/api/objects.md#log-object). + + + +# All logs + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["logs", {}] } +``` + +# Specific address, topic, fromBlock and toBlock + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": [ + "logs", + { + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "topics": [ + "0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902" + ], + "fromBlock": "0x0", + "toBlock": "latest" + } + ] +} +``` + +# Result + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x2" } +``` + +# Notification + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x2", + "result": { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x2174", + "blockHash": "0x7bc83837534aa13df55ff7db77784b1d1ba666d4c4bdd223cae9fe09c7c37eba", + "transactionHash": "0x942179373e413824c6bc7045e92295aff91b679215446549b4aeb084da46495b", + "transactionIndex": "0x0", + "address": "0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517", + "data": "0x", + "topics": [ + "0x199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca072787", + "0x0000000000000000000000000000000000000000000000000000000000000005" + ] + } + } +} +``` + + + + + +# All logs for privacy group + +```json +{ + "id": 1, + "method": "priv_subscribe", + "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "logs", {}] +} +``` + +# Specific address and topic + +```json +{ + "id": 1, + "method": "priv_subscribe", + "params": [ + "4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", + "logs", + { + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "topics": [ + "0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902" + ] + } + ] +} +``` + +# Result + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +# Notification + +```json +{ + "jsonrpc": "2.0", + "method": "priv_subscription", + "params": { + "subscription": "0x1", + "privacyGroupId": "4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", + "result": { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x285", + "blockHash": "0x98490766b16de2a4d044c04d92599d71e626bc96e42f0c74274ef4e03fafd579", + "transactionHash": "0x40034ef14e3a22946693dd2a11efddf3a8850ddcad46b408198df6c176c53ffb", + "transactionIndex": "0x0", + "address": "0x61f96a7ed09877197d4fff0c29b8e523913651a9", + "data": "0x", + "topics": [ + "0x85bea11d86cefb165374e0f727bacf21dc2f4ea816493981ecf72dcfb212a410", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ] + } + } +} +``` + + + +### Pending transactions + +To notify you about pending transactions added to the transaction pool for the node, use the `newPendingTransactions` parameter with `eth_subscribe`. + +The pending transactions subscription returns the transaction hashes or transaction details of the pending transactions. If the `includeTransactions` parameter is not included, the default is transaction hashes only. + +If a chain reorganization occurs, Besu resubmits transactions for inclusion in the new canonical chain. This means the subscription can publish notifications for the same pending transaction more than once. + +To subscribe to pending transaction notifications and receive transaction hashes only: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newPendingTransactions", { "includeTransactions": false }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": "0x5705bc8bf875ff03e98adb98489428835892dc6ba6a6b139fee1becbc26db0b8" + } +} +``` + +To subscribe to pending transaction notifications and receive transaction details: + +```json +{ + "id": 1, + "method": "eth_subscribe", + "params": ["newPendingTransactions", { "includeTransactions": true }] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x2" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x2", + "result": { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0x2540be400", + "hash": "0x7a4185f40ee93cb27eb132f301d0a5414c1f871051f166fc8804c376aab3ffec", + "input": "0x", + "nonce": "0x13", + "to": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f", + "value": "0x8ac7230489e80000", + "v": "0xfe7", + "r": "0xdd9013c67469d2fe79afdc61777c55bdced33c90fa6f9b83d8f9b7e445085123", + "s": "0x45823a1ab22ae9c83876ea435dc5ecc4fe3a83c1bfbc340a5f57df2f5a474fa5" + } + } +} +``` + +### Dropped transactions + +To notify you about transactions dropped from the transaction pool for the node, use the `droppedPendingTransactions` parameter with `eth_subscribe`. + +The dropped transactions subscription returns the transaction hashes of the dropped transactions. + +Dropped transactions can be re-added to the transaction pool from a variety of sources. For example, receiving a previously dropped transaction from a peer. As a result, it's possible to receive multiple dropped transaction notifications for the same transaction. + +To subscribe to dropped transaction notifications: + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["droppedPendingTransactions"] } +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x1" } +``` + +Example notification: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x1", + "result": "0xf57d6a90a7fb30880cfbdf6b432b487d0e94a3b55b34dc4b45e3b0b237ecab4c" + } +} +``` + +### Synchronizing + +To notify you about synchronization progress, use the `syncing` parameter with `eth_subscribe`. + +When behind the chain head, the synchronizing subscription returns an object indicating the synchronization progress. When fully synchronized, returns `false`. + +To subscribe to synchronizing notifications: + +```json +{ "id": 1, "method": "eth_subscribe", "params": ["syncing"] } +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": "0x4" } +``` + +Example notification while synchronizing: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4", + "result": { + "startingBlock": "0x0", + "currentBlock": "0x3e80", + "highestBlock": "0x67b93c" + } + } +} +``` + +Example notification when synchronized with chain head: + +```json +{ + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4", + "result": false + } +} +``` + +## Unsubscribe + +To cancel a subscription, use the [subscription ID](#subscription-id) with `eth_unsubscribe` or `priv_unsubscribe`. Only the connection that created a subscription can unsubscribe from it. + +When cancelling a subscription for private logs, the privacy group ID must be specified. + +`eth_unsubscribe` and `priv_unsubscribe` return `true` if subscription successfully unsubscribed; otherwise, returns an error. + +To unsubscribe from a subscription with subscription ID of `0x1`: + +```json +{ "id": 1, "method": "eth_unsubscribe", "params": ["0x1"] } +``` + +To unsubscribe from private logs subscription: + +```json +{ + "id": 1, + "method": "priv_unsubscribe", + "params": ["4sSv8eqB6/0lV9I0tBGUhPjjHtLEf3z0eeMc8Lokkyo=", "0x2"] +} +``` + +Example result: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": true } +``` diff --git a/versioned_docs/version-stable/public-networks/how-to/use-engine-api.md b/versioned_docs/version-stable/public-networks/how-to/use-engine-api.md new file mode 100644 index 00000000000..1155a51fe6a --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-engine-api.md @@ -0,0 +1,220 @@ +--- +title: Use the Engine API +sidebar_position: 2 +description: Use the Engine API to communicate with a consensus client. +tags: + - public networks +--- + +# Use the Engine API + +[Consensus and execution clients](../concepts/the-merge.md#execution-and-consensus-clients) communicate with each other using the [Engine API](../reference/engine-api/index.md). These API methods are a separate subsection of the [JSON-RPC API](../how-to/use-besu-api/index.md). + +## Configure the Engine API + +To configure the Engine API: + +- [Enable the Engine API](#enable-the-engine-api) (it's disabled by default). +- [Enable the JSON-RPC API](use-besu-api/index.md#enable-api-access). Ensure the [`ETH` method is enabled](use-besu-api/json-rpc.md#api-methods-enabled-by-default) (it's enabled by default). +- Specify the [service ports](#service-ports). +- Specify the [host allowlist](#host-allowlist). + +```bash title="Example Engine API configuration" +besu --engine-rpc-enabled --rpc-http-enabled --engine-rpc-port=8551 --engine-host-allowlist=localhost,127.0.0.1 --engine-jwt-secret=jwt.hex +``` + +### Enable the Engine API + +Enable the Engine API with the [`--engine-rpc-enabled`](../reference/cli/options.md#engine-rpc-enabled) CLI option. + +:::note + +The `--engine-rpc-enabled` CLI option enables the Engine API even if no consensus client configuration exists. + +::: + +### Service ports + +To specify the port the Engine API service listens on for HTTP and WebSocket, use the [`--engine-rpc-port`](../reference/cli/options.md#engine-rpc-port) option. The default is `8551`. + +### Host allowlist + +To prevent DNS rebinding attacks, Besu checks incoming HTTP request host headers, WebSocket connections, and GraphQL requests. Besu accepts requests only when hostnames specified using the [`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) option matches the request host headers. By default, Besu accepts requests and connections from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the Engine API, we recommend using [authentication](#authentication). + +::: + +If your application publishes RPC ports, specify the hostnames when starting Besu. + +Specify `*` for `--engine-host-allowlist` to effectively disable host protection. + +:::caution + +We don't recommend specifying `*` for `--engine-host-allowlist` in production. + +::: + +## Authentication + +By default, [authentication](../how-to/use-besu-api/authenticate.md) for the Engine API is enabled. To disable, set the [`--engine-jwt-disabled`](../reference/cli/options.md#engine-jwt-disabled) option to `true`. + +:::caution + +Don't disable JWT authentication in production environments. + +Disable only for testing purposes. + +::: + +Set the [JWT secret](use-besu-api/authenticate.md#jwt-public-key-authentication) by using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. + +## Send a payload using the Engine API + +### 1. Prepare a payload + +Prepare to send a payload using [`engine_forkchoiceUpdatedV1`](../reference/engine-api/index.md#engine_forkchoiceupdatedv1). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "safeBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", "finalizedBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000"},{"timestamp": "0x5","prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000","suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"}],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } +} +``` + + + +### 2. Get the payload + +Get the payload using [`engine_getPayloadV1`](../reference/engine-api/index.md#engine_getpayloadv1) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x1"],"id":1}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +} +``` + + + +### 3. Execute the payload + +Execute the payload using [`engine_newPayloadV1`](../reference/engine-api/index.md#engine_newpayloadv1) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } +} +``` + + + +### 4. Update the fork choice + +Update the fork choice using [`engine_forkchoiceUpdatedV1`](../reference/engine-api/index.md#engine_forkchoiceupdatedv1) again. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": null + } +} +``` + + diff --git a/versioned_docs/version-stable/public-networks/how-to/use-pow/_category_.json b/versioned_docs/version-stable/public-networks/how-to/use-pow/_category_.json new file mode 100644 index 00000000000..1381dd9fc66 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-pow/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Use proof of work", + "position": 10 +} diff --git a/versioned_docs/version-stable/public-networks/how-to/use-pow/mining.md b/versioned_docs/version-stable/public-networks/how-to/use-pow/mining.md new file mode 100644 index 00000000000..6dbd9b29f52 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/how-to/use-pow/mining.md @@ -0,0 +1,111 @@ +--- +title: Configure mining +sidebar_position: 1 +description: Using Hyperledger Besu for PoW CPU mining +tags: + - public networks + - private networks +--- + +# Configure mining + +Hyperledger Besu supports CPU and GPU mining, which are configured using command line options. + +GPU mining tests used [Ethminer](https://github.com/ethereum-mining/ethminer) with the `stratum+tcp` and `getwork` schemes. + +Ethminer has been used with Hyperledger Besu to mine blocks on the [Ropsten testnet](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine), [ETC Mainnet (uncle block only)](https://etc.tokenview.com/en/uncleblock/10555173) and Mordor ETC testnet. + +:::note + +- Some mining software supports the `getwork` scheme as the `http` scheme. + +- The Ropsten testnet is now deprecated. It transitioned to proof of stake consensus before deprecation. + +::: + +## Configure CPU mining + +To enable CPU mining, start Hyperledger Besu with the following options: + +```bash +besu --rpc-http-api=ETH,MINER --miner-enabled --miner-coinbase= +``` + +Where `` is the account you pay mining rewards to. For example, `fe3b557e8fb62b89f4916b721be55ceb828dbd73`. + +Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and [`miner_stop`](../../reference/api/index.md#miner_stop) APIs. + +## Configure GPU mining + +Besu supports GPU mining, tested using [Ethminer](https://github.com/ethereum-mining/ethminer) with the `stratum+tcp` scheme. + +To enable GPU mining, start Hyperledger Besu with the following options: + +```bash +besu --rpc-http-api=ETH,MINER --miner-enabled --miner-stratum-enabled --miner-coinbase= +``` + +Where `` is the account you pay mining rewards to. For example, `fe3b557e8fb62b89f4916b721be55ceb828dbd73`. + +Optional command line options are: + +- [`--miner-stratum-host`](../../reference/cli/options.md#miner-stratum-host) to specify the host of the mining service. +- [`--miner-stratum-port`](../../reference/cli/options.md#miner-stratum-port) to specify the port of the mining service. + +:::note + +Besu also supports the `getwork` scheme. Use the [`--miner-stratum-enabled`](../../reference/cli/options.md#miner-stratum-enabled) option and [enable the `ETH` RPCs](../../reference/cli/options.md#rpc-http-api). + +The `getwork` scheme is supported as the `http` scheme in certain mining software. + +::: + +Start and stop mining using the [`miner_start`](../../reference/api/index.md#miner_start) and [`miner_stop`](../../reference/api/index.md#miner_stop) APIs. + +## Mining APIs + +The JSON-RPC API methods for mining are: + +- [`miner_start`](../../reference/api/index.md#miner_start) to start mining. +- [`miner_stop`](../../reference/api/index.md#miner_stop) to stop mining. +- [`eth_mining`](../../reference/api/index.md#eth_mining) to determine whether the client is actively mining new blocks. +- [`eth_getMinerDataByBlockHash`](../../reference/api/index.md#eth_getminerdatabyblockhash) and [`eth_getMinerDataByBlockNumber`](../../reference/api/index.md#eth_getminerdatabyblocknumber) to get the miner data for a specified block. +- [`eth_hashrate`](../../reference/api/index.md#eth_hashrate) to get the number of hashes per second with which the node is mining. Not supported for GPU mining. +- [`eth_getWork`](../../reference/api/index.md#eth_getwork) to get the hash of the current block, the seed hash, and the target boundary condition. Only used when using the `getwork` scheme. +- [`eth_submitWork`](../../reference/api/index.md#eth_submitwork) to submit the PoW solution. Only used when using the `getwork` scheme. + +## Besu mined blocks + +Besu has successfully mined blocks on the Ropsten testnet, ETC Mainnet (uncle block only) and Mordor ETC testnet. Blocks mined by the Hyperledger Besu team contain the version number used in the block's `extraData` field. The following accounts have been used to mine on public networks with Hyperledger Besu: + +- **Ropsten**: [`0x2f14582947E292a2eCd20C430B46f2d27CFE213c`](https://ropsten.etherscan.io/address/0x2f14582947E292a2eCd20C430B46f2d27CFE213c#mine) +- **ETC**: [`0x3125309aa670f5e60493b50884a7e7abf9ebb701`](https://etc.tokenview.com/en/address/0x3125309aa670f5e60493b50884a7e7abf9ebb701) +- **Mordor**: `0x2f14582947E292a2eCd20C430B46f2d27CFE213c` + +## Troubleshoot + +### Check block creation + +On mining nodes, log messages indicate block creation. + +```bash +2019-05-08 20:28:27.026+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=660, Round=0}, hash=0x759afaba4e923d89175d850ceca4b8ef81f7d9c727b0b0b8e714b624a4b8e8cc +2019-05-08 20:28:29.020+10:00 | pool-10-thread-1 | INFO | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=661, Round=0}, hash=0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14 +``` + +On non-mining nodes, log messages indicate importing blocks. + +```bash +2019-05-08 20:28:29.026+10:00 | EthScheduler-Workers-1 | INFO | BlockPropagationManager | Imported #661 / 0 tx / 0 om / 0 (0.0%) gas / (0x5443e504256765f06b3cebfbee82276a034ebcc8d685b7c3d1a6010fd4acfa14) in 0.000s. +2019-05-08 20:28:31.031+10:00 | EthScheduler-Workers-0 | INFO | BlockPropagationManager | Imported #662 / 0 tx / 0 om / 0 (0.0%) gas / (0x0ead4e20123d3f1433d8dec894fcce386da4049819b24b309963ce7a8a0fcf03) in 0.000s. +``` + +To confirm the block number is increasing, use the [`eth_blockNumber`](../../reference/api/index.md#eth_blocknumber) JSON-RPC API method. + +If there's no block creation in [Clique](../../../private-networks/how-to/configure/consensus/clique.md#extra-data) or [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md#extra-data) networks, ensure the validator addresses in the genesis file match running nodes. + +### No mined transactions + +If you add a transaction to the [transaction pool](../../concepts/transactions/pool.md) and the transaction hash returns, but the transaction is never mined, check the [`--min-gas-price`](../../reference/cli/options.md#min-gas-price) option on mining nodes. If the `gasPrice` on a [transaction](../send-transactions.md) is lower than the `min-gas-price` for the mining node, the transaction will never mine. + +In [free gas networks](../../../private-networks/how-to/configure/free-gas.md), you must set [`--min-gas-price`](../../reference/cli/options.md#min-gas-price) to zero. diff --git a/versioned_docs/version-stable/public-networks/index.md b/versioned_docs/version-stable/public-networks/index.md new file mode 100644 index 00000000000..d16d273afd8 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/index.md @@ -0,0 +1,25 @@ +--- +title: Public networks +sidebar_position: 1 +sidebar_label: Introduction +description: Public networks overview +tags: + - public networks +--- + +# Hyperledger Besu for public networks + +Besu serves as an [execution client](concepts/the-merge.md#execution-clients) on public proof-of-stake Ethereum networks such as Ethereum Mainnet, Goerli, and Sepolia. + +You can also run Besu using proof of work on [Ethereum Classic (ETC)](how-to/use-pow/mining.md). + +Get started by [installing Besu](get-started/install/index.md). + +## Architecture + +The following diagram outlines the high-level architecture of Besu for public networks. + +![Public architecture](../assets/images/public-architecture.jpeg) + +If you have any questions about Besu for public networks, ask on the **besu** channel on +[Hyperledger Discord](https://discord.gg/hyperledger). diff --git a/versioned_docs/version-stable/public-networks/reference/_category_.json b/versioned_docs/version-stable/public-networks/reference/_category_.json new file mode 100644 index 00000000000..1f988aef3d0 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Reference", + "position": 6, + "link": { + "type": "generated-index", + "slug": "public-networks/reference" + } +} diff --git a/versioned_docs/version-stable/public-networks/reference/api/index.md b/versioned_docs/version-stable/public-networks/reference/api/index.md new file mode 100644 index 00000000000..852a6cc370f --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/api/index.md @@ -0,0 +1,6659 @@ +--- +title: Besu API +sidebar_position: 2 +description: Hyperledger Besu JSON-RPC API methods reference +tags: + - public networks + - private networks +--- + +import Postman from '../../../global/postman.md' + +# Besu API methods + +:::caution + +- This reference contains API methods that apply to both public and private networks. For private-network-specific API methods, see the [private network API reference](../../../private-networks/reference/api/index.md). +- All JSON-RPC HTTP examples use the default host and port endpoint `http://127.0.0.1:8545`. If using the [--rpc-http-host](../cli/options.md#rpc-http-host) or [--rpc-http-port](../cli/options.md#rpc-http-port) options, update the endpoint. +- Most example requests are made against private networks. Depending on network configuration and activity, your example results might be different. + +::: + + + +## `ADMIN` methods + +The `ADMIN` API methods provide administrative functionality to manage your node. + +:::note + +The `ADMIN` API methods are not enabled by default for JSON-RPC. To enable the `ADMIN` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `admin_addPeer` + +Adds a [static node](../../how-to/connect/static-nodes.md). + +:::caution + +If connections are timing out, ensure the node ID in the [enode URL](../../concepts/node-keys.md#enode-url) is correct. + +::: + +#### Parameters + +`enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of peer to add + +#### Returns + +`result`: _boolean_ - `true` if peer added or `false` if peer already a [static node](../../how-to/connect/static-nodes.md) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `admin_changeLogLevel` + +Changes the log level without restarting Besu. You can change the log level for all logs, or you can change the log level for specific packages or classes. + +You can specify only one log level per RPC call. + +#### Parameters + +- `level`: _string_ - [log level](../cli/options.md#logging) + +- `log_filter`: _array_ - (optional) packages or classes for which to change the log level + +#### Returns + +`result`: _string_ - `Success` if the log level has changed, otherwise `error` + +The following example changes the debug level for specified classes to `DEBUG`. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0", "method":"admin_changeLogLevel", "params":["DEBUG", ["org.hyperledger.besu.ethereum.eth.manager","org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.ApiHandler"]], "id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +The following example changes the debug level of all logs to `WARN`. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_changeLogLevel","params":["WARN"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_changeLogLevel", + "params": ["WARN"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `admin_generateLogBloomCache` + +Generates cached log bloom indexes for blocks. APIs such as [`eth_getLogs`](#eth_getlogs) and [`eth_getFilterLogs`](#eth_getfilterlogs) use the cache for improved performance. + +:::tip + +Manually executing `admin_generateLogBloomCache` is not required unless the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option is set to false. + +::: + +:::note + +Each index file contains 100000 blocks. The last fragment of blocks less than 100000 are not indexed. + +::: + +#### Parameters + +- `startBlock`: _string_ - block to start generating indexes + +- `endBlock`: _string_ - block to stop generating indexes + +#### Returns + +`result`: _object_ - log bloom index details: + +- `startBlock`: _string_ - starting block for the last requested cache generation + +- `endBlock`: _string_ - ending block for the last requested cache generation + +- `currentBlock`: _string_ - most recent block added to the cache + +- `indexing`: _boolean_ - indicates if indexing is in progress + +- _boolean_ - indicates acceptance of the request from this call to generate the cache + + + +# curl HTTP request + +```bash +curl -X POST --data '{jsonrpc":"2.0","method":"admin_generateLogBloomCache", "params":["0x0", "0x10000"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_generateLogBloomCache", + "params": ["0x0", "0x10000"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "startBlock": "0x0", + "endBlock": "0x10000", + "currentBlock": "0x0", + "indexing": true, + "requestAccepted": true + } +} +``` + + + +### `admin_logsRemoveCache` + +Removes cache files for the specified range of blocks. + +#### Parameters + +- `fromBlock`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `toBlock`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +You can skip a parameter by using an empty string, `""`. If you specify: + +- No parameters, the call removes cache files for all blocks. + +- Only `fromBlock`, the call removes cache files for the specified block. + +- Only `toBlock`, the call removes cache files from the genesis block to the specified block. + +#### Returns + +`result`: _object_ - `Cache Removed` status or `error`. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRemoveCache","params":["1", "100"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_logsRemoveCache", + "params": ["1", "100"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "Status": "Cache Removed" + } +} +``` + + + +### `admin_logsRepairCache` + +Repairs cached logs by fixing all segments starting with the specified block number. + +#### Parameters + +`startBlock`: _string_ - decimal index of the starting block to fix; defaults to the head block + +#### Returns + +`result`: _object_ - status of the repair request; `Started` or `Already running` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_logsRepairCache","params":["1200"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "admin_logsRepairCache", + "params": ["1200"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "Status": "Started" + } +} +``` + + + +### `admin_nodeInfo` + +Returns networking information about the node. The information includes general information about the node and specific information from each running Ethereum sub-protocol (for example, `eth`). + +#### Parameters + +None + +#### Returns + +`result`: _object_ - node object with the following fields: + +- `enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of the node + +- `listenAddr`: _string_ - host and port for the node + +- `name`: _string_ - client name + +- `id`: _string_ - [node public key](../../concepts/node-keys.md#node-public-key) + +- `ports`: _object_ - peer discovery and listening [ports](../../how-to/connect/manage-peers.md#port-configuration) + +- `protocols`: _object_ - list of objects containing information for each Ethereum sub-protocol + +:::note + +If the node is running locally, the host of the `enode` and `listenAddr` display as `[::]` in the result. When advertising externally, the external address displayed for the `enode` and `listenAddr` is defined by [`--nat-method`](../../how-to/connect/specify-nat.md). + +::: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enode": "enode://87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3@[::]:30303", + "listenAddr": "[::]:30303", + "name": "besu/v1.0.1-dev-0d2294a5/osx-x86_64/oracle-java-1.8", + "id": "87ec35d558352cc55cd1bf6a472557797f91287b78fe5e86760219124563450ad1bb807e4cc61e86c574189a851733227155551a14b9d0e1f62c5e11332a18a3", + "ports": { + "discovery": 30303, + "listener": 30303 + }, + "protocols": { + "eth": { + "config": { + "chainId": 2018, + "homesteadBlock": 0, + "daoForkBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "constantinopleFixBlock": 0, + "ethash": { + "fixeddifficulty": 100 + } + }, + "difficulty": 78536, + "genesis": "0x43ee12d45470e57c86a0dfe008a5b847af9e372d05e8ba8f01434526eb2bea0f", + "head": "0xc6677651f16d07ae59cab3a5e1f0b814ed2ec27c00a93297b2aa2e29707844d9", + "network": 2018 + } + } + } +} +``` + + + +### `admin_peers` + +Returns networking information about connected remote nodes. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _objects_ - list of objects returned for each remote node, with the following fields. + +- `version`: _string_ - P2P protocol version + +- `name`: _string_ - client name + +- `caps`: _array_ of _strings_ - list of Ethereum sub-protocol capabilities + +- `network`: _object_ - local and remote addresses established at time of bonding with the peer (the remote address might not match the hex value for `port`; it depends on which node initiated the connection.) + +- `port`: _string_ - port on the remote node on which P2P discovery is listening + +- `id`: _string_ - node public key (excluding the `0x` prefix, the node public key is the ID in the [enode URL](../../concepts/node-keys.md#enode-url) `enode://@:`.) + +- `protocols`: _object_ - [current state of peer](../../how-to/connect/manage-peers.md#monitor-peer-connections) including `difficulty` and `head` (`head` is the hash of the highest known block for the peer.) + +- `enode`: _string_ - enode URL of the remote node + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "version": "0x5", + "name": "besu/v20.10.4-dev-0905d1b2/osx-x86_64/adoptopenjdk-java-11", + "caps": ["eth/62", "eth/63", "eth/64", "eth/65", "IBF/1"], + "network": { + "localAddress": "192.168.1.229:50115", + "remoteAddress": "168.61.153.255:40303" + }, + "port": "0x765f", + "id": "0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc", + "protocols": { + "eth": { + "difficulty": "0x1ac", + "head": "0x964090ae9277aef43f47f1b8c28411f162243d523118605f0b1231dbfdf3611a", + "version": 65 + } + }, + "enode": "enode://e143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc@127.0.0.1:30303" + } + ] +} +``` + + + +### `admin_removePeer` + +Removes a [static node](../../how-to/connect/static-nodes.md). + +#### Parameters + +`enode`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of peer to remove + +#### Returns + +`result`: _boolean_ - `true` if peer removed or `false` if peer not a [static node](../../how-to/connect/static-nodes.md) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"admin_removePeer","params":["enode://f59c0ab603377b6ec88b89d5bb41b98fc385030ab1e4b03752db6f7dab364559d92c757c13116ae6408d2d33f0138e7812eb8b696b2a22fe3332c4b5127b22a3@127.0.0.1:30304"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `DEBUG` methods + +The `DEBUG` API methods allow you to inspect and debug the network. The `DEBUG` API is a more verbose alternative to the [`TRACE` API](#trace-methods), and its main purpose is compatibility with tools such as [Remix](https://remix.ethereum.org/). Where these APIs overlap, we recommend using the [`TRACE` API](#trace-methods) for production use over the `DEBUG` API. Specifically, we recommend `trace_block` over `debug_traceBlock`, and `trace_transaction` over `debug_traceTransaction`. + +:::note + +The `DEBUG` API methods are not enabled by default for JSON-RPC. To enable the `DEBUG` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `debug_accountAt` + +Returns account information at the specified index of the specified block. + +#### Parameters + +- `blockHashOrNumber`: _string_ - block hash or number at which to retrieve account information + +- `txIndex`: _number_ - transaction index at which to retrieve account information + +- `address`: _string_ - contract or account address for which to retrieve information + +#### Returns + +`result`: _object_ - account details object with the following fields: + +- `code`: _data_ - code for the account. Displays `0x0` if the address is an externally owned account. + +- `nonce`: _quantity_ - number of transactions made by the account before this one + +- `balance`: _quantity_ - balance of the account in Wei + +- `codehash`: _data_ - code hash for the account + +This example uses an externally owned account address for the `address` parameter. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", 0, "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountAt", + "params": [ + "0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6", + 0, + "0xbcde5374fce5edbc8e2a8697c15331677e6ebf0b" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "code": "0x0", + "nonce": "0x5", + "balance": "0xad78ebc5ac6200000", + "codehash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + } +} +``` + + + +This example uses a contract address for the `address` parameter. + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", 0, "0x0e0d2c8f7794e82164f11798276a188147fbd415"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountAt", + "params": [ + "0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", + 0, + "0x0e0d2c8f7794e82164f11798276a188147fbd415" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "code": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b27b880414610030575b600080fd5b61004a60048036038101906100459190610108565b61004c565b005b60606000806000604051935036600085376000803686885af490503d9150816000853e806000811461007d57610093565b60008311156100925761012085019350836040525b5b5060008114156100ec578473ffffffffffffffffffffffffffffffffffffffff167f410d96db3f80b0f89b36888c4d8a94004268f8d42309ac39b7bcba706293e099856040516100e3919061016e565b60405180910390a25b5050505050565b60008135905061010281610227565b92915050565b60006020828403121561011e5761011d610211565b5b600061012c848285016100f3565b91505092915050565b600061014082610190565b61014a818561019b565b935061015a8185602086016101de565b61016381610216565b840191505092915050565b600060208201905081810360008301526101888184610135565b905092915050565b600081519050919050565b600082825260208201905092915050565b60006101b7826101be565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156101fc5780820151818401526020810190506101e1565b8381111561020b576000848401525b50505050565b600080fd5b6000601f19601f8301169050919050565b610230816101ac565b811461023b57600080fd5b5056fea2646970667358221220fdfb5c371055342507b8fb9ca7b0c234f79819bd5cb05c0d467fb605de979eb564736f6c63430008060033", + "nonce": "0x1", + "balance": "0x0", + "codehash": "0xf5f334d41776ed2828fc910d488a05c57fe7c2352aab2d16e30539d7726e1562" + } +} +``` + + + +### `debug_accountRange` + +[Retesteth](https://github.com/ethereum/retesteth/wiki/Retesteth-Overview) uses `debug_accountRange` to implement debugging. + +Returns the accounts for a specified block. + +#### Parameters + +- `blockHashOrNumber`: _string_ - block hash or number at which to retrieve account information + +- `txIndex`: _number_ - transaction index at which to retrieve account information + +- `address`: _string_ - address hash from which to start + +- `limit`: _integer_ - maximum number of account entries to return + +#### Returns + +`result`: _object_ - account details object with the following fields: + +- `addressMap`: _map_ of _strings_ to _strings_ - map of address hashes and account addresses + +- `nextKey`: _string_ - hash of the next address if any addresses remain in the state, otherwise zero + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_accountRange","params":["12345", 0, "0", 5],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_accountRange", + "params": ["12345", 0, "0", 5], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "addressMap": { + "0x005e5...86960": "0x0000000000000000000000000000000000000000", + "0x021fe...6ffe3": "0x0000000000000000000000000000000000000000", + "0x028e6...ab776": "0x0000000000000000000000000000000000000000", + "0x02cb5...bc4d8": "0x0000000000000000000000000000000000000000", + "0x03089...23fd5": "0x0000000000000000000000000000000000000000" + }, + "nextKey": "0x04242954a5cb9748d3f66bcd4583fd3830287aa585bebd9dd06fa6625976be49" + } +} +``` + + + +### `debug_batchSendRawTransaction` + +Sends a list of [signed transactions](../../how-to/send-transactions.md). This is used to quickly load a network with a lot of transactions. This does the same thing as calling [`eth_sendRawTransaction`](#eth_sendrawtransaction) multiple times. + +#### Parameters + +`data`: _string_ - signed transaction data array + +#### Returns + +`result`: _array_ of _objects_ - object returned for each transaction, with the following fields: + +- `index`: _string_ - index of the transaction in the request parameters array + +- `success`: _boolean_ - indicates whether or not the transaction has been added to the transaction pool + +- `errorMessage`: _string_ - (optional) error message + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"debug_batchSendRawTransaction","params":["0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ba0ac74ecfa0e9b85785f042c143ead4780931234cc9a032fce99fab1f45e0d90faa02fd17e8eb433d4ca47727653232045d4f81322619c0852d3fe8ddcfcedb66a43","0x416","0xf868018203e882520894627306090abab3a6e1400e9345bc60c78a8bef57872386f26fc10000801ca0b24ea1bee8fe36984c36acbf80979a4509f23fc17141851e08d505c0df158aa0a00472a05903d4cd7a811bd4d5c59cc105d93f5943f3393f253e92e65fc36e7ce0","0xf868808203e882520894627306090abab3a6e1400e9345bc60c78a8bef5787470de4df820000801ca0f7936b4de04792e3c65095cfbfd1399d231368f5f05f877588c0c8509f6c98c9a01834004dead527c8da1396eede42e1c60e41f38a77c2fd13a6e495479c729b99"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "index": 0, + "success": true + }, + { + "index": 1, + "success": false, + "errorMessage": "Invalid raw transaction hex" + }, + { + "index": 2, + "success": true + }, + { + "index": 3, + "success": false, + "errorMessage": "TRANSACTION_REPLACEMENT_UNDERPRICED" + } + ] +} +``` + + + +### `debug_getBadBlocks` + +Returns a list of invalid blocks. This is used to detect and analyze consensus flaws. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _objects_ - list of [block objects](objects.md#block-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```bash +{"jsonrpc":"2.0","method":"debug_getBadBlocks","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "block": { + "number": "0xd", + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x02c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41", + "stateRoot": "0x861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5", + "receiptsRoot": "0xccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x1", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a488", + "timestamp": "0x5f5b6824", + "uncles": [], + "transactions": [ + { + "blockHash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "blockNumber": "0xd", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a49e", + "gasPrice": "0x3e8", + "hash": "0xdd8cf045113754c306ba9ac8ac8786235e33bc5c087678084ef260a2a583f127", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0xa7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7", + "s": "0x130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fca" + } + ] + }, + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "rlp": "0xf9039df9025ca0544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5a002c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41a0ccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d86ffffffffffff8301a488845f5b6824b86100000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a49e8080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da0a7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7a0130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fcac0" + }, + { + "block": { + "number": "0x8", + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x98ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x8ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486", + "stateRoot": "0x140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3bac", + "receiptsRoot": "0x2b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x2", + "totalDifficulty": "0x2", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a4c9", + "timestamp": "0x5f5b6b80", + "uncles": [], + "transactions": [ + { + "blockHash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "blockNumber": "0x8", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a4c9", + "gasPrice": "0x3e8", + "hash": "0x675e336a4281b29c619dfd4ccfbd2f930f3728b20caf9e0067284aa3224e6758", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0x2e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4", + "s": "0x50e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0" + } + ] + }, + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "rlp": "0xf9039df9025ca098ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3baca08ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486a02b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020886ffffffffffff8301a4c9845f5b6b80b86100000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a4c98080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da002e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4a050e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0c0" + } + ] +} +``` + + + +### `debug_getRawBlock` + +Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) of the specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _object_ - RLP-encoded [block object](objects.md#block-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"debug_getRawBlock","params":["0x32026E"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xf96096f90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9bf95c56f8ac82d51f8502540be4008303c9e294a68d4c1e3de1b721ad1356bbf827d6bc8cef304f80b844b1bb4d351300dbc7e12342566318001b83aefc9f20080000f3ef25472407fe9c9c69a1470000000242692bb4cd506c409651ab80eb3acfa54551d3dbc9af4493605d79871ba01e474fb147b16b9538d7a59a57738e406158d9cc306a9062b1b7a9f544c35abfa061aabb714c760f2243a16a024811679d402c8822e8b25dfd0038d84298fb5205b87502f87283aa36a754849502f900849502f9108302222794102554afa6b5dbccc86176faef2b2d854201756e8084e2bc7b43c001a04f2398f24bc950db1f5439de3cf6431ea277236595ae8dc5815c0cc671c9f97ca029898786a59c56f086fc0f7a16859f366cf46084add999fe137cbf43693712e8b87c02f87983aa36a7830293748459682f00850165a0bc008255f094fafb56bb5b37c3b0b0ee9d7c31f018aac91dfb778806f05b59d3b2000080c080a0b069dd8967533a773e592c26b1b36df0793d0b9f6eceba34da246f602c2fae58a002009dab32ab63a25b705d9a00e311f7cd5d85e73f9b2c03ffd0e5135c0bb2c6b89502f89283aa36a7018459682f008459682f0983011fec945b9fedd37f0b92e7e282b19cebcf06f57b77c60480a46a62784200000000000000000000000019a1fcc6fcc5832cd2db7704d75efbc800f5a742c001a0c65eb0e48090a8f8830de47f430b9ad11071a62a5db9555619a990d7e9b81738a05a6e826610a5b2ee529a22942ebcd3abd2a8a10228098c8158380e8fcceb962fb9028002f9027c83aa36a7178459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e17852000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f16827000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a004f8666c8e5d0f3c7110994f624d24aa47a1327814289698c3e2777284a5cfdca04ff05f1b8c5beb58972d40e5a7b894d5e28ad2f15a3429c7d2bee6b6a9633730b9019f02f9019b83aa36a70b8459682f008459682f098303644f944284890d4acd0bcb017ece481b96fd4cb457cac88715c0f4db6e0ea0b90124ee1490b20000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d40000000000000000000000001e8c104d068f22d351859cdbfe41a697a98e6ea20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000222e00000000000000000000000000000000000000000000000000015c0f4db6e0ea00000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d400000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000c080a0e5270f6291acc162885656bedf64fbcb904c41951221dc0cbbbdca03bb33ce43a01f08c7ed3c231403b55f37a157d80e121b653baa810add8c02aea722631450dcb87c02f87983aa36a7830293758459682f00850165a0bc008255f0948d247f4fbbe81429d3d164a5c9ae0063210edbdc8806f05b59d3b2000080c080a0bb83dd6181c9a7ae3069af3bdf1820b5e556eaf99e385b8d7b3571321fb2966ba02ac193773704524adcd02824796df83407a42cdd81e786b591eba43c4ffc6c40b9028002f9027c83aa36a7048459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e178520000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac6790000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c00000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac679000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c001a0fc882968005f717a74a2c2fb345f691091cab084f4bd3934358741807bd5a66ea03f81c68d05d06bf851a6ef5ea6874557a221cbadde24f3fa51f777699b5d2804b8d802f8d583aa36a7822c0b8459682f008459682f098303534f943367dfa11e3148a07c2da773e1f65b155b0abe5680b864ad58bdd100000000000000000000000053844f9577c2334e541aec7df7174ece5df1fcf0000000000000000000000000e9e12c660e77a732940bab3c2cf385c843b834b800000000000000000000000000000000000000000006015d637c177581800000c001a0a292e7723d3c950aa8a557bd91dece34ec527d9efe2cc413d582dcd9fc6bf6eba03386ce6f58e862f329946bf32897f7df5d1c8f818fecfafc1223052fb251d97eb8b602f8b383aa36a7138459682f008459682f09832dc6c094ba175fdab00e7fcf603f43be8f68db7f4de9f3a980b844095ea7b300000000000000000000000084a0cc1ab353da6b7817947f7b116b8ea982c3d20000000000000000000000000000000000000000000000068f365aea1e440000c001a0968ed0274829918071d9cef28e1adbf1fd15ec76e5a4f809971e887b4c9f34b6a001ce26485bc7e3ea71fb99866bd43002b264b2ed80e10850203c2f07b78856bdb87c02f87983aa36a7830293768459682f00850165a0bc008255f0946d3b93db4e4078cf6541a68532d00705d9a4da618806f05b59d3b2000080c080a083c831630788e7ee57c87128d18582e29aa51f1f233e91d916c06d0750578156a0549b5a00477f3fb4d8fbf95ba3a636c3a14ff011c1bbf3a717e00d61735cbf34b87c02f87983aa36a7830293778459682f00850165a0bc008255f0940d3a7d69859a0dd6971d39703b15379e05ae2ec48806f05b59d3b2000080c001a0082660b5db2d3a8a58c0b863673ab27f7cfe4c049dcc52c76a00ab45b0358db5a05a7519a2d399cb534480383ac21262fbde2dd85241495d7832dee8bb02c49c87b87c02f87983aa36a7830293788459682f00850165a0bc008255f0941be13f64a2463fc7a76b4092c53328cc965a77fb8806f05b59d3b2000080c001a0e6ee9b85c3b729518524fdaeb25d47f89f6fc6c4d2c4df707187bef74d73f958a0756bbf4ab119805b77466957b5895c1d5bf422c5f65d8a06f7efd37dcb2c87afb87c02f87983aa36a7830293798459682f00850165a0bc008255f094a90b28fd6f8e46ac668fcb688414184a163e2cd28806f05b59d3b2000080c080a0d394dd43c58591e5dda8a7f3a2f4eae1bfd65655b9e9eec5facc6dcb39aa77baa002eeabf3fe9c0a56eae476d2f6452ea72e63a9c9b1180290b792883258f939f5b8f802f8f583aa36a7830283818459682f008459682f1082962494d0f723c6b2226df56fe41e63b9eaa66eb540bcb880b884abac047b000000000000000000000000000000000000000000000000000000000103e9f0f3471dc445d8f209ef546e0d20eaccc12ed0a5b4100007f57d9bc8638dacaf6480000000000000000000000000000000000000000000000000000000001d209b1ea11d77d1ab457eb3e2954cb2b98e77b5b07e2a4f48507af0adc61329ddc210c001a0efa10ab60f3bd1e7c4a8d52a275a568fbe2f5edc9e1eaf386299577ff9ddbd6ba06e62cf2f66b58f655ddd3eae47ce40408445b086f6ea858edb7bd847ee206207f86f82e6e582014482f618949ebf6b12e7e33b8672788e7b2b3330356f6f2c41880de0b6b3a7640000808401546d72a008d6be7aa21be0a43e08e960620f4c40c44010a743ead9919ef9423863c08b12a06a63a7caae4504ee5528e50387ca09974f7124035328a62d1085da2fee6618f9f86f82e1c382014482f618949c68eb31c4d00b94c3e3d4c2887946f8b076b24c880de0b6b3a7640000808401546d72a0c22d48d72c70ccf0a44d0950daf16741838f9333ee0bc5e05ff02b058da1e010a06a20c9f74cbc14c0d5bf3b3c38d3c33a5ace9194cddc2c533afb16459eaa7647f86f82e4cb82014482f61894d531e7aa3c0bee832aaff22642c7a3128d48a81a880de0b6b3a7640000808401546d72a01dbaeffc8e11964c06a722bae73e35bb5de55b8f959592868f2ff5fc13b69bd3a002acadc04665570a2032cdb616de15bdca79127f21302d62db5baf96ae4734e6f86e830176e381d882520894ad346e81c5b26fe563ab1ba2aa4ff811655882ca872386f26fc10000808401546d72a0b6de11598824e338100d5ebe70c0b0f4d6893fbb36f11ad55cf74b2f43afc5dda05101e65e7e84ea9edba6e5bf1a1e07028ae3fa5213240e812e57cf6b29080726b9235302f9234f83aa36a7830137d564748315f52194ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5000000000000000000000000000077770000000000000000000000000000000191c15235c348207e935e72b9151056a9661d73631d1e2c3f89ffddf8e74efe8a42ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000030ef2c000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000ec15abee257256da1a964434000f59ddd45b1ce67d5df44f1c82fd5bfe95c3b31dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000777700000000000000000000000000000001d4b5b35d93f51c8143f6a4cc3d7b320d37ce03989cd88c28601f4ea94cd6554249cff83e4dd8e99a8ef9004b2ac7518996f4784af1f9e52debb6223a697e9652530feda219f333e01f8cd0b31ee83b9c250ee51fde9718ef5fa305cbcd01901200200100002020000400000280000006004000c0020000000000000000000100000000029000000000000000090000000000008000200040000012004020000800000000240002400008000800000020000000001040000000000040824000000000000002040000400000002000080000000000000804000000001001000c84000208000000000180020000014000000000210100510008000082c0000000001200002000000024000008400000000220001800400000008010000052000200000200028000000000800000040200000110000010000010000001020000210004100002000000000900280000010008001000000018004000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc0000000000000000000000000000000000000000000000000000000000034bfbc00000000000000000000000000000000000000000000000000000000002ddb24000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000002e042ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b2a7122720155935f15da0807d0054f1a4c3db2a92ec4124bf590ce7a16594f3f1812f260acb049d01ad534a937840a80c0f56fd9a54ca5a8628ed896d14a5f8b2570f5813e35c990656f6300a1a1849429135ada6337646248f6ea03a7f70ac426c1d805216d154ea5a8e5ff953bc04b71b049b4b5bd549b6b0cfa7f8b21dba72a3805c7093d8589f2d4c55b6211441041e8bd7916daed5093fcebd377c31e810a6499e6e26840e3afadc9b339c6abc86b7f89fc3559f4242d373a71389db20219195f6e13069701f6d539dcf63a049726cdd8cadc412d1c43cf3fc0095ae5e2157dc668bdb924d7d7afc2b4632ab8a0e4ef71941a0a6a65645f6cd8570302f90b98bbdd01be238dc07780ee9b93e22ab87f26170d7fc5531347fb9fadcb65dc2ca20442a70be9e785292d533fa9496308a7b1588b50b45c17ea765de525259f036edd3984782399b46793acd5abb9f49e38b309c2363aead57264ac1a44e6432b81127a0bfdc29f01bd04e7db2b2545ed8426d2fe9b3e561793ec8fc875f2a71f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f11fcba848e01c60438611958101321898e95c8fdc936d31389bdba8073b382e5b1e2cd25993ad31586d7525f165fb25a1cf8c22623f983c025d21f0e52ecfec5f0232a753addaad88340ca39f00e9722f35dd25fbe8fdd8846bfc0288215d0638004009396bfcd5e6eb0c587797ae8297decbca48b02407219b910ce163552ed230438292cec430007886beabe7cdf5c6f9c3740a3dd6c52ba88e6d652ce43f90044193c4a42335291795c2cc160dc68b6225edb425a88d27cae159f77df3a2241fbe809c8f1122d245bf439df0761bec97358b96d6653bc83702b559bde5a2d12f771a2a11bc9dc32580bc3ccf9dfacd0a5379587ac5160b45d333a85cde46810ad2875b406f00438aee245ecc63815528a185e9e2a029147db7fcffcb8875e5259f15c3e467de02e035891b131bc715e54e7e27a7acc437bb9f6f84fa4456aa016b3578a73ed8a4706efb935be8b6abe0697e46d878d9c74e274f2816d2fd88146b316731719e125d227e002af95aa13f468a9bae4ff41a4a6036ee7fc321b3249aed4dfb6e75089ec0656ee4e87e1fffefbd74edf55a20d752a85caccf583c0d9e2ef1040b4d36a8e992ad50ce1c4bd2b300b344ca881725c164886a5f8f18035f6e75e67a3eaa2064fc24ff79897edb624e1a67f34deb414d5efaf4c55d482da108aa2ab7504fd5d7f78d91da5c20230380ec013b910b01a26b8bed8a05a004d52db30b7fb01f16347692e9f19f303f48ea8cbbed2d3a3eb277ddf4e9ed8026af5ce92a618c8942caf28b3249044347e14e5c3c2ed5ec0f9cccf1d11a5b290c00773e12c25feafbcceeb8ae6c25a88c9657c627187af6fe0bfea0b3cc36c908a76f90e965bc4135c8596534f444c91aaaaaa6277985e36248bd53ef0f74f103eeac98ba92c5350e4a0c586c851ad25df982e16b2d408de37c687efc6915a41197df379614aa657ab5100627c47896b51b000cb95505bac77e4e440ecd1fe50252fc98f15ee41cafbf717e144da35f424e141639de04ebe5d333e9df8c06821c689d1ef2abbfd12e8a1edc059a9279db7ff44bac1962b5f7297da5c989528229e98a91a3a2e351f371dfa34d4c3676725baa5fa4696f67f4239b5fe1e3fa351d66aa5a2df992426d94ba049bbb4eea0ab22e3b9a7409f2b6719ede64353f4112e4da3919adc16dcd99c545966256493d2699ae529e365c20515d95c013ba2627576fb75a030ffd25b85ed3fc40dbbedbca54427f8dc2255c16b742b3e2b82e1bb634ae73a402927e6dc424d1908942b9b0f2cc17909ed050defe85d24a1986291facbb4ecf9b7ff66c27f8e771d28ec6866e3d24bc97e7be388013df8ba8f407b9147ed9b3581784003a22eeada55656d2be271afce06ef3fca32ac9b77b4f2420d60e892c95418b2a1b7d3dae2738a073ef105e66c08488e8a91e8ebdb5a10e979611bd29245c13cc4c0f5b33eedc5263edd6c27666e0c3f02161114120230511406f9f82102fd8c37c36d4e383e445df4afc6e7dbaa570cfe05b3f6038ec1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5006f155ac97d6757728caceba5530eb745e72277723ad34268b34008a97a27c370e9bc006aeaca4ac36414f35aa41ff400f698623a447c949f7f004f3c3fdb09f2af3c96042e215f0d4bbb23fda72d4f01dd9a55dbdec930919715a23e2cd772a260e2b91324c244d88ce1b83c92dce1aa0e0c255b80ed9325dec0e677563984a1c559ddb4a544eadeb2a38e8ed7736174a30d2bee6e0b65f3766e0b7a4e4d8022dd9f82493a9b1fadd1907147ac29edeb8cf8c7c58fbfa9b82ed3d9f9f05bfc900e52e29a05ca8d445b5245b16928dd61800ebb63933d9c471c2fb38776459641e9debdc606abf6ccfdf8fb41da88ba0745d96fd4557a879fee82e33df32d18b18d7360529f89f3dea680a5cb0c6a7652ee38589e1997f3e64ce4db1d3c04cd628fc0fd6e7ef1944108d48eb742a28467fa4bca693dbc8f923945256da2a83222d172286c82b1949803c54409de4653f258d0cf4266c83d5675ca9b5b3a3fb322b9c493ed7bff0a6165babb19c94d9e2014b13b099f09894fbcf32959b9d4ce71ddf9d24dee8bc40d6be92ee6e1220d84d68ecf1a0424132315c0612802b477b0acabcf346b0ad5ea329ea72f4de7524530bc00ad36baeee835908655faecd350463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea0908c560e84b404afb45f69169d28348ca20bb4f5693db19304d154f60a91ec4e9255be05739f5dc7e0b420d4bde4b188a8520bf39202f81dd3e2f4adcc6f4b4be16880103e0ab232f509729c91ddf0006d6a099a769b38affb89d7489b3bf261106aec362c77acdbb0a71c3da369067eb0f2ee9866a0bbdc4ee41ae81a88d860f1784565b7b1cdd350e8e12241103ff9d57c86c368775530773bafc058cbcea6309bd6d9c144cf6657cac5084ac5fe63ef038a71b3d79e6b7a32cc70039e182052f5cd5e415128e9ab1f553f13c165ea122d089975c1daf617766e12d9f3abb2501571eefde182b767e4b63568d37a8c553671adcee2ee4c7c6d77493e4599cd70d002a718fe0d7c31b7df3893f8b9993c90d7d55eea1c38292f1eae3a7887cfd182977403d5c029a42809f2c6fb8d04aff1c60106ba36367ecca0699866e5ec922ebaeffc4e624d0cc2c748f9c446da0c293d8ba7a28125145ce0936a2dd47172c4502ccf050145fc0584ad8608ee8f6c34c3e718fa5ca616722c5b3549ddb5e2f6a96e82c3d706bf255afda0272c199da51f9a4a869ce8b164694f6ef7593ce08b4bb0afda822eed4a0a7863f532fc0a22de9de5d3456574021b711c42eb1c9190de35ea592568f8ba5528c0f5fadc38e10b14a89a1e49fba9a76ca2478dcca20f8a3c78bb3e1b9869b7375d0deb87819ce7209ad4d73d84a92d08d23649bb50ecb4a1763050b7860afb055461b3158647b453d7977bddde0fac9415327e7eb2ea373fc8abd6793f576e72a47c92d6f6e19fadfdf2c6912365b74929d9b483c19f5146ac5a8dd943caf50b2e0a95fb19066a63a71862a540b2e41731ea66697094e51d309589ce9d25a37c06c9a12839c4c08a050a3ff9e502514f20d573c610466ac5399e11b0153954428f25d16958ab48614d34f768991f84411c401e6900fb0dfaab4108db0ad42fc9ae0a255e60fa4d92747ddda47d07de9f847e7a2be289798c5d34924aae419abdc41d30fb095c6ccabe5c5d5be73ec6197371ea74e08f0583b21901bd748db5348282cabaf57d883f5c55311f1304d7fcd30a9f0b22f810b1a7f089860e4ca0f23ddce9a23d7167762734b10b995d5bd2cf3b31f8f24b18d0a2f7ce1101d3a32d18988f162e91ac94b0f521f24fa287b0d2b97c408079336b89af9e842cf31886c701018ba98d5b0eb0e6d41b67b499f4c466cb1412db0e5937f7ffa83426c9234c713096444d0fc65d1b45f166e54d2a54bc103de110669fbc34555a6d16714ca37651e976b06a7ee96d80af9ff50162016a998451e2ce5819f3346b1fcdf6fe9ff3ec8420d4860a9980ce28fd8c55660983a3fb02cbedb5c638a49e5cdf0b69b71d78e071f1200608e235e6ed0ee8fea5567be12018bcd026412db0538c28bcd4a9afe799d5c677298646943c4200a039d2fced71d985d188f84dfd3132b6a015c50b8a60d712a97c89e0cd7d3a1740244c1522b117dad1220463f5d4af1004c1a2ad6b5708d7d6b28f8ae1e1e7dd1b2d3798b8c2e27a3559c7202aa268099eb3bbdf7c42d0d20b47e5623dba8e6aa1392ff532113c32bd836f4160abb287aefe648aaff6bb0a23928f580347046b64babf354790704538c6ce83f117ac7e83e1e0f54054466cc82b2144cf135be31f24f1b224e2a956827c303b0d82964e284b968c5ebe97688e49ca793a4aba81a3d36eefd8c12e3ce9409be63c3a308636a7b296b804d8125b4f29068ef44d3f2a3c9eb13e61d6365bb96d6973e88a70757b1d9213511d357d252df58d1e848d534d9517165263e803855e8caf387579f1ff0e7e9c3c8e532a2025d8016b70a45c24a546f0b21acf38d16b27eae6466e22396097090291184a7719beb4a55beb89275c6893e01f2075d3b73e165c39335d34a5aa7b280386e30a6df9ba917e1dc6774e2edaa0c87e8f5fcf89306a6fdbcf8cf52cf25f5df473fe350325d510421546765acd00b34ef53e56b01445deea042282e7d6ce20c8f967204c26bda9f2596fa378dc611091ab6db9e1e8d4e9b5c1cc4c4d6ee2ad82b32d08f8cb5a9dd9b03f7aa754f2738ddf2dc0c3318974ff3810765917c251c74ce3d7132c26b5f2ede12a6f62f2e8ddecd5e0d02f99f2ed8ac15641c586d68e093fbe80cefd6a7dbdac6d43e261160807eb82fc2aea870a22b25148d256a083325a5b97bcf0187f748b6c0a1691867344efdd53809fb9edea57669c33780a4aa9e65149937817d3d845d9fccae1876575d5383d06adeacd0f3371209a30e1a9c98446174b0b98560652d0643f120bdabd5484435871b42ad0ce36aa8330c7edd26e64e89eb84e0c72a2c6e49fb24088ae2bdaf7ef07af9bfe381dd6a9ed430a553de1bad4dcefd5239b389090925a69e44e25800d9fccda11ff4e1e4d3049386397f1145c3595ab5115255bc1c1eabb379a37504eda27b1a103b88ae8f174e1d182e3dfbb0b8317d05d6e08c191661b04537421fd84057a9ff5a6eceb68c5bf1f0e356df6e93d936bb6bdccb42127cba43e7615d522242df13f08e5fa162a641430c1431a7d7181dec65202fb618a690c2bf3361d7dc689d5e4a97a550a9b17c8a5ada8f32db3f774e9ed047c02eb7d1ba7add29fa07ab90f290e77bd91ee9b5208b1fb19a37f29dd1a492fa32156a7d43146a336fe6144d19228f975c54ab304565269124e069e864873c0eef23f2e7b012e84ad0c71d76e1b23b8b9a0a66edcd59f4b203a9773ce26baee206254b49efb10cc48bad814b2e299bd478fd4bd8b1ae2c8bd99070b259a9e204e42fc5f65f9e25cb4e4a1a3b67872314fcaeede2abbbc6978660c3e685f6dccb53160d1f7517bbda54177495c23fcf45cdd66363a70a84f2699e239b5071c9e6cb19069f3e0be9f4390c8028ae9960851e34ea18ff88d36ee826c0a4db4e33e94f0ec6651a728a1a2b0c15b30a1783ad4b1d224d87264779a817d107d40c75b77c25addd7b7d6a8b73b2d551f125daed95786920c4130d2061178604f9604a0e2f1c6cdbf3066fd28bf276ee0aee379bc049bc8eba361f4052bd2a698da312c991015c0fbc43ea1d2e72426279fc5181851a15a2f4883018ab01ff8745625f388f05f5fa9abc5d87a710a1227322626115b60f781f4ddd91e205c1cca582a5e37e005396703375846be4f36fdb76c277dc1a2ff1f183cbafc6db485a562f4d08262a207844a3d12261fa0ac479abca76f417df42b037e611b1b6acfda94d5dacc620c3edf5744db24bcc41ef1722dc0e620f8a35c50585a7cecfc97f05bfec21f919420e62a9c4f28ea9585cc056aee08ed8891d077a9647d9c0b5c3141f8c517f13b05bf0a18b99111d2d6e7b4892e78fab35d882e4e153060f0c44cb946d20ad0897a34d2a24d3800b54acd68fdd797aa362560dcede6d12909948bd6f4726a20142eec9c6b78d224b2c24885490bfb492217c6809e0628164579d2c2c16a90f28aa5393ad44c45d4e1500fccdcc684023d7cac4e2cca889333f048cd9a29de018e958d00553c77c74ab50d974df5f654233fb923e809ef6ceabe6a860386603003cc376e90b8bee74f2477343a5ae923aea4ffe99a91b9d9289ddcc3ca316b026b3d369aca474b7941588fc6e9cb062528b10f13b90dd55afd64f7b0ab79163163ce02aed379af25740ac5e37c5628c0b868b7ccfed0ae521c964846f0287d3006952539b2dffaf891bd01fe98a1685e71536d7f33ae85775d11545eb379e0916be616206968605e5033267f6f79cc651c2ce71a790ae5cef19fea7604e479c0793f82db1f8e85bec40d8c6a2dbc9bf76d02a616aced611ae1a7a3756d87dab2855ca585d0048e1e4222ed9d6fa24e3e13677256fbb9959b965727c192696a11474a7f6a6b6c8efb649b1f601c76576f36996ec7a20eee84208232c20e8502903d4e303e4ad7139c654b7e5d2aa262d75672cbb4f653e62ed8e4d28835f7d6d0efb3f39c40558d9cbf19f250681a5c8a59143fec80d6a69d8a265835d6562ef248fa4ac508bd60c9283f6e731baa786828d0f7a635e1d14a448383c8b0243570df4a42799afe03143c227e3fcf0b1393bdf8bacbd26f1041d5e3112c84755942fac77981fe16f048cd882243a8787b09bdc38847a5a9cc9aaf4d30544181ff014dca8b2892c00a933333df6d8ef79041483f2d8c6416897ae7897ca1da85e8f0a493be4520595cd0dd7d32c87999e703704ba0ac7d8b444dba807746123100e2cf7573843a0a755eebad6045d2970a0ef8c9adddff093e79731d5e506f1c43318fb25144ff5fb63041574e89216ebe0ac75d7dcffc35d095691723493c94dcc11d4480bf3fe7b76ba53cae5b409c002f2d1bb5eab08ac993054ec297543798700fe3e2877a4a0cce53599a66eb4f1fef5cafc774277f0e694ebd7f8748fb5140735282e5e0b9bb35b8aeb098775a33820c9b8decad3ad6ce36f79c347dcc2c60a5442d2eab4368827acae1f0ccd52f0475fab95ac57c3c9d7c2649d355756140d5a1e8c6eab8b67a5c169cb899230c4be1dc702323f2b07ee1fcf5657361e250ccbe93bb403abd857eee4335e454e8485a3b055c908c957dca3f9a288299729216103089910386fb994285602ce12b04be1819a2c80394b2410767d9aabdb591e4c4dcd08d1d5bc1bcb532496ff1fc968ac3ff59bc7266d8ecbb67f34b681331685a99b781c9752dfe83d145bd4f3c8ec634f028e850e246aa81f1d03aef40d000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a0bf32b9037b600aae3ecd3dd1838bc9f18ae1661f615cf3d70bc270b6c31f55fb80808080808080a0a2381991afea644ece5cba0d8d69f838f7b123d2e0057a54509e0c61e8b293028080808080808080b8b2f8b030b8adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a0529f2d89256fc038782a4d70b40bf127de906cbe211e7acaa3e928e0fd5cf11d80808080808080a0b4f4d0be01c65da5308bab41d52d8a7c93a1693c170c44d1f619b8364d40e3428080808080808080b90190f9018d30b90189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa50000000000000000000000000000000000000000000000c080a0ae5e67673b90f2d6802e8dba26aadb2e8b81e059d1611afd1908e743e3c0b75da004886b0ac3a810519aa2395bffdd94fbcfe4a2de989ec95d1aea0fcd09afd931b9235302f9234f83aa36a7830137d664748315f42594ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000007777000000000000000000000000000000010012f20d5ba20a09e185d452c999c129d712b83c75480e2e029fc895986d361a781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000004f9456000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000bbe20eedcc0216c615d3a0550a5507bdb2f9912eba7b608300486e871a4e42491dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000007777000000000000000000000000000000014852ab81d236f35c396d4836a6f82239f5672a4b6136ab9ebdd8669a9f9e831b87a26944e5c04f16b79426135ac11b155922c14178bf3d1ecbb1fb12ccc8119a22df5003de2d5956c745f9e825a8f0ca1bb1e265d4d431781b00765e0fe37280000000000004a00000000000800000020400004002001000000000000000010000000002800000000000100009000000000000a000000050000010004020000000000000000412000008002900000000000000000000000000000000820000000000000002000000400000000000080000000000000800000000001000040c0400000000000000010000000001400000000081000001800800008280000000001200002000000000000008440000000000001000000000004000000000000200200040028000000000000000000200000000000000000010000000020200290004100000000000000902080400010000001000000008000000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc100000000000000000000000000000000000000000000000000000000005364e600000000000000000000000000000000000000000000000000000000004456ed000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000002e0781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b21ad05b7c1eb0d208d17426c52831c6347a8db75b12bfeb2970c4dc6666e4eba0492d2ec318089b11ee7ec6087ab6a3df335770526cc0c1679b764d847b4ec1e303d400c12e690aa26a3771e5676e7ac95e2dc7a1b33be698f077c598f880d4203defa26ad36b84573e923af347475c7c7671be245e9859ca1db3c047faeee4b1c0e81d8a92915c2b94ff300e18f77f70ffec15631161e0bc3cdc9143c43422c208187652c1ec83c5d282e10587216eaf56689e5fe236f72c13eb9574afabc622a739cefbbe11aaa4e2e3d4c5415818914fe554a07be374f565d9bcebc0134940e8921b87bd4f6b42a6432e6e176be5ec82bb8eb6bdb7e4acc1f1e99725bd3ab2e3fa52e02c2741dfe6eddf5a3846dfd57f6a72e834faa048cb007826a293d9e163d47f9ea635871b25afcc3561dfce77b3a2604b3c8de90aa24916f41aed62d2e0c0d18f9c259bf614f1321c5b7cf7b5bd73cec408dd85f046bf36302e20f3603b7832071796022e893386de4e3b170135a591b1a44117240ba85876dba586b1f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f12f7e30e74b0329222f6067cad3b4324a80f570506985d729f7780955333f40e615f065023fb607d975d7a2b9f234137e72260d8f6b586baecf42819f8328dfb3304441f2c9e97d1fab9a3625073ac3d2bff6ba2f8d659cbc6f66e8d9afde1ef229ff39bac1ecd65eddc4953e2726a72daefa76f00d58e11c9a9ba3448fbe0d3a03db78d70ed9c574ddc45de5c73efdf3113ee70a4b42cea9884f85c1b995516912800abeb70f3022d5de6d9f49469161a36a6a309099ca43e388908635ed4ae825a14b7cf5213454a1f345497008ed417e5d33ef84c4934368b36f27606072192a1b43396f89647f0541dd25f55b42c5295d3ab2a22355664608b8dfec3c9d76045b27d8c2bdba7f376a44826bbf4044aed0d57068489fd32a2bf52f8613aa150185aafe655d2b86bf8867a6f7728c4133fb95776545b19767a0d7144f60f5ef038eac390d1cac6f9882211d7302137efc82b93b8f9c55db629f47a2c61931c21d01d5ad967c9dc6c1abfd496a74df2ac4714cfb027bc4d8c0153543ca663ded2af64f7396ed3b2ebd1976386814e94b7f7fcc3a19a4dd876288b905c381bc8f008de145083d6404890a863e1af1dd897aeef2516b20df50befb6c708c9728a22cb31d80b0e953aa71230d2462bb0668dd8701e11bc5240d85184f9298e2c5a3257b5dcc3e138df8b7d4162d6253fb5c21a65e952600c8764c613c6f43d22c861d4380cd688c286e9ffad6bb8582421fcab96b075769cf48b3160f056dfac4041b08287533a769bed0f08fdee9a16c5c8f414eb35830793c7b64341fef79dbc529a7b99f85d4e2e88b64954be967c5ee6386f9131b80b454ce70209f78f2101d0ca71da273735bcbcdc5ea5d3d54b607820b9bc852abb1b733cb7bb5018276d30c4c0a7f9ffcd318499a2041043494b82456ca8ac6f07678a8b770329b7c00f31e70e97ce48bc796570be27577e8986ee4c7fa51da44bdecfddfcf18686cbddc02ca206d9132d451ab55cce8069f631412ad2ae02b1a8245d31c0a65854d07370259f632fe253b2412c5a785148248d660d7cb6bef5240749d6ac4a4ac59384b27e7019c6cae15ef7c82e5a952f4da079b6205f9e16f3d3c84e94b490530c5b602d4bf5e9d34f2a785cdb7f7755d6d467a9d88071bbdf8c79195730db7d0b7872cbdcdabab02bd4b8487b726c5ce6492344ae7e900a21893e7b840b46380ba99278ce95322dc23daa97995d1149d425952913428c8ef8659dd2cc2895f12b08e0532a254fd5674fcac1b0992472ef75337d8d77f6fef3720d4b7b17302478c7d2e3b8dec7af4c681aba5e25d8aa3f4382b0082066c3f7a0b4e42c4637df90d9a1e2f3fd1cffa7e0d5577f5da89353521ed02cb1c39eb5746cef10ceb74c3fdba13199b42516ebfe29af40da64ad81b46b7bf04bf25994255c7a51f6839848810025bb52fe7500cf1ef628a07747894e3b73d53e6b2997d0654f1ffd0c070455400fd7e9d670984ac807a0f8131977ed1806fd3c0927c34b7b4dabf011d31e86b1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5020d266b1ccea774955484405f58ad161251d879a87c43d5dbaecd976ac5d04dd2586d70031a86b0dcade14028f36a04508494c7a20e98b3b21f7765e7b3ef68f10960709e63eea35a26ff47424e18df8cc271ff3049262c855d6a131695a395f2ba2f1b039012ac8a2abdf6d9f6b0c432f0ae78b9bccb99f89759434477257ce1f44cc61e95b9c9843ec8efb17c640fc4c837ec125fb25323d3f0644615d21721607fee4d68e2dc9bd29f5b13fafe39b0710d0365dccda35e3c937aed1b6949b2a0a7523011eb706357b85e174376ea7cadbd01ed0dd1bc6a8e5a5a11bc6131f0661dd6365b13c6e2de50b98cba1cde58a921d19936c711424eb625b7c35cba01a0f7dfa8d6f86a2a02425ab48e2c28f8f2f61adbb744c221b9c4f35b16c749c227bcee1202e87537c7441f421c855ce87d858a679f09dcf814bfa1f26f7d9ce18f723d2f84d4b25ec60adbb6367e92270836d03c71ed43413767342a4fb8d6801b8755bf65e7947ed4459ad6486fc1cca1f1cc89df3d307f01d8ac68aa1d08d18aa35a46bf245589c599eddc6337e764c36426f7b7f5d2afde0a76fd3aa536d1a165f9f23cfc65866f574f2289aa5be056dd32c72a204ba8328dd9b0b4643790463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea09160db3fa7477a2fff436ecee95aa2d51ff42ca9d4fcf021b6e501410fd41098a1a8f6021636ece98c27bd74740b7280d3a5e13d9850fcf7f2118c4c91572ba5826fcc4b0837d0b394f6683cba38fa35a5e2bd242041533bd25939cc873d1f5852a2f57cb172eb17c2e3c351240a0b2b334978b90ac18041b09aead26649b1c1c019e41731e77c6b2211d7da94630507bad027561dc625b7e84094378e599a57b09eb32c2a67cf5f2f0bf9250e6da07b165f97dca10517e9f3fe3561d02ec83a722b544bd6e25ef27d9825d13651443c4d984d7e5d0fd70c2a7f983b3ae8c698d27a2a0bf2d35655f477adc99c56f48773922831746f8af58de941a020986ad7c23fb7d31c2f17f305174db26b40447e64c66216dce98e7a8316dd91dee468e602206a4d1d18fa7827f733037fa87dfc9c74c9df0960867087c776382b94db9420a19e5338e17e8a68cb7621f0b56984610bedd3d9b77dc5447cdb129ecc33596079cf206e93904368cae07f0d449e2095f8abd95f26603d2db047647babc8342200be0095aa5489fd18cd00a52f59b70ff04c4b1e572db76d08bad419abbabb00b9e485e3f017807c12b427b5e0e648cf7b16065e313c1c073ce354a5fc6812c02b8d4b6aa1168c575dad9875087fe9f61702309febfb99b895387cc1104c35e123b713019b5e51c320fc2521cdb5cfca20f617773fd46d3872128b87df6f66a21fb3fa16711245ab65eef629c5e6073efaff5b707657f4442f2eb2637fa71000f14fc691a71aacf902c0c1a1a5d7d8d351b8b3cad57acd0a9e47a1abdcaf2b70aed8b7370a6bb2bb4f3d679c4f9793e4b256deefaef1e6dbcdbb648b917e34822d833d2ac1614aebcf360d328d9271f27c52c93de4a9455ce6cd8d2140ebf6b21c9b172cf47556efc5dff9afb913e328a708292bfb65c96d668f4d0b3a9a21b222039156cba9980d6bf11efbd8dd893378e5dc1b323c57d8f702076c22d125d1489bab2553c5521631c35f7b5236007ce8f37012cace78d6eb39718904b5dc31ddcb6f4f175e52bcf6c6008f6f5a572925600194b9af7ae074dbf85119e3afd141b2ff2652a58f043e97f11b77997a9da1c96c18b5254a107f24e997a3ea61c2069b9d04d49bd1bcd2495b19bc71848f28bfb4f0346b682a1b474e040b056e60a32b5e8aa532103101cb45ca41c6a690c8688523b8566d507f29eb44fe2d2490e81f4343ca61c8783b83e40e3ce66532f186e9d09bd2667cf974a763072a910121aa5e86e151d92a868508b680f795bc30b4502769f41e3afef5f321be9ce2f1cff3eb3308d65aa0ed780cc889f605f35eb5e02ba772d08db2579f8561c61fa09a8e23ea1416fb95ca0c7e139ddd16f04b0c872499e44cb5a03868d6c5fa1300c19a96b8586b8f33bd760c6350713696b7d3236acb0eb35bde2e6378e9ef9b117b02290ead7824d42452e332f6ec95a7f871da9ebdf6ad02c959a1a36ba33ff0089a4f5217b7bfa5379a507b1e994fb7b8fef489f1f2cf6fdedf0e530635ef31faaa1a37457c445836376dc5cdefc7770fbbad8c326955655efe4ecde89bd2f1dc62a2551a45206fd7d42605aa1c0fc80476b741bd7df1f0f2db0fc387614240e78427bb3a8cbbaf9bb112da06ea6942335f88c65d42d17816136509ec39b51079b5eb2a8cd15c3d1fbc56dd72c3499c101e2fc9126e8f194c6c8006faef30917c5e535439c6b0d78be52a4d17a3a25d0878649b668db027eecbbafcfac7a612138c77d1511f9cc5e763eaddbad6d9d8770705ef7b4d062b4c6dc72f30d1d272dca8700ae03a4c6d2cc6a0a03f9bfb2615b2b294515ca80827ec9cbaa7746112530f5e70f236a641c05bbc8647dd130f02db3561f9dfaa1d687235bccb0498202af478a6070dfa49df99785a61eb5fe5f18777569c18b08d2042ae8639abbc225b832a2fbcd95ff43a3fee4fb2962983af8304ef995716110a7ad35c538697c109c01c427ca6cefef3a842fcf74b1c49a3f2da88b85fdb1d05e20cd567538942fa2f0ffbb5d2ff73d60d562d9a0a6894bec3d85a709b43e42ab64e2306cb96919e078b899f3155af56390d06ddc662afe8d2c91fc091e2c5cbbfab3fdb3f49423a5a5f7741f2d70c6736adc66e7c2caa89c6bbc678bb4b445a8a63d120867f01f164dc87adc853633ca7bd4b9d585c2a637d1469da612b5210476fc8d66f90029bdbf7fa5eddc8335cd23deb4bb47e1582e64a03dd021292d34435419af80af178cdfab0fb9374fa0fade48108cd3a571b814231784ac37c9f6071fc6ac0bb018595c9d8afbfcd6f31832b2581f7f7ce7c45d22817aab8ac6df0e0995e12dbd1595c3377b707b816c96ceb1893b9e7c747a577bb7540b89eb3ff7cac878a7a121a37b38fcd3248abfd24b50e25948dcaeff8c1c7ab8b745a93adb87cd54fca223dd940ef4d7eca9dd69243c74ea128ed624e52c7a2257f3950d0c7409d665d912495f8a8a2cf2482c1d51cd7793d3d31f32ffc24374d8606daa2a423931d97019ba2fd3ba773645b7fd01cf75e8201dd29f694a72136b585d940bff8867654223c28d0603d85fe4472d93ee30e35f46e27b8f40f9a9ad03992d9ff23305fc062c7d95971baae1ab074df88d41e09ec9752efff012c482e0cf9aea2b78cc26db146a278d584575ed615f5d168e6df7a832322da093f0aea706cee594207427d3005fd910843f3dc54b14f8b187e3b495b7474792743fc2e43f62bbc7fd50a76513f1fa4073b15a42d1e78a708134238f2521c749d086deeef512823b514aa64122b365efd51e11415de40826971c234d571c3e2a0507226c6ccc540e43a9aa32244b29784ac824c20d3d1b72dc7262f61cce4eefbe9a4ea4cb1061e4a71925aa13f31d6ce80bb7c56bf47b91cf107ab17168dd4fb60614757d7c7f4ebe0320692235fb502621ed9b15b9b3fa23aa1bf266a2a2c3f2386b52625e42e0cd85c37319e3266185419bcf6dea997e52ec8fca5887a68530002fcc5b3619e88d4dc9a918cc36bac2416ffa9b9734ac4e67a93a800f36d7aba4ecfed8d65f62cf6ad13d184a8c6406e3ba17b8aee6af0721ed091e1d225d044629a4ef5153c294a3e87e243e03bdcf6eaf7ee56d9d969a1f054d5774a7e2c363b160386b909c89717aa7015385f4ab8b6c97805c12c37d981ca945134cb1306d39a4d136b42c36d8aacd2c37575a11b17fa50ede8072d667f64bb55e3b54aff2c3c61782e442e088db7c1ce62287477132bef00c17e9992dd42f35b5e098eb97724fc4e697d75812635203abe8f96000d9553012be065980fb16d6d1c0c80457585c6eb699b0e8a6e36c1cd518dd1ffc517afcb9114a4ff629d06cd2f0be1495c4ee09243e96529e6c3a228c923ca2a703930ea94f7a5803645324ba9ea1a08e6c3241fe57a80bd24f780566342561189baed15e85ba9257b701d651754ff534e51279961ff379974e34010d80773b169a140e0ee7c5e2c0312c9dee46fb7b309710d448a43805c7eab513e84e346411b7145f77ff4ced7b32eb641528f78d88af0fe88e0840e9c16f2210e18c1da605bb04a4c963441c06fa839f722b0c67345168bc0fbb1c826f20472c7551a1327eae9eddbc24e63814fb81320cbc6f03488d64587f3e5f53c03db02cb15412e622f9ec9944643d4b5530b0cd4d577489d8ee499ecf2b74fb72423412aca8530fe53c3fc584ed8e39f900843ac73e36fb113c343cc197cd689a09e12f29203c1dfe839630f6932f3a29de81ba787f6044e70dff8981b71fe82f8a4d01f45770a53b090026a003b3e639eca0e6a1e5bdd0aad456e89d83012ea1f53e1a5fe848b33528f7195a7b0c36d4315f1b96b62d5603e87a13e12a97ec335e3922d4339d9575cb26d5691da78a738aa5c84aecc22a93033a6912f84360d13e2e23b0185bdc2cd331bd26ababcc91894935db5c7e1800b8a10db884a7614ceea91f38bbf623c5e7e7238eef06cd9fc9e43507c56e8d6212b7d03ef2db0dfceb040c0b206e1b7eee6ae564b15e4c02e9c3e4179d78bc68a9fbc2166cb8458342f218dc631705602b2ef1c6716dbc08f30810c9e2ab3ac7a03e300e9c21cd2a0240025ed5eda13e6daa246241669acfae65302dbca5c579d3b5c3a4c16a976209e22845337f9ca033329f849f3ccebc69ff01b301d99dbe9e79058fade67bf881c70283f41eaca130d1423e733ccd520f26ebbe8d304cbb8fa2f4bf67e2e041e5e90e840d5510d33a9f700219fbead699901ea3b3f8aa3d5ff0c028ceee5b5e711c29e7740bc98f4b78f15f2aa1e01449f1f15e68023861f540d2ae0541273c641914ea0e6abadbb2f11618bb678c8b7abff1f6d4e9f789706cdbd8dcc1acd4bbd506e42e928d134366d3f32d8caa4b86736bb065b1a3f89354835b7ba5ae1e53cc1bd9f5dfa3e0d49c0a0a8d32670c382712e30f8f4cb8fc980785fb6012df752e02c923d3f56f5764a41629646f9fd7641c8365f0917f85a64d0ba36179e2c2b3045d7b3c6ccfdb60cd5c365c43d88e231465c6616f7d2cab0db88cd79268e5ba0cecb98875958ee3827af7842e35d9cc89c3776e5640f2433a6afccf0e6fff9321e31802746639bf2bf77f375dd6799baa184b48815f24d3fca5d534dfe61d1306d15e97d3a320457ddd2239cc52fb31dbf98709cf090ae59afabbda6da75f4e1373a28bcadc2405e0a7f6dbf9a3e26511fc600a496b4623593213283a1fd33f000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a04dd5a916917c46969db2e2093e73972daa52d5582e183eb0bd08362e7aca1dc280808080808080a03605d0d2c4765be29883abb71f1c4b162f9d6786835ccabb068a243ff819909f8080808080808080b8b2f8b030b8adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a087eef6c6fab228bc280138441d870592a3910f042806b16f257faf5f1542f9a280808080808080a00ac60a3a5bafa4560edb7bd978a6b8980fa818c5edea7c010986328de4d9b4ba8080808080808080b90190f9018d30b90189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d67440000000000000000000000000000000000000000000000c080a0d86a71e8e531bae3b2a2e70d98e516ccf31b6583d936ffa31c3772ac265db828a0420f5a8067c7eec5214117647da149eaa4e7c78a10d8ee6fa62001ee1b680f9fb9060002f905fc83aa36a7823d3f647482a9c494bac000000000000000000000000000000000000380b905930001536cb8da3dd105e94414690798c7f100000000057b78da8ccffb3bd38b03c0f12199bb964b426dd6b091efd7dc3ad1a9d321d1713b2ea1189d39280b4791c5c858729090c3b6182ac75951eef74b38191686b35c4669656ca9dc5a0ce7e9399f7efffc03afe7fd6e7485887f6264e97e9856a6978b65c5db3b4ce57cf4812abeba0de10d0d6ee5a2cbc9885a2163a58d1895524adbfd86d795eac74ec74d783b599861bf4b7b3e6daf70b3ae0e5740c88a4dc15b893f76fe074a718bcead52fb2a06d6e5f1cf3ca344ad05dcf5ca10bd9bc2809cd8ecd40a2dd0e03200dadd8f921f0e9953a7e6d8c7dc99e60cf6fe81465175e0cf99b702ac6a13706e64ac349a1119796eb0b6e7d5ae48ad74a5c997d679ef9c637c619587cb98ecf88e620dacdc57701500c74e087533f978831a78bf3857cb6044a8c66e41645cdee74ac7cdac69a8484083eb003827ccfd6b92c77b7097a15f38a419f6f0578f3568465e6fb639f1a8d6e52e9d17a0413100ca8d08b210a2e5adb2bead3dfaada14b2513113802f3996daccac89014dafd1368700300053ad7daeea2a4d4d9e8502aa44337c6ff91165a25de84fe5273b2e5b7f4dda3a0410900125e7778d5c2a59a2ca2ce36bacc9e95812ae1b69a478fc7ecf5ded14b68a80a010d6e03e07137d5de8082773f8a422390cd0a592d81e6e623a42bc69547e6b343e1d9a14e64ac3486116e29a8315486a2324d93d3e33a8344ffdbc2655b76dbf72077e43c13961a6a52f0565f2000881576c7a113e7aa6e9a6ed4679014533f8d1bf80ff44ae5599813e80d2c1f2fd0a03400864952137916724a4504bb118ccaf9236f217a1e43c97e471397a3f86672226dd0e02e00d4dcbfe4dd250a97d0c830b3d93213fd048fed38ea8378018c726be68728e22c687037000e3bb6d2858fba82db877c2e28fa1e2cca4ce57b6bdfdba7513dcd2649da93544083d06f85c8f4d21559e8e7651dcaa0c3aafc4a691fdfb27f2f39ea08ea62feff43cf0d80061500b0b00cb246f3641d83f5c934c477ca641a5c545da8aa0e4662c4c5f26ee70525a04125006cf268fbdcaddb151168bf24d3fa2e09f7445d859ff9e5ba2fe71e7ef8861ba61834a80280ebddf1bc99e8d00ae5d2a0893d64774d4cea1bad7146fc964526b6c4617cd70a68500d00f7e8131b976b9537ab4e2b9c9cf086fcfd82e235cf6c6eabbf8030cc3fd1e395071a840120bfbd7fd4a54397eca0c0f7adc1231dd539950f508f92e237e3aeb91468c38d4083ea0068a89abd38178e2e9f67559758419b6908d48d58967547c9edfe98ba016e050734a809807957936c079272b238748593ee3a73f5c7647d0ece20a5c208769c484474aa2f192b6dcc780a770c9b40b42348219a34a746cb495f3f1efb710a816ac142121461c6f7bf82fb00b0dec5bfbcaa2e32983075c84989e439154bfc7df1d0549680a6c1a4999c18aa010dee074028fcade2995b7daec4562449ccbced0caf7a660f49ac4ea07d485b22348948a0415d001ce8e16f70ca5813141f7f7544586da1364d2f77dd8fbb7cc937c6d46136f93d68f000009a72d59e5a9bdf1de5e60bbb17358bc65e8ff1566fabad6d6eb42ef2781f6d6d40837000bce21c64847942319b4ac1c92b2ee02fe2bfbf43b685908b92a0c3cd25f21641a0417d0084138599419cf73489312bda0d53e1fa748e1f7927380961470ec9fda73b36978c953661c8065aaafe09fb847fb54e35b3c68f771b6953941b2b4e619b486d81761ee187bf828700301cd34529763c60738c12e1ccce6ddff8b8338cda8fda245e5d8d5613d20734408306df96bd65c7b8d5c27299269dd9335ef7cb1f3357145983f365ec2f933686fc6d77d0a01100ca3a3773d3f0a52559ee691776b714fedc8c7b2cd672c7065c295693d0616d37408318007c18e9a9f6e4929e20d8efd4c2428065720ed1938af8e5348c14b373b0a845d1063468d2f96f000000ffff86f9aa5001c001a08f785a1c8e4c549c415dd948da80f86e3aaabc4e7a784604b6362208e0fb6b85a011d366d57b6ad95cda2eb6b618704859b4d433ad7557cad177eff6f6bae578cbc0f90200df8345de7e8203e494e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de7f8203e594e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de8082062294388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de8182062394388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de828201949425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de838201979425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de848201999425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8582019a9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8682019b9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8782019e9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de888201a29425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de898201a59425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8a8201a89425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8b8201a99425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8c8201aa9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8d8201ac9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08" +} +``` + + + +### `debug_getRawHeader` + +Returns the [RLP encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) of the header of specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - RLP-encoded block header or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_getRawHeader","params":["0x32026E"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_getRawHeader", + "params": ["0x32026E"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0xf90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9b" +} +``` + + + +### `debug_metrics` + +Returns metrics providing information on the internal operation of Besu. + +The available metrics might change over time. The JVM metrics might vary based on the JVM implementation used. + +The metric types are: + +- Timer + +- Counter + +- Gauge + +#### Parameters + +None + +#### Returns + +`result`: _object_ - metrics object + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_metrics","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_metrics", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "jvm": { + "memory_bytes_init": { + "heap": 268435456, + "nonheap": 2555904 + }, + "threads_current": 41, + "memory_bytes_used": { + "heap": 696923976, + "nonheap": 63633456 + }, + "memory_pool_bytes_used": { + "PS Eden Space": 669119360, + "Code Cache": 19689024, + "Compressed Class Space": 4871144, + "PS Survivor Space": 2716320, + "PS Old Gen": 25088296, + "Metaspace": 39073288 + }, + ... + }, + "process": { + "open_fds": 546, + "cpu_seconds_total": 67.148992, + "start_time_seconds": 1543897699.589, + "max_fds": 10240 + }, + "rpc": { + "request_time": { + "debug_metrics": { + "bucket": { + "+Inf": 2, + "0.01": 1, + "0.075": 2, + "0.75": 2, + "0.005": 1, + "0.025": 2, + "0.1": 2, + "1.0": 2, + "0.05": 2, + "10.0": 2, + "0.25": 2, + "0.5": 2, + "5.0": 2, + "2.5": 2, + "7.5": 2 + }, + "count": 2, + "sum": 0.015925392 + } + } + }, + "blockchain": { + "difficulty_total": 3533501, + "announcedBlock_ingest": { + "bucket": { + "+Inf": 0, + "0.01": 0, + "0.075": 0, + "0.75": 0, + "0.005": 0, + "0.025": 0, + "0.1": 0, + "1.0": 0, + "0.05": 0, + "10.0": 0, + "0.25": 0, + "0.5": 0, + "5.0": 0, + "2.5": 0, + "7.5": 0 + }, + "count": 0, + "sum": 0 + }, + "height": 1908793 + }, + "peers": { + "disconnected_total": { + "remote": { + "SUBPROTOCOL_TRIGGERED": 5 + }, + "local": { + "TCP_SUBSYSTEM_ERROR": 1, + "SUBPROTOCOL_TRIGGERED": 2, + "USELESS_PEER": 3 + } + }, + "peer_count_current": 2, + "connected_total": 10 + } + } +} +``` + + + +### `debug_replayBlock` + +Re-imports the block matching the specified block number, by rolling the head of the local chain back to the block right before the specified block, then importing the specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_replayBlock","params":["0x1"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_replayBlock", "params": ["0x1"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `debug_resyncWorldstate` + +Triggers a re-synchronization of the world state while retaining imported blocks. This is useful if there are world state database inconsistencies (for example, Bonsai database issues). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash + curl -X POST --data '{"jsonrpc":"2.0","method":"debug_resyncWorldstate","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_resyncWorldstate", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `debug_setHead` + +Sets the current head of the local chain to the block matching the specified block number. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_setHead","params":["0x1"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "debug_setHead", "params": ["0x1"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `debug_standardTraceBlockToFile` + +Generates files containing the block trace. A separate file is generated for each transaction in the block. + +You can also specify a trace file for a specific transaction in a block. + +Use [`debug_standardTraceBadBlockToFile`](#debug_standardtracebadblocktofile) to view the trace for an invalid block. + +#### Parameters + +`blockHash`: _string_ - block hash + +`txHash`: _string_ - (optional) transaction hash; if omitted, a trace file is generated for each transaction in the block. + +`disableMemory`: _boolean_ - (optional) specifies whether to capture EVM memory during the trace; defaults to `true` + +#### Returns + +`result`: _string_ - location of the generated trace files + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBlockToFile","params":["0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", { +"txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", "disableMemory": false}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_standardTraceBlockToFile", + "params": [ + "0x2dc0b6c43144e314a86777b4bd4f987c0790a6a0b21560671d221ed81a23f2dc", + { + "txHash": "0x4ff04c4aec9517721179c8dd435f47fbbfc2ed26cd4926845ab687420d5580a6", + "disableMemory": false + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "/Users/me/mynode/goerli/data/traces/block_0x2dc0b6c4-4-0x4ff04c4a-1612820117332" + ] +} +``` + + + +### `debug_standardTraceBadBlockToFile` + +Generates files containing the block trace of invalid blocks. A separate file is generated for each transaction in the block. + +Use [`debug_standardTraceBlockToFile`](#debug_standardtraceblocktofile) to view the trace for a valid block. + +#### Parameters + +`blockHash`: _string_ - block hash + +#### Returns + +`result`: _string_ - location of the generated trace files + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_standardTraceBadBlockToFile","params":["0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_standardTraceBadBlockToFile", + "params": [ + "0x53741e9e94791466d117c5f9e41a2ed1de3f73d39920c621dfc2f294e7779baa" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "/Users/me/mynode/goerli/data/traces/block_0x53741e9e-0-0x407ec43d-1600951088172" + ] +} +``` + + + +### `debug_storageRangeAt` + +[Remix](https://remix.ethereum.org/) uses `debug_storageRangeAt` to implement debugging. Use the _Debugger_ tab in Remix instead of calling `debug_storageRangeAt` directly. + +Returns the contract storage for the specified range. + +#### Parameters + +- `blockHash`: _string_ - block hash + +- `txIndex`: _number_ - transaction index from which to start + +- `address`: _string_ - contract address + +- `startKey`: _string_ - start key + +- `limit`: _number_ - number of storage entries to return + +#### Returns + +`result`: _object_ - [range object](objects.md#range-object). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_storageRangeAt","params":["0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c",0,"0x0e0d2c8f7794e82164f11798276a188147fbd415","0x0000000000000000000000000000000000000000000000000000000000000000",1], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_storageRangeAt", + "params": [ + "0x2b76b3a2fc44c0e21ea183d06c846353279a7acf12abcc6fb9d5e8fb14ae2f8c", + 0, + "0x0e0d2c8f7794e82164f11798276a188147fbd415", + "0x0000000000000000000000000000000000000000000000000000000000000000", + 1 + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "storage": { + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": { + "key": null, + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + }, + "nextKey": "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6" + } +} +``` + +::: + +### `debug_traceTransaction` + +[Remix](https://remix.ethereum.org/) uses `debug_traceTransaction` to implement debugging. Use the _Debugger_ tab in Remix instead of calling `debug_traceTransaction` directly. + +Reruns the transaction with the same state as when the transaction executed. + +#### Parameters + +- `transactionHash`: _string_ - transaction hash + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _object_ - [trace object](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e",{"disableStorage":true}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceTransaction", + "params": [ + "0x2cc6c94c21685b7e0f8ddabf277a5ccf98db157c62619cde8baea696a74ed18e", + { "disableStorage": true } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null + } + ] + } +} +``` + + + +### `debug_traceBlock` + +Returns full trace of all invoked opcodes of all transactions included in the block. + +#### Parameters + +- `block`: _string_ - RLP of the block + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _object_ - [trace object](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlock","params":["0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlock", + "params": [ + "0xf90277f90208a05a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e6a7a1d47ff21b6321162aea7c6cb457d5476bcaa00e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169a04513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598a0fe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860153886c1bbd82b44382520b8252088455c426598b657468706f6f6c2e6f7267a0b48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf488ba4f8ecd18aab215f869f86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33ac0" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null + } + ] + } +} +``` + + + +### `debug_traceBlockByHash` + +Returns full trace of all invoked opcodes of all transactions included in the block. + +#### Parameters + +- `blockHash`: _string_ - block hash + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _array_ of _objects_ - list of [trace objects](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByHash","params":["0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlockByHash", + "params": [ + "0xaceb3b2c9b25b0589230873921eb894b28722011b8df63977145517d754875a5" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": {}, + "reason": null + } + ] + } + ] +} +``` + + + +### `debug_traceBlockByNumber` + +Returns full trace of all invoked opcodes of all transactions included in the block. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `options`: _object_ - request options object with the following fields (all optional and default to `false`): + + - `disableStorage`: _boolean_ - `true` disables storage capture. + + - `disableMemory`: _boolean_ - `true` disables memory capture. + + - `disableStack` : _boolean_ - `true` disables stack capture. + +#### Returns + +`result`: _array_ of _objects_ - list of [trace objects](objects.md#trace-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceBlockByNumber","params":["0x7224",{"disableStorage":true}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "debug_traceBlockByNumber", + "params": ["0x7224", { "disableStorage": true }], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "stack": [], + "memory": [], + "storage": null, + "reason": null + } + ] + } + ] +} +``` + + + +## `ETH` methods + +The `ETH` API methods allow you to interact with the blockchain. + +:::note + +Methods with an equivalent [GraphQL](../../how-to/use-besu-api/graphql.md) query include a GraphQL request and result in the method example. The parameter and result descriptions apply to the JSON-RPC requests. The GraphQL specification is defined in the [schema]. + +::: + +### `eth_accounts` + +Returns a list of account addresses a client owns. + +:::note + +This method returns an empty object because Besu [doesn't support key management](../../how-to/send-transactions.md) inside the client. + +To provide access to your key store and and then sign transactions, use [EthSigner](http://docs.ethsigner.consensys.net/en/latest/) with Besu. + +::: + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - list of 20-byte account addresses owned by the client + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_accounts", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": [] +} +``` + + + +### `eth_blockNumber` + +Returns the index corresponding to the block number of the current chain head. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - hexadecimal integer representing the index corresponding to the block number of the current chain head + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 51 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x2377" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{number}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + number + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 16221 + } + } +} +``` + + + +### `eth_call` + +Invokes a contract function locally and does not change the state of the blockchain. + +You can interact with contracts using [`eth_sendRawTransaction`](#eth_sendrawtransaction) or `eth_call`. + +If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the `eth_call` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + +#### Parameters + +`call`: _object_ - [transaction call object](objects.md#transaction-call-object) + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +:::note + +By default, `eth_call` does not fail if the sender account has an insufficient balance. This is done by setting the balance of the account to a large amount of ether. To enforce balance rules, set the [`strict` parameter](objects.md#transaction-call-object) in the transaction call object to `true`. + +::: + +#### Returns + +`result`: _string_ - return value of the executed contract + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13","value":"0x1"}, "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_call", + "params": [ + { "to": "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", "value": "0x1" }, + "latest" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13\", data :\"0x12a7b914\"}){data status}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + number + call(data: {from: "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", to: "0x69498dd54bd25aa0c886cf1f8b8ae0856d55ff13", data: "0x12a7b914"}) { + data + status + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17449, + "call": { + "data": "0x", + "status": 1 + } + } + } +} +``` + + + +:::info Example of a simulated contract creation + +The following example creates a simulated contract by not including the `to` parameter from the [transaction call object](objects.md#transaction-call-object) in the `call` parameter. Besu simulates the data to create the contract. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "data":"0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005057600080fd5b5061021e806100606000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032","gas":"0x439cf","gasPrice":"0x0"},"latest"],"id":53}' http://127.0.0.1:8545 +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032" +} +``` + + + +::: + +### `eth_chainId` + +Returns the [chain ID](../../concepts/network-and-chain-id.md). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - chain ID in hexadecimal + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_chainId", "params": [], "id": 51 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x7e2" +} +``` + + + +### `eth_coinbase` + +Returns the client coinbase address. The coinbase address is the account to pay mining rewards to. + +To set a coinbase address, start Besu with the `--miner-coinbase` option set to a valid Ethereum account address. You can get the Ethereum account address from a client such as MetaMask or Etherscan. For example: + +```bash title="Example" +besu --miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" --rpc-http-enabled +``` + +#### Parameters + +None + +#### Returns + +`result`: _string_ - coinbase address + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_coinbase", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +} +``` + + + +### `eth_createAccessList` + +Creates an [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) access list that you can [include in a transaction](../../concepts/transactions/types.md#access_list-transactions). + +#### Parameters + +`transaction`: _object_ - [transaction call object](objects.md#transaction-call-object) + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). + +#### Returns + +`result`: _object_ - access list object with the following fields: + +- `accessList`: _array_ of _objects_ - list of objects with the following fields: + - `address`: _string_ - addresses to be accessed by the transaction + - `storageKeys`: _array_ - storage keys to be accessed by the transaction +- `gasUsed`: _string_ - approximate gas cost for the transaction if the access list is included + + + +# curl HTTP + +```bash +curl -X POST --data '{"method":"eth_createAccessList","params":[{"from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", "data": "0x608060806080608155"}, "pending"],"id":1,"jsonrpc":"2.0"}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "method": "eth_createAccessList", + "params": [ + { + "from": "0xaeA8F8f781326bfE6A7683C2BD48Dd6AA4d3Ba63", + "data": "0x608060806080608155" + }, + "pending" + ], + "id": 1, + "jsonrpc": "2.0" +} +``` + +# JSON result + +```json +{ + "accessList": [ + { + "address": "0xa02457e5dfd32bda5fc7e1f1b008aa5979568150", + "storageKeys": [ + "0x0000000000000000000000000000000000000000000000000000000000000081", + ] + } + ] + "gasUsed": "0x125f8" +} +``` + + + +### `eth_estimateGas` + +Returns an estimate of the gas required for a transaction to complete. The estimation process does not use gas and the transaction is not added to the blockchain. The resulting estimate can be greater than the amount of gas the transaction ends up using, for reasons including EVM mechanics and node performance. + +The `eth_estimateGas` call does not send a transaction. You must call [`eth_sendRawTransaction`](#eth_sendrawtransaction) to execute the transaction. + +If revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the `eth_estimateGas` error response includes the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + +#### Parameters + +For `eth_estimateGas`, all fields are optional because setting a gas limit is irrelevant to the estimation process (unlike transactions, in which gas limits apply). + +`call`: _object_ - [transaction call object](objects.md#transaction-call-object) + +#### Returns + +`result`: _string_ - amount of gas used + +The following example returns an estimate of 21000 wei (`0x5208`) for the transaction. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"from":"0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73","to":"0x44Aa93095D6749A706051658B970b941c72c1D53","value":"0x1"}],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_estimateGas", + "params": [ + { + "from": "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "to": "0x44Aa93095D6749A706051658B970b941c72c1D53", + "value": "0x1" + } + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5208" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block{estimateGas (data: {from :\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", to :\"0x8888f1f195afa192cfee860698584c030f4c9db1\"})}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block { + estimateGas(data: {from: "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f", to: "0x8888f1f195afa192cfee860698584c030f4c9db1"}) + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "estimateGas": 21000 + } + } +} +``` + + + +The following example request estimates the cost of deploying a simple storage smart contract to the network. The data field contains the hash of the compiled contract you want to deploy. (You can get the compiled contract hash from your IDE, for example, **Remix > Compile tab > details > WEB3DEPLOY**.) The result is 113355 wei. + + + +# curl HTTP request + +```bash +curl -X POST \ +http://127.0.0.1:8545 \ +-H 'Content-Type: application/json' \ +-d '{ + "jsonrpc": "2.0", + "method": "eth_estimateGas", + "params": [{ + "from": "0x8bad598904ec5d93d07e204a366d084a80c7694e", + "data": "0x608060405234801561001057600080fd5b5060e38061001f6000396000f3fe6080604052600436106043576000357c0100000000000000000000000000000000000000000000000000000000900480633fa4f24514604857806355241077146070575b600080fd5b348015605357600080fd5b50605a60a7565b6040518082815260200191505060405180910390f35b348015607b57600080fd5b5060a560048036036020811015609057600080fd5b810190808035906020019092919050505060ad565b005b60005481565b806000819055505056fea165627a7a7230582020d7ad478b98b85ca751c924ef66bcebbbd8072b93031073ef35270a4c42f0080029" + }], + "id": 1 +}' +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1bacb" +} +``` + + + +### `eth_feeHistory` + +Returns base fee per gas and transaction effective priority fee per gas history for the requested block range, allowing you to track trends over time. + +#### Parameters + +- `blockCount`: _integer_ or _string_ - Number of blocks in the requested range. Between 1 and 1024 blocks can be requested in a single query. If blocks in the specified block range are not available, then only the fee history for available blocks is returned. Accepts hexadecimal or integer values. + +- `newestBlock`: _string_ - Integer representing the highest number block of the requested range or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). + +- `array` of `integers` - (optional) A monotonically increasing list of percentile values to sample from each block's effective priority fees per gas in ascending order, weighted by gas used. + +#### Returns + +`result`: _object_ - [Fee history results object](objects.md#fee-history-results-object). + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_feeHistory","params": ["0x5", "latest", [20,30]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_feeHistory", + "params": ["0x5", "latest", [20, 30]], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "baseFeePerGas": [ + "0x3da8e7618", + "0x3e1ba3b1b", + "0x3dfd72b90", + "0x3d64eee76", + "0x3d4da2da0", + "0x3ccbcac6b" + ], + "gasUsedRatio": [ + 0.5290747666666666, 0.49240453333333334, 0.4615576, 0.49407083333333335, + 0.4669053 + ], + "oldestBlock": "0xfab8ac", + "reward": [ + ["0x59682f00", "0x59682f00"], + ["0x59682f00", "0x59682f00"], + ["0x3b9aca00", "0x59682f00"], + ["0x510b0870", "0x59682f00"], + ["0x3b9aca00", "0x59682f00"] + ] + }, + "id": 1 +} +``` + + + +### `eth_gasPrice` + +Returns a percentile gas unit price for the most recent blocks, in Wei. By default, the last 100 blocks are examined and the 50th percentile gas unit price (that is, the median value) is returned. + +If there are no blocks, the value for [`--min-gas-price`](../cli/options.md#min-gas-price) is returned. The value returned is restricted to values between [`--min-gas-price`](../cli/options.md#min-gas-price) and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max). By default, 1000 Wei and 500GWei. + +Use the [`--api-gas-price-blocks`](../cli/options.md#api-gas-price-blocks), [`--api-gas-price-percentile`](../cli/options.md#api-gas-price-percentile) , and [`--api-gas-price-max`](../cli/options.md#api-gas-price-max) command line options to configure the `eth_gasPrice` default values. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - percentile gas unit price for the most recent blocks, in Wei, as a hexadecimal value + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_gasPrice", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x3e8" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{gasPrice}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + gasPrice +} +``` + +# GraphQL result + +```json +{ + "data": { + "gasPrice": "0x3e8" + } +} +``` + + + +### `eth_getBalance` + +Returns the account balance of the specified address. + +#### Parameters + +- `address`: _string_ - 20-byte account address from which to retrieve the balance + +- `blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - current balance, in Wei, as a hexadecimal value + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBalance", + "params": ["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "latest"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x1cfe56f3795885980000" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account ( address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") { balance } }"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + balance + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "balance": "0x1ce96a1ffe7620d00000" + } + } +} +``` + + + +### `eth_getBlockByHash` + +Returns information about the block matching the specified block hash. + +#### Parameters + +- `hash`: _string_ - 32-byte hash of a block + +- `verbose`: _boolean_ - if `true`, returns the full [transaction objects](objects.md#transaction-object); if `false`, returns the transaction hashes + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object), or `null` when there is no block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", false],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockByHash", + "params": [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + false + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": { + "number": "0x68b3", + "hash": "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "mixHash": "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", + "parentHash": "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", + "nonce": "0x378da40ff335b070", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", + "transactionsRoot": "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", + "stateRoot": "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", + "receiptsRoot": "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", + "miner": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "difficulty": "0x66e619a", + "totalDifficulty": "0x1e875d746ae", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "size": "0x334", + "gasLimit": "0x47e7c4", + "gasUsed": "0x37993", + "timestamp": "0x5835c54d", + "uncles": [], + "transactions": [ + "0xa0807e117a8dd124ab949f460f08c36c72b710188f01609595223b325e58e0fc", + "0xeae6d797af50cb62a596ec3939114d63967c374fa57de9bc0f4e2b576ed6639d" + ], + "baseFeePerGas": "0x7" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (hash : \"0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92\") {number transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92") { + number + transactions { + hash + } + timestamp + difficulty + totalDifficulty + gasUsed + gasLimit + hash + nonce + ommerCount + logsBloom + mixHash + ommerHash + extraData + stateRoot + receiptsRoot + transactionCount + transactionsRoot + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "number": 17607, + "transactions": [], + "timestamp": "0x5cdbdfb5", + "difficulty": "0x1", + "totalDifficulty": "0x44c8", + "gasUsed": 0, + "gasLimit": 4700000, + "hash": "0xb0efed1fc9326fee967cb2d845d4ebe57c5350a0670c8e86f8052dea6f219f92", + "nonce": "0x0000000000000000", + "ommerCount": 0, + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b841fae6d25da0b91e3e88669d0a765c98479d86d53e9ea1f3fb6b36d7ff22fa622a3da0c49c20e5562c774e90acae8ad487936f6b6019cd8a782db684693cba1e9800", + "stateRoot": "0xa7086c266aed46cd3bc45579178f8acb36d9d147de575a3ecbf8c7e6f1c737fc", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "transactionCount": 0, + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "baseFeePerGas": "0x7" + } + } +} +``` + + + +### `eth_getBlockByNumber` + +Returns information about the block matching the specified block number. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, `pending`, `finalized`, or `safe` as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `verbose`: _boolean_ - if `true`, returns the full [transaction objects](objects.md#transaction-object); if `false`, returns only the hashes of the transactions. + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object), or `null` when there is no block. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x68B3", true],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": ["0x68B3", true], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "number": "0x68b3", + "hash": "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "mixHash": "0x24900fb3da77674a861c428429dce0762707ecb6052325bbd9b3c64e74b5af9d", + "parentHash": "0x1f68ac259155e2f38211ddad0f0a15394d55417b185a93923e2abe71bb7a4d6d", + "nonce": "0x378da40ff335b070", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000100000004080000000000500000000000000020000100000000800001000000004000001000000000000000800040010000020100000000400000010000000000000000040000000000000040000000000000000000000000000000400002400000000000000000000000000000004000004000000000000840000000800000080010004000000001000000800000000000000000000000000000000000800000000000040000000020000000000000000000800000400000000000000000000000600000400000000002000000000000000000000004000000000000000100000000000000000000000000000000000040000900010000000", + "transactionsRoot": "0x4d0c8e91e16bdff538c03211c5c73632ed054d00a7e210c0eb25146c20048126", + "stateRoot": "0x91309efa7e42c1f137f31fe9edbe88ae087e6620d0d59031324da3e2f4f93233", + "receiptsRoot": "0x68461ab700003503a305083630a8fb8d14927238f0bc8b6b3d246c0c64f21f4a", + "miner": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "difficulty": "0x66e619a", + "totalDifficulty": "0x1e875d746ae", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "size": "0x334", + "gasLimit": "0x47e7c4", + "gasUsed": "0x37993", + "timestamp": "0x5835c54d", + "uncles": [], + "transactions": [], + "baseFeePerGas": "0x7" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block (number : 100) {transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot ommers{hash} ommerAt(index : 1){hash} miner{address} account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){balance} parent{hash} }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 100) { + transactions { + hash + } + timestamp + difficulty + totalDifficulty + gasUsed + gasLimit + hash + nonce + ommerCount + logsBloom + mixHash + ommerHash + extraData + stateRoot + receiptsRoot + transactionCount + transactionsRoot + ommers { + hash + } + ommerAt(index: 1) { + hash + } + miner { + address + } + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + balance + } + parent { + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactions": [], + "timestamp": "0x5cd10933", + "difficulty": "0x1", + "totalDifficulty": "0x65", + "gasUsed": 0, + "gasLimit": 4700000, + "hash": "0x63b3ea2bc37fec8f82680eb823652da6af8acebb4f6c4d0ff659c55be473c8b0", + "nonce": "0x0000000000000000", + "ommerCount": 0, + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8414d877d8d0ced37ea138fab55a978f3740367a24a31731322ecdc3368f11e0d4966c9ce17ae59a76fb94eb436e8a386868f6bd6b0a5678e58daf49f5dd940558b00", + "stateRoot": "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "transactionCount": 0, + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "ommers": [], + "ommerAt": null, + "miner": { + "address": "0x9811ebc35d7b06b3fa8dc5809a1f9c52751e1deb" + }, + "account": { + "balance": "0xad0f47f269cbf31ac" + }, + "parent": { + "hash": "0x7bca25e1fa5e395fd6029eb496a70b6b5495843976bf9e49b993c723ded29d9e" + }, + "baseFeePerGas": "0x7" + } + } +} +``` + + + +### `eth_getBlockTransactionCountByHash` + +Returns the number of transactions in the block matching the specified block hash. + +#### Parameters + +`hash`: _string_ - 32-byte block hash + +#### Returns + +`result`: _number_ - integer representing the number of transactions in the specified block, or `null` if no matching block hash is found + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockTransactionCountByHash", + "params": [ + "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": null +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097\"){transactionCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xe455c14f757b0b9b67774baad1be1c180a4c1657df52259dbb685bf375408097") { + transactionCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionCount": 1 + } + } +} +``` + + + +### `eth_getBlockTransactionCountByNumber` + +Returns the number of transactions in a block matching the specified block number. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - integer representing the number of transactions in the specified block, or `null` if no matching block number is found + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0xe8"],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getBlockTransactionCountByNumber", + "params": ["0xe8"], + "id": 51 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "0x8" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:232){transactionCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 232) { + transactionCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionCount": 1 + } + } +} +``` + + + +### `eth_getCode` + +Returns the code of the smart contract at the specified address. Besu stores compiled smart contract code as a hexadecimal value. + +#### Parameters + +`address`: _string_ - 20-byte contract address + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _data_ - code stored at the specified address + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getCode", + "params": ["0xa50a51c09a5c451c52bb714527e1974b686d8e77", "latest"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{account(address: \"0xa50a51c09a5c451c52bb714527e1974b686d8e77\"){ code }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xa50a51c09a5c451c52bb714527e1974b686d8e77") { + code + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "code": "0x60806040526004361060485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa4f2458114604d57806355241077146071575b600080fd5b348015605857600080fd5b50605f6088565b60408051918252519081900360200190f35b348015607c57600080fd5b506086600435608e565b005b60005481565b60008190556040805182815290517f199cd93e851e4c78c437891155e2112093f8f15394aa89dab09e38d6ca0727879181900360200190a1505600a165627a7a723058209d8929142720a69bde2ab3bfa2da6217674b984899b62753979743c0470a2ea70029" + } + } +} +``` + + + +### `eth_getFilterChanges` + +Polls the specified filter and returns an array of changes that have occurred since the last poll. + +#### Parameters + +`filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _strings_ or _objects_ - if nothing changed since the last poll, an empty list; otherwise: + +- For filters created with `eth_newBlockFilter`, returns block hashes. + +- For filters created with `eth_newPendingTransactionFilter`, returns transaction hashes. + +- For filters created with `eth_newFilter`, returns [log objects](objects.md#log-object). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0xf8bf5598d9e04fbe84523d42640b9b0e"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getFilterChanges", + "params": ["0xf8bf5598d9e04fbe84523d42640b9b0e"], + "id": 1 +} +``` + +# JSON result + +```json title="Example result from a filter created with eth_newBlockFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0xda2bfe44bf85394f0d6aa702b5af89ae50ae22c0928c18b8903d9269abe17e0b", + "0x88cd3a37306db1306f01f7a0e5b25a9df52719ad2f87b0f88ee0e6753ed4a812", + "0x4d4c731fe129ff32b425e6060d433d3fde278b565bbd1fd624d5a804a34f8786" + ] +} +``` + +```json title="Example result from a filter created with eth_newPendingTransactionFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0x1e977049b6db09362da09491bee3949d9362080ce3f4fc19721196d508580d46", + "0xa3abc4b9a4e497fd58dc59cdff52e9bb5609136bcd499e760798aa92802769be" + ] +} +``` + +```json title="Example result from a filter created with eth_newFilter" +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x233", + "blockHash": "0xfc139f5e2edee9e9c888d8df9a2d2226133a9bd87c88ccbd9c930d3d4c9f9ef5", + "transactionHash": "0x66e7a140c8fa27fe98fde923defea7562c3ca2d6bb89798aabec65782c08f63d", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000004", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0x238", + "blockHash": "0x98b0ec0f9fea0018a644959accbe69cd046a8582e89402e1ab0ada91cad644ed", + "transactionHash": "0xdb17aa1c2ce609132f599155d384c0bc5334c988a6c368056d7e167e23eee058", + "transactionIndex": "0x0", + "address": "0x42699a7612a82f1d9c36148af9c77354759b210b", + "data": "0x0000000000000000000000000000000000000000000000000000000000000007", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + + + +### `eth_getFilterLogs` + +Returns an array of [logs](../../concepts/events-and-logs.md) for the specified filter. + +Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option at the default value of `true` to improve log retrieval performance. + +:::note + +`eth_getFilterLogs` is only used for filters created with `eth_newFilter`. To specify a filter object and get logs without creating a filter, use `eth_getLogs`. + +::: + +#### Parameters + +`filterId`: _string_ - filter ID + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](objects.md#log-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x5ace5de3985749b6a1b2b0d3f3e1fb69"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getFilterLogs", + "params": ["0x5ace5de3985749b6a1b2b0d3f3e1fb69"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb3", + "blockHash": "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", + "transactionHash": "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000003", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb6", + "blockHash": "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", + "transactionHash": "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + + + +### `eth_getLogs` + +Returns an array of [logs](../../concepts/events-and-logs.md) matching a specified filter object. + +Leave the [`--auto-log-bloom-caching-enabled`](../cli/options.md#auto-log-bloom-caching-enabled) command line option at the default value of `true` to improve log retrieval performance. + +:::caution + +Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from its genesis block, might cause Besu to hang for an indeterminable amount of time while generating the response. We recommend setting a range limit using the [`--rpc-max-logs-range`](../cli/options.md#rpc-max-logs-range) option (or leaving it at its default value of 1000). + +::: + +#### Parameters + +`filterOptions`: _object_ - [filter options object](objects.md#filter-options-object) + +#### Returns + +`result`: _array_ of _objects_ - list of [log objects](objects.md#log-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":"earliest", "toBlock":"latest", "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", "topics":[]}], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [ + { + "fromBlock": "earliest", + "toBlock": "latest", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "topics": [] + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb3", + "blockHash": "0xe7cd776bfee2fad031d9cc1c463ef947654a031750b56fed3d5732bee9c61998", + "transactionHash": "0xff36c03c0fba8ac4204e4b975a6632c862a3f08aa01b004f570cc59679ed4689", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000003", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + }, + { + "logIndex": "0x0", + "removed": false, + "blockNumber": "0xb6", + "blockHash": "0x3f4cf35e7ed2667b0ef458cf9e0acd00269a4bc394bb78ee07733d7d7dc87afc", + "transactionHash": "0x117a31d0dbcd3e2b9180c40aca476586a648bc400aa2f6039afdd0feab474399", + "transactionIndex": "0x0", + "address": "0x2e1f232a9439c3d459fceca0beef13acc8259dd8", + "data": "0x0000000000000000000000000000000000000000000000000000000000000005", + "topics": [ + "0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3" + ] + } + ] +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{logs(filter:{fromBlock: 1486000, toBlock: 1486010, addresses: [\"0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d\"], topics: [[\"0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d\"]]}) {index topics data account{address} transaction{hash} }}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + logs(filter: {fromBlock: 1486000, toBlock: 1486010, addresses: ["0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d"], topics: [["0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d"]]}) { + index + topics + data + account { + address + } + transaction { + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "logs": [ + { + "index": 0, + "topics": [ + "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000508918" + ], + "data": "0xa5a04999ec29a8bd19ce32b859280ef9dbb464d846be06f64a1b1012ec08ab03", + "account": { + "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" + }, + "transaction": { + "hash": "0x36a2186344c6a32760e7700fdf3685936220876c51ff39d071eb48c17f7e802f" + } + }, + { + "index": 0, + "topics": [ + "0x8a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674d", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000648c72" + ], + "data": "0x0ee96b660ad82c8010c90760a03edfbb40b4af5e3634a8c214e4ac7fa1f61492", + "account": { + "address": "0x7ef66b77759e12caf3ddb3e4aff524e577c59d8d" + }, + "transaction": { + "hash": "0x9e2cc9e84a9e78839d6f4b591dfd98cc7a454a8ee3cd6ccd0a18e662e22d3818" + } + } + ] + } +} +``` + + + +### `eth_getMinerDataByBlockHash` + +Returns miner data for the specified block. + +#### Parameters + +`hash`: _string_ - 32-byte block hash + +#### Returns + +`result`: _object_ - [miner data object](objects.md#miner-data-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockHash","params": ["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getMinerDataByBlockHash", + "params": [ + "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "netBlockReward": "0x47c6f3739f3da800", + "staticBlockReward": "0x4563918244f40000", + "transactionFee": "0x38456548220800", + "uncleInclusionReward": "0x22b1c8c1227a000", + "uncleRewards": [ + { + "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", + "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" + } + ], + "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "difficulty": "0x7348c20", + "totalDifficulty": "0xa57bcfdd96" + } +} +``` + + + +### `eth_getMinerDataByBlockNumber` + +Returns miner data for the specified block. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _object_ - [miner data object](objects.md#miner-data-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getMinerDataByBlockNumber","params": ["0x7689D2"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getMinerDataByBlockNumber", + "params": ["0x7689D2"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "netBlockReward": "0x47c6f3739f3da800", + "staticBlockReward": "0x4563918244f40000", + "transactionFee": "0x38456548220800", + "uncleInclusionReward": "0x22b1c8c1227a000", + "uncleRewards": [ + { + "hash": "0x2422d43b4f72e19faf4368949a804494f67559405046b39c6d45b1bd53044974", + "coinbase": "0x0c062b329265c965deef1eede55183b3acb8f611" + } + ], + "coinbase": "0xb42b6c4a95406c78ff892d270ad20b22642e102d", + "extraData": "0xd583010502846765746885676f312e37856c696e7578", + "difficulty": "0x7348c20", + "totalDifficulty": "0xa57bcfdd96" + } +} +``` + + + +### `eth_getProof` + +Returns the account and storage values of the specified account, including the Merkle proof. + +The API allows IoT devices or mobile apps which are unable to run light clients to verify responses from untrusted sources, by using a trusted block hash. + +#### Parameters + +`address`: _string_ - 20-byte address of the account or contract + +`keys`: _array_ of _strings_ - list of 32-byte storage keys to generate proofs for + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _object_ - account details object with the following fields: + +- `balance`: _string_ - account balance + +- `codeHash`: _string_ - 32-byte hash of the account code + +- `nonce`: _string_ - number of transactions sent from the account + +- `storageHash`: _string_ - 32-byte SHA3 of the `storageRoot` + +- `accountProof`: _array_ of _strings_ - list of RLP-encoded Merkle tree nodes, starting with the `stateRoot` + +- `storageProof`: _array_ of _objects_ - list of storage entry objects with the following fields: + + - `key`: _string_ - storage key + + - `value`: _string_ - storage value + + - `proof`: _array_ of _strings_ - list of RLP-encoded Merkle tree nodes, starting with the `storageHash` + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getProof","params": [ +"0a8156e7ee392d885d10eaa86afd0e323afdcd95", ["0x0000000000000000000000000000000000000000000000000000000000000347"], "latest"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getProof", + "params": [ + "0a8156e7ee392d885d10eaa86afd0e323afdcd95", + ["0x0000000000000000000000000000000000000000000000000000000000000347"], + "latest" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "accountProof": [ + "0xf90211a0...608d898380", + "0xf90211a0...ec33f19580", + "0xf901d1a0...9e55584480", + "0xf8718080...18e5777142" + ], + "address": "0x0a8156e7ee392d885d10eaa86afd0e323afdcd95", + "balance": "0x0", + "codeHash": "0x2b6975dcaf69f9bb9a3b30bb6a37b305ce440250bf0dd2f23338cb18e5777142", + "nonce": "0x5f", + "storageHash": "0x917688de43091589aa58c1dfd315105bc9de4478b9ba7471616a4d8a43d46203", + "storageProof": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000347", + "value": "0x0", + "proof": [ + "0xf90211a0...5176779280", + "0xf901f1a0...c208d86580", + "0xf8d180a0...1ce6808080" + ] + } + ] + } +} +``` + + + +### `eth_getStorageAt` + +Returns the value of a storage position at a specified address. + +#### Parameters + +`address`: _string_ - 20-byte storage address + +`index`: _string_ - integer index of the storage position + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result` : _string_ - value at the specified storage position + +Calculating the correct position depends on the storage you want to retrieve. + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method": "eth_getStorageAt","params": ["0x‭3B3F3Eâ€Ŧ","0x0","latest"],"id": 53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getStorageAt", + "params": ["0x‭3B3F3Eâ€Ŧ", "0x0", "latest"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{account(address: \"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\") {storage(slot: \"0x04\")}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + storage(slot: "0x04") + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "storage": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } +} +``` + + + +### `eth_getTransactionByBlockHashAndIndex` + +Returns transaction information for the specified block hash and transaction index position. + +#### Parameters + +`block`: _string_ - 32-byte hash of a block + +`index`: _string_ - integer representing the transaction index position + +#### Returns + +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", "0x2"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByBlockHashAndIndex", + "params": [ + "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "0x2" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "blockNumber": "0x1442e", + "chainId": 2018, + "from": "0x70c9217d814985faef62b124420f8dfbddd96433", + "gas": "0x3d090", + "gasPrice": "0x57148a6be", + "hash": "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", + "input": "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", + "nonce": "0x2cb2", + "to": "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", + "transactionIndex": "0x2", + "value": "0x0", + "v": "0x2a", + "r": "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", + "s": "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{ block(hash: \"0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69\") { transactionAt(index: 0) {block{hash} hash } } }"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69") { + transactionAt(index: 0) { + block { + hash + } + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionAt": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" + } + } + } +} +``` + + + +### `eth_getTransactionByBlockNumberAndIndex` + +Returns transaction information for the specified block number and transaction index position. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +`index`: _string_ - transaction index position + +#### Returns + +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +This request returns the third transaction in the 82990 block on the Ropsten testnet. You can also view this [block](https://ropsten.etherscan.io/txs?block=82990) and [transaction] on Etherscan. + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["82990", "0x2"], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByBlockNumberAndIndex", + "params": ["82990", "0x2"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xbf137c3a7a1ebdfac21252765e5d7f40d115c2757e4a4abee929be88c624fdb7", + "blockNumber": "0x1442e", + "chainId": 2018, + "from": "0x70c9217d814985faef62b124420f8dfbddd96433", + "gas": "0x3d090", + "gasPrice": "0x57148a6be", + "hash": "0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6", + "input": "0x51a34eb8000000000000000000000000000000000000000000000029b9e659e41b780000", + "nonce": "0x2cb2", + "to": "0xcfdc98ec7f01dab1b67b36373524ce0208dc3953", + "transactionIndex": "0x2", + "value": "0x0", + "v": "0x2a", + "r": "0xa2d2b1021e1428740a7c67af3c05fe3160481889b25b921108ac0ac2c3d5d40a", + "s": "0x63186d2aaefe188748bfb4b46fb9493cbc2b53cf36169e8501a5bc0ed941b484" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{block(number:20303) {transactionAt(index: 0) {block{hash} hash}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 20303) { + transactionAt(index: 0) { + block { + hash + } + hash + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "transactionAt": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86" + } + } + } +} +``` + + + +### `eth_getTransactionByHash` + +Returns transaction information for the specified transaction hash. + +#### Parameters + +`transaction`: _string_ - 32-byte transaction hash + +#### Returns + +`result`: _object_ - [transaction object](objects.md#transaction-object), or `null` when there is no transaction + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByHash", + "params": [ + "0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": { + "blockHash": "0x510efccf44a192e6e34bcb439a1947e24b86244280762cbb006858c237093fda", + "blockNumber": "0x422", + "chainId": 2018, + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0x3b9aca00", + "hash": "0xa52be92809541220ee0aaaede6047d9a6c5d0cd96a517c854d944ee70a0ebb44", + "input": "0x", + "nonce": "0x1", + "to": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "transactionIndex": "0x0", + "value": "0x4e1003b28d9280000", + "v": "0xfe7", + "r": "0x84caf09aefbd5e539295acc67217563438a4efb224879b6855f56857fa2037d3", + "s": "0x5e863be3829812c81439f0ae9d8ecb832b531d651fb234c848d1bf45e62be8b9" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash : \"0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d\") { block{hash} gas gasPrice hash nonce value from {address} to {address} status}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + transaction(hash: "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d") { + block { + hash + } + gas + gasPrice + hash + nonce + value + from { + address + } + to { + address + } + status + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "transaction": { + "block": { + "hash": "0xb1ef35744bade6980c3a933024b2557a8c724a19e5fdd2116bac712aa5e57198" + }, + "gas": 21000, + "gasPrice": "0x2540be400", + "hash": "0x03d80b9ca0a71435399a268609d6d7896f7155d2147cc22b780672bcb59b170d", + "nonce": 6, + "value": "0x8ac7230489e80000", + "from": { + "address": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + }, + "to": { + "address": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" + }, + "status": 1 + } + } +} +``` + + + +### `eth_getTransactionCount` + +Returns the number of transactions sent from a specified address. Use the `pending` tag to get the next account nonce not used by any pending transactions. + +#### Parameters + +`address`: _string_ - 20-byte account address + +`blockNumber` or `blockHash`: _string_ - integer representing a block number, block hash, or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - integer representing the number of transactions sent from the specified address + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xc94770007dda54cF92009BFF0dE90c06F603a09f","latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionCount", + "params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f", "latest"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ account (address:\"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73\"){transactionCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + account(address: "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73") { + transactionCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "account": { + "transactionCount": 5 + } + } +} +``` + + + +### `eth_getTransactionReceipt` + +Returns the receipt of a transaction by transaction hash. Receipts for pending transactions are not available. + +If you enabled [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md), the receipt includes available revert reasons in the response. + +#### Parameters + +`transaction`: _string_ - 32-byte hash of a transaction + +#### Returns + +`result`: _object_ - [transaction receipt object](objects.md#transaction-receipt-object), or `null` when there is no receipt + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionReceipt", + "params": [ + "0x504ce587a65bdbdb6414a0c6c16d86a04dd79bfcc4f2950eec9634b30ce5370f" + ], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", + "blockNumber": "0x50", + "contractAddress": null, + "cumulativeGasUsed": "0x5208", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gasUsed": "0x5208", + "effectiveGasPrice": "0x1", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", + "transactionHash": "0xc00e97af59c6f88de163306935f7682af1a34c67245e414537d02e422815efc3", + "transactionIndex": "0x0" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{"query": "{transaction(hash: \"0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86\") {block{hash logsBloom} hash createdContract{address} cumulativeGasUsed gas gasUsed logs{topics} from{address} to{address} index}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + transaction(hash: "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86") { + block { + hash + logsBloom + } + hash + createdContract { + address + } + cumulativeGasUsed + gas + gasUsed + logs { + topics + } + from { + address + } + to { + address + } + index + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "transaction": { + "block": { + "hash": "0x9270651f9c6fa36232c379d0ecf69b519383aa275815a65f1e03114346668f69", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hash": "0x5f5366af89e8777d5ae62a1af94a0876bdccbc22417bed0aff361eefa3e37f86", + "createdContract": null, + "cumulativeGasUsed": 21000, + "gas": 21000, + "gasUsed": 21000, + "effectiveGasPrice": "0x1", + "logs": [], + "from": { + "address": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" + }, + "to": { + "address": "0x9d8f8572f345e1ae53db1dfa4a7fce49b467bd7f" + }, + "index": 0 + } + } +} +``` + + + +### `eth_getUncleByBlockHashAndIndex` + +Returns uncle specified by block hash and index. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +`uncleIndex`: _string_ - index of the uncle + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object) + +:::note + +Uncles don't contain individual transactions. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", "0x0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleByBlockHashAndIndex", + "params": [ + "0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7", + "0x0" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x76b123df93230", + "extraData": "0x50505945206e616e6f706f6f6c2e6f7267", + "gasLimit": "0x7a121d", + "gasUsed": "0x7a0175", + "hash": "0xc20189c0b1a4a23116ab3b177e929137f6e826f17fc4c2e880e7258c620e9817", + "logsBloom": "0x890086c024487ca422be846a201a10e41bc2882902312116c1119609482031e9c000e2a708004a10281024028020c505727a12570c4810121c59024490b040894406a1c23c37a0094810921da3923600c71c03044b40924280038d07ab91964a008084264a01641380798840805a284cce201a8026045451002500113a00de441001320805ca2840037000111640d090442c11116d2112948084240242340400236ce81502063401dcc214b9105194d050884721c1208800b20501a4201400276004142f118e60808284506979a86e050820101c170c185e2310005205a82a2100382422104182090184800c02489e033440218142140045801c024cc1818485", + "miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", + "mixHash": "0xf557cc827e058862aa3ea1bd6088fb8766f70c0eac4117c56cf85b7911f82a14", + "nonce": "0xd320b48904347cdd", + "number": "0x768964", + "parentHash": "0x98d752708b3677df8f439c4529f999b94663d5494dbfc08909656db3c90f6255", + "receiptsRoot": "0x0f838f0ceb73368e7fc8d713a7761e5be31e3b4beafe1a6875a7f275f82da45b", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "size": "0x21a", + "stateRoot": "0xa0c7d4fca79810c89c517eff8dadb9c6d6f4bcc27c2edfb301301e1cf7dec642", + "timestamp": "0x5cdcbba6", + "totalDifficulty": "0x229ad33cabd4c40d23d", + "transactionsRoot": "0x866e38e91d01ef0387b8e07ccf35cd910224271ccf2b7477b8c8439e8b70f365", + "uncles": [] + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7\"){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0xc48fb64230a82f65a08e7280bd8745e7fea87bc7c206309dee32209fe9a985f7") { + ommerAt(index: 0) { + difficulty + extraData + gasLimit + gasUsed + hash + logsBloom + mixHash + nonce + number + receiptsRoot + stateRoot + timestamp + totalDifficulty + transactionsRoot + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "difficulty": "0x1", + "extraData": "0xf882a00000000000000000000000000000000000000000000000000000000000000000d5949811ebc35d7b06b3fa8dc5809a1f9c52751e1deb808400000000f843b8418e98ef756acdae1e510b1df4b507b7af04eb3802db7fa0f3e73e7d0721b3645e76f4eb3d0dbf0de75620c4405bd5a663247cdd9616482c883053856d857f884a01", + "gasLimit": 4700000, + "gasUsed": 0, + "hash": "0x0efe67972b982eb6be5df84e5238eb07475f86afa8a7de708f6a13ac0ff60d6c", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "nonce": "0x0000000000000000", + "number": 200, + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "0xd650578a04b39f50cc979155f4510ec28c2c0a7c1e5fdbf84609bc7b1c430f48", + "timestamp": "0x5cd109fb", + "totalDifficulty": "0xc9", + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" + } + } +} +``` + + + +### `eth_getUncleByBlockNumberAndIndex` + +Returns uncle specified by block number and index. + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `uncleIndex`: _string_ - index of the uncle + +#### Returns + +`result`: _object_ - [block object](objects.md#block-object) + +:::note + +Uncles do not contain individual transactions. + +::: + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x7689D2", "0x0"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleByBlockNumberAndIndex", + "params": ["0x7689D2", "0x0"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x77daec467bf93", + "extraData": "0x50505945206e616e6f706f6f6c2e6f7267", + "gasLimit": "0x7a121d", + "gasUsed": "0x7a0f7b", + "hash": "0x42d83ae9c0743f4b1f9c61ff7ea8b164c1bab3627decd49233760680be006ecf", + "logsBloom": "0x888200800000340120220008640200500408006100038400100581c000080240080a0014e8002010080004088040004022402a000c18010001400100002a041141a0610a0052900600041018c0002a0003090020404c00206010010513d00020005380124e08050480710000000108401012b0901c1424006000083a10a8c1040100a0440081050210124400040044304070004001100000012600806008061d0320800000b40042160600002480000000800000c0002100200940801c000820800048024904710000400640490026000a44300309000286088010c2300060003011380006400200812009144042204810209020410a84000410520c08802941", + "miner": "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", + "mixHash": "0xf977fcdb52868be410b75ef2becc35cc312f13ab0a6ce400ecd9d445f66fa3f2", + "nonce": "0x628b28403bf1e3d3", + "number": "0x7689d0", + "parentHash": "0xb32cfdfbf4adb05d30f02fcc6fe039cc6666402142954051c1a1cb9cc91aa11e", + "receiptsRoot": "0x9c7c8361d1a24ea2841432234c81974a9920d3eba2b2b1c496b5f925a95cb4ac", + "sha3Uncles": "0x7d972aa1b182b7e93f1db043f03fbdbfac6874fe7e67e162141bcc0aefa6336b", + "size": "0x21a", + "stateRoot": "0x74e97b77813146344d75acb5a52a006cc6dfaca678a10fb8a484a8443e919272", + "timestamp": "0x5cdcc0a7", + "totalDifficulty": "0x229b0583b4bd2698ca0", + "transactionsRoot": "0x1d21626afddf05e5866de66ca3fcd98f1caf5357eba0cc6ec675606e116a891b", + "uncles": [] + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:2587){ ommerAt(index: 0) {difficulty extraData gasLimit gasUsed hash logsBloom mixHash nonce number receiptsRoot stateRoot timestamp totalDifficulty transactionsRoot}}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: 2587) { + ommerAt(index: 0) { + difficulty + extraData + gasLimit + gasUsed + hash + logsBloom + mixHash + nonce + number + receiptsRoot + stateRoot + timestamp + totalDifficulty + transactionsRoot + } + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerAt": null + } + } +} +``` + + + +### `eth_getUncleCountByBlockHash` + +Returns the number of uncles in a block from a block matching the given block hash. + +#### Parameters + +`block`: _string_ - 32-byte block hash + +#### Returns + +`result`: _string_ - integer representing the number of uncles in the specified block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleCountByBlockHash", + "params": [ + "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 0x0 +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(hash:\"0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426\"){ommerCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(hash: "0x65c08d792e4192b9ece6b6f2390da7da464208b22d88490be8add9373917b426") { + ommerCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerCount": 2 + } + } +} +``` + + + +### `eth_getUncleCountByBlockNumber` + +Returns the number of uncles in a block matching the specified block number. + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _string_ - integer representing the number of uncles in the specified block + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_getUncleCountByBlockNumber", + "params": ["0xe8"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{block(number:\"0x59fd\"){ommerCount}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + block(number: "0x59fd") { + ommerCount + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "block": { + "ommerCount": 0 + } + } +} +``` + + + +### `eth_getWork` + +Returns the hash of the current block, the seed hash, and the required target boundary condition. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _strings_ - array with the following items: + +- `header`: _string_ - 32-byte hash of the current block header (PoW-hash) + +- `seed`: _string_ - 32-byte seed hash used for the DAG + +- `target`: _string_ - 32-byte required target boundary condition: 2^256 / difficulty + +- `blockNumber`: _string_ - hexadecimal integer representing the current block number + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getWork","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_getWork", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + "0xce5e32ca59cb86799a1879e90150b2c3b882852173e59865e9e79abb67a9d636", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3", + "0x42" + ] +} +``` + + + +### `eth_hashrate` + +Returns the number of hashes per second with which the node is mining. + +When the stratum server is enabled, this method returns the cumulative hashrate of all sealers reporting their hashrate. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - number of hashes per second + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x12b" +} +``` + + + +### `eth_mining` + +Whether the client is actively mining new blocks. Besu pauses mining while the client synchronizes with the network regardless of command settings or methods called. + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - indicates if the client is actively mining new blocks + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_mining", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": true +} +``` + + + +### `eth_newBlockFilter` + +Creates a filter to retrieve new block hashes. To poll for new blocks, use [`eth_getFilterChanges`](#eth_getfilterchanges). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "eth_newBlockFilter", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x9d78b6780f844228b96ecc65a320a825" +} +``` + + + +### `eth_newFilter` + +Creates a [log filter](../../concepts/events-and-logs.md). To poll for logs associated with the created filter, use [`eth_getFilterChanges`](#eth_getfilterchanges). To get all logs associated with the filter, use [`eth_getFilterLogs`](#eth_getfilterlogs). + +#### Parameters + +`filterOptions`: _object_ - [filter options object](objects.md#filter-options-object) + +:::note + +`fromBlock` and `toBlock` in the filter options object default to `latest`. + +::: + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"fromBlock":"earliest", "toBlock":"latest", "topics":[]}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_newFilter", + "params": [{ "fromBlock": "earliest", "toBlock": "latest", "topics": [] }], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x1ddf0c00989044e9b41cc0ae40272df3" +} +``` + + + +### `eth_newPendingTransactionFilter` + +Creates a filter to retrieve new pending transactions hashes. To poll for new pending transactions, use [`eth_getFilterChanges`](#eth_getfilterchanges). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - filter ID + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_newPendingTransactionFilter", + "params": [], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x443d6a77c4964707a8554c92f7e4debd" +} +``` + + + +### `eth_protocolVersion` + +Returns current Ethereum protocol version. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - Ethereum protocol version + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_protocolVersion", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0x3f" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{protocolVersion}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + protocolVersion +} +``` + +# GraphQL result + +```json +{ + "data": { + "protocolVersion": 63 + } +} +``` + + + +### `eth_sendRawTransaction` + +Sends a [signed transaction](../../how-to/send-transactions.md). A transaction can send ether, deploy a contract, or interact with a contract. Set the maximum transaction fee for transactions using the [`--rpc-tx-feecap`](../cli/options.md#rpc-tx-feecap) CLI option. + +You can interact with contracts using `eth_sendRawTransaction` or [`eth_call`](#eth_call). + +To avoid exposing your private key, create signed transactions offline and send the signed transaction data using `eth_sendRawTransaction`. + +:::info + +Besu doesn't implement [`eth_sendTransaction`](../../how-to/send-transactions.md). + +[EthSigner](https://docs.ethsigner.consensys.net/) provides transaction signing and implements [`eth_sendTransaction`](https://docs.ethsigner.consensys.net/Reference/API-Methods#eth_sendtransaction). + +::: + +#### Parameters + +`transaction`: _string_ - signed transaction serialized to hexadecimal format + +:::note + +[Creating and sending transactions](../../how-to/send-transactions.md) includes examples of creating signed transactions using the [web3.js](https://github.com/ethereum/web3.js/) library. + +::: + +#### Returns + +`result`: _string_ - 32-byte transaction hash + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "eth_sendRawTransaction", + "params": [ + "0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation {sendRawTransaction(data: \"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833\")}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +mutation { + sendRawTransaction(data: "0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833") +} +``` + +# GraphQL result + +```json +{ + "data": { + "sendRawTransaction": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" + } +} +``` + + + +### `eth_submitHashrate` + +Submits the mining hashrate. This is used by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer). + +#### Parameters + +- `hashrate`: _string_ - 32-byte hexadecimal string representation of the hashrate + +- `id`: _string_ - 32-byte random hexadecimal ID identifying the client + +#### Returns + +`result`: _boolean_ - indicates if submission is successful + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitHashrate", "params":["0x0000000000000000000000000000000000000000000000000000000000500000", "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_submitHashrate", + "params": [ + "0x0000000000000000000000000000000000000000000000000000000000500000", + "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `eth_submitWork` + +Submits a proof of work (Ethash) solution. This is used by mining software such as [Ethminer](https://github.com/ethereum-mining/ethminer). + +#### Parameters + +- `nonce`: _string_ - retrieved 8-byte nonce + +- `header`: _string_ - 32-byte hash of the block header (PoW-hash) + +- `digest`: _string_ - 32-bytes mix digest + +#### Returns + +`result`: _boolean_ - indicates if the provided solution is valid + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":73} +``` + +# JSON result + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": true +} +``` + + + +### `eth_syncing` + +Returns an object with data about the synchronization status, or `false` if not synchronizing. + +:::note + +Once the node reaches the head of the chain, `eth_syncing` returns false, indicating that there is no active syncing target. + +::: + +#### Parameters + +None + +#### Returns + +`result`: _object_ or _boolean_ - synchronization status data object with the following fields, or `false` if not synchronizing: + +- `startingBlock`: _string_ - index of the highest block on the blockchain when the network synchronization starts + +- `currentBlock`: _string_ - index of the latest block (also known as the best block) for the current node (this is the same index that [`eth_blockNumber`](#eth_blocknumber) returns.) + +- `highestBlock`: _string_ - index of the highest known block in the peer network (that is, the highest block so far discovered among peer nodes. This is the same value as `currentBlock` if the current node has no peers.) + +- `pulledStates`: _string_ - if fast synchronizing, the number of state entries fetched so far, or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, this field is not returned.) + +- `knownStates`: _string_ - if fast synchronizing, the number of states the node knows of so far, or `null` if this is not known or not relevant (if full synchronizing or fully synchronized, this field is not returned.) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":51}' http://127.0.0.1:8545 +``` + +# wscat WS + +```json +{ "jsonrpc": "2.0", "method": "eth_syncing", "params": [], "id": 51 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x1518", + "highestBlock": "0x9567a3", + "pulledStates": "0x203ca", + "knownStates": "0x200636" + } +} +``` + +# curl GraphQL + +```bash +curl -X POST -H "Content-Type: application/json" --data '{ "query": "{syncing{startingBlock currentBlock highestBlock pulledStates knownStates}}"}' http://localhost:8547/graphql +``` + +# GraphQL + +```text +{ + syncing { + startingBlock + currentBlock + highestBlock + pulledStates + knownStates + } +} +``` + +# GraphQL result + +```json +{ + "data": { + "syncing": { + "startingBlock": 0, + "currentBlock": 5400, + "highestBlock": 9791395, + "pullStates": 132042, + "knownStates": 2098742 + } + } +} +``` + + + +### `eth_uninstallFilter` + +Uninstalls a filter with the specified ID. When a filter is no longer required, call this method. + +Filters time out when not requested by [`eth_getFilterChanges`](#eth_getfilterchanges) or [`eth_getFilterLogs`](#eth_getfilterlogs) for 10 minutes. + +#### Parameters + +`filterId`: _string_ - filter ID + +#### Returns + +`result`: _boolean_ - indicates if the filter is successfully uninstalled + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0x70355a0b574b437eaa19fe95adfedc0a"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "eth_uninstallFilter", + "params": ["0x70355a0b574b437eaa19fe95adfedc0a"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `MINER` methods + +The `MINER` API methods allow you to control the node’s mining operation. + +:::note + +The `MINER` API methods are not enabled by default for JSON-RPC. To enable the `MINER` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `miner_changeTargetGasLimit` + +Updates the target gas limit set using the [`--target-gas-limit`](../cli/options.md#target-gas-limit) command line option. + +#### Parameters + +`gasPrice`: _number_ - target gas price in Wei + +#### Returns + +`result`: _string_ - `Success` or `error` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_changeTargetGasLimit","params":[800000], "id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "miner_changeTargetGasLimit", + "params": [800000], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +### `miner_setCoinbase` + +Sets the coinbase, the address for the mining rewards. + +:::note + +You can also use `miner_setEtherbase` as an alternative method. They both work the same way. Etherbase is a historic name for coinbase. + +::: + +#### Parameters + +`coinbase`: _string_ - Account address you pay mining rewards to + +#### Returns + +`result`: _boolean_ - `true` when address is set + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_setCoinbase","params":["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "miner_setCoinbase", + "params": ["0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `miner_start` + +Starts the mining process. To start mining, you must first specify a miner coinbase using the [`--miner-coinbase`](../cli/options.md#miner-coinbase) command line option or using [`miner_setCoinbase`](#miner_setcoinbase). + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - `true` if mining starts, or if the node is already mining + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_start","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "miner_start", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +### `miner_stop` + +Stops the mining process on the client. + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - `true` if mining stops, or if the node is not mining + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"miner_stop","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "miner_stop", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + + + +## `NET` methods + +The `NET` API methods provide network-related information. + +### `net_enode` + +Returns the [enode URL](../../concepts/node-keys.md#enode-url). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - [enode URL](../../concepts/node-keys.md#enode-url) of the node + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_enode","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"net_enode","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "enode://6a63160d0ccef5e4986d270937c6c8d60a9a4d3b25471cda960900d037c61988ea14da67f69dbfb3497c465d0de1f001bb95598f74b68a39a5156a608c42fa1b@127.0.0.1:30303" +} +``` + + + +### `net_listening` + +Whether the client is actively listening for network connections. + +#### Parameters + +None + +#### Returns + +`result`: _boolean_ - indicates if the client is actively listening for network connections + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"net_listening","params":[],"id":53} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": true +} +``` + + + +### `net_peerCount` + +Returns the number of peers currently connected to the client. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - number of connected peers in hexadecimal + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "net_peerCount", "params": [], "id": 53 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5" +} +``` + + + +### `net_services` + +Returns enabled services (for example, `jsonrpc`) and the host and port for each service. + +:::note + +The [`--nat-method`](../cli/options.md#nat-method) setting affects the JSON-RPC and P2P host and port values, but not the metrics host and port values. + +::: + +#### Parameters + +None + +#### Returns + +`result`: _object_ - enabled services + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_services","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"net_services","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "jsonrpc": { + "host": "127.0.0.1", + "port": "8545" + }, + "p2p": { + "host": "127.0.0.1", + "port": "30303" + }, + "metrics": { + "host": "127.0.0.1", + "port": "9545" + } + } +} +``` + + + +### `net_version` + +Returns the [network ID](../../concepts/network-and-chain-id.md). + +#### Parameters + +None + +#### Returns + +`result`: _string_ - current network ID + +| Network ID | Chain | Network | Description | +| ---------- | ----- | ------- | ----------------------------- | +| `1` | ETH | Mainnet | Main Ethereum network | +| `5` | ETH | Goerli | PoS test network | +| `11155111` | ETH | Sepolia | PoS test network | +| `2018` | ETH | Dev | PoW development network | +| `1` | ETC | Classic | Main Ethereum Classic network | +| `7` | ETC | Mordor | PoW test network | +| `6` | ETC | Kotti | PoA test network using Clique | +| `212` | ETC | Astor | PoW test network | + +:::note + +For almost all networks, network ID and chain ID are the same. + +The only networks in the table above with different network and chain IDs are Classic with a chain ID of `61` and Mordor with a chain ID of `63`. + +::: + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "net_version", "params": [], "id": 53 } +``` + +# JSON result for Mainnet + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": "1" +} +``` + +# JSON result for Goerli + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "5" +} +``` + + + +## `PLUGINS` methods + +The `PLUGINS` API methods provide plugin-related functionality. + +:::note + +The `PLUGINS` API methods are not enabled by default for JSON-RPC. To enable the `PLUGINS` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `plugins_reloadPluginConfig` + +Reloads specified plugin configuration. + +#### Parameters + +`plugin`: _string_ - plugin + +#### Returns + +`result`: _string_ - `Success` + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"plugins_reloadPluginConfig","params":["tech.pegasys.plus.plugin.kafka.KafkaPlugin"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "plugins_reloadPluginConfig", + "params": ["tech.pegasys.plus.plugin.kafka.KafkaPlugin"], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Success" +} +``` + + + +## `TRACE` methods + +The `TRACE` API is a more concise alternative to the [`DEBUG` API](#debug-methods). + +:::note + +The `TRACE` API methods are not enabled by default for JSON-RPC. To enable the `TRACE` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `trace_block` + +Provides transaction processing of [type `trace`](../trace-types.md#trace) for the specified block. + +:::tip + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +`blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_block","params":["0x6"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "trace_block", "params": ["0x6"], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad82", + "input": "0x0000000000000000000000000000000000000999", + "to": "0x0020000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": { + "gasUsed": "0x7536", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "call" + }, + { + "action": { + "address": "0x0020000000000000000000000000000000000000", + "balance": "0x300", + "refundAddress": "0x0000000000000999000000000000000000000000" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": null, + "subtraces": 0, + "traceAddress": [0], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "suicide" + }, + { + "action": { + "author": "0x0000000000000000000000000000000000000000", + "rewardType": "block", + "value": "0x1bc16d674ec80000" + }, + "blockHash": "0x71512d31e18f828cef069a87bc2c7514a8ca334f9ee72625efdf5cc2d43768dd", + "blockNumber": 6, + "result": null, + "subtraces": 0, + "traceAddress": [], + "transactionHash": null, + "transactionPosition": null, + "type": "reward" + } + ], + "id": 1 +} +``` + + + +### `trace_call` + +Executes the given call and returns a number of possible traces for it. + +:::info + +The requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `call`: _object_ - [transaction call object](objects.md#transaction-call-object) + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_call","params":[{"from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73","to":"0x0010000000000000000000000000000000000000","gas":"0xfffff2","gasPrice":"0xef","value":"0x0","data":"0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002","nonce":"0x0"},["trace"],"latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_call", + "params": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "to": "0x0010000000000000000000000000000000000000", + "gas": "0xfffff2", + "gasPrice": "0xef", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002", + "nonce": "0x0" + }, + ["trace"], + "latest" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas" : "0xffabba", + "input" : "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002", + "to" : "0x0010000000000000000000000000000000000000", + "value" : "0x0" + }, + "result" : { + "gasUsed" : "0x9c58", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, +"id" : 2 +}, +``` + + + +### `trace_callMany` + +Performs multiple call traces on top of the same block. You can trace dependent transactions. + +:::info + +The requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{"jsonrpc":"2.0","method":"trace_callMany","params":[[[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]],[{"from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1","to":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","value":"0x186a0"},["trace"]]],"latest"],"latest"],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "gas" : "0x1dcd12f8", + "input" : "0x", + "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "0x186a0" + }, + "result" : { + "gasUsed" : "0x0", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, + { + "output" : "0x", + "stateDiff" : null, + "trace" : [ { + "action" : { + "callType" : "call", + "from" : "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "gas" : "0x1dcd12f8", + "input" : "0x", + "to" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "0x186a0" + }, + "result" : { + "gasUsed" : "0x0", + "output" : "0x" + }, + "subtraces" : 0, + "traceAddress" : [ ], + "type" : "call" + } ], + "vmTrace" : null + }, + ], +"id" : 1 +}, +``` + + + +### `trace_filter` + +Returns traces matching the specified filter. + +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +`traceFilterOptions`: _object_ - [trace filter options object](objects.md#trace-filter-options-object) + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in transaction execution order + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_filter","params":[{"fromBlock":"0x1","toBlock":"0x21","after":2,"count":2,"fromAddress":["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"]}],"id":415}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_filter", + "params": [ + { + "fromBlock": "0x1", + "toBlock": "0x21", + "after": 2, + "count": 2, + "fromAddress": ["0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"] + } + ], + "id": 415 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad82", + "input": "0x0000000000000000000000000000000000000999", + "to": "0x0020000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0xcd5d9c7acdcbd3fb4b24a39e05a38e32235751bb0c9e4f1aa16dc598a2c2a9e4", + "blockNumber": 6, + "result": { + "gasUsed": "0x7536", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [], + "transactionHash": "0x91eeabc671e2dd2b1c8ddebb46ba59e8cb3e7d189f80bcc868a9787728c6e59e", + "transactionPosition": 0, + "type": "call" + }, + { + "action": { + "callType": "call", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0xffad52", + "input": "0xf000000000000000000000000000000000000000000000000000000000000001", + "to": "0x0030000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0xeed85fe57db751442c826cfe4fdf43b10a5c2bc8b6fd3a8ccced48eb3fb35885", + "blockNumber": 7, + "result": { + "gasUsed": "0x1b", + "output": "0xf000000000000000000000000000000000000000000000000000000000000002" + }, + "subtraces": 0, + "traceAddress": [], + "transactionHash": "0x47f4d445ea1812cb1ddd3464ab23d2bfc6ed408a8a9db1c497f94e8e06e85286", + "transactionPosition": 0, + "type": "call" + } + ], + "id": 415 +} +``` + + + +### `trace_get` + +Returns trace at given position. + +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `transaction`: _string_ - transaction hash + +- `indexPositions`: _array_ - Index positions of the traces + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_get","params":["0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3",["0x0"]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_get", + "params": [ + "0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3", + ["0x0"] + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "action" : { + "callType" : "call", + "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", + "gas" : "0x13e99", + "input" : "0x16c72721", + "to" : "0x2bd2326c993dfaef84f696526064ff22eba5b362", + "value" : "0x0" + }, + "blockHash" : "0x7eb25504e4c202cf3d62fd585d3e238f592c780cca82dacb2ed3cb5b38883add" + "blockNumber": 3068185, + "result": { + "gasUsed": "0x183", + "output" : "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "subtraces" : 0, + "traceAddress" : [ + 0 + ], + "transactionHash": "0x17104ac9d3312d8c136b7f44d4b8b47852618065ebfa534bd2d3b5ef218ca1f3", + "transactionPosition": 2, + "type" : "call" + }, +"id" : 1 +}, +``` + + + +### `trace_rawTransaction` + +Traces a call to `eth_sendRawTransaction` without making the call, returning the traces. + +:::info + +The requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +- `data` - _string_ - Raw transaction data + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"trace_rawTransaction","params":["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",["trace"]],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_rawTransaction", + "params": [ + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", + ["trace"] + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": { + "output" : "0x" + "stateDiff": null, + "from" : "0x1c39ba39e4735cb65978d4db400ddd70a72dc750", + "trace": [{ + "action": { ... }, + "result": { + "gasUsed": "0x0", + "output": "0x" + } + "subtraces": 0, + "traceAddress": [], + "type": "call" + }], + "vmTrace": null + }, +"id" : 1 +}, +``` + + + +### `trace_replayBlockTransactions` + +Provides transaction processing tracing per block. + +:::info + +When using [Bonsai](../../concepts/data-storage-formats.md#bonsai-tries), the requested block must be within the number of [blocks retained](../cli/options.md#bonsai-historical-block-limit) (by default, 512 from the head of the chain). + +When using [Forest](../../concepts/data-storage-formats.md#forest-of-tries), the requested block must be within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024 from head of the chain). + +::: + +#### Parameters + +- `blockNumber`: _string_ - integer representing a block number or one of the string tags `latest`, `earliest`, or `pending`, as described in [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter) + +- `options`: _array_ of _strings_ - list of tracing options; tracing options are [`trace`, `vmTrace`, and `stateDiff`](../trace-types.md). Specify any combination of the three options including none of them. + +#### Returns + +`result`: _array_ of _objects_ - list of [transaction trace objects](objects.md#transaction-trace-object) containing one object per transaction, in transaction execution order; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the [`trace`](../trace-types.md#trace) list items in the returned transaction trace object include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_replayBlockTransactions","params": ["0x12",["trace","vmTrace","stateDiff"]],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_replayBlockTransactions", + "params": ["0x12", ["trace", "vmTrace", "stateDiff"]], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result":[ + { + "output":"0x", + "vmTrace":{ + "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", + "ops":[ + { + "cost":3, + "ex":{ + "mem":null, + "push":[ + "0x8" + ], + "store":null, + "used":16756175 + }, + "pc":72, + "sub":null + }, + ... + ] + }, + "trace":[ + { + "action":{ + "callType":"call", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0xffadea", + "input":"0x", + "to":"0x0100000000000000000000000000000000000000", + "value":"0x0" + }, + "result":{ + "gasUsed":"0x1e", + "output":"0x" + }, + "subtraces":0, + "traceAddress":[ + ], + "type":"call" + } + ], + "stateDiff":{ + "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ + "balance":{ + "*":{ + "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", + "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" + } + }, + "code":"=", + "nonce":{ + "*":{ + "from":"0x14", + "to":"0x15" + } + }, + "storage":{ + } + } + }, + "transactionHash":"0x2a5079cc535c429f668f13a7fb9a28bdba6831b5462bd04f781777b332a8fcbd", + }, + {...} + ] +} +``` + + + +### `trace_transaction` + +Provides transaction processing of [type `trace`](../trace-types.md#trace) for the specified transaction. + +:::info + +Your node must be an archive node (that is, synchronized without pruning or fast sync) or the requested transaction must be contained in a block within the number of [blocks retained](../cli/options.md#pruning-blocks-retained) with [pruning enabled](../cli/options.md#pruning-enabled) (by default, 1024). + +::: + +#### Parameters + +`transaction`: _string_ - transaction hash + +#### Returns + +`result`: _array_ of _objects_ - list of [calls to other contracts](../trace-types.md#trace) containing one object per call, in the order called by the transaction; if revert reason is enabled with [`--revert-reason-enabled`](../cli/options.md#revert-reason-enabled), the returned list items include the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md). + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc": "2.0", "method": "trace_transaction","params": ["0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7"],"id": 1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "trace_transaction", + "params": [ + "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7" + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "result": [ + { + "action": { + "creationMethod": "create", + "from": "0x627306090abab3a6e1400e9345bc60c78a8bef57", + "gas": "0xff2e26", + "init": "0x60006000600060006000732c2b9c9a4a25e24b174f26114e8926a9f2128fe45af2600060006000600060007300a00000000000000000000000000000000000005af2", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "address": "0x30753e4a8aad7f8597332e813735def5dd395028", + "code": "0x", + "gasUsed": "0x1c39" + }, + "subtraces": 2, + "traceAddress": [], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "create" + }, + { + "action": { + "callType": "callcode", + "from": "0x30753e4a8aad7f8597332e813735def5dd395028", + "gas": "0xfb2ea9", + "input": "0x", + "to": "0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "gasUsed": "0x138e", + "output": "0x" + }, + "subtraces": 1, + "traceAddress": [0], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "call" + }, + { + "action": { + "address": "0x30753e4a8aad7f8597332e813735def5dd395028", + "balance": "0x0", + "refundAddress": "0x0000000000000000000000000000000000000000" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": null, + "subtraces": 0, + "traceAddress": [0, 0], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "suicide" + }, + { + "action": { + "callType": "callcode", + "from": "0x30753e4a8aad7f8597332e813735def5dd395028", + "gas": "0xfb18a5", + "input": "0x", + "to": "0x00a0000000000000000000000000000000000000", + "value": "0x0" + }, + "blockHash": "0x7e9a993adc6f043c0a9b6a385e6ed3fa370586c55823251b8fa7033cf89d414e", + "blockNumber": 19, + "result": { + "gasUsed": "0x30b", + "output": "0x" + }, + "subtraces": 0, + "traceAddress": [1], + "transactionHash": "0x4c253746668dca6ac3f7b9bc18248b558a95b5fc881d140872c2dff984d344a7", + "transactionPosition": 3, + "type": "call" + } + ], + "id": 1 +} +``` + + + +## `TXPOOL` methods + +The `TXPOOL` API methods allow you to inspect the contents of the transaction pool. + +:::note + +The `TXPOOL` API methods are not enabled by default for JSON-RPC. To enable the `TXPOOL` API methods, use the [`--rpc-http-api`](../cli/options.md#rpc-http-api) or [`--rpc-ws-api`](../cli/options.md#rpc-ws-api) options. + +::: + +### `txpool_besuPendingTransactions` + +Lists pending transactions that match the supplied filter conditions. + +#### Parameters + +- `numResults`: _number_ - integer representing the maximum number of results to return + +- `fields`: _object_ - object of fields used to create the filter condition + +Each field in the object corresponds to a field name containing an operator, and a value for the operator. A field name can only be specified once, and can only contain one operator. For example, you cannot query transactions with a gas price between 8 and 9 Gwei by using both the `gt` and `lt` operator in the same field name instance. + +All filters must be satisfied for a transaction to be returned. + +| Field name | Value | Value type | Supported operators | +| --- | --- | :-: | --- | +| `from` | Address of the sender. | _Data_, 20 bytes | `eq` | +| `to` | Address of the receiver, or `"contract_creation"`. | _Data_, 20 bytes | `eq`, `action` | +| `gas` | Gas provided by the sender. | _Quantity_ | `eq`, `gt`, `lt` | +| `gasPrice` | Gas price, in wei, provided by the sender. | _Quantity_ | `eq`, `gt`, `lt` | +| `value` | Value transferred, in wei. | _Quantity_ | `eq`, `gt`, `lt` | +| `nonce` | Number of transactions made by the sender. | _Quantity_ | `eq`, `gt`, `lt` | + +Supported operators: + +- `eq` (equal to) + +- `lt` (less than) + +- `gt` (greater than) + +- `action` + +:::note + +The only supported `action` is `"contract_creation"`. + +::: + +#### Returns + +`result`: _array_ of _objects_ - list of objects with [details of the pending transaction](objects.md#pending-transaction-object) + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuPendingTransactions","params":[2,{"from":{"eq":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"},"gas":{"lt":"0x5209"},"nonce":{"gt":"0x1"}}],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "txpool_besuPendingTransactions", + "params": [ + 2, + { + "from": { "eq": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" }, + "gas": { "lt": "0x5209" }, + "nonce": { "gt": "0x1" } + } + ], + "id": 1 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x5208", + "gasPrice": "0xab5d04c00", + "hash": "0xb7b2f4306c1c228ec94043da73b582594007091a7dfe024b1f8d6d772284e54b", + "input": "0x", + "nonce": "0x2", + "to": "0xf8be4ebda7f62d79a665294ec1263bfdb59aabf2", + "value": "0x0", + "v": "0xfe8", + "r": "0x5beb711e652c6cf0a589d3cea904eefc4f45ce4372652288701d08cc4412086d", + "s": "0x3af14a56e63aa5fb7dcb444a89708363a9d2c1eba1f777c67690288415080ded" + } + ] +} +``` + + + +### `txpool_besuStatistics` + +Lists statistics about the node transaction pool. + +#### Parameters + +None + +#### Returns + +`result`: _object_ - transaction pool statistics object with the following fields: + +- `maxSize`: _number_ - maximum number of transactions kept in the transaction pool; use the [`--tx-pool-max-size`](../cli/options.md#tx-pool-max-size) option to configure the maximum size. + +- `localCount`: _number_ - number of transactions submitted directly to this node + +- `remoteCount`: _number_ - number of transactions received from remote nodes + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "maxSize": 4096, + "localCount": 1, + "remoteCount": 0 + } +} +``` + + + +### `txpool_besuTransactions` + +Lists transactions in the node transaction pool. + +#### Parameters + +None + +#### Returns + +`result`: _array_ of _objects_ - list of transactions + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"txpool_besuTransactions","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "txpool_besuTransactions", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "hash": "0x8a66830098be4006a3f63a03b6e9b67aa721e04bd6b46d420b8f1937689fb4f1", + "isReceivedFromLocalSource": true, + "addedToPoolAt": "2019-03-21T01:35:50.911Z" + }, + { + "hash": "0x41ee803c3987ceb5bcea0fad7a76a8106a2a6dd654409007d9931032ea54579b", + "isReceivedFromLocalSource": true, + "addedToPoolAt": "2019-03-21T01:36:00.374Z" + } + ] +} +``` + + + +## `WEB3` methods + +The `WEB3` API methods provide functionality for the Ethereum ecosystem. + +### `web3_clientVersion` + +Returns the current client version. + +#### Parameters + +None + +#### Returns + +`result`: _string_ - current client version + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ "jsonrpc": "2.0", "method": "web3_clientVersion", "params": [], "id": 1 } +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "besu/" +} +``` + + + +### `web3_sha3` + +Returns a [SHA3](https://en.wikipedia.org/wiki/SHA-3) hash of the specified data. The result value is a [Keccak-256](https://keccak.team/keccak.html) hash, not the standardized SHA3-256. + +#### Parameters + +`data`: _string_ - data to convert to a SHA3 hash + +#### Returns + +`result`: _string_ - SHA3 result of the input data + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c00"],"id":53}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```json +{ + "jsonrpc": "2.0", + "method": "web3_sha3", + "params": ["0x68656c6c6f20776f726c00"], + "id": 53 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 53, + "result": "0x5e39a0a66544c0668bde22d61c47a8710000ece931f13b84d3b2feb44ec96d3f" +} +``` + + + +## Miscellaneous methods + +### `rpc_modules` + +Lists [enabled APIs](../../how-to/use-besu-api/json-rpc.md#api-methods-enabled-by-default) and the version of each. + +#### Parameters + +None + +#### Returns + +`result`: _map_ of _strings_ to _strings_ - enabled APIs and their versions + + + +# curl HTTP request + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1}' http://127.0.0.1:8545 +``` + +# wscat WS request + +```bash +{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "web3": "1.0", + "eth": "1.0", + "net": "1.0" + } +} +``` + + + + + +[schema]: https://github.com/hyperledger/besu/blob/750580dcca349d22d024cc14a8171b2fa74b505a/ethereum/api/src/main/resources/schema.graphqls +[eth_sendRawTransaction or eth_call]: ../../how-to/send-transactions.md#eth_call-or-eth_sendrawtransaction +[transaction]: https://ropsten.etherscan.io/tx/0xfc766a71c406950d4a4955a340a092626c35083c64c7be907060368a5e6811d6 diff --git a/versioned_docs/version-stable/public-networks/reference/api/objects.md b/versioned_docs/version-stable/public-networks/reference/api/objects.md new file mode 100644 index 00000000000..1694463f148 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/api/objects.md @@ -0,0 +1,265 @@ +--- +title: Objects +description: Hyperledger Besu API objects reference +tags: + - public networks + - private networks +--- + +# Besu API objects + +The following objects are parameters for or returned by Besu API methods. + +:::info + +This reference contains API objects that apply to both public and private networks. For private-network-specific API objects, see the [private network API object reference](../../../private-networks/reference/api/objects.md). + +::: + +## Block object + +Returned by [`eth_getBlockByHash`](index.md#eth_getblockbyhash) and [`eth_getBlockByNumber`](index.md#eth_getblockbynumber). + +| Key | Type | Value | +| --- | :-: | --- | +| `number` | _Quantity_, Integer | Block number. `null` when block is pending. | +| `hash` | _Data_, 32 bytes | Hash of the block. `null` when block is pending. | +| `parentHash` | _Data_, 32 bytes | Hash of the parent block. | +| `nonce` | _Data_, 8 bytes | Hash of the generated proof of work. `null` when block is pending. | +| `sha3Uncles` | _Data_, 32 bytes | SHA3 of the uncle's data in the block. | +| `logsBloom` | _Data_, 256 bytes | Bloom filter for the block logs. `null` when block is pending. | +| `transactionsRoot` | _Data_, 32 bytes | Root of the transaction trie for the block. | +| `stateRoot` | Data, 32 bytes | Root of the final state trie for the block. | +| `receiptsRoot` | Data, 32 bytes | Root of the receipts trie for the block. | +| `miner` | Data, 20 bytes | Address to pay mining rewards to. | +| `difficulty` | Quantity, Integer | Difficulty for this block. | +| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. This value will always be `0` for an uncle block. | +| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. Stores extra data when used with [Clique](../../../private-networks/how-to/configure/consensus/clique.md#genesis-file) and [IBFT](../../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | +| `size` | Quantity, Integer | Size of block in bytes. | +| `gasLimit` | Quantity | Maximum gas allowed in this block. | +| `gasUsed` | Quantity | Total gas used by all transactions in this block. | +| `timestamp` | Quantity | Unix timestamp (milliseconds) for block assembly. | +| `transactions` | Array | Array of [transaction objects](#transaction-object), or 32 byte transaction hashes depending on the specified boolean parameter. | +| `uncles` | Array | Array of uncle hashes. | +| `baseFeePerGas` | Quantity | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | + +## Fee history results object + +Returned by [`eth_feeHistory`](index.md#eth_feehistory) for the requested block range. If blocks in the specified block range are not available, then only the fee history for available blocks is returned. + +| Key | Type | Value | +| --- | :-: | --- | +| `oldestBlock` | Quantity, Integer | Lowest number block of the returned range. | +| `baseFeePerGas` | Array | Array of block base fees per gas, including an extra block value. The extra value is the next block after the newest block in the returned range. Returns zeroes for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | +| `gasUsedRatio` | Array | Array of block gas used ratios. These are calculated as the ratio of `gasUsed` and `gasLimit`. | +| `reward` | Array | Array of effective priority fee per gas data points from a single block. All zeroes are returned if the block is empty. | + +## Filter options object + +Parameter for [`eth_newFilter`](index.md#eth_newfilter), [`eth_getLogs`](index.md#eth_getlogs), and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). Used to [`filter logs`](../../how-to/use-besu-api/access-logs.md). + +| Key | Type | Required/Optional | Value | +| --- | :-: | :-: | --- | +| `fromBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | +| `toBlock` | Quantity | Tag | Optional | Integer block number or `latest`, `pending`, `earliest`. See [block parameter](../../how-to/use-besu-api/json-rpc.md#block-parameter). Default is `latest`. | +| `address` | Data | Array | Optional | Contract address or array of addresses from which [logs](../../concepts/events-and-logs.md) originate. | +| `topics` | Array of Data, 32 bytes each | Optional | Array of topics by which to [filter logs](../../concepts/events-and-logs.md#topic-filters). | + +[`eth_getLogs`](index.md#eth_getlogs) and [`priv_getLogs`](index.md#priv_getlogs) have an extra key. + +| Key | Type | Required/Optional | Value | +| --- | :-: | :-: | --- | +| `blockHash` | Data, 32 bytes | Optional. | Hash of block for which to return logs. If you specify `blockHash`, you cannot specify `fromBlock` and `toBlock`. | + +## Log object + +Returned by [`eth_getFilterChanges`](index.md#eth_getfilterchanges) and [`priv_getLogs`](../../../private-networks/reference/api/index.md#priv_getlogs). [`Transaction receipt objects`](#transaction-receipt-object) can contain an array of log objects. + +| Key | Type | Value | +| --- | :-: | --- | +| `removed` | Tag | `true` if log removed because of a chain reorganization. `false` if a valid log. | +| `logIndex` | Quantity, Integer | Log index position in the block. `null` when log is pending. | +| `transactionIndex` | Quantity, Integer | Index position of the starting transaction for the log. `null` when log is pending. | +| `transactionHash` | Data, 32 bytes | Hash of the starting transaction for the log. `null` when log is pending. | +| `blockHash` | Data, 32 bytes | Hash of the block that includes the log. `null` when log is pending. | +| `blockNumber` | Quantity | Number of block that includes the log. `null` when log is pending. | +| `address` | Data, 20 bytes | Address the log originated from. | +| `data` | Data | Non-indexed arguments of the log. | +| `topics` | Array of Data, 32 bytes each | [Event signature hash](../../concepts/events-and-logs.md#event-signature-hash) and 0 to 3 [indexed log arguments](../../concepts/events-and-logs.md#event-parameters). | + +## Miner data object + +Returned by [`eth_getMinerDataByBlockHash`](index.md#eth_getminerdatabyblockhash) and [`eth_getMinerDataByBlockNumber`](index.md#eth_getminerdatabyblocknumber). + +| Key | Type | Value | +| --- | :-: | --- | +| `netBlockReward` | Quantity, Integer | The net block reward, in Wei, is `staticBlockReward + transactionFee + uncleInclusionReward`. | +| `staticBlockReward` | Quantity, Integer | The static block reward, in Wei, is preset on a hard fork. | +| `transactionFee` | Quantity, Integer | The transaction fee, in Wei, is `sum of upfront cost - refund amount for all transactions`. | +| `uncleInclusionReward` | Quantity, Integer | The uncle inclusion reward, in Wei, is `static block reward * number of ommers/32`. | +| `uncleRewards` | Map | Map of uncle block hashes and uncle miner coinbase addresses. | +| `coinbase` | Data, 20 bytes | Coinbase address. | +| `extraData` | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the [`--miner-extra-data`](../cli/options.md#miner-extra-data) command line option. | +| `difficulty` | Quantity, Integer | Difficulty of this block. | +| `totalDifficulty` | Quantity, Integer | Total difficulty of the chain until this block. | + +## Pending transaction object + +Returned by [`txpool_besuPendingTransactions`](index.md#txpool_besupendingtransactions). + +| Key | Type | Value | +| --- | :-: | --- | +| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Not used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `hash` | Data, 32 bytes | Hash of the transaction. | +| `input` | Data | Data sent with the transaction to create or invoke a contract. | +| `nonce` | Quantity | Number of transactions made by the sender before this one. | +| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `value` | Quantity | Value transferred, in Wei. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | + +## Range object + +Returned by [`debug_storageRangeAt`](index.md#debug_storagerangeat). + +| Key | Type | Value | +| --- | :-: | --- | +| `storage` | Object | Key hash and value. Pre-image key is `null` if it falls outside the cache. | +| `nextKey` | Hash | Hash of next key if further storage in range. Otherwise, not included. | + +### Structured log object + +Log information returned as part of the [Trace object](#trace-object). + +| Key | Type | Value | +| --- | :-: | --- | +| `pc` | Integer | Current program counter. | +| `op` | String | Current OpCode. | +| `gas` | Integer | Gas remaining. | +| `gasCost` | Integer | Cost in wei of each gas unit. | +| `depth` | Integer | Execution depth. | +| `exceptionalHaltReasons` | Array | One or more strings representing an error condition causing the EVM execution to terminate. These strings suggest that EVM execution terminated for reasons such as running out of gas or attempting to execute an unknown instruction. Generally a single exceptional halt reason returns but it's possible for more than one to occur at once. | +| `stack` | Array of 32 byte arrays | EVM execution stack before executing current operation. | +| `memory` | Array of 32 byte arrays | Memory space of the contract before executing current operation. | +| `storage` | Object | Storage entries changed by the current transaction. | + +## Trace object + +Returned by [`debug_traceBlock`](index.md#debug_traceblock), [`debug_traceBlockByHash`](index.md#debug_traceblockbyhash), [`debug_traceBlockByNumber`](index.md#debug_traceblockbynumber), and [`debug_traceTransaction`](index.md#debug_tracetransaction). + +| Key | Type | Value | +| --- | :-: | --- | +| `gas` | Integer | Gas used by the transaction. | +| `failed` | Boolean | True if transaction failed, otherwise, false. | +| `returnValue` | String | Bytes returned from transaction execution (without a `0x` prefix). | +| `structLogs` | Array | Array of structured log objects. | + +## Trace filter options object + +Parameter for [`trace_filter`](index.md#trace_filter). All parameters are optional. + +| Key | Type | Value | +| --- | :-: | --- | +| `fromBLock` | String | Tag | Trace starts at this block. | +| `toBlock` | String | Tag | Trace stops at this block. | +| `fromAddress` | String | Include only traces sent from this address. | +| `toAddress` | String | Include only traces with this destination address. | +| `after` | Quantity | The offset trace number. | +| `count` | Integer | Number of traces to display in a batch. | + +## Transaction object + +Returned by [`eth_getTransactionByHash`](index.md#eth_gettransactionbyhash), [`eth_getTransactionByBlockHashAndIndex`](index.md#eth_gettransactionbyblockhashandindex), and [`eth_getTransactionByBlockNumberAndIndex`](index.md#eth_gettransactionbyblocknumberandindex). + +| Key | Type | Value | +| --- | :-: | --- | +| `accessList` | Array | (Optional) List of addresses and storage keys the transaction plans to access. Used in [`ACCESS_LIST` transactions](../../concepts/transactions/types.md#access_list-transactions) and may be used in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `blockHash` | Data, 32 bytes | Hash of the block containing this transaction. `null` when transaction is pending. | +| `blockNumber` | Quantity | Block number of the block containing this transaction. `null` when transaction is pending. | +| `chainId` | Quantity | [Chain ID](../../concepts/network-and-chain-id.md). | +| `from` | Data, 20 bytes | Address of the sender. | +| `gas` | Quantity | Gas provided by the sender. | +| `gasPrice` | Quantity | (Optional) Gas price, in Wei, provided by the sender. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | +| `maxPriorityFeePerGas` | Quantity, Integer | (Optional) Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `maxFeePerGas` | Quantity, Integer | (Optional) Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). | +| `hash` | Data, 32 bytes | Hash of the transaction. | +| `input` | Data | Data sent with the transaction to create or invoke a contract. For [private transactions](../../../private-networks/concepts/privacy/index.md), it's a pointer to the transaction location in [Tessera](https://docs.tessera.consensys.net/). | +| `nonce` | Quantity | Number of transactions made by the sender before this one. | +| `to` | Data, 20 bytes | Address of the receiver. `null` if a contract creation transaction. | +| `transactionIndex` | Quantity, Integer | Index position of the transaction in the block. `null` when transaction is pending. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `value` | Quantity | Value transferred, in Wei. | +| `v` | Quantity | ECDSA Recovery ID. | +| `r` | Data, 32 bytes | ECDSA signature r. | +| `s` | Data, 32 bytes | ECDSA signature s. | + +## Transaction call object + +Parameter for [`eth_call`](index.md#eth_call), [`eth_createAccessList`](index.md#eth_createAccessList), and [`eth_estimateGas`](index.md#eth_estimategas). + +All transaction call object parameters are optional. + +| Key | Type | Value | +| --- | :-: | --- | +| `from` | Data, 20 bytes | Address of the sender. | +| `to` | Data, 20 bytes | Address of the action receiver. | +| `gas` | Quantity, Integer | Gas provided by the sender. `eth_call` consumes zero gas, but other executions might need this parameter. `eth_estimateGas` ignores this value. | +| `gasPrice` | Quantity, Integer | Gas price, in Wei, provided by the sender. The default is `0`. Used only in non-[`EIP1559`](../../concepts/transactions/types.md#eip1559-transactions) transactions. | +| `maxPriorityFeePerGas` | Quantity, Integer | Maximum fee, in Wei, the sender is willing to pay per gas above the base fee. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxFeePerGas`. | +| `maxFeePerGas` | Quantity, Integer | Maximum total fee (base fee + priority fee), in Wei, the sender is willing to pay per gas. Can be used only in [`EIP1559` transactions](../../concepts/transactions/types.md#eip1559-transactions). If used, must specify `maxPriorityFeePerGas`. | +| `value` | Quantity, Integer | Value transferred, in Wei. | +| `data` | Data | Hash of the method signature and encoded parameters. For details, see [Ethereum Contract ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html). | +| `accessList` | Array | List of addresses and storage keys that the transaction plans to access. Used only in non-[`FRONTIER`](../../concepts/transactions/types.md#frontier-transactions) transactions. | +| `strict` | Tag | If `true`, checks that the `from` account’s ether balance is sufficient to cover the transaction and gas fee. If `false`, the `gasPrice` and `baseFee` are set to zero, in order to simulate a transaction without enforcing a balance check. The default is `false`. | + +## Transaction receipt object + +Returned by [`eth_getTransactionReceipt`](index.md#eth_gettransactionreceipt). + +| Key | Type | Value | +| --- | :-: | --- | +| `blockHash` | Data, 32 bytes | Hash of block containing this transaction. | +| `blockNumber` | Quantity | Block number of block containing this transaction. | +| `contractAddress` | Data, 20 bytes | Contract address created, if contract creation transaction, otherwise, `null`. A failed contract creation transaction still produces a contract address value. | +| `cumulativeGasUsed` | Quantity | Total amount of gas used by previous transactions in the block and this transaction. | +| `effectiveGasPrice` | Quantity | The [actual value per gas deducted](../../concepts/transactions/types.md#eip1559-transactions) from the sender's account. | +| `from` | Data, 20 bytes | Address of the sender. | +| `gasUsed` | Quantity | Amount of gas used by this specific transaction. | +| `logs` | Array | Array of [log objects](#log-object) generated by this transaction. | +| `logsBloom` | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs. | +| `status` | Quantity | Either `0x0` (failure), `0x1` (success), or `0x2` (invalid). | +| `to` | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null. | +| `transactionHash` | Data, 32 bytes | Hash of the transaction. | +| `transactionIndex` | Quantity, Integer | Index position of transaction in the block. | +| `transactionType` | String | [Transaction type](../../concepts/transactions/types.md). | +| `revertReason` | String | ABI-encoded string that displays the [reason for reverting the transaction](../../../private-networks/how-to/send-transactions/revert-reason.md). Only available if revert reason is [enabled](../cli/options.md#revert-reason-enabled). | +| `type` | Quantity | Transaction type, `0x00` for legacy transactions, `0x01` for access list types, `0x02` for dynamic fees. | + +:::note + +For pre-Byzantium transactions, the transaction receipt object includes the following instead of `status`: + +| Key | Type | Value | +| ------ | :-----------------: | --------------------------- | +| `root` | Data, 32 bytes | Post-transaction state root | + +::: + +## Transaction trace object + +Returned by [`trace_replayBlockTransactions`](index.md#trace_replayblocktransactions). + +| Key | Type | Value | +| --- | :-: | --- | +| `output` | Boolean | Transaction result. 1 for success and 0 for failure. | +| `stateDiff` | Object | [State changes in the requested block](../trace-types.md#statediff). | +| `trace` | Array | [Ordered list of calls to other contracts](../trace-types.md#trace). | +| `vmTrace` | Object | [Ordered list of EVM actions](../trace-types.md#vmtrace). | +| `transactionHash` | Data, 32 bytes | Hash of the replayed transaction. | diff --git a/versioned_docs/version-stable/public-networks/reference/cli/_category_.json b/versioned_docs/version-stable/public-networks/reference/cli/_category_.json new file mode 100644 index 00000000000..e94b0c9a474 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/cli/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Besu command line", + "position": 1 +} diff --git a/versioned_docs/version-stable/public-networks/reference/cli/options.md b/versioned_docs/version-stable/public-networks/reference/cli/options.md new file mode 100644 index 00000000000..63a2367a32e --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/cli/options.md @@ -0,0 +1,3943 @@ +--- +title: Options +description: Hyperledger Besu command line interface reference +sidebar_position: 1 +tags: + - public networks + - private networks +--- + +# Command line options + +This reference describes the syntax of the Hyperledger Besu command line interface (CLI) options. + +:::info + +This reference contains options that apply to both public and private networks. For private-network-specific options, see the [private network options reference](../../../private-networks/reference/cli/options.md). + +::: + +## Specify options + +You can specify Besu options: + +- On the command line. + + ```bash + besu [OPTIONS] [SUBCOMMAND] + ``` + +- As an environment variable. For each command line option, the equivalent environment variable is: + + - Uppercase. + - `_` replaces `-`. + - Has a `BESU_` prefix. + + For example, set `--miner-coinbase` using the `BESU_MINER_COINBASE` environment variable. + +- In a [configuration file](../../how-to/configuration-file.md). + +If you specify an option in more than one place, the order of priority is command line, environment variable, configuration file. + +If using Bash or Z shell, you can view option suggestions by entering `--` and pressing the Tab key twice. + +```bash +besu --Tab+Tab +``` + +:::caution + +Characters such as smart quotes and long (em) hyphens don't work in Besu command line options. Ensure quotes aren't automatically converted to smart quotes, or double hyphens combined into em hyphens. + +::: + +## Options + +### `api-gas-price-blocks` + + + +# Syntax + +```bash +--api-gas-price-blocks= +``` + +# Example + +```bash +--api-gas-price-blocks=50 +``` + +# Environment variable + +```bash +BESU_API_GAS_PRICE_BLOCKS=50 +``` + +# Example configuration file + +```bash +api-gas-price-blocks=50 +``` + + + +Number of blocks back from the head block to examine for [`eth_gasPrice`](../api/index.md#eth_gasprice). The default is `100`. + +### `api-gas-price-max` + + + +# Syntax + +```bash +--api-gas-price-max= +``` + +# Example + +```bash +--api-gas-price-max=20000 +``` + +# Environment variable + +```bash +BESU_API_GAS_PRICE_MAX=20000 +``` + +# Example configuration file + +```bash +api-gas-price-max=20000 +``` + + + +Maximum gas price to return for [`eth_gasPrice`](../api/index.md#eth_gasprice), regardless of the percentile value measured. The default is `500000000000` (500 GWei). + +### `api-gas-price-percentile` + + + +# Syntax + +```bash +--api-gas-price-percentile= +``` + +# Example + +```bash +--api-gas-price-percentile=75 +``` + +# Environment variable + +```bash +BESU_API_GAS_PRICE_PERCENTILE=75 +``` + +# Example configuration file + +```bash +api-gas-price-percentile=75 +``` + + + +Percentile value to measure for [`eth_gasPrice`](../api/index.md#eth_gasprice). The default is `50.0`. + +For [`eth_gasPrice`](../api/index.md#eth_gasprice), to return the: + +- Highest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `100`. +- Lowest gas price in [`--api-gas-price-blocks`](#api-gas-price-blocks), set to `0`. + +### `auto-log-bloom-caching-enabled` + + + +# Syntax + +```bash +--auto-log-bloom-caching-enabled[=] +``` + +# Example + +```bash +--auto-log-bloom-caching-enabled=false +``` + +# Environment variable + +```bash +BESU_AUTO_LOG_BLOOM_CACHING_ENABLED=false +``` + +# Example configuration file + +```bash +auto-log-bloom-caching-enabled=false +``` + + + +Enables or disables automatic log bloom caching. APIs such as [`eth_getLogs`](../api/index.md#eth_getlogs) and [`eth_getFilterLogs`](../api/index.md#eth_getfilterlogs) use the cache for improved performance. The default is `true`. + +If automatic log bloom caching is enabled and a log bloom query reaches the end of the cache, Besu performs an uncached query for logs not yet written to the cache. + +Automatic log bloom caching has a small impact on performance. If you are not querying logs blooms for a large number of blocks, you might want to disable automatic log bloom caching. + +### `banned-node-ids` + + + +# Syntax + +```bash +--banned-node-ids=[,...]... +``` + +# Example + +```bash +--banned-node-ids=0xc35c3...d615f,0xf42c13...fc456 +``` + +# Environment variable + +```bash +BESU_BANNED_NODE_IDS=0xc35c3...d615f,0xf42c13...fc456 +``` + +# Configuration file + +```bash +banned-node-ids=["0xc35c3...d615f","0xf42c13...fc456"] +``` + + + +A list of node IDs with which this node will not peer. The node ID is the public key of the node. You can specify the banned node IDs with or without the `0x` prefix. + +:::tip + +The singular `--banned-node-id` and plural `--banned-node-ids` are available and are two names for the same option. + +::: + +### `bonsai-historical-block-limit` + + + +# Syntax + +```bash +--bonsai-historical-block-limit=256 +``` + +# Example + +```bash +--bonsai-historical-block-limit=256 +``` + +# Environment variable + +```bash +BESU_BONSAI_MAXIMUM_BACK_LAYERS_TO_LOAD=256 +``` + +# Example configuration file + +```bash +bonsai-historical-block-limit=256 +``` + + + +When using [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries), the [maximum number of previous blocks](../../concepts/data-storage-formats.md#accessing-data) for which Bonsai can reconstruct a historical state. The default is 512. + +### `bootnodes` + + + +# Syntax + +```bash +--bootnodes[=[,...]...] +``` + +# Example + +```bash +--bootnodes=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` + +# Environment variable + +```bash +BESU_BOOTNODES=enode://c35c3...d615f@1.2.3.4:30303,enode://f42c13...fc456@1.2.3.5:30303 +``` + +# Example configuration file + +```bash +bootnodes=["enode://c35c3...d615f@1.2.3.4:30303","enode://f42c13...fc456@1.2.3.5:30303"] +``` + + + +A list of comma-separated [enode URLs](../../concepts/node-keys.md#enode-url) for [P2P discovery bootstrap](../../../private-networks/how-to/configure/bootnodes.md). + +When connecting to Mainnet or public testnets, the default is a predefined list of enode URLs. + +In private networks defined using [`--genesis-file`](#genesis-file) or when using [`--network=dev`](#network), the default is an empty list of bootnodes. + +### `color-enabled` + + + +# Syntax + +```bash +--color-enabled[=] +``` + +# Example + +```bash +--color-enabled=false +``` + +# Environment variable + +```bash +BESU_COLOR_ENABLED=false +``` + +# Example configuration file + +```bash +color-enabled=false +``` + + + +Enables or disables color output to console. The default is `true`. + +### `compatibility-eth64-forkid-enabled` + + + +# Syntax + +```bash +--compatibility-eth64-forkid-enabled[=] +``` + +# Example + +```bash +--compatibility-eth64-forkid-enabled=true +``` + +# Environment variable + +```bash +BESU_COMPATIBILITY_ETH64_FORKID_ENABLED=true +``` + +# Example configuration file + +```bash +compatibility-eth64-forkid-enabled=true +``` + + + +Enables or disables the legacy Eth/64 fork ID. For any networks with nodes using Besu v1.4 or earlier and nodes using Besu v20.10.1 or later, either: + +- All nodes must be upgraded to v20.10.1 or later. +- All nodes using v20.10.1 or later must have `--compatibility-eth64-forkid-enabled` set to `true`. + +The default is `false`. + +:::caution + +If networks have Besu nodes using v1.4 or earlier and other Besu nodes using v20.10.1 or later, the nodes on different versions cannot communicate unless `--compatibility-eth64-forkid-enabled` is set to `true`. + +::: + +### `config-file` + + + +# Syntax + +```bash +--config-file= +``` + +# Example + +```bash +--config-file=/home/me/me_node/config.toml +``` + +# Environment variable + +```bash +BESU_CONFIG_FILE=/home/me/me_node/config.toml +``` + + + +The path to the [TOML configuration file](../../how-to/configuration-file.md). The default is `none`. + +### `data-path` + + + +# Syntax + +```bash +--data-path= +``` + +# Example + +```bash +--data-path=/home/me/me_node +``` + +# Environment variable + +```bash +BESU_DATA_PATH=/home/me/me_node +``` + +# Configuration file + +```bash +data-path="/home/me/me_node" +``` + + + +The path to the Besu data directory. The default is the directory you installed Besu in, or `/opt/besu/database` if using the [Besu Docker image](../../get-started/install/run-docker-image.md). + +### `data-storage-format` + + + +# Syntax + +```bash +--data-storage-format= +``` + +# Example + +```bash +--data-storage-format=BONSAI +``` + +# Environment variable + +```bash +BESU_DATA_STORAGE_FORMAT=BONSAI +``` + +# Configuration file + +```bash +data-storage-format="BONSAI" +``` + + + +The [data storage format](../../concepts/data-storage-formats.md) to use. Set to `BONSAI` for Bonsai Tries or `FOREST` for Forest of Tries. The default is `FOREST`. + +### `discovery-dns-url` + + + +# Syntax + +```bash +--discovery-dns-url= +``` + +# Environment variable + +```bash +BESU_DISCOVERY_DNS_URL=enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org +``` + +# Example configuration file + +```bash +discovery-dns-url="enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" +``` + + + +The `enrtree` URL of the DNS node list for [node discovery via DNS](https://eips.ethereum.org/EIPS/eip-1459). The default is `null`. + +### `discovery-enabled` + + + +# Syntax + +```bash +--discovery-enabled[=] +``` + +# Example + +```bash +--discovery-enabled=false +``` + +# Environment variable + +```bash +BESU_DISCOVERY_ENABLED=false +``` + +# Example configuration file + +```bash +discovery-enabled=false +``` + + + +Enables or disables P2P discovery. The default is `true`. + +:::note + +You can override the default DNS server if it's unreliable or doesn't serve TCP DNS requests, using the [early access option](#xhelp) `--Xp2p-dns-discovery-server=`. + +::: + +### `engine-host-allowlist` + + + +# Syntax + +```bash +--engine-host-allowlist=[,...]... or "*" +``` + +# Example + +```bash +--engine-host-allowlist=localhost,127.0.0.1 +``` + +# Environment variable + +```bash +BESU_ENGINE_HOST_ALLOWLIST=localhost,127.0.0.1 +``` + +# Configuration file + +```bash +engine-host-allowlist=["localhost","127.0.0.1"] +``` + + + +A comma-separated list of hostnames to allow for Engine API access (applies to both HTTP and WebSocket). + +:::tip + +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames in production environments. + +::: + +### `engine-jwt-disabled` + + + +# Syntax + +```bash +--engine-jwt-disabled[=] +``` + +# Example + +```bash +--engine-jwt-disabled=true +``` + +# Environment variable + +```bash +BESU_ENGINE_JWT_DISABLED=true +``` + +# Configuration file + +```bash +engine-jwt-disabled=true +``` + + + +Disables or enables [authentication](../../how-to/use-engine-api.md#authentication) for Engine APIs. The default is `false` (authentication is enabled by default). + +### `engine-jwt-secret` + + + +# Syntax + +```bash +--engine-jwt-secret= +``` + +# Example + +```bash +--engine-jwt-secret=jwt.hex +``` + +# Environment variable + +```bash +BESU_ENGINE_JWT_SECRET="jwt.hex" +``` + +# Configuration file + +```bash +engine-jwt-secret="jwt.hex" +``` + + + +Shared secret used to authenticate [consensus clients](../../concepts/the-merge.md) when using the Engine JSON-RPC API (both HTTP and WebSocket). Contents of file must be at least 32 hex-encoded bytes and not begin with `0x`. May be a relative or absolute path. See an [example of how to generate this](../../get-started/connect/mainnet.md#1-generate-the-shared-secret). + +### `engine-rpc-enabled` + + + +# Syntax + +```bash +--engine-rpc-enabled[= +``` + +# Example + +```bash +--engine-rpc-enabled +``` + +# Environment variable + +```bash +BESU_ENGINE_RPC_ENABLED=true +``` + +# Configuration file + +```bash +engine-rpc-enabled=true +``` + + + +Enables or disables the [Engine API](../engine-api/index.md). The default is `false`. + +### `engine-rpc-port` + + + +# Syntax + +```bash +--engine-rpc-port= +``` + +# Example + +```bash +--engine-rpc-port=8551 +``` + +# Environment variable + +```bash +BESU_ENGINE_RPC_PORT=8551 +``` + +# Configuration file + +```bash +engine-rpc-port="8551" +``` + + + +The listening port for the Engine API calls (`ENGINE`, `ETH`) for JSON-RPC over HTTP and WebSocket. The default is `8551`. + +### `ethstats` + + + +# Syntax + +```bash +--ethstats= +``` + +# Example + +```bash +--ethstats=Dev-Node-1:secret@127.0.0.1:3001 +``` + +# Environment variable + +```bash +BESU_ETHSTATS=Dev-Node-1:secret@127.0.0.1:3001 +``` + +# Configuration file + +```bash +ethstats="Dev-Node-1:secret@127.0.0.1:3001" +``` + + + +Reporting URL of an [Ethstats](../../../private-networks/how-to/deploy/ethstats.md) server. If specified without a port, the default port is 443 for SSL connections and 80 for non-SSL connections. + +### `ethstats-cacert-file` + + + +# Syntax + +```bash +--ethstats-cacert-file= +``` + +# Example + +```bash +--ethstats-cacert-file=./root.cert +``` + +# Environment variable + +```bash +BESU_ETHSTATS_CACERT_FILE=./root.cert +``` + +# Configuration file + +```bash +ethstats-cacert-file="./root.cert" +``` + + + +Path to the root certificate authority (CA) certificate file of the Ethstats server specified by [`--ethstats`](#ethstats). This option is useful in non-production environments. + +### `ethstats-contact` + + + +# Syntax + +```bash +--ethstats-contact= +``` + +# Example + +```bash +--ethstats-contact=contact@mail.com +``` + +# Environment variable + +```bash +BESU_ETHSTATS_CONTACT=contact@mail.com +``` + +# Configuration file + +```bash +ethstats-contact="contact@mail.com" +``` + + + +Contact email address to send to the Ethstats server specified by [`--ethstats`](#ethstats). + +### `fast-sync-min-peers` + + + +# Syntax + +```bash +--fast-sync-min-peers= +``` + +# Example + +```bash +--fast-sync-min-peers=8 +``` + +# Environment variable + +```bash +BESU_FAST_SYNC_MIN_PEERS=8 +``` + +# Example configuration file + +```bash +fast-sync-min-peers=8 +``` + + + +The minimum number of peers required before starting [fast synchronization](../../get-started/connect/sync-node.md#fast-synchronization) in [proof of work](../../how-to/use-pow/mining.md) networks. The default is 5. + +:::info + +This option only applies to proof of work networks. + +::: + +### `genesis-file` + + + +# Syntax + +```bash +--genesis-file= +``` + +# Example + +```bash +--genesis-file=/home/me/me_node/customGenesisFile.json +``` + +# Environment variable + +```bash +BESU_GENESIS_FILE=/home/me/me_node/customGenesisFile.json +``` + +# Configuration file + +```bash +genesis-file="/home/me/me_node/customGenesisFile.json" +``` + + + +The path to the [genesis file](../../concepts/genesis-file.md). + +:::caution + +You can't use the [`--genesis-file`](#genesis-file) and [`--network`](#network) options at the same time. + +::: + +### `graphql-http-cors-origins` + + + +# Syntax + +```bash +--graphql-http-cors-origins= +``` + +# Example + +```bash +--graphql-http-cors-origins="http://medomain.com","https://meotherdomain.com" +``` + +# Environment variable + +```bash +BESU_GRAPHQL_HTTP_CORS_ORIGINS="http://medomain.com","https://meotherdomain.com" +``` + +# Configuration file + +```bash +graphql-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] +``` + + + +A list of comma-separated origin domain URLs for CORS validation. The default is none. + +### `graphql-http-enabled` + + + +# Syntax + +```bash +--graphql-http-enabled[=] +``` + +# Example + +```bash +--graphql-http-enabled +``` + +# Environment variable + +```bash +BESU_GRAPHQL_HTTP_ENABLED=true +``` + +# Configuration file + +```bash +graphql-http-enabled=true +``` + + + +Enables or disables the GraphQL HTTP service. The default is `false`. + +The default GraphQL HTTP service endpoint is `http://127.0.0.1:8547/graphql` if set to `true`. + +### `graphql-http-host` + + + +# Syntax + +```bash +--graphql-http-host= +``` + +# Example + +```bash +# to listen on all interfaces +--graphql-http-host=0.0.0.0 +``` + +# Environment variable + +```bash +# to listen on all interfaces +BESU_GRAPHQL_HTTP_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +graphql-http-host="0.0.0.0" +``` + + + +The host on which GraphQL HTTP listens. The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0`. + +### `graphql-http-port` + + + +# Syntax + +```bash +--graphql-http-port= +``` + +# Example + +```bash +# to listen on port 6175 +--graphql-http-port=6175 +``` + +# Environment variable + +```bash +# to listen on port 6175 +BESU_GRAPHQL_HTTP_PORT=6175 +``` + +# Configuration file + +```bash +graphql-http-port="6175" +``` + + + +The port (TCP) on which GraphQL HTTP listens. The default is `8547`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `help` + + + +# Syntax + +```bash +-h, --help +``` + + + +Show the help message and exit. + +### `host-allowlist` + + + +# Syntax + +```bash +--host-allowlist=[,...]... or "*" +``` + +# Example + +```bash +--host-allowlist=medomain.com,meotherdomain.com +``` + +# Environment variable + +```bash +BESU_HOST_ALLOWLIST=medomain.com,meotherdomain.com +``` + +# Configuration file + +```bash +host-allowlist=["medomain.com", "meotherdomain.com"] +``` + + + +A comma-separated list of hostnames to [access the JSON-RPC API](../../how-to/use-besu-api/index.md#host-allowlist) and [pull Besu metrics](../../how-to/monitor/metrics.md). By default, Besu accepts requests from `localhost` and `127.0.0.1`. + +:::info + +This isn't a permissioning feature. To restrict access to the API, we recommend using the [Besu authentication mechanism](../../how-to/use-besu-api/authenticate.md) with username and password authentication or JWT public key authentication. + +::: + +:::note + +If using [Prometheus](https://prometheus.io/) to pull metrics from a node, you must specify all the other nodes you want to pull metrics from in the list of allowed hostnames. + +::: + +:::tip + +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames for production environments. + +::: + +### `identity` + + + +# Syntax + +```bash +--identity= +``` + +# Example + +```bash +--identity=MyNode +``` + +# Environment variable + +```bash +BESU_IDENTITY=MyNode +``` + +# Configuration file + +```bash +identity="MyNode" +``` + + + +The name for the node. If specified, it's the second section of the client ID provided by some Ethereum network explorers. For example, in the client ID `besu/MyNode/v1.3.4/linux-x86_64/oracle_openjdk-java-11`, the node name is `MyNode`. + +If a name is not specified, the name section is not included in the client ID. For example, `besu/v1.3.4/linux-x86_64/oracle_openjdk-java-11`. + +### `key-value-storage` + + + +# Syntax + +```bash +--key-value-storage= +``` + +# Example + +```bash +--key-value-storage=rocksdb +``` + +# Environment variable + +```bash +BESU_KEY_VALUE_STORAGE=rocksdb +``` + +# Configuration file + +```bash +key-value-storage="rocksdb" +``` + + + +The key-value storage to use. Use this option only if using a storage system provided with a plugin. The default is `rocksdb`. + +For development use only, the `memory` option provides ephemeral storage for sync testing and debugging. + +### `logging` + + + +# Syntax + +```bash +-l, --logging= +``` + +# Example + +```bash +--logging=DEBUG +``` + +# Environment variable + +```bash +BESU_LOGGING=DEBUG +``` + +# Example configuration file + +```bash +logging="DEBUG" +``` + + + +Sets logging verbosity. Log levels are `OFF`, `FATAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. The default is `INFO`. + +### `max-peers` + + + +# Syntax + +```bash +--max-peers= +``` + +# Example + +```bash +--max-peers=42 +``` + +# Environment variable + +```bash +BESU_MAX_PEERS=42 +``` + +# Configuration file + +```bash +max-peers=42 +``` + + + +The maximum number of P2P connections you can establish. The default is 25. + +:::caution + +The minimum number of peers is set by the early access option `--Xp2p-peer-lower-bound`, which also has a default of 25. If you reduce the `--max-peers` from the default, you must also set the `--Xp2p-peer-lower-bound` option to the same value or lower. For example, if you decrease `--max-peers` to 20, set `--Xp2p-peer-lower-bound` to 20 or lower. + +::: + +### `metrics-category` + + + +# Syntax + +```bash +--metrics-category=[,metrics-category...]... +``` + +# Example + +```bash +--metrics-category=BLOCKCHAIN,PEERS,PROCESS +``` + +# Environment variable + +```bash +BESU_METRICS_CATEGORY=BLOCKCHAIN,PEERS,PROCESS +``` + +# Configuration file + +```bash +metrics-category=["BLOCKCHAIN","PEERS","PROCESS"] +``` + + + +A comma-separated list of categories for which to track metrics. The defaults are `BLOCKCHAIN`, `ETHEREUM`, `EXECUTORS`, `JVM`, `NETWORK`, `PEERS`, `PERMISSIONING`, `PROCESS`, `PRUNER`, `RPC`, `STRATUM`, `SYNCHRONIZER`, and `TRANSACTION_POOL`. + +Other categories are `KVSTORE_ROCKSDB`, `KVSTORE_PRIVATE_ROCKSDB`, `KVSTORE_ROCKSDB_STATS`, and `KVSTORE_PRIVATE_ROCKSDB_STATS`. + +Categories containing `PRIVATE` track metrics when you enable [private transactions](../../../private-networks/concepts/privacy/index.md). + +### `metrics-enabled` + + + +# Syntax + +```bash +--metrics-enabled[=] +``` + +# Example + +```bash +--metrics-enabled +``` + +# Environment variable + +```bash +BESU_METRICS_ENABLED=true +``` + +# Configuration file + +```bash +metrics-enabled=true +``` + + + +Enables or disables the [metrics exporter](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The default is `false`. + +You can't specify `--metrics-enabled` with [`--metrics-push-enabled`](#metrics-push-enabled). That is, you can enable either Prometheus polling or Prometheus push gateway support, but not both at once. + +### `metrics-host` + + + +# Syntax + +```bash +--metrics-host= +``` + +# Example + +```bash +--metrics-host=127.0.0.1 +``` + +# Environment variable + +```bash +BESU_METRICS_HOST=127.0.0.1 +``` + +# Configuration file + +```bash +metrics-host="127.0.0.1" +``` + + + +The host on which [Prometheus](https://prometheus.io/) accesses [Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The metrics server respects the [`--host-allowlist` option](#host-allowlist). + +The default is `127.0.0.1`. + +### `metrics-port` + + + +# Syntax + +```bash +--metrics-port= +``` + +# Example + +```bash +--metrics-port=6174 +``` + +# Environment variable + +```bash +BESU_METRICS_PORT=6174 +``` + +# Configuration file + +```bash +metrics-port="6174" +``` + + + +The port (TCP) on which [Prometheus](https://prometheus.io/) accesses [Besu metrics](../../how-to/monitor/metrics.md#monitor-node-performance-using-prometheus). The default is `9545`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `metrics-protocol` + + + +# Syntax + +```bash +--metrics-protocol= +``` + +# Example + +```bash +--metrics-protocol=OPENTELEMETRY +``` + +# Environment variable + +```bash +BESU_METRICS_PROTOCOL=OPENTELEMETRY +``` + +# Configuration file + +```bash +metrics-protocol="OPENTELEMETRY" +``` + + + +Metrics protocol to use: `PROMETHEUS`, `OPENTELEMETRY`, or `NONE`. The default is `PROMETHEUS`. + +### `metrics-push-enabled` + + + +# Syntax + +```bash +--metrics-push-enabled[=] +``` + +# Example + +```bash +--metrics-push-enabled=true +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_ENABLED=true +``` + +# Configuration file + +```bash +metrics-push-enabled=true +``` + + + +Enables or disables [push gateway integration]. + +You can't specify `--metrics-push-enabled` with [`--metrics-enabled`](#metrics-enabled). That is, you can enable either Prometheus polling or Prometheus push gateway support, but not both at once. + +### `metrics-push-host` + + + +# Syntax + +```bash +--metrics-push-host= +``` + +# Example + +```bash +--metrics-push-host=127.0.0.1 +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_HOST=127.0.0.1 +``` + +# Configuration file + +```bash +metrics-push-host="127.0.0.1" +``` + + + +The host of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The default is `127.0.0.1`. The metrics server respects the [`--host-allowlist` option](#host-allowlist). + +:::note + +When pushing metrics, ensure you set `--metrics-push-host` to the machine on which the push gateway is. Generally, this is a different machine to the machine on which Besu is running. + +::: + +### `metrics-push-interval` + + + +# Syntax + +```bash +--metrics-push-interval= +``` + +# Example + +```bash +--metrics-push-interval=30 +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_INTERVAL=30 +``` + +# Configuration file + +```bash +metrics-push-interval=30 +``` + + + +The interval, in seconds, to push metrics when in `push` mode. The default is 15. + +### `metrics-push-port` + + + +# Syntax + +```bash +--metrics-push-port= +``` + +# Example + +```bash +--metrics-push-port=6174 +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_PORT=6174 +``` + +# Configuration file + +```bash +metrics-push-port="6174" +``` + + + +The port (TCP) of the [Prometheus Push Gateway](https://github.com/prometheus/pushgateway). The default is `9001`. Ports must be [exposed appropriately](../../how-to/connect/configure-ports.md). + +### `metrics-push-prometheus-job` + + + +# Syntax + +```bash +--metrics-push-prometheus-job= +``` + +# Example + +```bash +--metrics-push-prometheus-job="my-custom-job" +``` + +# Environment variable + +```bash +BESU_METRICS_PUSH_PROMETHEUS_JOB="my-custom-job" +``` + +# Configuration file + +```bash +metrics-push-prometheus-job="my-custom-job" +``` + + + +The job name when in `push` mode. The default is `besu-client`. + +### `min-block-occupancy-ratio` + + + +# Syntax + +```bash +--min-block-occupancy-ratio= +``` + +# Example + +```bash +--min-block-occupancy-ratio=0.5 +``` + +# Environment variable + +```bash +BESU_MIN_BLOCK_OCCUPANCY_RATIO=0.5 +``` + +# Configuration file + +```bash +min-block-occupancy-ratio="0.5" +``` + + + +Minimum occupancy ratio for a mined block if the transaction pool is not empty. When filling a block during mining, the occupancy ratio indicates the threshold at which the node stops waiting for smaller transactions to fill the remaining space. The default is 0.8. + +### `miner-coinbase` + + + +# Syntax + +```bash +--miner-coinbase= +``` + +# Example + +```bash +--miner-coinbase=fe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + +# Environment variable + +```bash +BESU_MINER_COINBASE=fe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + +# Configuration file + +```bash +miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73" +``` + + + +The account you pay mining rewards to. You must specify a valid coinbase when you enable mining using the [`--miner-enabled`](#miner-enabled) option or the [`miner_start`](../api/index.md#miner_start) JSON-RPC API method. + +:::note + +Besu ignores this option in networks using [Clique](../../../private-networks/how-to/configure/consensus/clique.md), [IBFT 2.0](../../../private-networks/how-to/configure/consensus/ibft.md), or [QBFT](../../../private-networks/how-to/configure/consensus/qbft.md) consensus protocols. + +::: + +### `miner-enabled` + + + +# Syntax + +```bash +--miner-enabled[=] +``` + +# Example + +```bash +--miner-enabled=true +``` + +# Environment variable + +```bash +BESU_MINER_ENABLED=true +``` + +# Configuration file + +```bash +miner-enabled=true +``` + + + +Enables or disables mining when you start the node. The default is `false`. + +### `miner-extra-data` + + + +# Syntax + +```bash +--miner-extra-data= +``` + +# Example + +```bash +--miner-extra-data=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 +``` + +# Environment variable + +```bash +BESU_MINER_EXTRA_DATA=0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021 +``` + +# Configuration file + +```bash +miner-extra-data="0x444F4E27542050414E4943202120484F444C2C20484F444C2C20484F444C2021" +``` + + + +A hex string representing the 32 bytes included in the extra data field of a mined block. The default is 0x. + +### `miner-stratum-enabled` + + + +# Syntax + +```bash +--miner-stratum-enabled +``` + +# Environment variable + +```bash +BESU_MINER_STRATUM_ENABLED=true +``` + +# Configuration file + +```bash +miner-stratum-enabled=true +``` + + + +Enables a node to perform stratum mining. The default is `false`. + +### `miner-stratum-host` + + + +# Syntax + +```bash +--miner-stratum-host= +``` + +# Example + +```bash +--miner-stratum-host=192.168.1.132 +``` + +# Environment variable + +```bash +BESU_MINER_STRATUM_HOST=192.168.1.132 +``` + +# Configuration file + +```bash +miner-stratum-host="192.168.1.132" +``` + + + +The host of the stratum mining service. The default is `0.0.0.0`. + +### `miner-stratum-port` + + + +# Syntax + +```bash +--miner-stratum-port= +``` + +# Example + +```bash +--miner-stratum-port=8010 +``` + +# Environment variable + +```bash +BESU_MINER_STRATUM_PORT=8010 +``` + +# Configuration file + +```bash +miner-stratum-port="8010" +``` + + + +The port of the stratum mining service. The default is `8008`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `min-gas-price` + + + +# Syntax + +```bash +--min-gas-price= +``` + +# Example + +```bash +--min-gas-price=1337 +``` + +# Environment variable + +```bash +BESU_MIN_GAS_PRICE=1337 +``` + +# Configuration file + +```bash +min-gas-price=1337 +``` + + + +The minimum price a transaction offers to include it in a mined block. The minimum gas price is the lowest value [`eth_gasPrice`](../api/index.md#eth_gasprice) can return. The default is 1000 Wei. + +:::tip + +In a [free gas network](../../../private-networks/how-to/configure/free-gas.md), ensure the minimum gas price is set to zero for every node. Any node with a minimum gas price set higher than zero will silently drop transactions with a zero gas price. You can query a node's gas configuration using [`eth_gasPrice`](../api/index.md#eth_gasprice). + +::: + +### `nat-method` + + + +# Syntax + +```bash +--nat-method=UPNP +``` + +# Example configuration file + +```bash +nat-method="UPNP" +``` + + + +Specify the method for handling [NAT environments](../../how-to/connect/specify-nat.md). The options are: + +- [`UPNP`](../../how-to/connect/specify-nat.md#upnp) +- [`UPNPP2PONLY`](../../how-to/connect/specify-nat.md#upnp) +- [`KUBERNETES`](../../how-to/connect/specify-nat.md#kubernetes) +- [`DOCKER`](../../how-to/connect/specify-nat.md#docker) +- [`AUTO`](../../how-to/connect/specify-nat.md#auto) +- [`NONE`](../../how-to/connect/specify-nat.md#none). + +The default is `AUTO`. `NONE` disables NAT functionality. + +:::tip + +UPnP support is often disabled by default in networking firmware. If disabled by default, explicitly enable UPnP support. + +::: + +:::tip + +Use `UPNPP2PONLY` if you wish to enable UPnP for p2p traffic but not JSON-RPC. + +::: + +:::note + +Specifying `UPNP` might introduce delays during node startup, especially on networks without a UPnP gateway device. + +You must specify `DOCKER` when using the [Besu Docker image](../../get-started/install/run-docker-image.md). + +::: + +### `network` + + + +# Syntax + +```bash +--network= +``` + +# Example + +```bash +--network=goerli +``` + +# Environment variable + +```bash +BESU_NETWORK=goerli +``` + +# Configuration file + +```bash +network="goerli" +``` + + + +The predefined network configuration. The default is `mainnet`. + +Possible values are: + +| Network | Chain | Type | Default Sync Mode | Description | +| :-- | :-- | :-- | :-- | :-- | +| `mainnet` | ETH | Production | [FAST](#sync-mode) | The main network | +| `goerli` | ETH | Test | [FAST](#sync-mode) | A PoA network using Clique | +| `sepolia` | ETH | Test | [FAST](#sync-mode) | A PoW network | +| `dev` | ETH | Development | [FULL](#sync-mode) | A PoW network with a low difficulty to enable local CPU mining | +| `classic` | ETC | Production | [FAST](#sync-mode) | The main Ethereum Classic network | +| `mordor ` | ETC | Test | [FAST](#sync-mode) | A PoW network | +| `kotti` | ETC | Test | [FAST](#sync-mode) | A PoA network using Clique | +| `astor` | ETC | Test | [FAST](#sync-mode) | A PoW network | + +:::tip + +Values are case insensitive, so either `mainnet` or `MAINNET` works. + +::: + +:::info + +- You can't use the `--network` and [`--genesis-file`](#genesis-file) options at the same time. + +- The Ropsten, Rinkeby, and Kiln testnets are deprecated. + +::: + +### `network-id` + + + +# Syntax + +```bash +--network-id= +``` + +# Example + +```bash +--network-id=8675309 +``` + +# Environment variable + +```bash +BESU_NETWORK_ID=8675309 +``` + +# Configuration file + +```bash +network-id="8675309" +``` + + + +The [P2P network identifier](../../concepts/network-and-chain-id.md). + +Use this option to override the default network ID. The default value is the same as the chain ID defined in the genesis file. + +### `node-private-key-file` + + + +# Syntax + +```bash +--node-private-key-file= +``` + +# Example + +```bash +--node-private-key-file=/home/me/me_node/myPrivateKey +``` + +# Environment variable + +```bash +BESU_NODE_PRIVATE_KEY_FILE=/home/me/me_node/myPrivateKey +``` + +# Configuration file + +```bash +node-private-key-file="/home/me/me_node/myPrivateKey" +``` + + + +The private key file for the node. The default is the key file in the [data directory](#data-path). If no key file exists, Besu creates a key file containing the generated private key, otherwise, the existing key file specifies the node private key. + +:::danger + +The private key is not encrypted. + +::: + +This option is ignored if [`--security-module`](#security-module) is set to a non-default value. + +### `p2p-enabled` + + + +# Syntax + +```bash +--p2p-enabled[=] +``` + +# Example + +```bash +--p2p-enabled=false +``` + +# Environment variable + +```bash +BESU_P2P_ENABLED=false +``` + +# Configuration file + +```bash +p2p-enabled=false +``` + + + +Enables or disables all P2P communication. The default is `true`. + +### `p2p-host` + + + +# Syntax + +```bash +--p2p-host= +``` + +# Example + +```bash +# to listen on all interfaces +--p2p-host=0.0.0.0 +``` + +# Environment variable + +```bash +# to listen on all interfaces +BESU_P2P_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +p2p-host="0.0.0.0" +``` + + + +The advertised host that can be used to access the node from outside the network in [P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). The default is `127.0.0.1`. + +:::info + +If [`--nat-method`](#nat-method) is set to [`NONE`](../../how-to/connect/specify-nat.md), `--p2p-host` is not overridden and must be specified for the node to be accessed from outside the network. + +::: + +### `p2p-interface` + + + +Syntax + +```bash +--p2p-interface= +``` + +# Example + +```bash +--p2p-interface=192.168.1.132 +``` + +# Environment variable + +```bash +BESU_P2P_INTERFACE=192.168.1.132 +``` + +# Configuration file + +```bash +p2p-interface="192.168.1.132" +``` + + + +The network interface on which the node listens for [P2P communication](../../how-to/connect/configure-ports.md#p2p-networking). Use the option to specify the required network interface when the device that Besu is running on has multiple network interfaces. The default is 0.0.0.0 (all interfaces). + +### `p2p-port` + + + +# Syntax + +```bash +--p2p-port= +``` + +# Example + +```bash +# to listen on port 1789 +--p2p-port=1789 +``` + +# Environment variable + +```bash +# to listen on port 1789 +BESU_P2P_PORT=1789 +``` + +# Configuration file + +```bash +p2p-port="1789" +``` + + + +The P2P listening ports (UDP and TCP). The default is `30303`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `pruning-block-confirmations` + + + +# Syntax + +```bash +--pruning-block-confirmations= +``` + +# Example + +```bash +--pruning-block-confirmations=5 +``` + +# Environment variable + +```bash +BESU_PRUNING_BLOCK_CONFIRMATIONS=5 +``` + +# Configuration file + +```bash +pruning-block-confirmations=5 +``` + + + +The minimum number of confirmations on a block before marking of newly-stored or in-use state trie nodes that cannot be pruned. The default is 10. + +:::info + +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) is not supported. + +::: + +### `pruning-blocks-retained` + + + +# Syntax + +```bash +--pruning-blocks-retained= +``` + +# Example + +```bash +--pruning-blocks-retained=10000 +``` + +# Environment variable + +```bash +BESU_PRUNING_BLOCKS_RETAINED=10000 +``` + +# Configuration file + +```bash +pruning-blocks-retained=10000 +``` + + + +The minimum number of recent blocks to keep the entire world state for. The default is 1024. + +:::info + +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. + +::: + +### `pruning-enabled` + + + +# Syntax + +```bash +--pruning-enabled +``` + +# Example + +```bash +--pruning-enabled=true +``` + +# Environment variable + +```bash +BESU_PRUNING_ENABLED=true +``` + +# Configuration file + +```bash +pruning-enabled=true +``` + + + +Enables [pruning](../../concepts/data-storage-formats.md#pruning) to reduce storage required for the world state. The default is `false`. + +:::info + +Using pruning with [private transactions](../../../private-networks/concepts/privacy/index.md) isn't supported. + +::: + +:::note + +Pruning is being deprecated for [Bonsai Tries](../../concepts/data-storage-formats.md#bonsai-tries) and is currently not being updated. + +::: + +### `random-peer-priority-enabled` + + + +# Syntax + +```bash +--random-peer-priority-enabled[=] +``` + +# Example + +```bash +--random-peer-priority-enabled=true +``` + +# Environment variable + +```bash +BESU_RANDOM_PEER_PRIORITY_ENABLED=true +``` + +# Configuration file + +```bash +random-peer-priority-enabled=true +``` + + + +Enables or disables random prioritization of incoming connections. Enable in small, stable networks to prevent closed groups of peers forming. The default is `false`. + +### `remote-connections-limit-enabled` + + + +# Syntax + +```bash +--remote-connections-limit-enabled[=] +``` + +# Example + +```bash +--remote-connections-limit-enabled=false +``` + +# Environment variable + +```bash +BESU_REMOTE_CONNECTIONS_LIMIT_ENABLED=false +``` + +# Configuration file + +```bash +remote-connections-limit-enabled=false +``` + + + +Enables or disables using the [`--remote-connections-max-percentage`](#remote-connections-max-percentage) option to limit the percentage of remote P2P connections initiated by peers. The default is `true`. + +:::tip + +In private and permissioned networks with a level of trust between peers, disabling the remote connection limits may increase the speed at which nodes can join the network. + +::: + +:::danger + +To prevent eclipse attacks, ensure you enable the remote connections limit when connecting to any public network, and especially when using [`--sync-mode`](#sync-mode) and [`--fast-sync-min-peers`](#fast-sync-min-peers). + +::: + +### `remote-connections-max-percentage` + + + +# Syntax + +```bash +--remote-connections-max-percentage= +``` + +# Example + +```bash +--remote-connections-max-percentage=25 +``` + +# Environment variable + +```bash +BESU_REMOTE_CONNECTIONS_MAX_PERCENTAGE=25 +``` + +# Configuration file + +```bash +remote-connections-max-percentage=25 +``` + + + +The percentage of remote P2P connections you can establish with the node. Must be between 0 and 100, inclusive. The default is 60. + +### `reorg-logging-threshold` + + + +# Syntax + +```bash +--reorg-logging-threshold= +``` + +# Example + +```bash +--reorg-logging-threshold=3 +``` + +# Environment variable + +```bash +BESU_REORG_LOGGING_THRESHOLD=3 +``` + +# Configuration file + +```bash +reorg-logging-threshold=3 +``` + + + +Minimum depth of chain reorganizations to log. The default is 6. + +### `required-block` + + + +# Syntax + +```bash +--required-block, --required-blocks[=BLOCK=HASH[,BLOCK=HASH...]...] +``` + +# Example + +```bash +--required-block=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 +``` + +# Environment variable + +```bash +BESU_REQUIRED_BLOCK=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80 +``` + +# Configuration file + +```bash +required-block=["6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80"] +``` + + + +Requires a peer with the specified block number to have the specified hash when connecting, or Besu rejects that peer. + +### `revert-reason-enabled` + + + +# Syntax + +```bash +--revert-reason-enabled[=] +``` + +# Example + +```bash +--revert-reason-enabled=true +``` + +# Environment variable + +```bash +BESU_REVERT_REASON_ENABLED=true +``` + +# Configuration file + +```bash +revert-reason-enabled=true +``` + + + +Enables or disables including the [revert reason](../../../private-networks/how-to/send-transactions/revert-reason.md) in the transaction receipt, [`eth_estimateGas`](../api/index.md#eth_estimategas) error response, [`eth_call`](../api/index.md#eth_call) error response, and [`trace`](../trace-types.md#trace) response. The default is `false`. + +:::caution + +Enabling revert reason may use a significant amount of memory. We don't recommend enabling revert reason when connected to public Ethereum networks. + +::: + +### `rpc-http-api` + + + +# Syntax + +```bash +--rpc-http-api=[,...]... +``` + +# Example + +```bash +--rpc-http-api=ETH,NET,WEB3 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_API=ETH,NET,WEB3 +``` + +# Configuration file + +```bash +rpc-http-api=["ETH","NET","WEB3"] +``` + + + +A comma-separated list of APIs to enable on the HTTP JSON-RPC channel. When you use this option you must also specify the `--rpc-http-enabled` option. The available API options are: `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, `TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. + +:::tip + +The singular `--rpc-http-api` and plural `--rpc-http-apis` are available and are two names for the same option. + +::: + +### `rpc-http-authentication-credentials-file` + + + +# Syntax + +```bash +--rpc-http-authentication-credentials-file= +``` + +# Example + +```bash +--rpc-http-authentication-credentials-file=/home/me/me_node/auth.toml +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml +``` + +# Configuration file + +```bash +rpc-http-authentication-credentials-file="/home/me/me_node/auth.toml" +``` + + + +The [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). + +### `rpc-http-authentication-enabled` + + + +# Syntax + +```bash +--rpc-http-authentication-enabled[=] +``` + +# Example + +```bash +--rpc-http-authentication-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_AUTHENTICATION_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-authentication-enabled=true +``` + + + +Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the HTTP JSON-RPC service. + +### `rpc-http-authentication-jwt-public-key-file` + + + +# Syntax + +```bash +--rpc-http-authentication-jwt-public-key-file= +``` + +# Example + +```bash +--rpc-http-authentication-jwt-public-key-file=publicKey.pem +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" +``` + +# Configuration file + +```bash +rpc-http-authentication-jwt-public-key-file="publicKey.pem" +``` + + + +The [JWT provider's public key file] used for JSON-RPC HTTP authentication with an external JWT. + +### `rpc-http-cors-origins` + + + +# Syntax + +```bash +--rpc-http-cors-origins=[,...]... or all or "*" +``` + +# Example + +```bash + +$# You can allow one or more domains with a comma-separated list. + +--rpc-http-cors-origins=http://medomain.com,https://meotherdomain.com +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_CORS_ORIGINS=http://medomain.com,https://meotherdomain.com +``` + +# Configuration file + +```bash +rpc-http-cors-origins=["http://medomain.com","https://meotherdomain.com"] +``` + +# Remix example + +```bash + +$# The following allows Remix to interact with your Besu node. + +--rpc-http-cors-origins=http://remix.ethereum.org +``` + + + +A list of domain URLs for CORS validation. + +Listed domains can access the node using JSON-RPC. If your client interacts with Besu using a browser app (such as Remix or a block explorer), add the client domain to the list. + +The default value is `"none"`. If you do not list any domains, browser apps cannot interact with your Besu node. + +:::note + +To run a local Besu node with MetaMask, set `--rpc-http-cors-origins` to `chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn`. + +Remember to also include the dapp domain MetaMask interacts with, for example if your app is deployed on Remix and you're using MetaMask to interact with the contract, use `--rpc-http-cors-origins=chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn,http://remix.ethereum.org` + +::: + +:::tip + +For testing and development purposes, use `"all"` or `"*"` to accept requests from any domain. We don't recommend accepting requests from any domain for production environments. + +::: + +### `rpc-http-enabled` + + + +# Syntax + +```bash +--rpc-http-enabled[=] +``` + +# Example + +```bash +--rpc-http-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-enabled=true +``` + + + +Enables or disables the HTTP JSON-RPC service. The default is `false`. + +### `rpc-http-host` + + + +# Syntax + +```bash +--rpc-http-host= +``` + +# Example + +```bash +# to listen on all interfaces +--rpc-http-host=0.0.0.0 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +rpc-http-host="0.0.0.0" +``` + + + +The host on which HTTP JSON-RPC listens. The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0`. + +:::caution + +Setting the host to `0.0.0.0` exposes the RPC connection on your node to any remote connection. In a production environment, ensure you are using a firewall to avoid exposing your node to the internet. + +::: + +### `rpc-http-max-active-connections` + + + +# Syntax + +```bash +--rpc-http-max-active-connections= +``` + +# Example + +```bash +--rpc-http-max-active-connections=100 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_MAX_ACTIVE_CONNECTIONS=100 +``` + +# Configuration file + +```toml +rpc-http-max-active-connections=100 +``` + + + +The maximum number of allowed HTTP JSON-RPC connections. Once this limit is reached, incoming connections are rejected. The default is 80. + +### `rpc-http-max-batch-size` + + + +# Syntax + +```bash +--rpc-http-max-batch-size= +``` + +# Example + +```bash +--rpc-http-max-batch-size=1200 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_MAX_BATCH_SIZE=1200 +``` + +# Configuration file + +```toml +rpc-http-max-batch-size=1200 +``` + + + +The maximum number of allowed requests in a [RPC batch request](../../how-to/use-besu-api/json-rpc.md#http). The default limit is `1024`, and `-1` specifies no limit. + +### `rpc-http-port` + + + +# Syntax + +```bash +--rpc-http-port= +``` + +# Example + +```bash +# to listen on port 3435 +--rpc-http-port=3435 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_PORT=3435 +``` + +# Configuration file + +```bash +rpc-http-port="3435" +``` + + + +The port (TCP) on which HTTP JSON-RPC listens. The default is `8545`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `rpc-http-tls-ca-clients-enabled` + + + +# Syntax + +```bash +--rpc-http-tls-ca-clients-enabled[=] +``` + +# Example + +```bash +--rpc-http-tls-ca-clients-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_CA_CLIENTS_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-tls-ca-clients-enabled=true +``` + + + +Enables or disables clients with trusted CA certificates to connect. The default is `false`. + +:::note + +You must enable client authentication using the [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. + +::: + +### `rpc-http-tls-client-auth-enabled` + + + +# Syntax + +```bash +--rpc-http-tls-client-auth-enabled[=] +``` + +# Example + +```bash +--rpc-http-tls-client-auth-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_CLIENT_AUTH_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-tls-client-auth-enabled=true +``` + + + +Enables or disables TLS client authentication for the JSON-RPC HTTP service. The default is `false`. + +:::note + +You must specify [`--rpc-http-tls-ca-clients-enabled`](#rpc-http-tls-ca-clients-enabled) and/or [`rpc-http-tls-known-clients-file`](#rpc-http-tls-known-clients-file). + +::: + +### `rpc-http-tls-cipher-suite` + + + +# Syntax + +```bash +--rpc-http-tls-cipher-suite=[, ...] +``` + +# Example + +```bash +--rpc-http-tls-cipher-suite=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_CIPHER_SUITE=TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +``` + +# Configuration file + +```bash +rpc-http-tls-cipher-suite=["TLS_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"] +``` + + + +A list of comma-separated TLS cipher suites to support. + +:::tip + +The singular `--rpc-http-tls-cipher-suite` and plural `--rpc-http-tls-cipher-suites` are available and are two names for the same option. + +::: + +### `rpc-http-tls-enabled` + + + +# Syntax + +```bash +--rpc-http-tls-enabled[=] +``` + +# Example + +```bash +--rpc-http-tls-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_ENABLED=true +``` + +# Configuration file + +```bash +rpc-http-tls-enabled=true +``` + + + +Enables or disables TLS for the JSON-RPC HTTP service. The default is `false`. + +:::note + +[`--rpc-http-enabled`](#rpc-http-enabled) must be enabled. + +::: + +### `rpc-http-tls-keystore-file` + + + +# Syntax + +```bash +--rpc-http-tls-keystore-file= +``` + +# Example + +```bash +--rpc-http-tls-keystore-file=/home/me/me_node/keystore.pfx +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_KEYSTORE_FILE=/home/me/me_node/keystore.pfx +``` + +# Configuration file + +```bash +rpc-http-tls-keystore-file="/home/me/me_node/keystore.pfx" +``` + + + +The Keystore file (in PKCS #12 format) that contains private key and the certificate presented to the client during authentication. + +### `rpc-http-tls-keystore-password-file` + + + +# Syntax + +```bash +--rpc-http-tls-keystore-password-file= +``` + +# Example + +```bash +--rpc-http-tls-keystore-password-file=/home/me/me_node/password +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_KEYSTORE_PASSWORD_FILE=/home/me/me_node/password +``` + +# Configuration file + +```bash +rpc-http-tls-keystore-password-file="/home/me/me_node/password" +``` + + + +The path to the file containing the password to decrypt the keystore. + +### `rpc-http-tls-known-clients-file` + + + +# Syntax + +```bash +--rpc-http-tls-known-clients-file= +``` + +# Example + +```bash +--rpc-http-tls-known-clients-file=/home/me/me_node/knownClients +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_KNOWN_CLIENTS_FILE=/home/me/me_node/knownClients +``` + +# Configuration file + +```bash +rpc-http-tls-known-clients-file="/home/me/me_node/knownClients" +``` + + + +The path to the file used to [authenticate clients](../../../private-networks/how-to/configure/tls/client-and-server.md#create-the-known-clients-file) using self-signed certificates or non-public certificates. + +Must contain the certificate's Common Name, and SHA-256 fingerprint in the format ` `. + +:::note + +You must enable client authentication using the [`--rpc-http-tls-client-auth-enabled`](#rpc-http-tls-client-auth-enabled) option. + +::: + +### `rpc-http-tls-protocol` + + + +# Syntax + +```bash +--rpc-http-tls-protocol=[, ...] +``` + +# Example + +```bash +--rpc-http-tls-protocol=TLSv1.3,TLSv1.2 +``` + +# Environment variable + +```bash +BESU_RPC_HTTP_TLS_PROTOCOL=TLSv1.3,TLSv1.2 +``` + +# Configuration file + +```bash +rpc-http-tls-protocol=["TLSv1.3","TLSv1.2"] +``` + + + +A list of comma-separated TLS protocols to support. The default is `DEFAULT_TLS_PROTOCOLS`, a list which includes `TLSv1.3` and `TLSv1.2`. + +:::tip + +The singular `--rpc-http-tls-protocol` and plural `--rpc-http-tls-protocols` are available and are two names for the same option. + +::: + +### `rpc-max-logs-range` + + + +# Syntax + +```bash +--rpc-max-logs-range= +``` + +# Example + +```bash +--rpc-max-logs-range=500 +``` + +# Environment variable + +```bash +BESU_RPC_MAX_LOGS_RANGE=500 +``` + +# Configuration file + +```bash +rpc-max-logs-range=500 +``` + + + +When using [`eth_getLogs`](../api/index.md#eth_getlogs), the maximum number of blocks to retrieve logs from. Set to 0 to specify no limit. The default is 5000. + +:::caution + +Using `eth_getLogs` to get logs from a large range of blocks, especially an entire chain from its genesis block, might cause Besu to hang for an indeterminable amount of time while generating the response. + +We recommend setting a range limit or leaving this option at its default value. + +::: + +### `rpc-tx-feecap` + + + +# Syntax + +```bash +--rpc-tx-feecap= +``` + +# Example + +```bash +--rpc-tx-feecap=1200000000000000000 +``` + +# Environment variable + +```bash +BESU_RPC_TX_FEECAP=1200000000000000000 +``` + +# Configuration file + +```bash +rpc-tx-feecap=1200000000000000000 +``` + + + +The maximum transaction fee (in Wei) accepted for transactions submitted through the [`eth_sendRawTransaction`](../api/index.md#eth_sendrawtransaction) RPC. The default is 1000000000000000000 (1 ether). + +If set to 0, then this option is ignored and no cap is applied. + +### `rpc-ws-api` + + + +# Syntax + +```bash +--rpc-ws-api=[,...]... +``` + +# Example + +```bash +--rpc-ws-api=ETH,NET,WEB3 +``` + +# Environment variable + +```bash +BESU_RPC_WS_API=ETH,NET,WEB3 +``` + +# Configuration file + +```bash +rpc-ws-api=["ETH","NET","WEB3"] +``` + + + +A comma-separated list of APIs to enable on the WebSockets channel. When you use this option you must also specify the `--rpc-ws-enabled` option. The available API options are: `ADMIN`, `CLIQUE`, `DEBUG`, `EEA`, `ETH`, `IBFT`, `MINER`, `NET`, `PERM`, `PLUGINS`, `PRIV`, `QBFT`, `TRACE`, `TXPOOL`, and `WEB3`. The default is: `ETH`, `NET`, `WEB3`. + +:::tip + +The singular `--rpc-ws-api` and plural `--rpc-ws-apis` options are available and are two names for the same option. + +::: + +### `rpc-ws-authentication-credentials-file` + + + +# Syntax + +```bash +--rpc-ws-authentication-credentials-file= +``` + +# Example + +```bash +--rpc-ws-authentication-credentials-file=/home/me/me_node/auth.toml +``` + +# Environment variable + +```bash +BESU_RPC_WS_AUTHENTICATION_CREDENTIALS_FILE=/home/me/me_node/auth.toml +``` + +# Configuration file + +```bash +rpc-ws-authentication-credentials-file="/home/me/me_node/auth.toml" +``` + + + +The path to the [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). + +### `rpc-ws-authentication-enabled` + + + +# Syntax + +```bash +--rpc-ws-authentication-enabled[=] +``` + +# Example + +```bash +--rpc-ws-authentication-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_WS_AUTHENTICATION_ENABLED=true +``` + +# Configuration file + +```bash +rpc-ws-authentication-enabled=true +``` + + + +Enables or disables [authentication](../../how-to/use-besu-api/authenticate.md) for the WebSocket JSON-RPC service. + +:::note + +`wscat` doesn't support headers. [Authentication](../../how-to/use-besu-api/authenticate.md) requires you to pass an authentication token in the request header. To use authentication with WebSockets, you need an app that supports headers. + +::: + +### `rpc-ws-authentication-jwt-public-key-file` + + + +# Syntax + +```bash +--rpc-ws-authentication-jwt-public-key-file= +``` + +# Example + +```bash +--rpc-ws-authentication-jwt-public-key-file=publicKey.pem +``` + +# Environment variable + +```bash +BESU_RPC_WS_AUTHENTICATION_JWT_PUBLIC_KEY_FILE="publicKey.pem" +``` + +# Configuration file + +```bash +rpc-ws-authentication-jwt-public-key-file="publicKey.pem" +``` + + + +The [JWT provider's public key file] used for JSON-RPC WebSocket authentication with an external JWT. + +### `rpc-ws-enabled` + + + +# Syntax + +```bash +--rpc-ws-enabled[=] +``` + +# Example + +```bash +--rpc-ws-enabled=true +``` + +# Environment variable + +```bash +BESU_RPC_WS_ENABLED=true +``` + +# Configuration file + +```bash +rpc-ws-enabled=true +``` + + + +Enables or disables the WebSocket JSON-RPC service. The default is `false`. + +### `rpc-ws-host` + + + +# Syntax + +```bash +--rpc-ws-host= +``` + +# Example + +```bash +# to listen on all interfaces +--rpc-ws-host=0.0.0.0 +``` + +# Environment variable + +```bash +BESU_RPC_WS_HOST=0.0.0.0 +``` + +# Configuration file + +```bash +rpc-ws-host="0.0.0.0" +``` + + + +The host on which WebSocket JSON-RPC listens. +The default is `127.0.0.1`. + +To allow remote connections, set to `0.0.0.0` + +### `rpc-ws-max-active-connections` + + + +# Syntax + +```bash +--rpc-ws-max-active-connections= +``` + +# Example + +```bash +--rpc-ws-max-active-connections=100 +``` + +# Environment variable + +```bash +BESU_RPC_WS_MAX_ACTIVE_CONNECTIONS=100 +``` + +# Configuration file + +```toml +rpc-ws-max-active-connections=100 +``` + + + +The maximum number of WebSocket connections allowed for JSON-RPC. Once this limit is reached, incoming connections are rejected. The default is 80. + +### `rpc-ws-max-frame-size` + + + +# Syntax + +```bash +--rpc-ws-max-frame-size= +``` + +# Example + +```bash +--rpc-ws-max-frame-size=65536 +``` + +# Environment variable + +```bash +BESU_RPC_WS_MAX_FRAME_SIZE=65536 +``` + +# Configuration file + +```toml +rpc-ws-max-frame-size=65536 +``` + + + +The maximum size in bytes for JSON-RPC WebSocket frames. If this limit is exceeded, the WebSocket disconnects. The default is 1048576 (or 1 MB). + +### `rpc-ws-port` + + + +# Syntax + +```bash +--rpc-ws-port= +``` + +# Example + +```bash +# to listen on port 6174 +--rpc-ws-port=6174 +``` + +# Environment variable + +```bash +BESU_RPC_WS_PORT=6174 +``` + +# Configuration file + +```bash +rpc-ws-port="6174" +``` + + + +The port (TCP) on which WebSocket JSON-RPC listens. The default is `8546`. You must [expose ports appropriately](../../how-to/connect/configure-ports.md). + +### `security-module` + + + +# Syntax + +```bash +--security-module= +``` + +# Example + +```bash +--security-module=security_module +``` + +# Environment variable + +```bash +BESU_SECURITY_MODULE=security_module +``` + +# Configuration file + +```bash +security-module="security_module" +``` + + + +Name of the security module plugin to use. For example, a Hardware Security Module (HSM) or V3 filestore plugin. + +The default is the node's local private key file specified using [`--node-private-key-file`](#node-private-key-file). + +### `static-nodes-file` + + + +# Syntax + +```bash +--static-nodes-file= +``` + +# Example + +```bash +--static-nodes-file=~/besudata/static-nodes.json +``` + +# Environment variable + +```bash +BESU_STATIC_NODES_FILE=~/besudata/static-nodes.json +``` + +# Configuration file + +```bash +static-nodes-file="~/besudata/static-nodes.json" +``` + + + +Static nodes JSON file containing the [static nodes](../../how-to/connect/static-nodes.md) for this node to connect to. The default is `datapath/static-nodes.json`. + +### `strict-tx-replay-protection-enabled` + + + +# Syntax + +```bash +--strict-tx-replay-protection-enabled[=] +``` + +# Example + +```bash +--strict-tx-replay-protection-enabled=false +``` + +# Environment variable + +```bash +STRICT_TX_REPLAY_PROTECTION_ENABLED=false +``` + +# Configuration file + +```bash +strict-tx-replay-protection-enabled=false +``` + + + +Enables or disables replay protection, in accordance with [EIP-155](https://eips.ethereum.org/EIPS/eip-155), on transactions submitted using JSON-RPC. The default is `false`. + +### `sync-mode` + + + +# Syntax + +```bash +--sync-mode=X_SNAP +``` + +# Example + +```bash +--sync-mode=X_SNAP +``` + +# Environment variable + +```bash +BESU_SYNC_MODE=X_SNAP +``` + +# Configuration file + +```bash +sync-mode="X_SNAP" +``` + + + +The synchronization mode. Use `X_SNAP` for [snap sync](../../get-started/connect/sync-node.md#snap-synchronization), `X_CHECKPOINT` for [checkpoint sync](../../get-started/connect/sync-node.md#checkpoint-synchronization), `FAST` for [fast sync](../../get-started/connect/sync-node.md#fast-synchronization), and `FULL` for [full sync](../../get-started/connect/sync-node.md#run-an-archive-node). + +- The default is `FULL` when connecting to a private network by not using the [`--network`](#network) option and specifying the [`--genesis-file`](#genesis-file) option. +- The default is `FAST` when using the [`--network`](#network) option with named networks, except for the `dev` development network. `FAST` is also the default if running Besu on the default network (Ethereum Mainnet) by specifying neither [network](#network) nor [genesis file](#genesis-file). + +:::tip + +- We recommend using snap sync over fast sync because snap sync can be faster by several days. +- Checkpoint sync is an early access feature. +- It might become impossible to sync Ethereum Mainnet using fast sync in the future. Update Besu to a version that supports newer sync methods. +- When synchronizing in a mode other than `FULL`, most historical world state data is unavailable. Any methods attempting to access unavailable world state data return `null`. + +::: + +### `target-gas-limit` + + + +# Syntax + +```bash +--target-gas-limit= +``` + +# Example + +```bash +--target-gas-limit=8000000 +``` + +# Environment variable + +```bash +BESU_TARGET_GAS_LIMIT=8000000 +``` + +# Configuration file + +```bash +target-gas-limit="8000000" +``` + + + +The gas limit toward which Besu will gradually move on an existing network, if enough miners are in agreement. To change the block gas limit set in the genesis file without creating a new network, use `target-gas-limit`. The gas limit between blocks can change only 1/1024th, so the target tells the block creator how to set the gas limit in its block. If the values are the same or within 1/1024th, Besu sets the limit to the specified value. Otherwise, the limit moves as far as it can within that constraint. + +If a value for `target-gas-limit` is not specified, the block gas limit remains at the value specified in the [genesis file](../genesis-items.md#genesis-block-parameters). + +Use the [`miner_changeTargetGasLimit`](../api/index.md#miner_changetargetgaslimit) API to update the `target-gas-limit` while Besu is running. Alternatively restart Besu with an updated `target-gas-limit` value. + +### `tx-pool-disable-locals` + + + +# Syntax + +```bash +--tx-pool-disable-locals[=] +``` + +# Example + +```bash +--tx-pool-disable-locals=true +``` + +# Environment variable + +```bash +BESU_TX_POOL_DISABLE_LOCALS=true +``` + +# Configuration file + +```bash +tx-pool-disable-locals=true +``` + + + +If this option is set to true, transactions received via RPC must have the same checks, and should not be prioritized +over remote transactions. The default is `false`. + +### `tx-pool-enable-save-restore` + + + +# Syntax + +```bash +--tx-pool-enable-save-restore[=] +``` + +# Example + +```bash +--tx-pool-enable-save-restore=true +``` + +# Environment variable + +```bash +BESU_TX_POOL_ENABLE_SAVE_RESTORE=true +``` + +# Configuration file + +```bash +tx-pool-enable-save-restore=true +``` + + + +Enables or disables saving the transaction pool contents to a file on shutdown and reloading it at startup. +The default is `false`. + +You can define a custom path to the transaction pool file using the [`--tx-pool-save-file`](#tx-pool-save-file) option. + +### `tx-pool-limit-by-account-percentage` + + + +# Syntax + +```bash +--tx-pool-limit-by-account-percentage= +``` + +# Example + +```bash +--tx-pool-limit-by-account-percentage=0.1 +``` + +# Environment variable + +```bash +BESU_TX_POOL_LIMIT_BY_ACCOUNT_PERCENTAGE=0.1 +``` + +# Configuration file + +```bash +tx-pool-limit-by-account-percentage=0.4 +``` + + + +The maximum percentage of future transactions kept in the transaction pool, per account. Accepted values are in the range (0–1]. The default is .001 or 0.1% of transactions from a single account to be kept in the pool. + +:::caution + +The default value is often unsuitable for [private networks](../../../private-networks/index.md). This feature mitigates future-nonce transactions from filling the pool without ever being executable by Besu. This is important for Mainnet, but may cause issues on private networks. Please update this value or set to 1 if you know the nodes gossiping transactions in your network. + +::: + +### `tx-pool-max-size` + + + +# Syntax + +```bash +--tx-pool-max-size= +``` + +# Example + +```bash +--tx-pool-max-size=2000 +``` + +# Environment variable + +```bash +BESU_TX_POOL_MAX_SIZE=2000 +``` + +# Configuration file + +```bash +tx-pool-max-size="2000" +``` + + + +The maximum number of transactions kept in the transaction pool. The default is 4096. + +### `tx-pool-price-bump` + + + +# Syntax + +```bash +--tx-pool-price-bump= +``` + +# Example + +```bash +--tx-pool-price-bump=25 +``` + +# Environment variable + +```bash +BESU_TX_POOL_PRICE_BUMP=25 +``` + +# Configuration file + +```bash +tx-pool-price-bump=25 +``` + + + +The price bump percentage to replace an existing transaction. The default is 10. + +### `tx-pool-retention-hours` + + + +# Syntax + +```bash +--tx-pool-retention-hours= +``` + +# Example + +```bash +--tx-pool-retention-hours=5 +``` + +# Environment variable + +```bash +BESU_TX_POOL_RETENTION_HOURS=5 +``` + +# Configuration file + +```bash +tx-pool-retention-hours=5 +``` + + + +The maximum period, in hours, to hold pending transactions in the transaction pool. The default is 13. + +### `tx-pool-save-file` + + + +# Syntax + +```bash +--tx-pool-save-file= +``` + +# Example + +```bash +--tx-pool-save-file=/home/me/me_node/node_txpool.dump +``` + +# Environment variable + +```bash +BESU_TX_POOL_SAVE_FILE=/home/me/me_node/node_txpool.dump +``` + +# Configuration file + +```bash +tx-pool-save-file="/home/me/me_node/node_txpool.dump" +``` + + + +Path to the file that stores the transaction pool's content if the save and restore functionality is enabled +using [`--tx-pool-enable-save-restore`](#tx-pool-enable-save-restore). The +file is created on shutdown and reloaded during startup. The default file name is `txpool.dump` in the +[data directory](#data-path). + +### `Xhelp` + + + +# Syntax + +```bash +-X, --Xhelp +``` + + + +Displays the early access options and their descriptions, and exit. + +:::caution + +The displayed options are unstable and may change between releases. + +::: + +### `version` + + + +# Syntax + +```bash +-V, --version +``` + + + +Prints version information and exit. + + + +[push gateway integration]: ../../how-to/monitor/metrics.md#running-prometheus-with-besu-in-push-mode +[JWT provider's public key file]: ../../how-to/use-besu-api/authenticate.md#jwt-public-key-authentication diff --git a/versioned_docs/version-stable/public-networks/reference/cli/subcommands.md b/versioned_docs/version-stable/public-networks/reference/cli/subcommands.md new file mode 100644 index 00000000000..1a9798376bc --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/cli/subcommands.md @@ -0,0 +1,262 @@ +--- +title: Subcommands +description: Hyperledger Besu command line interface subcommands +sidebar_position: 2 +tags: + - public networks + - private networks +--- + +# Subcommands + +This reference describes the syntax of the Hyperledger Besu command line interface (CLI) subcommands. + +:::note + +This reference contains subcommands that apply to both public and private networks. For private-network-specific subcommands, see the [private network subcommands reference](../../../private-networks/reference/cli/subcommands.md). + +::: + +To start a Besu node using subcommands, run: + +```bash +besu [OPTIONS] [SUBCOMMAND] [SUBCOMMAND OPTIONS] +``` + +If using Bash or Z shell, you can view subcommand suggestions by pressing the Tab key twice. + +```bash +besu Tab+Tab +``` + +## `blocks` + +Provides blocks related actions. + +### `import` + + + +# Syntax + +```bash +besu blocks import [--skip-pow-validation-enabled] [--start-block=] [--end-block=] --from= +``` + +# Example + +```bash +besu blocks import --skip-pow-validation-enabled --start-block=100 --end-block=300 --from=/home/me/me_project/mainnet.blocks +``` + + + +Imports a block or range of blocks from the specified file into the blockchain database. + +You can specify the starting index of the block range to import with `--start-block`. If omitted, the default start block is 0 (the beginning of the chain). + +You can specify the ending index (exclusive) of the block range to import with `--end-block`. If omitted, all blocks after the start block will be imported. + +Including `--skip-pow-validation-enabled` skips validation of the `mixHash` when importing blocks. + +:::note + +Use `--skip-pow-validation-enabled` when performing [Ethereum Foundation hive testing](https://github.com/ethereum/hive). + +::: + +### `export` + + + +# Syntax + +```bash +besu blocks export [--start-block=] [--end-block=] --to= +``` + +# Example + +```bash +besu --network=goerli --data-path=/home/data/ blocks export --start-block=100 --end-block=300 --to=/home/exportblock.bin +``` + + + +Exports a block or range of blocks from storage to a file in RLP format. + +If you omit `--start-block`, the default start block is 0 (the beginning of the chain), and if you omit `--end-block`, the default end block is the current chain head. + +If you are not running the command against the default network (Mainnet), specify the `--network` or `--genesis-file` parameter. + +## `public-key` + +Provides node public key related actions. + +:::caution + +To get the public key or address of a node, ensure you use the [`--data-path`](options.md#data-path) or [`--node-private-key-file`](options.md#node-private-key-file) option with the `public-key` command. Otherwise, a new [node key](../../concepts/node-keys.md) is silently generated when starting Besu. + +::: + +### `export` + + + +# Syntax + +```bash +besu public-key export [--node-private-key-file=] [--to=] [--ec-curve=] +``` + +# Example (to standard output) + +```bash +besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 +``` + +# Example (to file) + +```bash +besu --data-path= public-key export --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/not_precious_pub_key --ec-curve=secp256k1 +``` + + + +Outputs the node public key to standard output or to the file specified by `--to=`. You can output the public key associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between `secp256k1` or `secp256r1`. + +### `export-address` + + + +# Syntax + +```bash +besu public-key export-address [--node-private-key-file=] [--to=] [--ec-curve=] +``` + +# Example (to standard output) + +```bash +besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --ec-curve=secp256k1 +``` + +# Example (to file) + +```bash +besu --data-path= public-key export-address --node-private-key-file=/home/me/me_node/myPrivateKey --to=/home/me/me_project/me_node_address --ec-curve=secp256k1 +``` + + + +Outputs the node address to standard output or to the file specified by `--to=`. You can output the address associated with a specific private key file using the [`--node-private-key-file`](options.md#node-private-key-file) option. The default elliptic curve used for the key is `secp256k1`. Use the `--ec-curve` option to choose between `secp256k1` or `secp256r1`. + +## `password` + +Provides password related actions. + +### `hash` + + + +# Syntax + +```bash +besu password hash --password= +``` + +# Example + +```bash +besu password hash --password=myPassword123 +``` + + + +Generates the hash of a given password. Include the hash in the [credentials file](../../how-to/use-besu-api/authenticate.md#credentials-file) for JSON-RPC API [authentication](../../how-to/use-besu-api/authenticate.md). + +## `operator` + +Provides operator actions. + +### `generate-log-bloom-cache` + + + +# Syntax + +```bash +besu operator generate-log-bloom-cache [--start-block=] [--end-block=] +``` + +# Example + +```bash +besu --network=goerli --data-path=/project/goerli operator generate-log-bloom-cache --start-block=0 --end-block=100000 +``` + + + +:::tip + +Manually executing `generate-log-bloom-cache` is not required unless you set the [`--auto-log-bloom-caching-enabled`](options.md#auto-log-bloom-caching-enabled) command line option to false. + +::: + +Generates cached log bloom indexes for blocks. APIs use the cached indexes for improved log query performance. + +:::note + +Each index file contains 100000 blocks. The last fragment of blocks less that 100000 are not indexed. + +::: + +To generate cached log bloom indexes while the node is running, use the [`admin_generateLogBloomCache`](../api/index.md#admin_generatelogbloomcache) API. + +## `retesteth` + + + +# Syntax + +```bash +besu retesteth [--data-path=] [--rpc-http-host=] [--rpc-http-port=] [-l=] [--host-allowlist=[,â€Ļ]â€Ļ or * or all] +``` + +# Example + +```bash +besu retesteth --data-path=/home/me/me_node --rpc-http-port=8590 --host-allowlist=* +``` + + + +Runs a Retesteth-compatible server. [Retesteth](https://github.com/ethereum/retesteth/wiki) is a developer tool that can generate and run consensus tests against any Ethereum client running such a server. + +The command accepts the following command line options: + +- [`--data-path`](options.md#data-path) +- [`--host-allowlist`](options.md#host-allowlist) +- [`--rpc-http-host`](options.md#rpc-http-host) +- [`--rpc-http-port`](options.md#rpc-http-port) +- [`--logging`](options.md#logging) + +## `validate-config` + + + +# Syntax + +```bash +besu validate-config --config-file +``` + +# Example + +```bash +besu validate-config --config-file ../besu-local-nodes/config/besu/besu1.conf +``` + + + +Performs basic syntax validation of the specified [TOML configuration file](../../how-to/configuration-file.md). Checks TOML syntax (for example, valid format and unmatched quotes) and flags unknown options. Doesn't check data types, and doesn't check dependencies between options (this is done at Besu startup). diff --git a/versioned_docs/version-stable/public-networks/reference/disclosure.md b/versioned_docs/version-stable/public-networks/reference/disclosure.md new file mode 100644 index 00000000000..3182278df61 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/disclosure.md @@ -0,0 +1,14 @@ +--- +title: Security disclosure policy +sidebar_position: 8 +description: Hyperledger Besu responsible disclosure statement +tags: + - public networks + - private networks +--- + +# Security disclosure policy + +At Hyperledger Besu, security is a priority. But regardless of how much effort we put into system security, there might still be vulnerabilities present. If you discover a vulnerability, we need to know about it so we can take steps to address it as quickly as possible. We would like you to help us better protect our clients and our systems. + +Please follow the process explained on [Hyperledger defect response wiki page](https://wiki.hyperledger.org/display/SEC/Defect+Response). diff --git a/versioned_docs/version-stable/public-networks/reference/engine-api/_category_.json b/versioned_docs/version-stable/public-networks/reference/engine-api/_category_.json new file mode 100644 index 00000000000..0ea3b53ab2e --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/engine-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Engine API", + "position": 3 +} diff --git a/versioned_docs/version-stable/public-networks/reference/engine-api/index.md b/versioned_docs/version-stable/public-networks/reference/engine-api/index.md new file mode 100644 index 00000000000..0d44ea08603 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/engine-api/index.md @@ -0,0 +1,488 @@ +--- +title: Engine API +description: Engine API methods reference +tags: + - public networks +--- + +# Engine API methods + +[Consensus and execution clients](../../concepts/the-merge.md#execution-and-consensus-clients) communicate with each other using the Engine API. When running Besu as an execution client, [use these API calls](../../how-to/use-engine-api.md) to communicate with a consensus client. + +:::info + +Ensure you enable the Engine API methods with the [`--engine-rpc-enabled`](../cli/options.md#engine-rpc-enabled) CLI option. + +::: + +See the [Ethereum Engine API specification](https://github.com/ethereum/execution-apis/blob/0b965fb714ccd3faa3c939fdce1726e56679cdec/src/engine/specification.md) for more information. Not all changes to the Engine API are documented on this page. + +## Methods + +### `engine_exchangeCapabilities` + +Exchanges a list of supported Engine API methods between the consensus client and Besu. + +#### Parameters + +`remoteCapabilities`: _array_ of _strings_ - Engine API method names that the consensus client supports + +#### Returns + +`localCapabilities`: _array_ of _strings_ - Engine API method names that Besu supports + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeCapabilities","params":[["engine_exchangeTransitionConfigurationV1","engine_forkchoiceUpdatedV1","engine_getPayloadBodiesByHash","engine_getPayloadBodiesByRangeV1","engine_getPayloadV1","engine_newPayloadV1"]],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_exchangeCapabilities", + "params": [ + [ + "engine_exchangeTransitionConfigurationV1", + "engine_forkchoiceUpdatedV1", + "engine_getPayloadBodiesByHash", + "engine_getPayloadBodiesByRangeV1", + "engine_getPayloadV1", + "engine_newPayloadV1" + ] + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [ + "engine_getPayloadV1", + "engine_getPayloadV2", + "engine_executePayloadV1", + "engine_newPayloadV1", + "engine_newPayloadV2", + "engine_forkchoiceUpdatedV1", + "engine_forkchoiceUpdatedV2", + "engine_exchangeTransitionConfigurationV1", + "engine_getPayloadBodiesByHashV1", + "engine_getPayloadBodiesByRangeV1" + ] +} +``` + + + +### `engine_exchangeTransitionConfigurationV1` + +Sends the transition configuration to the consensus client to verify the configuration between both clients. + +:::note + +The execution client runs this call every 60 seconds in the background. The log displays a warning message if the call hasn't been sent in 120 seconds. + +::: + +#### Parameters + +`transitionConfiguration`: _object_ - [Transition configuration object](objects.md#transition-configuration-object) + +#### Returns + +`transitionConfiguration`: _object_ - [Transition configuration object](objects.md#transition-configuration-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_exchangeTransitionConfigurationV1","params":[{"terminalTotalDifficulty": 0, "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "terminalBlockNumber": "0x1"}],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_exchangeTransitionConfigurationV1", + "params": [ + { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + } + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + }, + "payloadId": null +} +``` + + + +### `engine_forkchoiceUpdatedV1` + +Updates the fork choice with the consensus client. + +#### Parameters + +- `forkchoiceState`: _object_ - [Fork choice state object](objects.md#fork-choice-state-object) + +- `payloadAttributes`: _object_ - [Payload attribute object](objects.md#payload-attributes-object). Can be `null`. + +#### Returns + +- `payloadStatus`: _object_ - [Payload status object](objects.md#payload-status-object) + +- `payloadId`: _data_ - identifier of the payload build process or `null` + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV1","params":[{"headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},null],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_forkchoiceUpdatedV1", + "params": [ + { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + }, + null + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": null + } +} +``` + + + +### `engine_getPayloadBodiesByHashV1` + +Returns the bodies of the execution payloads corresponding to the specified block hashes. + +#### Parameters + +`blockHashes`: **array** of **strings** - Block hashes + +#### Returns + +`engineGetPayloadBodiesResultV1`: **array** of **objects** - Execution payload body objects + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByHashV1","params":[["0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c","0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553"]],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadBodiesByHashV1", + "params": [ + [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553" + ] + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [{ + "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], + "withdrawals": [{ + "index" : "0xf0", + "validatorIndex" : "0xf0", + "address" : "0x00000000000000000000000000000000000010f0", + "amount" : "0x1" + }, { + "index" : "0xf1", + "validatorIndex" : "0xf1", + "address" : "0x00000000000000000000000000000000000010f1", + "amount" : "0x1" + }] + }, { + "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], + "withdrawals": [{ + "index" : "0xf2", + "validatorIndex" : "0xf2", + "address" : "0x00000000000000000000000000000000000010f2", + "amount" : "0x1" + }, { + "index" : "0xf3", + "validatorIndex" : "0xf3", + "address" : "0x00000000000000000000000000000000000010f3", + "amount" : "0x1" + }] + }] +} +``` + + + +### `engine_getPayloadBodiesByRangeV1` + +Returns the bodies of the execution payloads corresponding to the specified range of block numbers. + +#### Parameters + +- `startBlockNumber`: _string_ - Number of the starting block of the range, as a hexadecimal string + +- `count`: _string_ - Number of blocks in the range (including the starting block), as a hexadecimal string + +#### Returns + +`engineGetPayloadBodiesResultV1`: _array_ of _objects_ - Execution payload body objects + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadBodiesByRangeV1","params":["0x20", "0x2"],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadBodiesByRangeV1", + "params": ["0x20", "0x2"], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": [{ + "transactions": ["0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95", ...], + "withdrawals": [{ + "index" : "0xf0", + "validatorIndex" : "0xf0", + "address" : "0x00000000000000000000000000000000000010f0", + "amount" : "0x1" + }, { + "index" : "0xf1", + "validatorIndex" : "0xf1", + "address" : "0x00000000000000000000000000000000000010f1", + "amount" : "0x1" + }] + }, { + "transactions": ["0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29", ...], + "withdrawals": [{ + "index" : "0xf2", + "validatorIndex" : "0xf2", + "address" : "0x00000000000000000000000000000000000010f2", + "amount" : "0x1" + }, { + "index" : "0xf3", + "validatorIndex" : "0xf3", + "address" : "0x00000000000000000000000000000000000010f3", + "amount" : "0x1" + }] + }] +} +``` + + + +### `engine_getPayloadV1` + +Prepares the payload to send to the consensus client. + +#### Parameters + +`payloadId`: _data_ - Identifier of the payload build process + +#### Returns + +`executionPayload`: _object_ - [Execution payload object](objects.md#execution-payload-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_getPayloadV1","params":["0x0000000021f32cc1"],"id":1}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_getPayloadV1", + "params": ["0x0000000021f32cc1"], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 67, + "result": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +} +``` + + + +### `engine_newPayloadV1` + +Executes the payload with the consensus client. + +#### Parameters + +`executionPayload`: _object_ - [Execution payload object](objects.md#execution-payload-object) + +#### Returns + +- `payloadStatus`: _object_ - [Payload status object](objects.md#payload-status-object) + + + +# curl HTTP + +```bash +curl -X POST --data '{"jsonrpc":"2.0","method":"engine_newPayloadV1","params":[ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } +],"id":67}' http://127.0.0.1:8550 +``` + +# wscat WS + +```json +{ + "jsonrpc": "2.0", + "method": "engine_newPayloadV1", + "params": [ + { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + ], + "id": 67 +} +``` + +# JSON result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } +} +``` + + diff --git a/versioned_docs/version-stable/public-networks/reference/engine-api/objects.md b/versioned_docs/version-stable/public-networks/reference/engine-api/objects.md new file mode 100644 index 00000000000..ecd40054d9f --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/engine-api/objects.md @@ -0,0 +1,71 @@ +--- +title: Objects +description: Engine API objects reference +tags: + - public networks +--- + +# Engine API objects + +The following objects are parameters for or returned by the [Engine API methods](index.md). + +## Execution payload object + +Parameter for [`engine_newPayloadV1`](index.md#engine_newpayloadv1). Returned by [`engine_getPayloadV1`](index.md#engine_getpayloadv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `parentHash` | _Data_, 32 Bytes | Hash of the parent block. | +| `feeRecipient` | _Data_, 20 Bytes | Beneficiary of the fee. | +| `stateRoot` | _Data_, 32 Bytes | Root of the final state trie for the block. | +| `receiptsRoot` | _Data_, 32 Bytes | Root of the receipts trie for the block. | +| `logsBloom` | _Data_, 256 Bytes | Bloom filter for light clients to quickly retrieve related logs. | +| `prevRandao` | _Data_, 32 Bytes | Difficulty for this block. | +| `blockNumber` | _Quantity_, 64 Bits | Block number of block containing this transaction. | +| `gasLimit` | _Quantity_, 64 Bits | Maximum gas allowed in this block. | +| `gasUsed` | _Quantity_, 64 Bits | Total gas used by all transactions in this block. | +| `timestamp` | _Quantity_, 64 Bits | Unix timestamp (milliseconds) for block assembly. | +| `extraData` | _Data_, 0 to 32 Bytes | Extra data field for this block. | +| `baseFeePerGas` | _Quantity_, 256 Bits | The block's [base fee per gas](../../concepts/transactions/types.md#eip1559-transactions). This field is empty for blocks created before [EIP-1559](https://github.com/ethereum/EIPs/blob/2d8a95e14e56de27c5465d93747b0006bd8ac47f/EIPS/eip-1559.md). | +| `blockHash` | _Data_, 32 Bytes | Hash of the execution block. | +| `transactions` | _Array_ | Array of transaction objects, each object is a list representing `TransactionType`, `TransactionPayload`, or `LegacyTransaction` as defined in [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718). | + +## Fork choice state object + +Parameter for [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `headBlockHash` | _Data_, 32 Bytes | Block hash of the head of the canonical chain. | +| `safeBlockHash` | _Data_, 32 Bytes | "Safe" block hash of the canonical chain under certain synchrony and honesty assumptions. This value MUST be either equal to or an ancestor of `headBlockHash`. | +| `finalizedBlockHash` | _Data_, 32 Bytes | Block hash of the most recent finalized block. | + +## Payload attributes object + +Parameter for [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `timestamp` | _Quantity_, 64 Bits | Value for the `timestamp` field of the new payload. | +| `prevRandao` | _Data_, 32 Bytes | Value for the `prevRandao` field of the new payload. | +| `suggestedFeeRecipient` | _Data_, 20 Bytes | Suggested value for the `feeRecipient` field of the new payload. | + +## Payload status object + +Returned by [`engine_newPayloadV1`](index.md#engine_newpayloadv1) and [`engine_forkchoiceUpdatedV1`](index.md#engine_forkchoiceupdatedv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `status` | _Enumeration_ | Either `"VALID"`, `"INVALID"`, `"SYNCING"`, `"ACCEPTED"`, `"INVALID_BLOCK_HASH"`, or `"INVALID_TERMINAL_BLOCK"`. | +| `latestValidHash` | _Data_, 32 Bytes | Hash of the most recent valid block in the branch defined by payload and its ancestors. | +| `validationError` | _String_ | Message providing additional details on the validation error if the payload is classified as `INVALID`, `INVALID_BLOCK_HASH` or `INVALID_TERMINAL_BLOCK`. | + +## Transition configuration object + +Parameter for and returned by [`engine_exchangeTransitionConfigurationV1`](index.md#engine_exchangetransitionconfigurationv1). + +| Key | Type | Value | +| --- | :-: | --- | +| `terminalTotalDifficulty` | _Quantity_, 256 Bits | Maps on the `TERMINAL_TOTAL_DIFFICULTY` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | +| `terminalBlockHash` | _Data_, 32 Bytes | Maps on the `TERMINAL_BLOCK_HASH` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | +| `terminalBlockNumber` | _Quantity_, 64 Bits | Maps on the `TERMINAL_BLOCK_NUMBER` parameter of [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#client-software-configuration). | diff --git a/versioned_docs/version-stable/public-networks/reference/evm-tool.md b/versioned_docs/version-stable/public-networks/reference/evm-tool.md new file mode 100644 index 00000000000..37c8b88ea02 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/evm-tool.md @@ -0,0 +1,562 @@ +--- +title: EVM tool options +sidebar_position: 5 +description: Besu EVM tool options reference +tags: + - public networks + - private networks +--- + +# EVM tool reference + +This reference describes options for running the following [using the EVM tool](../how-to/troubleshoot/evm-tool.md): + +- [Arbitrary EVM programs](#run-options) +- [Ethereum state tests](#state-test-options) +- [Ethereum object formatted code](#eof-code-validation) + +:::note + +Option names that include `trace`, such as [`--trace`](#json-trace) and [`--trace.[no]memory`](#nomemory-tracenomemory) exist to support [`t8ntool`](https://ethereum-tests.readthedocs.io/en/latest/t8ntool.html) reference testing, and are interchangeable with their standard option names. + +::: + +## Run options + +The first mode of the EVM tool runs an arbitrary EVM and is invoked without an extra command. Command line options specify the code and other contextual information. + +### `code` + + + +# Syntax + +```bash +--code= +``` + +# Example + +```bash +--code=5B600080808060045AFA50600056 +``` + + + +The code to be executed, in compiled hex code form. Execution fails if this is not set. + +### `gas` + + + +# Syntax + +```bash +--gas= +``` + +# Example + +```bash +--gas=100000000 +``` + + + +Amount of gas to make available to the EVM. The default is 10 billion, a number unlikely to be seen in any production blockchain. + +### `price` + + + +# Syntax + +```bash +--price= +``` + +# Example + +```bash +--price=10 +``` + + + +Price of gas in Gwei. The default is `0`. If set to a non-zero value, the sender account must have enough value to cover the gas fees. + +### `sender` + + + +# Syntax + +```bash +--sender=
+``` + +# Example + +```bash +--sender=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 +``` + + + +The account the invocation is sent from. The specified account must exist in the world state, which, unless specified by [`--genesis`](#genesis), is the set of [accounts used for testing](../../private-networks/reference/accounts-for-testing.md). + +### `receiver` + + + +# Syntax + +```bash +--receiver=
+``` + +# Example + +```bash +--receiver=0x588108d3eab34e94484d7cda5a1d31804ca96fe7 +``` + + + +The account the invocation is sent to. The specified account does not need to exist. + +### `input` + + + +# Syntax + +```bash +--input= +``` + +# Example + +```bash +--input=9064129300000000000000000000000000000000000000000000000000000000 +``` + + + +The data passed into the call. Corresponds to the `data` field of the transaction and is returned by the `CALLDATA` and related opcodes. + +### `value` + + + +# Syntax + +```bash +--value= +``` + +# Example + +```bash +--value=1000000000000000000 +``` + + + +The value, in wei, attached to this transaction. For operations that query the value or transfer it to other accounts this is the amount that is available. The amount is not reduced to cover intrinsic cost and gas fees. + +### `json`, `trace` + + + +# Syntax + +```bash +--json +``` + + + +Provides an operation-by-operation trace of the command in JSON. + +`--trace` is an alias for `--json`. + +### `json-alloc` + + + +# Syntax + +```bash +--json-alloc +``` + + + +Outputs a JSON summary of the post-execution world state and allocations. + +### `[no]memory`, `trace.[no]memory` + + + +# Syntax + +```bash +--nomemory, --memory +``` + + + +Setting `--nomemory` disables tracing the memory output for each operation. Setting `--memory` enables it. Memory traces are disabled by default. + +For memory heavy scripts, disabling memory traces may reduce the volume of JSON output. + +`--trace.[no]memory` is an alias for `--[no]memory`. + +### `trace.[no]stack` + + + +# Syntax + +```bash +--trace.nostack, --trace.stack +``` + + + +Setting `--trace.nostack` disables tracing the operand stack for each operation. Setting `--trace.stack` enables it. Stack traces are enabled by default. + +### `trace.[no]returndata` + + + +# Syntax + +```bash +--trace.noreturndata, --trace.returndata +``` + + + +Setting `--trace.noreturndata` disables tracing the return data for each operation. Setting `--trace.returndata` enables it. Return data traces are enabled by default. + +### `[no]time` + + + +# Syntax + +```bash +--notime, --time +``` + + + +Setting `--notime` disables including time data in the summary output. Setting `--time` enables it. + +This is useful for testing and differential evaluations. + +### `genesis` + + + +# Syntax + +```bash +--genesis= +``` + +# Example + +```bash +--genesis=/opt/besu/genesis.json +``` + + + +The [Besu genesis file](genesis-items.md) to use when evaluating the EVM. Most useful are the `alloc` items that set up accounts and their stored memory states. + +`--prestate` is a deprecated alias for `--genesis`. + +### `chain` + + + +# Syntax + +```bash +--chain= +``` + +# Example + +```bash +--chain=goerli +``` + + + +The well-known network genesis file to use when evaluating the EVM. These values are an alternative to the [`--genesis`](#genesis) option for well-known networks. + +### `repeat` + + + +# Syntax + +```bash +--repeat= +``` + +# Example + +```bash +--repeat=1000 +``` + + + +Number of times to repeat the contract before gathering timing information. This is useful when benchmarking EVM operations. The default is `0`. + +### `revert-reason-enabled` + + + +# Syntax + +```bash +--revert-reason-enabled +``` + + + +Enables tracing the reason included in `REVERT` operations. The revert reason is enabled by default. + +### `fork` + + + +# Syntax + +```bash +--fork= +``` + +# Example + +```bash +--fork=FutureEips +``` + + + +Specific fork to evaluate, overriding network settings. + +### `key-value-storage` + + + +# Syntax + +```bash +--key-value-storage= +``` + +# Example + +```bash +--key-value-storage=rocksdb +``` + + + +Kind of key value storage to use. + +It might be useful to execute isolated EVM calls in the context of an actual world state. The default is `memory`, which executes the call only in the context of the world provided by [`--genesis`](#genesis) or [`--chain`](#chain) at block zero. + +When set to `rocksdb` and combined with [`--data-path`](#data-path), [`--block-number`](#block-number), and [`--genesis`](#genesis), a Besu node that isn't currently running can be used to provide the appropriate world state for a transaction. This is useful when evaluating consensus failures. + +### `data-path` + + + +# Syntax + +```bash +--data-path= +``` + +# Example + +```bash +--data-path=/opt/besu/data +``` + + + +When [`--key-value-storage`](#key-value-storage) is set to `rocksdb`, specifies the location of the database on disk. + +### `block-number` + + + +# Syntax + +```bash +--block-number= +``` + +# Example + +```bash +--block-number=10000000 +``` + + + +The block number to evaluate the code against. Used to ensure that the EVM is evaluating the code against the correct fork, or to specify the world state when [`--key-value-storage`](#key-value-storage) is set to `rocksdb`. + +### `version` + + + +# Syntax + +```bash +--version +``` + + + +Displays the version information. + +`-v` is an alias for `--version`. + +## State test options + +The `state-test` subcommand allows the [Ethereum state tests](https://github.com/ethereum/tests/tree/develop/GeneralStateTests) to be evaluated. The only applicable options are `--json` and `--nomemory`. + +### `json`, `trace` + + + +# Syntax + +```bash +--json +``` + + + +Provides an operation-by-operation trace of the command in JSON. + +Set this option for EVM Lab Fuzzing. Whether or not `--json` is set, a summary JSON object is printed to standard output for each state test executed. + +`--trace` is an alias for `--json`. + +### `[no]memory`, `trace.[no]memory` + + + +# Syntax + +```bash +--[no]memory +``` + + + +Setting `--nomemory` disables tracing the memory output for each operation. Setting `--memory` enables it. Memory traces are disabled by default. + +For memory heavy scripts, disabling memory traces may reduce the volume of JSON output. + +`--trace.[no]memory` is an alias for `--[no]memory`. + +### Use command arguments + +If you use command arguments, you can list one or more state tests. All the state tests are evaluated in the order they are specified. + + + +# Docker example + +```bash +docker run --rm -v ${PWD}:/opt/referencetests hyperledger/besu-evmtool:develop --json state-test /opt/referencetests/GeneralStateTests/stExample/add11.json +``` + +# CLI example + +```bash +evm --json state-test stExample/add11.json +``` + + + +### Use standard input + +If no reference tests are passed in using the command line, the EVM tool loads one complete JSON object from standard input and executes that state test. + + + +# Docker example + +```bash +docker run --rm -i hyperledger/besu-evmtool:develop --json state-test < stExample/add11.json +``` + +# CLI example + +```bash +evm --json state-test < stExample/add11.json +``` + + + +## EOF code validation + +The `code-validate` subcommand allows [Ethereum object formatted (EOF)](https://eips.ethereum.org/EIPS/eip-3540) code to be validated. It accepts candidate EOF containers or EVM bytecode using the `--file` option, command arguments, or standard input. + +### `file` + + + +# Syntax + +```bash +--file= +``` + +# Example + +```bash +--file=eof.txt +``` + + + +File containing one or more EOF containers or EVM bytecode. Each line in the file is considered a separate program. + +### Use command arguments + +If you use command arguments, each argument is considered a separate program. If a code segment includes spaces, it must be contained in quotes. + + + +# Docker example + +```bash +docker run --rm hyperledger/besu-evmtool:develop code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 +``` + +# CLI example + +```bash +evm code-validate "0xef0001 010008 020002-0007-0002 030000 00 00000002-02010002 59-59-b00001-50-b1 03-b1" 0xef0002 0xef00010100040200010001030000000000000000 +``` + + + +### Use standard input + +If no reference tests are passed in using the command line, the EVM tool loads and validates code from standard input. Each line is considered a separate program. Comment lines and blanks are ignored. diff --git a/versioned_docs/version-stable/public-networks/reference/genesis-items.md b/versioned_docs/version-stable/public-networks/reference/genesis-items.md new file mode 100644 index 00000000000..dbf4089990c --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/genesis-items.md @@ -0,0 +1,151 @@ +--- +title: Genesis file items +sidebar_position: 4 +description: Genesis file configuration items reference +tags: + - public networks + - private networks +--- + +# Genesis file items + +The [Besu genesis file](../concepts/genesis-file.md) contains [network configuration items](#configuration-items) and [genesis block parameters](#genesis-block-parameters). + +## Configuration items + +Network configuration items are specified in the genesis file in the `config` object. + +| Item | Description | +| --- | --: | +| Milestone blocks | [Milestone blocks for the network](#milestone-blocks). | +| `chainID` | [Chain ID for the network](../concepts/network-and-chain-id.md). | +| `ethash` | Specifies network uses [Ethash](../../private-networks/how-to/configure/consensus/index.md) and contains [`fixeddifficulty`](#fixed-difficulty). | +| `clique` | Specifies network uses [Clique](../../private-networks/how-to/configure/consensus/clique.md) and contains [Clique configuration items](../../private-networks/how-to/configure/consensus/clique.md#genesis-file). | +| `ibft2` | Specifies network uses [IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md) and contains [IBFT 2.0 configuration items](../../private-networks/how-to/configure/consensus/ibft.md#genesis-file). | +| `qbft` | Specifies network uses [QBFT](../../private-networks/how-to/configure/consensus/qbft.md) and contains [QBFT configuration items](../../private-networks/how-to/configure/consensus/qbft.md#genesis-file). | +| `transitions` | Specifies block at which to [change IBFT 2.0 or QBFT validators](../../private-networks/how-to/configure/consensus/add-validators-without-voting.md). | +| `contractSizeLimit` | Maximum contract size in bytes. Specify in [free gas networks](../../private-networks/how-to/configure/free-gas.md). The default is `24576` and the maximum size is `2147483647`. | +| `evmStackSize` | Maximum stack size. Specify to increase the maximum stack size in private networks with complex smart contracts. The default is `1024`. | +| `ecCurve` | Specifies [the elliptic curve to use](../../private-networks/how-to/configure/curves.md). Default is `secp256k1`. | +| `discovery` | Specifies [discovery configuration items](#discovery-configuration-items). The `discovery` object can be left empty. | + +## Genesis block parameters + +The purpose of some genesis block parameters varies depending on the consensus protocol (Ethash, [Clique](../../private-networks/how-to/configure/consensus/clique.md), [IBFT 2.0](../../private-networks/how-to/configure/consensus/ibft.md), or [QBFT](../../private-networks/how-to/configure/consensus/qbft.md)). These parameters include: + +- `difficulty`. +- `extraData`. +- `mixHash`. + +The following table describes the genesis block parameters with the same purpose across all consensus protocols. + +| Item | Description | +| --- | --: | +| `coinbase` | Address to pay mining rewards to. Can be any value in the genesis block (commonly set to `0x0000000000000000000000000000000000000000`). | +| `gasLimit` | Block gas limit. Total gas limit for all transactions in a block. | +| `nonce` | Used in block computation. Can be any value in the genesis block (commonly set to `0x0`). | +| `timestamp` | Creation date and time of the block. Must be before the next block so we recommend specifying `0x0` in the genesis file. | +| `alloc` | Defines [accounts with balances](../../private-networks/reference/accounts-for-testing.md) or [contracts](../../private-networks/how-to/configure/contracts.md). | + +:::caution + +If a `Supplied genesis block does not match stored chain data` error occurs, use the genesis file matching the genesis block of the data directory, or use the [`--data-path`](../reference/cli/options.md#data-path) option to specify a different data directory. + +::: + +## Milestone blocks + +In public networks, the milestone blocks specify the blocks at which the network changed protocol. See a [full list of Ethereum protocol releases](https://github.com/ethereum/execution-specs#ethereum-protocol-releases) and their corresponding milestone blocks. + +```json title="Ethereum Mainnet milestone blocks" +{ + "config": { + ... + "homesteadBlock": 1150000, + "daoForkBlock": 1920000, + "daoForkSupport": true, + "eip150Block": 2463000, + "eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0", + "eip155Block": 2675000, + "eip158Block": 2675000, + "byzantiumBlock": 4370000, + "constantinopleBlock": 7280000, + "constantinopleFixBlock": 7280000, + "muirGlacierBlock": 9200000, + "berlinBlock": 12244000, + "londonBlock": 12965000, + "arrowGlacierBlock": 13773000, + "grayGlacierBlock": 15050000, + ... + }, +} +``` + +:::caution + +Ensure you include a milestone far enough in advance in the genesis file. Not doing so can lead to unexpected and inconsistent behavior without specific errors. + +::: + +In private networks, the milestone block defines the protocol version for the network. + +```json title="Private network milestone block" +{ + "config": { + ... + "berlinBlock": 0, + ... + }, +} +``` + +:::note + +In private networks, we recommend specifying the latest milestone block. It's implied this includes the preceding milestones. This ensures you use the most up-to-date protocol and have access to the most recent opcodes. + +::: + +## Fixed difficulty + +Use `fixeddifficulty` to specify a fixed difficulty in private networks using Ethash. This will keep the network's difficulty constant and override the `difficulty` parameter from the genesis file. + +```json +{ + "config": { + ... + "ethash": { + "fixeddifficulty": 1000 + }, + + }, + ... +} +``` + +:::tip + +Using `fixeddifficulty` is not recommended for use with Ethash outside of test environments. For production networks using Ethash, we recommend setting a low `difficulty` value in the genesis file instead. Ethash will adjust the difficulty of the network based on hashrate to produce blocks at the targeted frequency. + +::: + +## Discovery configuration items + +Use the `discovery` configuration items to specify the [`bootnodes`](cli/options.md#bootnodes) and [`discovery-dns-url`](cli/options.md#discovery-dns-url) in the genesis file, in place of using CLI options or listing them in the configuration file. If either CLI option is used, it takes precedence over the genesis file. Anything listed in the configuration file also takes precedence. + +```json +{ + "config": { + "discovery": { + "bootnodes": [ + "enode://c35c3...d615f@1.2.3.4:30303", + "enode://f42c13...fc456@1.2.3.5:30303" + ], + "dns": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@nodes.example.org" + } + } +} +``` + + + +[GoQuorum clients]: https://consensys.net/docs/goquorum/en/stable/ diff --git a/versioned_docs/version-stable/public-networks/reference/projects-using-besu.md b/versioned_docs/version-stable/public-networks/reference/projects-using-besu.md new file mode 100644 index 00000000000..7684be3a024 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/projects-using-besu.md @@ -0,0 +1,18 @@ +--- +title: Projects using Besu +sidebar_position: 7 +description: List of projects using Besu +tags: + - public networks + - private networks +--- + +# Projects using Besu + +## Block explorers + +The following block explorers are compatible with Besu: + +- [BlockScout](https://github.com/blockscout/blockscout#readme) - See the [project documentation](https://docs.blockscout.com/) for setup instructions. + +- [Sirato Blockchain Explorer](https://www.web3labs.com/sirato) - See how to [use Sirato with privacy-enabled networks](../../private-networks/how-to/monitor/sirato-explorer.md). diff --git a/versioned_docs/version-stable/public-networks/reference/trace-types.md b/versioned_docs/version-stable/public-networks/reference/trace-types.md new file mode 100644 index 00000000000..2ea2b785ce9 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/reference/trace-types.md @@ -0,0 +1,160 @@ +--- +title: Transaction trace types +sidebar_position: 6 +description: Transaction trace types reference +tags: + - public networks + - private networks +--- + +# Transaction trace types + +When [tracing transactions](../how-to/troubleshoot/trace-transactions.md), the trace type options are [`trace`](#trace), [`vmTrace`](#vmtrace), and [`stateDiff`](#statediff). + +## `trace` + +An ordered list of calls to other contracts, excluding precompiled contracts. + +```json title="trace example" +"trace":[ + { + "action":{ + "callType":"call", + "from":"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas":"0xffadea", + "input":"0x", + "to":"0x0100000000000000000000000000000000000000", + "value":"0x0" + }, + "result":{ + "gasUsed":"0x1e", + "output":"0x" + }, + "subtraces":0, + "traceAddress":[ + ], + "type":"call" + } +] +``` + +| Key | Value | +| --- | --- | +| `action` | Transaction details. | +| `callType` | Whether the transaction is `call` or `create`. | +| `from` | Address of the transaction sender. | +| `gas` | Gas provided by sender. | +| `input` | Transaction data. | +| `to` | Target of the transaction. | +| `value` | Value transferred in the transaction. | +| `result` | Transaction result. | +| `gasUsed` | Gas used by the transaction. Includes any refunds of unused gas. | +| `output` | Return value of the contract call. Contains only the actual value sent by a `RETURN` operation. If a `RETURN` was not executed, the output is empty bytes. | +| `subTraces` | Traces of contract calls made by the transaction. | +| `traceAddress` | Tree list address of where the call occurred, address of the parents, and order of the current sub call. | +| `type` | Whether the transaction is a `CALL` or `CREATE` series operation. | + +## `vmTrace` + +An ordered list of EVM actions when processing the transaction. + +`vmTrace` only reports actual data returned from a `RETURN` opcode and does not return the contents of the reserved output space for the call operations. As a result: + +- `vmTrace` reports `null` when a call operation ends because of a `STOP`, `HALT`, `REVERT`, running out of instructions, or any exceptional halts. +- When a `RETURN` operation returns data of a different length to the space reserved by the call, `vmTrace` reports only the data passed to the `RETURN` operation and does not include pre-existing memory data or trim the returned data. + +For out of gas operations, `vmTrace` reports the operation that caused the out of gas exception, including the calculated gas cost. `vmTrace` does not report `ex` values because the operation is not executed. + +```json title="vmTrace example" +"vmTrace":{ + "code":"0x7f3940be4289e4c3587d88c1856cc95352461992db0a584c281226faefe560b3016000527f14c4d2c102bdeb2354bfc3dc96a95e4512cf3a8461e0560e2272dbf884ef3905601052600851", + "ops":[ + { + "cost":3, + "ex":{ + "mem":null, + "push":[ + "0x8" + ], + "store":null, + "used":16756175 + }, + "pc":72, + "sub":null + }, + ... + ] +} +``` + +| Key | Value | +| --- | --- | +| `code` | Code executed by the EVM. | +| `ops` | Sequence of EVM operations (opcodes) executed in the transaction. | +| `cost` | Gas cost of the opcode. Includes memory expansion costs but not gas refunds. For precompiled contract calls, reports only the actual cost. | +| `ex` | Executed operations. | +| `mem` | Memory read or written by the operation. | +| `push` | Adjusted stack items. For swap, includes all intermediate values and the result. Otherwise, is the value pushed onto the stack. | +| `store` | Account storage written by the operation. | +| `used` | Remaining gas taking into account the all but 1/64th rule for calls. | +| `pc` | Program counter. | +| `sub` | Sub call operations. | + +## `stateDiff` + +State changes in the requested block for each transaction represented as a map of accounts to an object. Besu lists the balance, code, nonce, and storage changes from immediately before the transaction to after the transaction. For the `key:value` pairs: + +- `+` indicates the field didn’t exist before and now has the specified value +- `-` indicates a deleted value +- `*` has a `from` and a `to` value. + +An absent value is distinct from zero when creating accounts or clearing storage. + +```json title="stateDiff example" +"stateDiff":{ + "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73":{ + "balance":{ + "*":{ + "from":"0xffffffffffffffffffffffffffffffffc3e12a20b", + "to":"0xffffffffffffffffffffffffffffffffc3dc5f091" + } + }, + "code":"=", + "nonce":{ + "*":{ + "from":"0x14", + "to":"0x15" + } + }, + "storage":{ + } + } +} +``` + +| Key | Value | +| -------------- | ----------------------------------------- | +| `balance` | Change of balance event. | +| `balance.from` | Balance before the transaction. | +| `balance.to` | Balance after the transaction. | +| `code` | Changes to code. None in this example. | +| `nonce` | Change of nonce. | +| `nonce.from` | Nonce before the transaction. | +| `nonce.to` | Nonce after the transaction. | +| `storage` | Changes to storage. None in this example. | + +## Applicable API methods + +The trace options `trace`, `vmTrace`, and `stateDiff` are available for the following [ad-hoc tracing API methods](../how-to/troubleshoot/trace-transactions.md#ad-hoc-tracing-apis): + +- [`trace_call`](api/index.md#trace_call) +- [`trace_callMany`](api/index.md#trace_callmany) +- [`trace_rawTransaction`](api/index.md#trace_rawtransaction) +- [`trace_replayBlockTransactions`](api/index.md#trace_replayblocktransactions) + +Only the `trace` option is available for the following [transaction-trace filtering API methods](../how-to/troubleshoot/trace-transactions.md#transaction-trace-filtering-apis): + +- [`trace_block`](api/index.md#trace_block) +- [`trace_filter`](api/index.md#trace_filter) +- [`trace_get`](api/index.md#trace_get) +- [`trace_transaction`](api/index.md#trace_transaction) diff --git a/versioned_docs/version-stable/public-networks/tutorials/_category_.json b/versioned_docs/version-stable/public-networks/tutorials/_category_.json new file mode 100644 index 00000000000..f72790313cd --- /dev/null +++ b/versioned_docs/version-stable/public-networks/tutorials/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Tutorials", + "position": 5, + "link": { + "type": "generated-index", + "slug": "public-networks/tutorials" + } +} diff --git a/versioned_docs/version-stable/public-networks/tutorials/besu-teku-mainnet.md b/versioned_docs/version-stable/public-networks/tutorials/besu-teku-mainnet.md new file mode 100644 index 00000000000..56fa7eaaa14 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/tutorials/besu-teku-mainnet.md @@ -0,0 +1,182 @@ +--- +title: Run Besu and Teku on Mainnet +sidebar_position: 1 +description: Run Besu and Teku on Ethereum Mainnet. +tags: + - public networks +--- + +# Run Besu and Teku on Mainnet + +Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and [Teku](https://docs.teku.consensys.net/) as a [consensus client](../concepts/the-merge.md#consensus-clients) on Ethereum Mainnet. + +## 1. Install Besu and Teku + +Install [Besu](../get-started/install/binary-distribution.md) and [Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). + +Ensure you meet the prerequisites for the installation option you use. For example, you must have Java 17+ if using the Besu and Teku binary distributions. + +Ensure you meet the [system requirements for Besu on public networks](../get-started/system-requirements.md). + +## 2. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and Teku. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../how-to/use-engine-api.md). + +## 3. Generate validator keys + +If you're running Teku as a beacon node only, skip to the [next step](#4-start-besu). + +If you're also running Teku as a validator client, have a funded Ethereum address ready (32 ETH and gas fees for each validator). + +Generate validator keys and stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. + +You should also have a `.json` file for each validator key pair. + +::: + +## 4. Start Besu + +Run the following command or specify the options in a [configuration file](../how-to/configuration-file.md): + +```bash +besu \ + --sync-mode=X_SNAP \ + --data-storage-format=BONSAI \ + --rpc-http-enabled=true \ + --rpc-http-host="0.0.0.0" \ + --rpc-ws-enabled=true \ + --rpc-ws-host="0.0.0.0" \ + --host-allowlist=,127.0.0.1,localhost \ + --engine-host-allowlist=,127.0.0.1,localhost \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. +- The IP address of your Besu node using the [`--host-allowlist`](../reference/cli/options.md#host-allowlist) and [`--engine-host-allowlist`](../reference/cli/options.md#engine-host-allowlist) options. + +Also, in the command: + +- [`--sync-mode`](../reference/cli/options.md#sync-mode) specifies using [snap sync](../get-started/connect/sync-node.md#snap-synchronization). +- [`--data-storage-format`](../reference/cli/options.md#data-storage-format) specifies using [Bonsai Tries](../concepts/data-storage-formats.md#bonsai-tries). +- [`--rpc-http-enabled`](../reference/cli/options.md#rpc-http-enabled) enables the HTTP JSON-RPC service. +- [`--rpc-http-host`](../reference/cli/options.md#rpc-http-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--rpc-ws-enabled`](../reference/cli/options.md#rpc-ws-enabled) enables the WebSocket JSON-RPC service. +- [`--rpc-ws-host`](../reference/cli/options.md#rpc-ws-host) is set to `0.0.0.0` to allow remote RPC connections. +- [`--engine-rpc-enabled`](../reference/cli/options.md#engine-rpc-enabled) enables the [Engine API](../reference/engine-api/index.md). + +You can modify the option values and add other [command line options](../reference/cli/options.md) as needed. + +## 5. Start Teku + +Open a new terminal window. + +### Beacon node only + +To run Teku as a beacon node only (without validator duties), run the following command or specify the options in the [Teku configuration file]: + +```bash +teku \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. + +Also, in the command: + +- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) is set to the default URL of Besu's Engine API. +- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) enables Teku's metrics exporter. +- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) enables Teku's REST API service. + +You can modify the option values and add other [Teku command line options] as needed. + +### Beacon node and validator client + +To run Teku as a beacon node and validator in a single process, run the following command or specify the options in the [Teku configuration file]: + +```bash +teku \ + --ee-endpoint http://localhost:8551 \ + --ee-jwt-secret-file \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --validators-proposer-default-fee-recipient= \ + --validator-keys=:[,:,...] +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. +- An Ethereum address you own as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 3](#3-generate-validator-keys) for each validator using the [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. + +Also, in the command: + +- [`--ee-endpoint`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-endpoint) is set to the default URL of Besu's Engine API. +- [`--metrics-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#metrics-enabled) enables Teku's metrics exporter. +- [`--rest-api-enabled`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#rest-api-enabled) enables Teku's REST API service. + +You can modify the option values and add other [Teku command line options] as needed. + +## 6. Wait for Besu and Teku to sync + +After starting Besu and Teku, your node starts syncing and connecting to peers. + + + +# Besu logs + +```json +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running Teku as a beacon node only, you're all set. If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. + +## 7. Stake ETH + +Stake your ETH for one or more validators using the [Staking Launchpad](https://launchpad.ethereum.org/en/). + +You can check your validator status by searching your Ethereum address on the [Beacon Chain explorer](https://beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + + + +[Teku configuration file]: https://docs.teku.consensys.net/HowTo/Configure/Use-Configuration-File/ +[Teku command line options]: https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/ diff --git a/versioned_docs/version-stable/public-networks/tutorials/besu-teku-testnet.md b/versioned_docs/version-stable/public-networks/tutorials/besu-teku-testnet.md new file mode 100644 index 00000000000..c270a234b58 --- /dev/null +++ b/versioned_docs/version-stable/public-networks/tutorials/besu-teku-testnet.md @@ -0,0 +1,218 @@ +--- +title: Run Besu and Teku on a testnet +sidebar_position: 2 +description: Run Besu and Teku on Goerli or Sepolia testnet. +tags: + - public networks +--- + +# Run Besu and Teku on a testnet + +Run Besu as an [execution client](../concepts/the-merge.md#execution-clients) and [Teku](https://docs.teku.consensys.net/) as a [consensus client](../concepts/the-merge.md#consensus-clients) on the [Goerli](https://github.com/eth-clients/goerli) and [Sepolia](https://github.com/eth-clients/sepolia) Ethereum testnets. + +:::note + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. You can connect your consensus client using the beacon node only, without any validator duties. + +::: + +## 1. Install Besu and Teku + +Install [Besu](../get-started/install/binary-distribution.md) and [Teku](https://docs.teku.consensys.net/HowTo/Get-Started/Installation-Options/Install-Binaries/). + +Ensure you meet the prerequisites for the installation option you use. For example, you must have Java 17+ if using the Besu and Teku binary distributions. + +Ensure you meet the [system requirements for Besu on public networks](../get-started/system-requirements.md). + +## 2. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Besu and Teku. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](../how-to/use-engine-api.md). + +## 3. Generate validator keys + +If you're running Teku as a beacon node only, skip to the [next step](#4-start-besu). + +If you're also running Teku as a validator client, create a test Ethereum address (you can do this in [MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) and [Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). + +:::note + +If you can't get ETH using the faucet, you can ask for help on the [EthStaker Discord](https://discord.io/ethstaker). + +::: + +Generate validator keys for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/) (or [request to become validator on Sepolia](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg)). + +:::info + +Save the password you use to generate each key pair in a `.txt` file. You should also have a `.json` file for each validator key pair. + +::: + +## 4. Start Besu + +Run the following command or specify the options in a [configuration file](../how-to/configuration-file.md): + + + +# Goerli + +```bash +besu \ + --network=goerli \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + +# Sepolia + +```bash +besu \ + --network=sepolia \ + --rpc-http-enabled=true \ + --rpc-http-host=0.0.0.0 \ + --rpc-http-cors-origins="*" \ + --rpc-ws-enabled=true \ + --rpc-ws-host=0.0.0.0 \ + --host-allowlist="*" \ + --engine-host-allowlist="*" \ + --engine-rpc-enabled \ + --engine-jwt-secret= +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--engine-jwt-secret`](../reference/cli/options.md#engine-jwt-secret) option. + +You can modify the option values and add other [command line options](../reference/cli/options.md) as needed. + +## 5. Start Teku + +Open a new terminal window. + +### Beacon node only + +To run Teku as a beacon node only (without validator duties), run the following command or specify the options in the [Teku configuration file]: + + + +# Goerli + +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + +# Sepolia + +```bash +teku \ + --network=sepolia \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true +``` + + + +Specify the path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. + +You can modify the option values and add other [Teku command line options] as needed. + +### Beacon node and validator client + +To run Teku as a beacon node and validator in a single process, run the following command or specify the options in the [Teku configuration file]: + + + +# Goerli + +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --validators-proposer-default-fee-recipient= \ + --validator-keys=:[,:,...] +``` + +# Sepolia + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. + + + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 2](#2-generate-the-shared-secret) using the [`--ee-jwt-secret-file`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#ee-jwt-secret-file) option. +- The test Ethereum address created in [step 3](#3-generate-validator-keys) as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 3](#3-generate-validator-keys) for each validator using the [`--validator-keys`](https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. + +You can modify the option values and add other [Teku command line options] as needed. + +## 6. Wait for Besu and Teku to sync + +After starting Besu and Teku, your node starts syncing and connecting to peers. + + + +# Besu logs + +```json +{"@timestamp":"2023-02-03T04:43:49,555","level":"INFO","thread":"main","class":"DefaultSynchronizer","message":"Starting synchronizer.","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,556","level":"INFO","thread":"main","class":"FastSyncDownloader","message":"Starting sync","throwable":""} +{"@timestamp":"2023-02-03T04:43:49,559","level":"INFO","thread":"main","class":"Runner","message":"Ethereum main loop is up.","throwable":""} +{"@timestamp":"2023-02-03T04:43:53,106","level":"INFO","thread":"Timer-0","class":"DNSResolver","message":"Resolved 2409 nodes","throwable":""} +{"@timestamp":"2023-02-03T04:45:04,803","level":"INFO","thread":"nioEventLoopGroup-3-10","class":"SnapWorldStateDownloader","message":"Downloading world state from peers for pivot block 16545859 (0x616ae3c4cf85f95a9bce2814a7282d75dc2eac36 +cb9f0fcc6f16386df70da3c5). State root 0xa7114541f42c62a72c8b6bb9901c2ccf4b424cd7f76570a67b82a183b02f25dc pending requests 0","throwable":""} +{"@timestamp":"2023-02-03T04:46:04,834","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.08%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:48:01,840","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.23%, Peer count: 8","throwable":""} +{"@timestamp":"2023-02-03T04:49:09,931","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.41%, Peer count: 11","throwable":""} +{"@timestamp":"2023-02-03T04:50:12,466","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.61%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:20,977","level":"INFO","thread":"EthScheduler-Services-3 (batchPersistAccountData)","class":"SnapsyncMetricsManager","message":"Worldstate download progress: 0.75%, Peer count: 10","throwable":""} +{"@timestamp":"2023-02-03T04:51:28,985","level":"INFO","thread":"EthScheduler-Services-29 (importBlock)","class":"FastImportBlocksStep","message":"Block import progress: 180400 of 16545859 (1%)","throwable":""} +``` + +# Teku logs + +```bash +2022-03-21 20:43:24.355 INFO - Syncing *** Target slot: 76092, Head slot: 2680, Remaining slots: 73412, Connected peers: 8 +2022-03-21 20:43:36.363 INFO - Syncing *** Target slot: 76093, Head slot: 2879, Remaining slots: 73214, Connected peers: 10 +2022-03-21 20:43:48.327 INFO - Syncing *** Target slot: 76094, Head slot: 3080, Remaining slots: 73014, Connected peers: 8 +2022-03-21 20:44:00.339 INFO - Syncing *** Target slot: 76095, Head slot: 3317, Remaining slots: 72778, Connected peers: 6 +2022-03-21 20:44:12.353 INFO - Syncing *** Target slot: 76096, Head slot: 3519, Remaining slots: 72577, Connected peers: 9 +``` + + + +If you're running Teku as a beacon node only, you're all set. If you're also running Teku as a validator client, ensure Besu and Teku are fully synced before submitting your staking deposit in the next step. Syncing Besu can take several days. + +## 7. Stake ETH + +Stake your testnet ETH for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). + +You can check your validator status by searching your Ethereum address on the [Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + + + +[Teku configuration file]: https://docs.teku.consensys.net/HowTo/Configure/Use-Configuration-File/ +[Teku command line options]: https://docs.teku.consensys.net/Reference/CLI/CLI-Syntax/ diff --git a/versioned_sidebars/version-23.4.0-sidebars.json b/versioned_sidebars/version-23.4.0-sidebars.json new file mode 100644 index 00000000000..32910f92f17 --- /dev/null +++ b/versioned_sidebars/version-23.4.0-sidebars.json @@ -0,0 +1,14 @@ +{ + "publicDocSidebar": [ + { + "type": "autogenerated", + "dirName": "public-networks" + } + ], + "privateDocSidebar": [ + { + "type": "autogenerated", + "dirName": "private-networks" + } + ] +} diff --git a/versioned_sidebars/version-23.4.1-sidebars.json b/versioned_sidebars/version-23.4.1-sidebars.json new file mode 100644 index 00000000000..32910f92f17 --- /dev/null +++ b/versioned_sidebars/version-23.4.1-sidebars.json @@ -0,0 +1,14 @@ +{ + "publicDocSidebar": [ + { + "type": "autogenerated", + "dirName": "public-networks" + } + ], + "privateDocSidebar": [ + { + "type": "autogenerated", + "dirName": "private-networks" + } + ] +} diff --git a/versioned_sidebars/version-stable-sidebars.json b/versioned_sidebars/version-stable-sidebars.json new file mode 100644 index 00000000000..32910f92f17 --- /dev/null +++ b/versioned_sidebars/version-stable-sidebars.json @@ -0,0 +1,14 @@ +{ + "publicDocSidebar": [ + { + "type": "autogenerated", + "dirName": "public-networks" + } + ], + "privateDocSidebar": [ + { + "type": "autogenerated", + "dirName": "private-networks" + } + ] +} diff --git a/versions.json b/versions.json new file mode 100644 index 00000000000..cf7ae976e4b --- /dev/null +++ b/versions.json @@ -0,0 +1,4 @@ +[ + "stable", + "23.4.0" +] diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000000..817b82d78e8 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,13513 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@1.8.2": + version "1.8.2" + resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz" + integrity sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ== + dependencies: + "@algolia/autocomplete-shared" "1.8.2" + +"@algolia/autocomplete-preset-algolia@1.8.2": + version "1.8.2" + resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz" + integrity sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA== + dependencies: + "@algolia/autocomplete-shared" "1.8.2" + +"@algolia/autocomplete-shared@1.8.2": + version "1.8.2" + resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz" + integrity sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g== + +"@algolia/cache-browser-local-storage@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.1.tgz" + integrity sha512-e91Jpu93X3t3mVdQwF3ZDjSFMFIfzSc+I76G4EX8nl9RYXgqcjframoL05VTjcD2YCsI18RIHAWVCBoCXVZnrw== + dependencies: + "@algolia/cache-common" "4.17.1" + +"@algolia/cache-common@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.1.tgz" + integrity sha512-fvi1WT8aSiGAKrcTw8Qg3RYgcwW8GZMHcqEm4AyDBEy72JZlFBSY80cTQ75MslINjCHXLDT+9EN8AGI9WVY7uA== + +"@algolia/cache-in-memory@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.1.tgz" + integrity sha512-NbBt6eBWlsXc5geSpfPRC5dkIB/0Ptthw8r0yM5Z7D3sPlYdnTZSO9y9XWXIptRMwmZe4cM8iBMN8y0tzbcBkA== + dependencies: + "@algolia/cache-common" "4.17.1" + +"@algolia/client-account@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.1.tgz" + integrity sha512-3rL/6ofJvyL+q8TiWM3qoM9tig+SY4gB1Vbsj+UeJPnJm8Khm+7OS+r+mFraqR6pTehYqN8yGYoE7x4diEn4aA== + dependencies: + "@algolia/client-common" "4.17.1" + "@algolia/client-search" "4.17.1" + "@algolia/transporter" "4.17.1" + +"@algolia/client-analytics@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.1.tgz" + integrity sha512-Bepr2w249vODqeBtM7i++tPmUsQ9B81aupUGbDWmjA/FX+jzQqOdhW8w1CFO5kWViNKTbz2WBIJ9U3x8hOa4bA== + dependencies: + "@algolia/client-common" "4.17.1" + "@algolia/client-search" "4.17.1" + "@algolia/requester-common" "4.17.1" + "@algolia/transporter" "4.17.1" + +"@algolia/client-common@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.1.tgz" + integrity sha512-+r7kg4EgbFnGsDnoGSVNtXZO8xvZ0vzf1WAOV7sqV9PMf1bp6cpJP/3IuPrSk4t5w2KVl+pC8jfTM7HcFlfBEQ== + dependencies: + "@algolia/requester-common" "4.17.1" + "@algolia/transporter" "4.17.1" + +"@algolia/client-personalization@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.1.tgz" + integrity sha512-gJku9DG/THJpfsSlG/az0a3QIn+VVff9kKh8PG8+7ZfxOHS+C+Y5YSeZVsC+c2cfoKLPo3CuHIiJ/p86erR3bA== + dependencies: + "@algolia/client-common" "4.17.1" + "@algolia/requester-common" "4.17.1" + "@algolia/transporter" "4.17.1" + +"@algolia/client-search@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.1.tgz" + integrity sha512-Q5YfT5gVkx60PZDQBqp/zH9aUbBdC7HVvxupiHUgnCKqRQsRZjOhLest7AI6FahepuZLBZS62COrO7v+JvKY7w== + dependencies: + "@algolia/client-common" "4.17.1" + "@algolia/requester-common" "4.17.1" + "@algolia/transporter" "4.17.1" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/logger-common@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.1.tgz" + integrity sha512-Us28Ot+fLEmX9M96sa65VZ8EyEEzhYPxfhV9aQyKDjfXbUdJlJxKt6wZpoEg9RAPSdO8IjK9nmuW2P8au3rRsg== + +"@algolia/logger-console@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.1.tgz" + integrity sha512-iKGQTpOjHiE64W3JIOu6dmDvn+AfYIElI9jf/Nt6umRPmP/JI9rK+OHUoW4pKrBtdG0DPd62ppeNXzSnLxY6/g== + dependencies: + "@algolia/logger-common" "4.17.1" + +"@algolia/requester-browser-xhr@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.1.tgz" + integrity sha512-W5mGfGDsyfVR+r4pUFrYLGBEM18gs38+GNt5PE5uPULy4uVTSnnVSkJkWeRkmLBk9zEZ/Nld8m4zavK6dtEuYg== + dependencies: + "@algolia/requester-common" "4.17.1" + +"@algolia/requester-common@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.1.tgz" + integrity sha512-HggXdjvVFQR0I5l7hM5WdHgQ1tqcRWeyXZz8apQ7zPWZhirmY2E9D6LVhDh/UnWQNEm7nBtM+eMFONJ3bZccIQ== + +"@algolia/requester-node-http@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.1.tgz" + integrity sha512-NzFWecXT6d0PPsQY9L+/qoK2deF74OLcpvqCH+Vh3mh+QzPsFafcBExdguAjZsAWDn1R6JEeFW7/fo/p0SE57w== + dependencies: + "@algolia/requester-common" "4.17.1" + +"@algolia/transporter@4.17.1": + version "4.17.1" + resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.1.tgz" + integrity sha512-ZM+qhX47Vh46mWH8/U9ihvy98HdTYpYQDSlqBD7IbiUbbyoCMke+qmdSX2MGhR2FCcXBSxejsJKKVAfbpaLVgg== + dependencies: + "@algolia/cache-common" "4.17.1" + "@algolia/logger-common" "4.17.1" + "@algolia/requester-common" "4.17.1" + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": + version "7.20.10" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz" + integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.18.6", "@babel/core@^7.19.6": + version "7.20.12" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz" + integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.12" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz" + integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" + +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== + dependencies: + "@babel/types" "^7.20.7" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.10" + "@babel/types" "^7.20.7" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz" + integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz" + integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz" + integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz" + integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz" + integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-classes@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz" + integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz" + integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-constant-elements@^7.18.12": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz" + integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz" + integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.20.7" + +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.18.6": + version "7.19.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz" + integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.19.0": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typescript@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz" + integrity sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + +"@babel/preset-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + +"@babel/runtime-corejs3@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz" + integrity sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg== + dependencies: + core-js-pure "^3.25.1" + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.8.4": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.12.7", "@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5": + version "7.20.12" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz" + integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.7", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@commitlint/cli@^17.5.1": + version "17.5.1" + resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-17.5.1.tgz" + integrity sha512-pRRgGSzdHQHehxZbGA3qF6wVPyl+EEQgTe/t321rtMLFbuJ7nRj2waS17s/v5oEbyZtiY5S8PGB6XtEIm0I+Sg== + dependencies: + "@commitlint/format" "^17.4.4" + "@commitlint/lint" "^17.4.4" + "@commitlint/load" "^17.5.0" + "@commitlint/read" "^17.5.1" + "@commitlint/types" "^17.4.4" + execa "^5.0.0" + lodash.isfunction "^3.0.9" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^17.0.0" + +"@commitlint/config-conventional@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.4.4.tgz" + integrity sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ== + dependencies: + conventional-changelog-conventionalcommits "^5.0.0" + +"@commitlint/config-validator@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz" + integrity sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg== + dependencies: + "@commitlint/types" "^17.4.4" + ajv "^8.11.0" + +"@commitlint/ensure@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz" + integrity sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g== + dependencies: + "@commitlint/types" "^17.4.4" + lodash.camelcase "^4.3.0" + lodash.kebabcase "^4.1.1" + lodash.snakecase "^4.1.1" + lodash.startcase "^4.4.0" + lodash.upperfirst "^4.3.1" + +"@commitlint/execute-rule@^17.4.0": + version "17.4.0" + resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz" + integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== + +"@commitlint/format@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz" + integrity sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ== + dependencies: + "@commitlint/types" "^17.4.4" + chalk "^4.1.0" + +"@commitlint/is-ignored@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz" + integrity sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw== + dependencies: + "@commitlint/types" "^17.4.4" + semver "7.3.8" + +"@commitlint/lint@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-17.4.4.tgz" + integrity sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw== + dependencies: + "@commitlint/is-ignored" "^17.4.4" + "@commitlint/parse" "^17.4.4" + "@commitlint/rules" "^17.4.4" + "@commitlint/types" "^17.4.4" + +"@commitlint/load@>6.1.1", "@commitlint/load@^17.5.0": + version "17.5.0" + resolved "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz" + integrity sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q== + dependencies: + "@commitlint/config-validator" "^17.4.4" + "@commitlint/execute-rule" "^17.4.0" + "@commitlint/resolve-extends" "^17.4.4" + "@commitlint/types" "^17.4.4" + "@types/node" "*" + chalk "^4.1.0" + cosmiconfig "^8.0.0" + cosmiconfig-typescript-loader "^4.0.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + resolve-from "^5.0.0" + ts-node "^10.8.1" + typescript "^4.6.4 || ^5.0.0" + +"@commitlint/message@^17.4.2": + version "17.4.2" + resolved "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz" + integrity sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q== + +"@commitlint/parse@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.4.tgz" + integrity sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg== + dependencies: + "@commitlint/types" "^17.4.4" + conventional-changelog-angular "^5.0.11" + conventional-commits-parser "^3.2.2" + +"@commitlint/read@^17.5.1": + version "17.5.1" + resolved "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz" + integrity sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg== + dependencies: + "@commitlint/top-level" "^17.4.0" + "@commitlint/types" "^17.4.4" + fs-extra "^11.0.0" + git-raw-commits "^2.0.11" + minimist "^1.2.6" + +"@commitlint/resolve-extends@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz" + integrity sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A== + dependencies: + "@commitlint/config-validator" "^17.4.4" + "@commitlint/types" "^17.4.4" + import-fresh "^3.0.0" + lodash.mergewith "^4.6.2" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/rules@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-17.4.4.tgz" + integrity sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ== + dependencies: + "@commitlint/ensure" "^17.4.4" + "@commitlint/message" "^17.4.2" + "@commitlint/to-lines" "^17.4.0" + "@commitlint/types" "^17.4.4" + execa "^5.0.0" + +"@commitlint/to-lines@^17.4.0": + version "17.4.0" + resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz" + integrity sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg== + +"@commitlint/top-level@^17.4.0": + version "17.4.0" + resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz" + integrity sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^17.4.4": + version "17.4.4" + resolved "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz" + integrity sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ== + dependencies: + chalk "^4.1.0" + +"@cspell/cspell-bundled-dicts@6.31.1": + version "6.31.1" + resolved "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.1.tgz" + integrity sha512-rsIev+dk1Vd8H1OKZhNhXycIVsMfeWJaeW3QUi1l4oIoGwQfJVbs1ZPZPHE5cglzyHOW1jQNStXf34UKaC6siA== + dependencies: + "@cspell/dict-ada" "^4.0.1" + "@cspell/dict-aws" "^3.0.0" + "@cspell/dict-bash" "^4.1.1" + "@cspell/dict-companies" "^3.0.9" + "@cspell/dict-cpp" "^5.0.2" + "@cspell/dict-cryptocurrencies" "^3.0.1" + "@cspell/dict-csharp" "^4.0.2" + "@cspell/dict-css" "^4.0.5" + "@cspell/dict-dart" "^2.0.2" + "@cspell/dict-django" "^4.0.2" + "@cspell/dict-docker" "^1.1.6" + "@cspell/dict-dotnet" "^5.0.0" + "@cspell/dict-elixir" "^4.0.2" + "@cspell/dict-en-common-misspellings" "^1.0.2" + "@cspell/dict-en-gb" "1.1.33" + "@cspell/dict-en_us" "^4.3.2" + "@cspell/dict-filetypes" "^3.0.0" + "@cspell/dict-fonts" "^3.0.1" + "@cspell/dict-fullstack" "^3.1.5" + "@cspell/dict-gaming-terms" "^1.0.4" + "@cspell/dict-git" "^2.0.0" + "@cspell/dict-golang" "^6.0.1" + "@cspell/dict-haskell" "^4.0.1" + "@cspell/dict-html" "^4.0.3" + "@cspell/dict-html-symbol-entities" "^4.0.0" + "@cspell/dict-java" "^5.0.5" + "@cspell/dict-k8s" "^1.0.1" + "@cspell/dict-latex" "^4.0.0" + "@cspell/dict-lorem-ipsum" "^3.0.0" + "@cspell/dict-lua" "^4.0.1" + "@cspell/dict-node" "^4.0.2" + "@cspell/dict-npm" "^5.0.5" + "@cspell/dict-php" "^4.0.1" + "@cspell/dict-powershell" "^5.0.1" + "@cspell/dict-public-licenses" "^2.0.2" + "@cspell/dict-python" "^4.0.2" + "@cspell/dict-r" "^2.0.1" + "@cspell/dict-ruby" "^5.0.0" + "@cspell/dict-rust" "^4.0.1" + "@cspell/dict-scala" "^5.0.0" + "@cspell/dict-software-terms" "^3.1.6" + "@cspell/dict-sql" "^2.1.0" + "@cspell/dict-svelte" "^1.0.2" + "@cspell/dict-swift" "^2.0.1" + "@cspell/dict-typescript" "^3.1.1" + "@cspell/dict-vue" "^3.0.0" + +"@cspell/cspell-pipe@6.31.1": + version "6.31.1" + resolved "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz" + integrity sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ== + +"@cspell/cspell-service-bus@6.31.1": + version "6.31.1" + resolved "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz" + integrity sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg== + +"@cspell/cspell-types@6.31.1": + version "6.31.1" + resolved "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz" + integrity sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw== + +"@cspell/dict-ada@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz" + integrity sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw== + +"@cspell/dict-aws@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz" + integrity sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ== + +"@cspell/dict-bash@^4.1.1": + version "4.1.1" + resolved "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz" + integrity sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A== + +"@cspell/dict-companies@^3.0.9": + version "3.0.9" + resolved "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.9.tgz" + integrity sha512-wSkVIJjk33Sm3LhieNv9TsSvUSeP0R/h8xx06NqbMYF43w9J8hZiMHlbB3FzaSOHRpXT5eBIJBVTeFbceZdiqg== + +"@cspell/dict-cpp@^5.0.2": + version "5.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.2.tgz" + integrity sha512-Q0ZjfhrHHfm0Y1/7LMCq3Fne/bhiBeBogUw4TV1wX/1tg3m+5BtaW/7GiOzRk+rFsblVj3RFam59VJKMT3vSoQ== + +"@cspell/dict-cryptocurrencies@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz" + integrity sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w== + +"@cspell/dict-csharp@^4.0.2": + version "4.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz" + integrity sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g== + +"@cspell/dict-css@^4.0.5": + version "4.0.5" + resolved "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.5.tgz" + integrity sha512-z5vw8nJSyKd6d3i5UmMNoVcAp0wxvs9OHWOmAeJKT9fO3tok02gK24VZhcJ0NJtiKdHQ2zRuzdfWl51wdAiY6A== + +"@cspell/dict-dart@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz" + integrity sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q== + +"@cspell/dict-django@^4.0.2": + version "4.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.0.2.tgz" + integrity sha512-L0Yw6+Yh2bE9/FAMG4gy9m752G4V8HEBjEAGeRIQ9qvxDLR9yD6dPOtgEFTjv7SWlKSrLb9wA/W3Q2GKCOusSg== + +"@cspell/dict-docker@^1.1.6": + version "1.1.6" + resolved "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz" + integrity sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig== + +"@cspell/dict-dotnet@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz" + integrity sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw== + +"@cspell/dict-elixir@^4.0.2": + version "4.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.2.tgz" + integrity sha512-/YeHlpZ1pE9VAyxp3V0xyUPapNyC61WwFuw2RByeoMqqYaIfS3Hw+JxtimOsAKVhUvgUH58zyKl5K5Q6FqgCpw== + +"@cspell/dict-en-common-misspellings@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-1.0.2.tgz" + integrity sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw== + +"@cspell/dict-en-gb@1.1.33": + version "1.1.33" + resolved "https://registry.npmjs.org/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz" + integrity sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g== + +"@cspell/dict-en_us@^4.3.2": + version "4.3.2" + resolved "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.2.tgz" + integrity sha512-o8xtHDLPNzW6hK5b1TaDTWt25vVi9lWlL6/dZ9YoS+ZMj+Dy/yuXatqfOgeGyU3a9+2gxC0kbr4oufMUQXI2mQ== + +"@cspell/dict-filetypes@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.0.tgz" + integrity sha512-Fiyp0z5uWaK0d2TfR9GMUGDKmUMAsOhGD5A0kHoqnNGswL2iw0KB0mFBONEquxU65fEnQv4R+jdM2d9oucujuA== + +"@cspell/dict-fonts@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.1.tgz" + integrity sha512-o2zVFKT3KcIBo88xlWhG4yOD0XQDjP7guc7C30ZZcSN8YCwaNc1nGoxU3QRea8iKcwk3cXH0G53nrQur7g9DjQ== + +"@cspell/dict-fullstack@^3.1.5": + version "3.1.5" + resolved "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz" + integrity sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA== + +"@cspell/dict-gaming-terms@^1.0.4": + version "1.0.4" + resolved "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.4.tgz" + integrity sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg== + +"@cspell/dict-git@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-2.0.0.tgz" + integrity sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w== + +"@cspell/dict-golang@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.1.tgz" + integrity sha512-Z19FN6wgg2M/A+3i1O8qhrGaxUUGOW8S2ySN0g7vp4HTHeFmockEPwYx7gArfssNIruw60JorZv+iLJ6ilTeow== + +"@cspell/dict-haskell@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz" + integrity sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ== + +"@cspell/dict-html-symbol-entities@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz" + integrity sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw== + +"@cspell/dict-html@^4.0.3": + version "4.0.3" + resolved "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz" + integrity sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w== + +"@cspell/dict-java@^5.0.5": + version "5.0.5" + resolved "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz" + integrity sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg== + +"@cspell/dict-k8s@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz" + integrity sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw== + +"@cspell/dict-latex@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.0.tgz" + integrity sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ== + +"@cspell/dict-lorem-ipsum@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz" + integrity sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ== + +"@cspell/dict-lua@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz" + integrity sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg== + +"@cspell/dict-node@^4.0.2": + version "4.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz" + integrity sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw== + +"@cspell/dict-npm@^5.0.5": + version "5.0.5" + resolved "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.5.tgz" + integrity sha512-eirZm4XpJNEcbmLGIwI2qXdRRlCKwEsH9mT3qCUytmbj6S6yn63F+8bShMW/yQBedV7+GXq9Td+cJdqiVutOiA== + +"@cspell/dict-php@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz" + integrity sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ== + +"@cspell/dict-powershell@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.1.tgz" + integrity sha512-lLl+syWFgfv2xdsoxHfPIB2FGkn//XahCIKcRaf52AOlm1/aXeaJN579B9HCpvM7wawHzMqJ33VJuL/vb6Lc4g== + +"@cspell/dict-public-licenses@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz" + integrity sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ== + +"@cspell/dict-python@^4.0.2": + version "4.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.0.2.tgz" + integrity sha512-w1jSWDR1CkO23cZFbSYgnD/ZqknDZSVCI1AOE6sSszOJR8shmBkV3lMBYd+vpLsWhmkLLBcZTXDkiqFLXDGowQ== + +"@cspell/dict-r@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.0.1.tgz" + integrity sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA== + +"@cspell/dict-ruby@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz" + integrity sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A== + +"@cspell/dict-rust@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.1.tgz" + integrity sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw== + +"@cspell/dict-scala@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.0.tgz" + integrity sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ== + +"@cspell/dict-software-terms@^3.1.6": + version "3.1.6" + resolved "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.1.6.tgz" + integrity sha512-w46+pIMRVtrDuTZXK/YxDP5NL5yVoX0ImEPO0s9WbxdyyfhzAF3sGYHBGN/50OGLHExcqe6Idb9feoRC9mCLxw== + +"@cspell/dict-sql@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz" + integrity sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg== + +"@cspell/dict-svelte@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz" + integrity sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q== + +"@cspell/dict-swift@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.1.tgz" + integrity sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw== + +"@cspell/dict-typescript@^3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz" + integrity sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A== + +"@cspell/dict-vue@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.0.tgz" + integrity sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A== + +"@cspell/dynamic-import@6.31.1": + version "6.31.1" + resolved "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz" + integrity sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ== + dependencies: + import-meta-resolve "^2.2.2" + +"@cspell/strong-weak-map@6.31.1": + version "6.31.1" + resolved "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz" + integrity sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@csstools/selector-specificity@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz" + integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== + +"@docsearch/css@3.4.0": + version "3.4.0" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.4.0.tgz" + integrity sha512-Hg8Xfma+rFwRi6Y/pfei4FJoQ1hdVURmmNs/XPoMTCPAImU+d5yxj+M+qdLtNjWRpfWziU4dQcqY94xgFBn2dg== + +"@docsearch/react@^3.1.1": + version "3.4.0" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.4.0.tgz" + integrity sha512-ufrp5879XYGojgS30ZAp8H4qIMbahRHB9M85VDBP36Xgz5QjYM54i1URKj5e219F7gqTtOivfztFTij6itc0MQ== + dependencies: + "@algolia/autocomplete-core" "1.8.2" + "@algolia/autocomplete-preset-algolia" "1.8.2" + "@docsearch/css" "3.4.0" + algoliasearch "^4.0.0" + +"@docusaurus/core@2.4.1", "@docusaurus/core@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz" + integrity sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g== + dependencies: + "@babel/core" "^7.18.6" + "@babel/generator" "^7.18.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.18.6" + "@babel/preset-env" "^7.18.6" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@babel/runtime" "^7.18.6" + "@babel/runtime-corejs3" "^7.18.6" + "@babel/traverse" "^7.18.8" + "@docusaurus/cssnano-preset" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" + "@svgr/webpack" "^6.2.1" + autoprefixer "^10.4.7" + babel-loader "^8.2.5" + babel-plugin-dynamic-import-node "^2.3.3" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + clean-css "^5.3.0" + cli-table3 "^0.6.2" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^11.0.0" + core-js "^3.23.3" + css-loader "^6.7.1" + css-minimizer-webpack-plugin "^4.0.0" + cssnano "^5.1.12" + del "^6.1.1" + detect-port "^1.3.0" + escape-html "^1.0.3" + eta "^2.0.0" + file-loader "^6.2.0" + fs-extra "^10.1.0" + html-minifier-terser "^6.1.0" + html-tags "^3.2.0" + html-webpack-plugin "^5.5.0" + import-fresh "^3.3.0" + leven "^3.1.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.6.1" + postcss "^8.4.14" + postcss-loader "^7.0.0" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.3.3" + react-router-config "^5.1.1" + react-router-dom "^5.3.3" + rtl-detect "^1.0.4" + semver "^7.3.7" + serve-handler "^6.1.3" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.3" + tslib "^2.4.0" + update-notifier "^5.1.0" + url-loader "^4.1.1" + wait-on "^6.0.1" + webpack "^5.73.0" + webpack-bundle-analyzer "^4.5.0" + webpack-dev-server "^4.9.3" + webpack-merge "^5.8.0" + webpackbar "^5.0.2" + +"@docusaurus/cssnano-preset@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz" + integrity sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ== + dependencies: + cssnano-preset-advanced "^5.3.8" + postcss "^8.4.14" + postcss-sort-media-queries "^4.2.1" + tslib "^2.4.0" + +"@docusaurus/logger@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz" + integrity sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg== + dependencies: + chalk "^4.1.2" + tslib "^2.4.0" + +"@docusaurus/mdx-loader@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz" + integrity sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ== + dependencies: + "@babel/parser" "^7.18.8" + "@babel/traverse" "^7.18.8" + "@docusaurus/logger" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@mdx-js/mdx" "^1.6.22" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + image-size "^1.0.1" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.2.0" + stringify-object "^3.3.0" + tslib "^2.4.0" + unified "^9.2.2" + unist-util-visit "^2.0.3" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@docusaurus/module-type-aliases@2.4.1", "@docusaurus/module-type-aliases@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz" + integrity sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A== + dependencies: + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.4.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + +"@docusaurus/plugin-client-redirects@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.4.1.tgz" + integrity sha512-tp0j16gaLIJ4p+IR0P6KDOFsTOGGMY54MNPnmM61Vaqqt5omLqsuKUO8UlCGU1oW/4EIQOhXYy99XYY5MjE+7A== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + eta "^2.0.0" + fs-extra "^10.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + +"@docusaurus/plugin-content-blog@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz" + integrity sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + cheerio "^1.0.0-rc.12" + feed "^4.2.2" + fs-extra "^10.1.0" + lodash "^4.17.21" + reading-time "^1.5.0" + tslib "^2.4.0" + unist-util-visit "^2.0.3" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-docs@2.4.1", "@docusaurus/plugin-content-docs@^2.0.0-rc.1", "@docusaurus/plugin-content-docs@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz" + integrity sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/module-type-aliases" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + "@types/react-router-config" "^5.0.6" + combine-promises "^1.1.0" + fs-extra "^10.1.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-pages@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz" + integrity sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + fs-extra "^10.1.0" + tslib "^2.4.0" + webpack "^5.73.0" + +"@docusaurus/plugin-debug@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz" + integrity sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + fs-extra "^10.1.0" + react-json-view "^1.21.3" + tslib "^2.4.0" + +"@docusaurus/plugin-google-analytics@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz" + integrity sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + tslib "^2.4.0" + +"@docusaurus/plugin-google-gtag@2.4.1", "@docusaurus/plugin-google-gtag@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz" + integrity sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + tslib "^2.4.0" + +"@docusaurus/plugin-google-tag-manager@2.4.1", "@docusaurus/plugin-google-tag-manager@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz" + integrity sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + tslib "^2.4.0" + +"@docusaurus/plugin-sitemap@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz" + integrity sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + fs-extra "^10.1.0" + sitemap "^7.1.1" + tslib "^2.4.0" + +"@docusaurus/preset-classic@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz" + integrity sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/plugin-content-blog" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/plugin-content-pages" "2.4.1" + "@docusaurus/plugin-debug" "2.4.1" + "@docusaurus/plugin-google-analytics" "2.4.1" + "@docusaurus/plugin-google-gtag" "2.4.1" + "@docusaurus/plugin-google-tag-manager" "2.4.1" + "@docusaurus/plugin-sitemap" "2.4.1" + "@docusaurus/theme-classic" "2.4.1" + "@docusaurus/theme-common" "2.4.1" + "@docusaurus/theme-search-algolia" "2.4.1" + "@docusaurus/types" "2.4.1" + +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz" + integrity sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/module-type-aliases" "2.4.1" + "@docusaurus/plugin-content-blog" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/plugin-content-pages" "2.4.1" + "@docusaurus/theme-common" "2.4.1" + "@docusaurus/theme-translations" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + "@mdx-js/react" "^1.6.22" + clsx "^1.2.1" + copy-text-to-clipboard "^3.0.1" + infima "0.2.0-alpha.43" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.4.14" + prism-react-renderer "^1.3.5" + prismjs "^1.28.0" + react-router-dom "^5.3.3" + rtlcss "^3.5.0" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-common@2.4.1", "@docusaurus/theme-common@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz" + integrity sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA== + dependencies: + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/module-type-aliases" "2.4.1" + "@docusaurus/plugin-content-blog" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/plugin-content-pages" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^1.2.1" + parse-numeric-range "^1.3.0" + prism-react-renderer "^1.3.5" + tslib "^2.4.0" + use-sync-external-store "^1.2.0" + utility-types "^3.10.0" + +"@docusaurus/theme-search-algolia@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz" + integrity sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ== + dependencies: + "@docsearch/react" "^3.1.1" + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/theme-common" "2.4.1" + "@docusaurus/theme-translations" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + algoliasearch "^4.13.1" + algoliasearch-helper "^3.10.0" + clsx "^1.2.1" + eta "^2.0.0" + fs-extra "^10.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-translations@2.4.1", "@docusaurus/theme-translations@^2.0.0-rc.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz" + integrity sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA== + dependencies: + fs-extra "^10.1.0" + tslib "^2.4.0" + +"@docusaurus/types@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz" + integrity sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.6.0" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.73.0" + webpack-merge "^5.8.0" + +"@docusaurus/utils-common@2.4.1", "@docusaurus/utils-common@^2.0.0-rc.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz" + integrity sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ== + dependencies: + tslib "^2.4.0" + +"@docusaurus/utils-validation@2.4.1", "@docusaurus/utils-validation@^2.0.0-rc.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz" + integrity sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA== + dependencies: + "@docusaurus/logger" "2.4.1" + "@docusaurus/utils" "2.4.1" + joi "^17.6.0" + js-yaml "^4.1.0" + tslib "^2.4.0" + +"@docusaurus/utils@2.4.1", "@docusaurus/utils@^2.0.0-rc.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz" + integrity sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA== + dependencies: + "@docusaurus/logger" "2.4.1" + "@svgr/webpack" "^6.2.1" + escape-string-regexp "^4.0.0" + file-loader "^6.2.0" + fs-extra "^10.1.0" + github-slugger "^1.4.0" + globby "^11.1.0" + gray-matter "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.4.0" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@easyops-cn/autocomplete.js@^0.38.1": + version "0.38.1" + resolved "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz" + integrity sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q== + dependencies: + cssesc "^3.0.0" + immediate "^3.2.3" + +"@easyops-cn/docusaurus-search-local@^0.33.6": + version "0.33.6" + resolved "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.33.6.tgz" + integrity sha512-3UqsJ42akhHDSlW9SravWQF5ZUI5VEKlzt50djbRRjDdJGefe1v9FpBKVdqHtPPFefcJoagtpfK4/R3dtDeEhw== + dependencies: + "@docusaurus/plugin-content-docs" "^2.0.0-rc.1" + "@docusaurus/theme-translations" "^2.0.0-rc.1" + "@docusaurus/utils" "^2.0.0-rc.1" + "@docusaurus/utils-common" "^2.0.0-rc.1" + "@docusaurus/utils-validation" "^2.0.0-rc.1" + "@easyops-cn/autocomplete.js" "^0.38.1" + "@node-rs/jieba" "^1.6.0" + cheerio "^1.0.0-rc.3" + clsx "^1.1.1" + debug "^4.2.0" + fs-extra "^10.0.0" + klaw-sync "^6.0.0" + lunr "^2.3.9" + lunr-languages "^1.4.0" + mark.js "^8.11.1" + tslib "^2.4.0" + +"@emotion/is-prop-valid@^1.1.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz" + integrity sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ== + +"@eslint/eslintrc@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz" + integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.1" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.37.0": + version "8.37.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz" + integrity sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A== + +"@exodus/schemasafe@^1.0.0-rc.2": + version "1.0.0" + resolved "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0.tgz" + integrity sha512-2cyupPIZI69HQxEAPllLXBjQp4njDKkOjYRCYxvMZe3/LY9pp9fBM3Tb1wiFAdP6Emo4v3OEbCLGj6u73Q5KLw== + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@isaacs/string-locale-compare@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" + integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== + +"@jest/schemas@^29.0.0": + version "29.0.0" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz" + integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== + dependencies: + "@jest/schemas" "^29.0.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@node-rs/jieba-android-arm-eabi@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.7.0.tgz#50b9921c6feb44755584963e8e00e425e557965a" + integrity sha512-XF4OYcZCyDiBK+jm1Zmt2o+xEO7K2K5OvUC3MTc9jd3Lwvy3EdHp8tpGvEp8PxfVFe2/JxNzX4OQQQP3Dhmk9A== + +"@node-rs/jieba-android-arm64@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.7.0.tgz#3778790451e5664b7d658bdb66cc1013448b4ee2" + integrity sha512-9oWwFVr/37T89WC+jjiI9A6u0zUJNTJl5ZC4CMxX45MVMokWI7bBXU7t7qBmMdFBzj+OFwDd3sm1fh4vl7NSWA== + +"@node-rs/jieba-darwin-arm64@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.7.0.tgz#a2b4941ba3f738538cd2c432411408d52d8dba85" + integrity sha512-9gBuxJCNITNI/gU5l8eeVGQ9MAf0BV86lfeo9TeU61vJCy6sqyx26wFMLODQgLNdiMP+q/fZme/G0hfZUjfPVA== + +"@node-rs/jieba-darwin-x64@1.7.0": + version "1.7.0" + resolved "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.7.0.tgz" + integrity sha512-FFUSMY4tl0Prpxa1SHy7Yzze2KfV/bZzccpO5nd+a8zCKbiX6gVkJ89FfxSAD2QrXUGkZvJYiPmu5nkZItqRZQ== + +"@node-rs/jieba-freebsd-x64@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.7.0.tgz#f397ea7552121deb8f583ab51e96c198a0f88e38" + integrity sha512-QFz2pz0Br+621QbKkgQPqTn90j1kcCD9jaI++qTLNHJGlWLRn6sFoAjb+jQEQEy9aE7VqfIV56eaVcCoU5VO2w== + +"@node-rs/jieba-linux-arm-gnueabihf@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.7.0.tgz#e8914e8ad38b412edd78674d10381153bf6ac8b7" + integrity sha512-kHJxO2sd7gMKqI1YS5DjABEcRwRemaCtgbKSuUqEaHGmUz9nAaUF6FSY8U4rXwr7HXt+kQa4NgyYDjgz+Pscrw== + +"@node-rs/jieba-linux-arm64-gnu@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.7.0.tgz#987d7db0e1ffe30aff23abd5c3bb664aff88152f" + integrity sha512-3qoCV9pF6llPBGDMu7K8JdHjI10WPkrq6P2gpZESqekcE4DatV6DcU9FWR+QL7MK/7meoE3/Zhjm7OK+qBd8gg== + +"@node-rs/jieba-linux-arm64-musl@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.7.0.tgz#e32d20f1ba346e5e0e8c7cc4c5d9c5970dc7e6e7" + integrity sha512-xv6hvzOV7iTCq7mM8SWhC3zEk6CqmBwhOSlfbb3gvPkc4U1UA1hmvcrD7oO5Qn+U+nuswysGCdVU6Z5AypLDfg== + +"@node-rs/jieba-linux-x64-gnu@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.7.0.tgz#e39cf21d5220565542f1478571aa899ac4574411" + integrity sha512-NpelWidMSNLoFTw+ov3y5jhJZjapHwEnh0Fyfm/7mvqkdwzVyedqNj22etRGum+nsAosMotCUWUznIMAD075gQ== + +"@node-rs/jieba-linux-x64-musl@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.7.0.tgz#01f756bccc4f7b683317665d606e4384b47361ee" + integrity sha512-yG4F8sy+fW4RbhyKXmEMT/JGuQuKH0TGymCEGYgT0km2I60iys63jWf2VTzCtrx583wxN5XoHv5HN60nhtIBtw== + +"@node-rs/jieba-win32-arm64-msvc@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.7.0.tgz#71806504eea7390c3edd3579956d1f7e55f69c2e" + integrity sha512-R6l/BSMs6R6BwpZS6DIDZuAEjUIPdAHgyi+xptP3mICjm6U+GMsvsRTeZkIJ7a/yzYUfqvz54VpQsfE5f0psBQ== + +"@node-rs/jieba-win32-ia32-msvc@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.7.0.tgz#9c1c3f5aca2144cc2c8a14c0707a494e7ce79209" + integrity sha512-FwibbuizEjzom02K2JM2T8tL0VlxW5xGDDy3L3dgx46xIGE85PwGYjgju+eDt4UODgxDsxGC4DUMMZf3XvCc7A== + +"@node-rs/jieba-win32-x64-msvc@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.7.0.tgz#d1625a3e9172e266b04f89c6b19cf9da60fce723" + integrity sha512-pJv7nluB6azhsOWvJB86Dyfg/M7n9k49bs9Bwmsylz9uhdZX9QnEShDW934RdmnjPYQ5aPgsSFrY6NXP/aovUA== + +"@node-rs/jieba@^1.6.0": + version "1.7.0" + resolved "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.7.0.tgz" + integrity sha512-Hm1JIlejxkWe1FSFZRns/g1j5hZmp357n+0n2BluABA4KLZ8EraHfPmPRmVMW6vbdMZObTYIVu5aVrPnUfBOxg== + optionalDependencies: + "@node-rs/jieba-android-arm-eabi" "1.7.0" + "@node-rs/jieba-android-arm64" "1.7.0" + "@node-rs/jieba-darwin-arm64" "1.7.0" + "@node-rs/jieba-darwin-x64" "1.7.0" + "@node-rs/jieba-freebsd-x64" "1.7.0" + "@node-rs/jieba-linux-arm-gnueabihf" "1.7.0" + "@node-rs/jieba-linux-arm64-gnu" "1.7.0" + "@node-rs/jieba-linux-arm64-musl" "1.7.0" + "@node-rs/jieba-linux-x64-gnu" "1.7.0" + "@node-rs/jieba-linux-x64-musl" "1.7.0" + "@node-rs/jieba-win32-arm64-msvc" "1.7.0" + "@node-rs/jieba-win32-ia32-msvc" "1.7.0" + "@node-rs/jieba-win32-x64-msvc" "1.7.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/arborist@^6.2.10", "@npmcli/arborist@^6.2.5", "@npmcli/arborist@^6.2.9": + version "6.2.10" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.2.10.tgz#d12dbc772b5f2894e7eb680fde2b03ada81331ed" + integrity sha512-YpGd6RgYZ4JzIZCP6d+PfH81tD0XynOE7HyKUZPLss/YQZXR5pO6hyXWNYb1fcQw4yJrh9ed9umhGbxPhcjBRA== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/fs" "^3.1.0" + "@npmcli/installed-package-contents" "^2.0.2" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^5.0.0" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^3.0.0" + "@npmcli/query" "^3.0.0" + "@npmcli/run-script" "^6.0.0" + bin-links "^4.0.1" + cacache "^17.0.4" + common-ancestor-path "^1.0.1" + hosted-git-info "^6.1.1" + json-parse-even-better-errors "^3.0.0" + json-stringify-nice "^1.1.4" + minimatch "^9.0.0" + nopt "^7.0.0" + npm-install-checks "^6.0.0" + npm-package-arg "^10.1.0" + npm-pick-manifest "^8.0.1" + npm-registry-fetch "^14.0.3" + npmlog "^7.0.1" + pacote "^15.0.8" + parse-conflict-json "^3.0.0" + proc-log "^3.0.0" + promise-all-reject-late "^1.0.0" + promise-call-limit "^1.0.2" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + ssri "^10.0.1" + treeverse "^3.0.0" + walk-up-path "^3.0.1" + +"@npmcli/config@^6.1.4": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-6.2.1.tgz#954cc09b727b6bfc087cb1d2a48994dc342e45cc" + integrity sha512-Cj/OrSbrLvnwWuzquFCDTwFN8QmR+SWH6qLNCBttUreDkKM5D5p36SeSMbcEUiCGdwjUrVy2yd8C0REwwwDPEw== + dependencies: + "@npmcli/map-workspaces" "^3.0.2" + ci-info "^3.8.0" + ini "^4.1.0" + nopt "^7.0.0" + proc-log "^3.0.0" + read-package-json-fast "^3.0.2" + semver "^7.3.5" + walk-up-path "^3.0.1" + +"@npmcli/disparity-colors@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz#60ea8c6eb5ba9de2d1950e15b06205b2c3ab7833" + integrity sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg== + dependencies: + ansi-styles "^4.3.0" + +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + +"@npmcli/git@^4.0.0", "@npmcli/git@^4.0.1", "@npmcli/git@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.1.0.tgz#ab0ad3fd82bc4d8c1351b6c62f0fa56e8fe6afa6" + integrity sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^3.0.0" + +"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +"@npmcli/map-workspaces@^3.0.2": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" + integrity sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg== + dependencies: + "@npmcli/name-from-folder" "^2.0.0" + glob "^10.2.2" + minimatch "^9.0.0" + read-package-json-fast "^3.0.0" + +"@npmcli/metavuln-calculator@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz#426b3e524c2008bcc82dbc2ef390aefedd643d76" + integrity sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q== + dependencies: + cacache "^17.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^15.0.0" + semver "^7.3.5" + +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== + +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/package-json@^3.0.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-3.1.1.tgz#5628332aac90fa1b4d6f98e03988c5958b35e0c5" + integrity sha512-+UW0UWOYFKCkvszLoTwrYGrjNrT8tI5Ckeb/h+Z1y1fsNJEctl7HmerA5j2FgmoqFaLI2gsA1X9KgMFqx/bRmA== + dependencies: + "@npmcli/git" "^4.1.0" + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.1" + proc-log "^3.0.0" + +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + +"@npmcli/query@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.0.0.tgz#51a0dfb85811e04f244171f164b6bc83b36113a7" + integrity sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA== + dependencies: + postcss-selector-parser "^6.0.10" + +"@npmcli/run-script@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^3.0.0" + which "^3.0.0" + +"@octokit/auth-token@^3.0.0": + version "3.0.2" + resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz" + integrity sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q== + dependencies: + "@octokit/types" "^8.0.0" + +"@octokit/core@^4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz" + integrity sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ== + dependencies: + "@octokit/auth-token" "^3.0.0" + "@octokit/graphql" "^5.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^8.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^7.0.0": + version "7.0.3" + resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz" + integrity sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw== + dependencies: + "@octokit/types" "^8.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^5.0.0": + version "5.0.4" + resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz" + integrity sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A== + dependencies: + "@octokit/request" "^6.0.0" + "@octokit/types" "^8.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^14.0.0": + version "14.0.0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz" + integrity sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw== + +"@octokit/plugin-paginate-rest@^5.0.0": + version "5.0.1" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz" + integrity sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw== + dependencies: + "@octokit/types" "^8.0.0" + +"@octokit/plugin-request-log@^1.0.4": + version "1.0.4" + resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz" + integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== + +"@octokit/plugin-rest-endpoint-methods@^6.7.0": + version "6.7.0" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz" + integrity sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw== + dependencies: + "@octokit/types" "^8.0.0" + deprecation "^2.3.1" + +"@octokit/request-error@^3.0.0": + version "3.0.2" + resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz" + integrity sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg== + dependencies: + "@octokit/types" "^8.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^6.0.0": + version "6.2.2" + resolved "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz" + integrity sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw== + dependencies: + "@octokit/endpoint" "^7.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^8.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/rest@^19.0.0": + version "19.0.5" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz" + integrity sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow== + dependencies: + "@octokit/core" "^4.1.0" + "@octokit/plugin-paginate-rest" "^5.0.0" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^6.7.0" + +"@octokit/types@^8.0.0": + version "8.1.1" + resolved "https://registry.npmjs.org/@octokit/types/-/types-8.1.1.tgz" + integrity sha512-7tjk+6DyhYAmei8FOEwPfGKc0VE1x56CKPJ+eE44zhDbOyMT+9yan8apfQFxo8oEFsy+0O7PiBtH8w0Yo0Y9Kw== + dependencies: + "@octokit/openapi-types" "^14.0.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/utils@^2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz" + integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== + dependencies: + cross-spawn "^7.0.3" + is-glob "^4.0.3" + open "^8.4.0" + picocolors "^1.0.0" + tiny-glob "^0.2.9" + tslib "^2.4.0" + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^1.0.4": + version "1.0.5" + resolved "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz" + integrity sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A== + dependencies: + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@redocly/ajv@^8.11.0": + version "8.11.0" + resolved "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz" + integrity sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +"@redocly/openapi-core@1.0.0-beta.123", "@redocly/openapi-core@^1.0.0-beta.104": + version "1.0.0-beta.123" + resolved "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.123.tgz" + integrity sha512-W6MbUWpb/VaV+Kf0c3jmMIJw3WwwF7iK5nAfcOS+ZwrlbxtIl37+1hEydFlJ209vCR9HL12PaMwdh2Vpihj6Jw== + dependencies: + "@redocly/ajv" "^8.11.0" + "@types/node" "^14.11.8" + colorette "^1.2.0" + js-levenshtein "^1.1.6" + js-yaml "^4.1.0" + lodash.isequal "^4.5.0" + minimatch "^5.0.1" + node-fetch "^2.6.1" + pluralize "^8.0.0" + yaml-ast-parser "0.0.43" + +"@semantic-release/changelog@^6.0.3": + version "6.0.3" + resolved "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz" + integrity sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag== + dependencies: + "@semantic-release/error" "^3.0.0" + aggregate-error "^3.0.0" + fs-extra "^11.0.0" + lodash "^4.17.4" + +"@semantic-release/commit-analyzer@^9.0.2": + version "9.0.2" + resolved "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz" + integrity sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g== + dependencies: + conventional-changelog-angular "^5.0.0" + conventional-commits-filter "^2.0.0" + conventional-commits-parser "^3.2.3" + debug "^4.0.0" + import-from "^4.0.0" + lodash "^4.17.4" + micromatch "^4.0.2" + +"@semantic-release/error@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz" + integrity sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw== + +"@semantic-release/git@^10.0.1": + version "10.0.1" + resolved "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz" + integrity sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w== + dependencies: + "@semantic-release/error" "^3.0.0" + aggregate-error "^3.0.0" + debug "^4.0.0" + dir-glob "^3.0.0" + execa "^5.0.0" + lodash "^4.17.4" + micromatch "^4.0.0" + p-reduce "^2.0.0" + +"@semantic-release/github@^8.0.0", "@semantic-release/github@^8.0.7": + version "8.0.7" + resolved "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.7.tgz" + integrity sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww== + dependencies: + "@octokit/rest" "^19.0.0" + "@semantic-release/error" "^3.0.0" + aggregate-error "^3.0.0" + bottleneck "^2.18.1" + debug "^4.0.0" + dir-glob "^3.0.0" + fs-extra "^11.0.0" + globby "^11.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + issue-parser "^6.0.0" + lodash "^4.17.4" + mime "^3.0.0" + p-filter "^2.0.0" + p-retry "^4.0.0" + url-join "^4.0.0" + +"@semantic-release/npm@^10.0.2": + version "10.0.2" + resolved "https://registry.npmjs.org/@semantic-release/npm/-/npm-10.0.2.tgz" + integrity sha512-Mo0XoBza4pUapxiBhLLYXeSZ9tkuHDUd/WvMbpilwuPRfJDnQXMqx5tBVon8d2mBk8JXmXpqB+ExhlWJmVT40A== + dependencies: + "@semantic-release/error" "^3.0.0" + aggregate-error "^4.0.1" + execa "^7.0.0" + fs-extra "^11.0.0" + lodash-es "^4.17.21" + nerf-dart "^1.0.0" + normalize-url "^8.0.0" + npm "^9.5.0" + rc "^1.2.8" + read-pkg "^7.0.0" + registry-auth-token "^5.0.0" + semver "^7.1.2" + tempy "^3.0.0" + +"@semantic-release/release-notes-generator@^10.0.0", "@semantic-release/release-notes-generator@^10.0.3": + version "10.0.3" + resolved "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz" + integrity sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w== + dependencies: + conventional-changelog-angular "^5.0.0" + conventional-changelog-writer "^5.0.0" + conventional-commits-filter "^2.0.0" + conventional-commits-parser "^3.2.3" + debug "^4.0.0" + get-stream "^6.0.0" + import-from "^4.0.0" + into-stream "^6.0.0" + lodash "^4.17.4" + read-pkg-up "^7.0.0" + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sigstore/protobuf-specs@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" + integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== + +"@sigstore/tuf@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.0.tgz#13b69323e7bf8de458cd6c952c57acd1169772a5" + integrity sha512-bLzi9GeZgMCvjJeLUIfs8LJYCxrPRA8IXQkzUtaFKKVPTz0mucRyqFcV2U20yg9K+kYAD0YSitzGfRZCFLjdHQ== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + make-fetch-happen "^11.0.1" + tuf-js "^1.1.3" + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@slorber/static-site-generator-webpack-plugin@^4.0.7": + version "4.0.7" + resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz" + integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== + dependencies: + eval "^0.1.8" + p-map "^4.0.0" + webpack-sources "^3.2.2" + +"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" + integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== + +"@svgr/babel-plugin-remove-jsx-attribute@*": + version "6.5.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz" + integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@*": + version "6.5.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz" + integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" + integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== + +"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" + integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== + +"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" + integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" + integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== + +"@svgr/babel-plugin-transform-svg-component@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" + integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== + +"@svgr/babel-preset@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" + integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" + "@svgr/babel-plugin-remove-jsx-attribute" "*" + "@svgr/babel-plugin-remove-jsx-empty-expression" "*" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" + "@svgr/babel-plugin-transform-svg-component" "^6.5.1" + +"@svgr/core@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" + integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== + dependencies: + "@babel/types" "^7.20.0" + entities "^4.4.0" + +"@svgr/plugin-jsx@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" + integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/hast-util-to-babel-ast" "^6.5.1" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" + integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.8.0" + +"@svgr/webpack@^6.2.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz" + integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== + dependencies: + "@babel/core" "^7.19.6" + "@babel/plugin-transform-react-constant-elements" "^7.18.12" + "@babel/preset-env" "^7.19.4" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@svgr/core" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + "@svgr/plugin-svgo" "^6.5.1" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@tsconfig/docusaurus@^1.0.7": + version "1.0.7" + resolved "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz" + integrity sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.10" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz" + integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.31": + version "4.17.32" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz" + integrity sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.15" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz" + integrity sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.31" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mdast@^3.0.0": + version "3.0.11" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz" + integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== + dependencies: + "@types/unist" "*" + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/node@*": + version "18.11.18" + resolved "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz" + integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== + +"@types/node@^14.11.8": + version "14.18.42" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz" + integrity sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg== + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-router-config@*", "@types/react-router-config@^5.0.6": + version "5.0.6" + resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz" + integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router-dom@*": + version "5.3.3" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*": + version "5.1.20" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react@*": + version "18.0.26" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz" + integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/sax@^1.2.1": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz" + integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.0" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.19" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz" + integrity sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.57.0": + version "5.57.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz" + integrity sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.57.0" + "@typescript-eslint/type-utils" "5.57.0" + "@typescript-eslint/utils" "5.57.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.57.0": + version "5.57.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz" + integrity sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ== + dependencies: + "@typescript-eslint/scope-manager" "5.57.0" + "@typescript-eslint/types" "5.57.0" + "@typescript-eslint/typescript-estree" "5.57.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.57.0": + version "5.57.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz" + integrity sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw== + dependencies: + "@typescript-eslint/types" "5.57.0" + "@typescript-eslint/visitor-keys" "5.57.0" + +"@typescript-eslint/type-utils@5.57.0": + version "5.57.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz" + integrity sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ== + dependencies: + "@typescript-eslint/typescript-estree" "5.57.0" + "@typescript-eslint/utils" "5.57.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.57.0": + version "5.57.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz" + integrity sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ== + +"@typescript-eslint/typescript-estree@5.57.0": + version "5.57.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz" + integrity sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw== + dependencies: + "@typescript-eslint/types" "5.57.0" + "@typescript-eslint/visitor-keys" "5.57.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.57.0": + version "5.57.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz" + integrity sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.57.0" + "@typescript-eslint/types" "5.57.0" + "@typescript-eslint/typescript-estree" "5.57.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.57.0": + version "5.57.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz" + integrity sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g== + dependencies: + "@typescript-eslint/types" "5.57.0" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0, acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + +address@^1.0.1, address@^1.1.2: + version "1.2.2" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + dependencies: + debug "^4.1.0" + depd "^2.0.0" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +aggregate-error@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz" + integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.11.0, ajv@^8.8.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +algoliasearch-helper@^3.10.0: + version "3.13.0" + resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.0.tgz" + integrity sha512-kV3c1jMQCvkARtGsSDvAwuht4PAMSsQILqPiH4WFiARoa3jXJ/r1TQoBWAjWyWF48rsNYCv7kzxgB4LTxrvvuw== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^4.0.0, algoliasearch@^4.13.1: + version "4.17.1" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.1.tgz" + integrity sha512-4GDQ1RhP2qUR3x8PevFRbEdqZqIARNViZYjgTJmA1T7wRNtFA3W4Aqc/RsODqa1J8IO/QDla5x4tWuUS8NV8wA== + dependencies: + "@algolia/cache-browser-local-storage" "4.17.1" + "@algolia/cache-common" "4.17.1" + "@algolia/cache-in-memory" "4.17.1" + "@algolia/client-account" "4.17.1" + "@algolia/client-analytics" "4.17.1" + "@algolia/client-common" "4.17.1" + "@algolia/client-personalization" "4.17.1" + "@algolia/client-search" "4.17.1" + "@algolia/logger-common" "4.17.1" + "@algolia/logger-console" "4.17.1" + "@algolia/requester-browser-xhr" "4.17.1" + "@algolia/requester-common" "4.17.1" + "@algolia/requester-node-http" "4.17.1" + "@algolia/transporter" "4.17.1" + +ansi-align@^3.0.0, ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-escapes@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz" + integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== + dependencies: + type-fest "^1.0.2" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +archy@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz#3ff397dc14f08b52dd8b2a64d3cee154ab8760d2" + integrity sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw== + dependencies: + delegates "^1.0.0" + readable-stream "^4.1.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +arg@^5.0.0: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +argv-formatter@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz" + integrity sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw== + +aria-query@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-timsort@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz" + integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.12, autoprefixer@^10.4.7: + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.2.tgz" + integrity sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg== + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" + +babel-loader@^8.2.5: + version "8.3.0" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +"babel-plugin-styled-components@>= 1.12.0": + version "2.0.7" + resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz" + integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + picomatch "^2.3.0" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" + integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz" + integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bin-links@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.1.tgz#afeb0549e642f61ff889b58ea2f8dca78fb9d8d3" + integrity sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA== + dependencies: + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" + +binary-extensions@^2.0.0, binary-extensions@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.0.14" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz" + integrity sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +bottleneck@^2.18.1: + version "2.19.5" + resolved "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz" + integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^17.0.0, cacache@^17.0.4: + version "17.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" + integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cachedir@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== + +callsites@^3.0.0, callsites@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelize@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: + version "1.0.30001472" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001472.tgz" + integrity sha512-xWC/0+hHHQgj3/vrKYY0AAzeIUgr7L9wlELIcAvZdDUHlhL/kNxMdnQLOSOQfP8R51ZzPhmHdyMkI0MMpmxCfg== + +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@5.2.0, chalk@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + +chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0-rc.12, cheerio@^1.0.0-rc.3: + version "1.0.0-rc.12" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.7.1" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz" + integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== + +ci-info@^3.6.1, ci-info@^3.7.1, ci-info@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cidr-regex@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d" + integrity sha512-RBqYd32aDwbCMFJRL6wHOlDNYJsPNTt8vC82ErHF5vKt8QQzxm1FrkW8s/R5pVrXMf17sba09Uoy91PKiddAsw== + dependencies: + ip-regex "^4.1.0" + +classnames@^2.3.1: + version "2.3.2" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +clean-css@^5.2.2, clean-css@^5.3.0: + version "5.3.1" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz" + integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clean-stack@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz" + integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== + dependencies: + escape-string-regexp "5.0.0" + +clear-module@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz" + integrity sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw== + dependencies: + parent-module "^2.0.0" + resolve-from "^5.0.0" + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-columns@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646" + integrity sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ== + dependencies: + string-width "^4.2.3" + strip-ansi "^6.0.1" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + +cli-table3@^0.6.1, cli-table3@^0.6.2, cli-table3@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +cmd-shim@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" + integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colord@^2.9.1, colord@^2.9.3: + version "2.9.3" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^1.2.0: + version "1.4.0" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colorette@^2.0.10, colorette@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +columnify@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" + integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== + dependencies: + strip-ansi "^6.0.1" + wcwidth "^1.0.0" + +combine-promises@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz" + integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz" + integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +comment-json@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz" + integrity sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw== + dependencies: + array-timsort "^1.0.3" + core-util-is "^1.0.3" + esprima "^4.0.1" + has-own-prop "^2.0.0" + repeat-string "^1.6.1" + +commitizen@^4.0.3: + version "4.2.6" + resolved "https://registry.npmjs.org/commitizen/-/commitizen-4.2.6.tgz" + integrity sha512-RyTM+EiD9GO01DJUn9MRRAet3XUHGfoUZoksLfr+1ym1Xt2q5EYJs9Fg2BtKSb5Mo53i0BtMBmWMHQXVlZ/L9w== + dependencies: + cachedir "2.3.0" + cz-conventional-changelog "3.3.0" + dedent "0.7.0" + detect-indent "6.1.0" + find-node-modules "^2.1.2" + find-root "1.1.0" + fs-extra "9.1.0" + glob "7.2.3" + inquirer "8.2.4" + is-utf8 "^0.2.1" + lodash "4.17.21" + minimist "1.2.6" + strip-bom "4.0.0" + strip-json-comments "3.1.1" + +common-ancestor-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" + integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +confusing-browser-globals@^1.0.10: + version "1.0.11" + resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +conventional-changelog-angular@^5.0.0, conventional-changelog-angular@^5.0.11: + version "5.0.13" + resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz" + integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== + dependencies: + compare-func "^2.0.0" + q "^1.5.1" + +conventional-changelog-conventionalcommits@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz" + integrity sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw== + dependencies: + compare-func "^2.0.0" + lodash "^4.17.15" + q "^1.5.1" + +conventional-changelog-writer@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz" + integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== + dependencies: + conventional-commits-filter "^2.0.7" + dateformat "^3.0.0" + handlebars "^4.7.7" + json-stringify-safe "^5.0.1" + lodash "^4.17.15" + meow "^8.0.0" + semver "^6.0.0" + split "^1.0.0" + through2 "^4.0.0" + +conventional-commit-types@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz" + integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== + +conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz" + integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== + dependencies: + lodash.ismatch "^4.4.0" + modify-values "^1.0.0" + +conventional-commits-parser@^3.2.2, conventional-commits-parser@^3.2.3: + version "3.2.4" + resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz" + integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-text-to-clipboard@^3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz" + integrity sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +copyfiles@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz" + integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== + dependencies: + glob "^7.0.5" + minimatch "^3.0.3" + mkdirp "^1.0.4" + noms "0.0.0" + through2 "^2.0.1" + untildify "^4.0.0" + yargs "^16.1.0" + +core-js-compat@^3.25.1: + version "3.27.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz" + integrity sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA== + dependencies: + browserslist "^4.21.4" + +core-js-pure@^3.25.1: + version "3.27.1" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz" + integrity sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw== + +core-js@^3.23.3: + version "3.27.1" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz" + integrity sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww== + +core-util-is@^1.0.3, core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig-typescript-loader@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz" + integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== + +cosmiconfig@8.0.0, cosmiconfig@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz" + integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1, cosmiconfig@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@^3.1.5: + version "3.1.6" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz" + integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== + dependencies: + node-fetch "^2.6.11" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +cspell-dictionary@6.31.1: + version "6.31.1" + resolved "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz" + integrity sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg== + dependencies: + "@cspell/cspell-pipe" "6.31.1" + "@cspell/cspell-types" "6.31.1" + cspell-trie-lib "6.31.1" + fast-equals "^4.0.3" + gensequence "^5.0.2" + +cspell-gitignore@6.31.1: + version "6.31.1" + resolved "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.1.tgz" + integrity sha512-PAcmjN6X89Z8qgjem6HYb+VmvVtKuc+fWs4sk21+jv2MiLk23Bkp+8slSaIDVR//58fxJkMx17PHyo2cDO/69A== + dependencies: + cspell-glob "6.31.1" + find-up "^5.0.0" + +cspell-glob@6.31.1: + version "6.31.1" + resolved "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.1.tgz" + integrity sha512-ygEmr5hgE4QtO5+L3/ihfMKBhPipbapfS22ilksFSChKMc15Regds0z+z/1ZBoe+OFAPneQfIuBxMwQ/fB00GQ== + dependencies: + micromatch "^4.0.5" + +cspell-grammar@6.31.1: + version "6.31.1" + resolved "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz" + integrity sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ== + dependencies: + "@cspell/cspell-pipe" "6.31.1" + "@cspell/cspell-types" "6.31.1" + +cspell-io@6.31.1: + version "6.31.1" + resolved "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.1.tgz" + integrity sha512-deZcpvTYY/NmLfOdOtzcm+nDvJZozKmj4TY3pPpX0HquPX0A/w42bFRT/zZNmRslFl8vvrCZZUog7SOc6ha3uA== + dependencies: + "@cspell/cspell-service-bus" "6.31.1" + node-fetch "^2.6.9" + +cspell-lib@6.31.1: + version "6.31.1" + resolved "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.1.tgz" + integrity sha512-KgSiulbLExY+z2jGwkO77+aAkyugsPAw7y07j3hTQLpd+0esPCZqrmbo2ItnkvkDNd/c34PqQCr7/044/rz8gw== + dependencies: + "@cspell/cspell-bundled-dicts" "6.31.1" + "@cspell/cspell-pipe" "6.31.1" + "@cspell/cspell-types" "6.31.1" + "@cspell/strong-weak-map" "6.31.1" + clear-module "^4.1.2" + comment-json "^4.2.3" + configstore "^5.0.1" + cosmiconfig "8.0.0" + cspell-dictionary "6.31.1" + cspell-glob "6.31.1" + cspell-grammar "6.31.1" + cspell-io "6.31.1" + cspell-trie-lib "6.31.1" + fast-equals "^4.0.3" + find-up "^5.0.0" + gensequence "^5.0.2" + import-fresh "^3.3.0" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + vscode-languageserver-textdocument "^1.0.8" + vscode-uri "^3.0.7" + +cspell-trie-lib@6.31.1: + version "6.31.1" + resolved "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz" + integrity sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg== + dependencies: + "@cspell/cspell-pipe" "6.31.1" + "@cspell/cspell-types" "6.31.1" + gensequence "^5.0.2" + +cspell@^6.31.1: + version "6.31.1" + resolved "https://registry.npmjs.org/cspell/-/cspell-6.31.1.tgz" + integrity sha512-gyCtpkOpwI/TGibbtIgMBFnAUUp2hnYdvW/9Ky4RcneHtLH0+V/jUEbZD8HbRKz0GVZ6mhKWbNRSEyP9p3Cejw== + dependencies: + "@cspell/cspell-pipe" "6.31.1" + "@cspell/dynamic-import" "6.31.1" + chalk "^4.1.2" + commander "^10.0.0" + cspell-gitignore "6.31.1" + cspell-glob "6.31.1" + cspell-io "6.31.1" + cspell-lib "6.31.1" + fast-glob "^3.2.12" + fast-json-stable-stringify "^2.1.0" + file-entry-cache "^6.0.1" + get-stdin "^8.0.0" + imurmurhash "^0.1.4" + semver "^7.3.8" + strip-ansi "^6.0.1" + vscode-uri "^3.0.7" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + +css-declaration-sorter@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz" + integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== + +css-functions-list@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz" + integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w== + +css-loader@^6.7.1: + version "6.7.3" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz" + integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.19" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-minimizer-webpack-plugin@^4.0.0: + version "4.2.2" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz" + integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== + dependencies: + cssnano "^5.1.8" + jest-worker "^29.1.2" + postcss "^8.4.17" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-to-react-native@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz" + integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^5.3.8: + version "5.3.10" + resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz" + integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== + dependencies: + autoprefixer "^10.4.12" + cssnano-preset-default "^5.2.14" + postcss-discard-unused "^5.1.0" + postcss-merge-idents "^5.1.1" + postcss-reduce-idents "^5.2.0" + postcss-zindex "^5.1.0" + +cssnano-preset-default@^5.2.13, cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.1.12, cssnano@^5.1.8: + version "5.1.14" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz" + integrity sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw== + dependencies: + cssnano-preset-default "^5.2.13" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +cz-conventional-changelog@3.3.0, cz-conventional-changelog@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz" + integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== + dependencies: + chalk "^2.4.1" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" + lodash.map "^4.5.1" + longest "^2.0.1" + word-wrap "^1.0.3" + optionalDependencies: + "@commitlint/load" ">6.1.1" + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + +debug@2.6.9, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decko@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz" + integrity sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +dedent@0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +del@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0, depd@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + +detect-indent@6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0: + version "1.5.1" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + +dir-glob@^3.0.0, dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.4.0" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +docusaurus-plugin-redoc@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-1.6.0.tgz" + integrity sha512-bvOmVcJ9Lo6ymyaHCoXTjN6Ck7/Dog1KRsJgZilB6ukHQ7d6nJrAwAEoDF1rXto8tOvIUqVb6Zzy7qDPvBQA1Q== + dependencies: + "@redocly/openapi-core" "1.0.0-beta.123" + redoc "2.0.0" + +docusaurus-theme-redoc@1.6.3: + version "1.6.3" + resolved "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-1.6.3.tgz" + integrity sha512-vOdU1WcxFOfp+7HqwEoybmU3t3hC1GN5GnYbT9rjffv5yx4m4x5fQOtTQqCmtk3L9OCFX+pDfwiBXw1EUIaOLA== + dependencies: + "@redocly/openapi-core" "1.0.0-beta.123" + clsx "^1.2.1" + copyfiles "^2.4.1" + lodash "^4.17.21" + mobx "^6.8.0" + redoc "2.0.0" + styled-components "^5.3.6" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +dompurify@^2.2.8: + version "2.4.5" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz" + integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA== + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.1.0, dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexer2@~0.1.0: + version "0.1.4" + resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" + integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== + dependencies: + readable-stream "^2.0.2" + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.284: + version "1.4.284" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.10.0, enhanced-resolve@^5.12.0: + version "5.12.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.2.0, entities@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + +env-ci@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/env-ci/-/env-ci-8.0.0.tgz" + integrity sha512-W+3BqGZozFua9MPeXpmTm5eYEBtGgL76jGu/pwMVp/L8PdECSCEWaIp7d4Mw7kuUrbUldK0oV0bNd6ZZjLiMiA== + dependencies: + execa "^6.1.0" + java-properties "^1.0.2" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.0.tgz" + integrity sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g== + dependencies: + call-bind "^1.0.2" + es-set-tostringtag "^2.0.0" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.4" + is-array-buffer "^3.0.0" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-get-iterator@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-set-tostringtag@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb-typescript@^17.0.0: + version "17.0.0" + resolved "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz" + integrity sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g== + dependencies: + eslint-config-airbnb-base "^15.0.0" + +eslint-config-prettier@^8.8.0: + version "8.8.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-import-resolver-typescript@^3.5.4: + version "3.5.4" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.4.tgz" + integrity sha512-9xUpnedEmSfG57sN1UvWPiEhfJ8bPt0Wg2XysA7Mlc79iFGhmJtRUg9LxtkK81FhMUui0YuR2E8iUsVhePkh4A== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + get-tsconfig "^4.5.0" + globby "^13.1.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + synckit "^0.8.5" + +eslint-module-utils@^2.7.4: + version "2.7.4" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jsx-a11y@^6.7.1: + version "6.7.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.32.2: + version "7.32.2" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== + +eslint@^8.37.0: + version "8.37.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz" + integrity sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.2" + "@eslint/js" "8.37.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.4.0" + espree "^9.5.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.5.1: + version "9.5.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz" + integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.0" + +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/eta/-/eta-2.0.0.tgz" + integrity sha512-NqE7S2VmVwgMS8yBxsH4VgNQjNjLq1gfGU0u9I6Cjh468nPRMoDfGdK9n1p/3Dvsw3ebklDkZsFAnKJ9sefjBA== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.0, eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz" + integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^3.0.1" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +execa@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-equals@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz" + integrity sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg== + +fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastest-levenshtein@^1.0.16: + version "1.0.16" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz" + integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +figures@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz" + integrity sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg== + dependencies: + escape-string-regexp "^5.0.0" + is-unicode-supported "^1.2.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-node-modules@^2.1.2: + version "2.1.3" + resolved "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== + dependencies: + findup-sync "^4.0.0" + merge "^2.1.1" + +find-root@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +find-versions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz" + integrity sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg== + dependencies: + semver-regex "^4.0.5" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +flux@^4.0.1: + version "4.0.4" + resolved "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz" + integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.1" + +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreach@^2.0.4: + version "2.0.6" + resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz" + integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.2" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +from2@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@9.1.0, fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^11.0.0: + version "11.1.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0, fs-minipass@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gauge@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.1.tgz#1efc801b8ff076b86ef3e9a7a280a975df572112" + integrity sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^4.0.1" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gensequence@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz" + integrity sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA== + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz" + integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ== + +git-log-parser@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz" + integrity sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA== + dependencies: + argv-formatter "~1.0.0" + spawn-error-forwarder "~1.0.0" + split2 "~1.0.0" + stream-combiner2 "~1.1.1" + through2 "~2.0.0" + traverse "~0.6.6" + +git-raw-commits@^2.0.11: + version "2.0.11" + resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +github-slugger@^1.4.0: + version "1.5.0" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1, glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.2.3, glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^10.2.2: + version "10.3.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.0.tgz#763d02a894f3cdfc521b10bbbbc8e0309e750cce" + integrity sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2" + path-scurry "^1.7.0" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz" + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== + dependencies: + ini "^1.3.4" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== + +globby@^11.0.0, globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1, globby@^13.1.3: + version "13.1.3" + resolved "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz" + integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz" + integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@4.2.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +handlebars@^4.7.7: + version "4.7.7" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-own-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz" + integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hook-std@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz" + integrity sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw== + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-tags@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-client@^1.2.5: + version "1.3.5" + resolved "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz" + integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz" + integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" + integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== + dependencies: + minimatch "^9.0.0" + +ignore@^5.2.0, ignore@^5.2.1: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +image-size@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz" + integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== + dependencies: + queue "6.0.2" + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immer@^9.0.7: + version "9.0.17" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.17.tgz" + integrity sha512-+hBruaLSQvkPfxRiTLK/mi4vLH+/VQS6z2KJahdoxlleFOI8ARqzOF17uy12eFDlqWmPoygwc5evgwcp+dlHhg== + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz" + integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +import-meta-resolve@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz" + integrity sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +infima@0.2.0-alpha.43: + version "0.2.0-alpha.43" + resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz" + integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +ini@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.1.tgz#c76ec81007875bc44d544ff7a11a55d12294102d" + integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== + +ini@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +init-package-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-5.0.0.tgz#030cf0ea9c84cfc1b0dc2e898b45d171393e4b40" + integrity sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw== + dependencies: + npm-package-arg "^10.0.0" + promzard "^1.0.0" + read "^2.0.0" + read-package-json "^6.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^5.0.0" + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inquirer@8.2.4: + version "8.2.4" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +internal-slot@^1.0.3, internal-slot@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +into-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz" + integrity sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA== + dependencies: + from2 "^2.3.0" + p-is-promise "^3.0.0" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.0, is-array-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-cidr@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814" + integrity sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA== + dependencies: + cidr-regex "^3.1.1" + +is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-core-module@^2.8.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2, is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz" + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== + dependencies: + text-extensions "^1.0.0" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-unicode-supported@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + +is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +issue-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz" + integrity sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA== + dependencies: + lodash.capitalize "^4.2.1" + lodash.escaperegexp "^4.1.2" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.uniqby "^4.7.0" + +jackspeak@^2.0.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" + integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +java-properties@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz" + integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== + +jest-util@^29.3.1: + version "29.3.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz" + integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== + dependencies: + "@jest/types" "^29.3.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.1.2: + version "29.3.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz" + integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== + dependencies: + "@types/node" "*" + jest-util "^29.3.1" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +joi@^17.6.0: + version "17.7.0" + resolved "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz" + integrity sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +js-sdsl@^4.1.4: + version "4.2.0" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz" + integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-parse-even-better-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" + integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== + +json-pointer@0.6.2, json-pointer@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz" + integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== + dependencies: + foreach "^2.0.4" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-nice@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" + integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0, jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +just-diff-apply@^5.2.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" + integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== + +just-diff@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" + integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +known-css-properties@^0.26.0: + version "0.26.0" + resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz" + integrity sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +libnpmaccess@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" + integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== + dependencies: + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + +libnpmdiff@^5.0.13: + version "5.0.18" + resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-5.0.18.tgz#58dae566f30f4ebcd1de8834530a3da739555623" + integrity sha512-KJeZxdI+tvsJMjFvyDOqg4lkcewRU8njf7N97uJXhW6IWr0w2nvICnHq5jt7gcmo2I9p9Tq6cu+6q+/2DrK9qg== + dependencies: + "@npmcli/arborist" "^6.2.10" + "@npmcli/disparity-colors" "^3.0.0" + "@npmcli/installed-package-contents" "^2.0.2" + binary-extensions "^2.2.0" + diff "^5.1.0" + minimatch "^9.0.0" + npm-package-arg "^10.1.0" + pacote "^15.0.8" + tar "^6.1.13" + +libnpmexec@^5.0.13: + version "5.0.17" + resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-5.0.17.tgz#46f628688da8c92aeb2ea79333edbea464c46dd5" + integrity sha512-HGO8XiNWojyxb//LHsXmYuDWehPi/NuGsrNTu9VeRp/WNT5ijq2p219nLRu8ZBxGlBFCkLj8AbVRj1lmIFPObA== + dependencies: + "@npmcli/arborist" "^6.2.9" + "@npmcli/run-script" "^6.0.0" + chalk "^4.1.0" + ci-info "^3.7.1" + npm-package-arg "^10.1.0" + npmlog "^7.0.1" + pacote "^15.0.8" + proc-log "^3.0.0" + read "^2.0.0" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + walk-up-path "^3.0.1" + +libnpmfund@^4.0.13: + version "4.0.18" + resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-4.0.18.tgz#30593edfaa4becc51a1df2b7a715a295aa1da327" + integrity sha512-pJaWkHal9/qncuVQWoqzFvZ7vSBz9YvoBO+q/R+Sq4WYZMsB1qrVCzbYCYhLqfVlSUNV/6DH0BF3AUckHHOhIQ== + dependencies: + "@npmcli/arborist" "^6.2.10" + +libnpmhook@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-9.0.3.tgz#5dbd6a146feb7e11993d36a26f750ae2347bb1d9" + integrity sha512-wMZe58sI7KLhg0+nUWZW5KdMfjNNcOIIbkoP19BDHYoUF9El7eeUWkGNxUGzpHkPKiGoQ1z/v6CYin4deebeuw== + dependencies: + aproba "^2.0.0" + npm-registry-fetch "^14.0.3" + +libnpmorg@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-5.0.4.tgz#94eec2b84fbef736457eb27894c972ae6f5cac82" + integrity sha512-YqYXLMAN0Y1eJH4w3hUFN9648xfSdvJANMsdeZTOWJOW4Pqp8qapJFzQdqCfUkg+tEuQmnaFQQKXvkMZC51+Mw== + dependencies: + aproba "^2.0.0" + npm-registry-fetch "^14.0.3" + +libnpmpack@^5.0.13: + version "5.0.18" + resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-5.0.18.tgz#bdabd7798a98a0241a5078df2902cd17049789c0" + integrity sha512-Xvb8FkULAY9VXqMCh+S9bl7bb6l/j+xDXRsfyP0nSezW8QklFA4VWLgZgm9PdGupZWC759CYaIPaaXTkIUPYag== + dependencies: + "@npmcli/arborist" "^6.2.10" + "@npmcli/run-script" "^6.0.0" + npm-package-arg "^10.1.0" + pacote "^15.0.8" + +libnpmpublish@^7.1.2: + version "7.4.0" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.4.0.tgz#c396e0a56adc1511105cd4d4dec8798b3a5c2680" + integrity sha512-DoMMLif02eWBRDhKMov2TKFEexYaUD24L4QPfbteND2CdgrxCTRM4o8sj0XKcylcwcRxcp8i/IKeWTq0lPP53g== + dependencies: + ci-info "^3.6.1" + normalize-package-data "^5.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + proc-log "^3.0.0" + semver "^7.3.7" + sigstore "^1.4.0" + ssri "^10.0.1" + +libnpmsearch@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-6.0.2.tgz#b6a531a312855dd3bf84dd273b1033dd09b4cbec" + integrity sha512-p+5BF19AvnVg8mcIQhy6yWhI6jHQRVMYaIaKeITEfYAffWsqbottA/WZdMtHL76hViC6SFM1WdclM1w5eAIa1g== + dependencies: + npm-registry-fetch "^14.0.3" + +libnpmteam@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-5.0.3.tgz#196657e9d87c0cc914c44fee588ad2b838074a3c" + integrity sha512-7XOGhi45s+ml6TyrhJUTyrErcoDMKGKfEtiTEco4ofU7BGGAUOalVztKMVLLJgJOOXdIAIlzCHqkTXEuSiyCiA== + dependencies: + aproba "^2.0.0" + npm-registry-fetch "^14.0.3" + +libnpmversion@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-4.0.2.tgz#cad9cd1b287fcf9576a64edfe71491b49a65d06f" + integrity sha512-n1X70mFHv8Piy4yos+MFWUARSkTbyV5cdsHScaIkuwYvRAF/s2VtYScDzWB4Oe8uNEuGNdjiRR1E/Dh1tMvv6g== + dependencies: + "@npmcli/git" "^4.0.1" + "@npmcli/run-script" "^6.0.0" + json-parse-even-better-errors "^3.0.0" + proc-log "^3.0.0" + semver "^7.3.7" + +lilconfig@2.1.0, lilconfig@^2.0.3: + version "2.1.0" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^13.2.0: + version "13.2.0" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz" + integrity sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw== + dependencies: + chalk "5.2.0" + cli-truncate "^3.1.0" + commander "^10.0.0" + debug "^4.3.4" + execa "^7.0.0" + lilconfig "2.1.0" + listr2 "^5.0.7" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-inspect "^1.12.3" + pidtree "^0.6.0" + string-argv "^0.3.1" + yaml "^2.2.1" + +listr2@^5.0.7: + version "5.0.8" + resolved "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz" + integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.19" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.8.0" + through "^2.3.8" + wrap-ansi "^7.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.1.1" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz" + integrity sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg== + dependencies: + p-locate "^6.0.0" + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.capitalize@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz" + integrity sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw== + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz" + integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz" + integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.ismatch@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz" + integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + +lodash.map@^4.5.1: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz" + integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz" + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz" + integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== + +lodash.upperfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz" + integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== + +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +longest@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz" + integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +lru-cache@^9.1.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835" + integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ== + +lunr-languages@^1.4.0: + version "1.12.0" + resolved "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.12.0.tgz" + integrity sha512-C2z02jt74ymrDocBwxYB4Cr1LNZj9rHGLTH/00+JuoT6eJOSSuPBzeqQG8kjnlPUQe+/PAWv1/KHbDT+YYYRnA== + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.0.3, make-fetch-happen@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +mark.js@^8.11.1: + version "8.11.1" + resolved "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz" + integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +marked-terminal@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz" + integrity sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g== + dependencies: + ansi-escapes "^5.0.0" + cardinal "^2.1.1" + chalk "^5.0.0" + cli-table3 "^0.6.1" + node-emoji "^1.11.0" + supports-hyperlinks "^2.2.0" + +marked@^4.0.15, marked@^4.1.0: + version "4.2.5" + resolved "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz" + integrity sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ== + +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18, mime-types@~2.1.17: + version "2.1.18" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@^2.6.1: + version "2.7.2" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz" + integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.1.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" + integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0, minimatch@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" + integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== + dependencies: + minipass "^5.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" + integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w== + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mobx-react-lite@^3.4.0: + version "3.4.3" + resolved "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz" + integrity sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg== + +mobx-react@^7.2.0: + version "7.6.0" + resolved "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz" + integrity sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA== + dependencies: + mobx-react-lite "^3.4.0" + +mobx@^6.8.0: + version "6.9.0" + resolved "https://registry.npmjs.org/mobx/-/mobx-6.9.0.tgz" + integrity sha512-HdKewQEREEJgsWnErClfbFoVebze6rGazxFLU/XUyrII8dORfVszN1V0BMRnQSzcgsNNtkX8DHj3nC6cdWE9YQ== + +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0, ms@^2.1.2: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mute-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3, negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.0, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nerf-dart@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz" + integrity sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^1.10.0, node-emoji@^1.11.0: + version "1.11.0" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + +node-fetch@^2.6.1, node-fetch@^2.6.11, node-fetch@^2.6.7, node-fetch@^2.6.9: + version "2.6.11" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz" + integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-gyp@^9.0.0, node-gyp@^9.3.1: + version "9.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" + integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^11.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz" + integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== + dependencies: + es6-promise "^3.2.1" + +node-releases@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz" + integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== + +noms@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz" + integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== + dependencies: + inherits "^2.0.1" + readable-stream "~1.0.31" + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + +nopt@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" + integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA== + dependencies: + abbrev "^2.0.0" + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + +npm-audit-report@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-4.0.0.tgz#dfffdb6464a7799d3d30e067ae1943982cf45f69" + integrity sha512-k2o5476sLrp94b6Gl819YzlS7LAdb8lgE6yQCysBEji5E3WoUdRve6tiVMLKAPPdLfItU4kOSUycWS5HFTrbug== + dependencies: + chalk "^4.0.0" + +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + +npm-install-checks@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.1.1.tgz#b459b621634d06546664207fde16810815808db1" + integrity sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^3.0.0, npm-normalize-package-bin@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== + dependencies: + ignore-walk "^6.0.0" + +npm-pick-manifest@^8.0.0, npm-pick-manifest@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" + integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + +npm-profile@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-7.0.1.tgz#a37dae08b22e662ece2c6e08946f9fcd9fdef663" + integrity sha512-VReArOY/fCx5dWL66cbJ2OMogTQAVVQA//8jjmjkarboki3V7UJ0XbGFW+khRwiAJFQjuH0Bqr/yF7Y5RZdkMQ== + dependencies: + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== + dependencies: + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +npm-user-validate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-2.0.0.tgz#7b69bbbff6f7992a1d9a8968d52fd6b6db5431b6" + integrity sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q== + +npm@^9.5.0: + version "9.6.2" + resolved "https://registry.npmjs.org/npm/-/npm-9.6.2.tgz" + integrity sha512-TnXoXhlFkH/9wI4+aXSq0aPLwKG7Ge17t1ME4/rQt+0DZWQCRk9PwhBuX/shqdUiHeKicSLSkzWx+QZgTRE+/A== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/arborist" "^6.2.5" + "@npmcli/config" "^6.1.4" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/package-json" "^3.0.0" + "@npmcli/run-script" "^6.0.0" + abbrev "^2.0.0" + archy "~1.0.0" + cacache "^17.0.4" + chalk "^4.1.2" + ci-info "^3.8.0" + cli-columns "^4.0.0" + cli-table3 "^0.6.3" + columnify "^1.6.0" + fastest-levenshtein "^1.0.16" + fs-minipass "^3.0.1" + glob "^8.1.0" + graceful-fs "^4.2.10" + hosted-git-info "^6.1.1" + ini "^3.0.1" + init-package-json "^5.0.0" + is-cidr "^4.0.2" + json-parse-even-better-errors "^3.0.0" + libnpmaccess "^7.0.2" + libnpmdiff "^5.0.13" + libnpmexec "^5.0.13" + libnpmfund "^4.0.13" + libnpmhook "^9.0.3" + libnpmorg "^5.0.3" + libnpmpack "^5.0.13" + libnpmpublish "^7.1.2" + libnpmsearch "^6.0.2" + libnpmteam "^5.0.3" + libnpmversion "^4.0.2" + make-fetch-happen "^11.0.3" + minimatch "^6.2.0" + minipass "^4.2.4" + minipass-pipeline "^1.2.4" + ms "^2.1.2" + node-gyp "^9.3.1" + nopt "^7.0.0" + npm-audit-report "^4.0.0" + npm-install-checks "^6.0.0" + npm-package-arg "^10.1.0" + npm-pick-manifest "^8.0.1" + npm-profile "^7.0.1" + npm-registry-fetch "^14.0.3" + npm-user-validate "^2.0.0" + npmlog "^7.0.1" + p-map "^4.0.0" + pacote "^15.1.1" + parse-conflict-json "^3.0.0" + proc-log "^3.0.0" + qrcode-terminal "^0.12.0" + read "^2.0.0" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.2" + semver "^7.3.8" + ssri "^10.0.1" + tar "^6.1.13" + text-table "~0.2.0" + tiny-relative-date "^1.3.0" + treeverse "^3.0.0" + validate-npm-package-name "^5.0.0" + which "^3.0.0" + write-file-atomic "^5.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +npmlog@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" + integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== + dependencies: + are-we-there-yet "^4.0.0" + console-control-strings "^1.1.0" + gauge "^5.0.0" + set-blocking "^2.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.2.2: + version "3.2.2" + resolved "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz" + integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-resolver@^2.5.6: + version "2.5.6" + resolved "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz" + integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^5.0.8: + version "5.0.8" + resolved "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz" + integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== + dependencies: + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.2.2" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + reftools "^1.1.9" + should "^13.2.1" + yaml "^1.10.0" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.2, object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.5, object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +openapi-sampler@^1.3.0: + version "1.3.1" + resolved "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.3.1.tgz" + integrity sha512-Ert9mvc2tLPmmInwSyGZS+v4Ogu9/YoZuq9oP3EdUklg2cad6+IGndP9yqJJwbgdXwZibiq5fpv6vYujchdJFg== + dependencies: + "@types/json-schema" "^7.0.7" + json-pointer "0.6.2" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-each-series@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz" + integrity sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw== + +p-filter@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + +p-is-promise@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz" + integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-reduce@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== + +p-reduce@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz" + integrity sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q== + +p-retry@^4.0.0, p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +pacote@^15.0.0, pacote@^15.0.8, pacote@^15.1.1: + version "15.2.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" + integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^5.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + promise-retry "^2.0.1" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" + tar "^6.1.11" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parent-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz" + integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== + dependencies: + callsites "^3.1.0" + +parse-conflict-json@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== + dependencies: + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" + just-diff-apply "^5.2.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.7.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63" + integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg== + dependencies: + lru-cache "^9.1.1" + minipass "^5.0.0 || ^6.0.2" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +perfect-scrollbar@^1.5.5: + version "1.5.5" + resolved "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz" + integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pkg-conf@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz" + integrity sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g== + dependencies: + find-up "^2.0.0" + load-json-file "^4.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +polished@^4.1.3: + version "4.2.2" + resolved "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz" + integrity sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ== + dependencies: + "@babel/runtime" "^7.17.8" + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-discard-unused@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz" + integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-loader@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz" + integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.8" + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + +postcss-merge-idents@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz" + integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-idents@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz" + integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz" + integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw== + +postcss-safe-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz" + integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.11" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.2.1: + version "4.4.1" + resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz" + integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== + dependencies: + sort-css-media-queries "2.1.0" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-zindex@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" + integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== + +postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.19: + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.8.7: + version "2.8.7" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz" + integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^1.3.5: + version "1.3.5" + resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz" + integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== + +prismjs@^1.27.0, prismjs@^1.28.0: + version "1.29.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +promise-all-reject-late@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" + integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== + +promise-call-limit@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" + integrity sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +promzard@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" + integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== + dependencies: + read "^2.0.0" + +prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz" + integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== + +q@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qrcode-terminal@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" + integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@1.2.8, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz" + integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-fast-compare@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-helmet-async@*, react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.3.3: + version "5.3.4" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.4" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.4, react-router@^5.3.3: + version "5.3.4" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-tabs@^3.2.2: + version "3.2.3" + resolved "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.3.tgz" + integrity sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg== + dependencies: + clsx "^1.1.0" + prop-types "^15.5.0" + +react-textarea-autosize@^8.3.2: + version "8.4.1" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz" + integrity sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== + +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +read-package-json@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.4.tgz#90318824ec456c287437ea79595f4c2854708836" + integrity sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw== + dependencies: + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" + +read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg-up@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz" + integrity sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg== + dependencies: + find-up "^6.3.0" + read-pkg "^7.1.0" + type-fest "^2.5.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +read-pkg@^7.0.0, read-pkg@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz" + integrity sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg== + dependencies: + "@types/normalize-package-data" "^2.4.1" + normalize-package-data "^3.0.2" + parse-json "^5.2.0" + type-fest "^2.0.0" + +read@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read/-/read-2.1.0.tgz#69409372c54fe3381092bc363a00650b6ac37218" + integrity sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== + dependencies: + mute-stream "~1.0.0" + +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^4.1.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.0.tgz#55ce132d60a988c460d75c631e9ccf6a7229b468" + integrity sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + +readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + dependencies: + esprima "~4.0.0" + +redoc@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/redoc/-/redoc-2.0.0.tgz" + integrity sha512-rU8iLdAkT89ywOkYk66Mr+IofqaMASlRvTew0dJvopCORMIPUcPMxjlJbJNC6wsn2vvMnpUFLQ/0ISDWn9BWag== + dependencies: + "@redocly/openapi-core" "^1.0.0-beta.104" + classnames "^2.3.1" + decko "^1.2.0" + dompurify "^2.2.8" + eventemitter3 "^4.0.7" + json-pointer "^0.6.2" + lunr "^2.3.9" + mark.js "^8.11.1" + marked "^4.0.15" + mobx-react "^7.2.0" + openapi-sampler "^1.3.0" + path-browserify "^1.0.1" + perfect-scrollbar "^1.5.5" + polished "^4.1.3" + prismjs "^1.27.0" + prop-types "^15.7.2" + react-tabs "^3.2.2" + slugify "~1.4.7" + stickyfill "^1.1.1" + style-loader "^3.3.1" + swagger2openapi "^7.0.6" + url-template "^2.0.8" + +redocusaurus@^1.6.1: + version "1.6.3" + resolved "https://registry.npmjs.org/redocusaurus/-/redocusaurus-1.6.3.tgz" + integrity sha512-RTo0HyTJwPM1t1ZB5j+yK31ta4Dy2IaGS1j/DKN2Kn2ZsahFO7m3fom/LzRYxzv2H0bd9VxYaxUrlLsMmFzmGA== + dependencies: + docusaurus-plugin-redoc "1.6.0" + docusaurus-theme-redoc "1.6.3" + +reftools@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz" + integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +registry-auth-token@^4.0.0: + version "4.2.2" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== + dependencies: + rc "1.2.8" + +registry-auth-token@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz" + integrity sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA== + dependencies: + "@pnpm/npm-conf" "^1.0.4" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remark-docusaurus-tabs@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/remark-docusaurus-tabs/-/remark-docusaurus-tabs-0.2.0.tgz" + integrity sha512-Xl8FkeQAdDqlhf7EurBxCkT7cfA5QK2PN8eoFr94g1OOuc7XsgVk897zf8yhNNnpQYR8nd/XC6JaXTZxHxX4mA== + dependencies: + mdast-util-to-string "^2.0.0" + unist-util-visit "^2.0.3" + +remark-emoji@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz" + integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.3" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-string@^1.5.4, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" + integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.3.2: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rtl-detect@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz" + integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== + +rtlcss@^3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz" + integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== + dependencies: + find-up "^5.0.0" + picocolors "^1.0.0" + postcss "^8.3.11" + strip-json-comments "^3.1.1" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.4, rxjs@^7.5.5, rxjs@^7.8.0: + version "7.8.0" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semantic-release@^21.0.0: + version "21.0.0" + resolved "https://registry.npmjs.org/semantic-release/-/semantic-release-21.0.0.tgz" + integrity sha512-zks0jVk2Hbyhn014vshcwQ6e6gM9jDPr8SdujqfAzPJBvvvSXa8GHz/x+W0VaW2aBNawWFAlx6N45dp1H1XCCw== + dependencies: + "@semantic-release/commit-analyzer" "^9.0.2" + "@semantic-release/error" "^3.0.0" + "@semantic-release/github" "^8.0.0" + "@semantic-release/npm" "^10.0.2" + "@semantic-release/release-notes-generator" "^10.0.0" + aggregate-error "^4.0.1" + cosmiconfig "^8.0.0" + debug "^4.0.0" + env-ci "^8.0.0" + execa "^7.0.0" + figures "^5.0.0" + find-versions "^5.1.0" + get-stream "^6.0.0" + git-log-parser "^1.2.0" + hook-std "^3.0.0" + hosted-git-info "^6.0.0" + lodash-es "^4.17.21" + marked "^4.1.0" + marked-terminal "^5.1.1" + micromatch "^4.0.2" + p-each-series "^3.0.0" + p-reduce "^3.0.0" + read-pkg-up "^9.1.0" + resolve-from "^5.0.0" + semver "^7.3.2" + semver-diff "^4.0.0" + signale "^1.2.1" + yargs "^17.5.1" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== + dependencies: + semver "^7.3.5" + +semver-regex@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz" + integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw== + +"semver@2 || 3 || 4 || 5", semver@^5.4.1: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.3.8, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.3: + version "6.1.5" + resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz" + integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.1.2" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.7.4" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz" + integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz" + integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz" + integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.npmjs.org/should/-/should-13.2.3.tgz" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + +signale@^1.2.1: + version "1.4.0" + resolved "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz" + integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== + dependencies: + chalk "^2.3.2" + figures "^2.0.0" + pkg-conf "^2.1.0" + +sigstore@^1.3.0, sigstore@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.6.0.tgz#887a4007c6ee83f3ef3fd844be1a0840e849c301" + integrity sha512-QODKff/qW/TXOZI6V/Clqu74xnInAS6it05mufj4/fSewexLtfEntgLZZcBtUK44CDQyUE5TUXYy1ARYzlfG9g== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + "@sigstore/tuf" "^1.0.0" + make-fetch-happen "^11.0.1" + tuf-js "^1.1.3" + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slugify@~1.4.7: + version "1.4.7" + resolved "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz" + integrity sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +sort-css-media-queries@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz" + integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spawn-error-forwarder@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz" + integrity sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.12" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +split2@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz" + integrity sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg== + dependencies: + through2 "~2.0.0" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/split/-/split-1.0.1.tgz" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^10.0.0, ssri@^10.0.1: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== + dependencies: + minipass "^5.0.0" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +std-env@^3.0.1: + version "3.3.1" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.3.1.tgz" + integrity sha512-3H20QlwQsSm2OvAxWIYhs+j01MzzqwMwGiiO1NQaJYZgJZFPuAbf95/DiKRBSTYIJ2FeGUc+B/6mPGcWP9dO3Q== + +stickyfill@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz" + integrity sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +stream-combiner2@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz" + integrity sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw== + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +string-argv@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-bom@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-loader@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz" + integrity sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw== + +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz" + integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +styled-components@^5.3.6: + version "5.3.9" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.9.tgz" + integrity sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^1.1.0" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +stylelint-config-prettier@^9.0.4: + version "9.0.4" + resolved "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-9.0.4.tgz" + integrity sha512-38nIGTGpFOiK5LjJ8Ma1yUgpKENxoKSOhbDNSemY7Ep0VsJoXIW9Iq/2hSt699oB9tReynfWicTAoIHiq8Rvbg== + +stylelint-config-recommended@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz" + integrity sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ== + +stylelint-config-standard@^29.0.0: + version "29.0.0" + resolved "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz" + integrity sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg== + dependencies: + stylelint-config-recommended "^9.0.0" + +stylelint@^14.16.1: + version "14.16.1" + resolved "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz" + integrity sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + balanced-match "^2.0.0" + colord "^2.9.3" + cosmiconfig "^7.1.0" + css-functions-list "^3.1.0" + debug "^4.3.4" + fast-glob "^3.2.12" + fastest-levenshtein "^1.0.16" + file-entry-cache "^6.0.1" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.2.0" + ignore "^5.2.1" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.26.0" + mathml-tag-names "^2.1.3" + meow "^9.0.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.19" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^6.0.0" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + style-search "^0.1.0" + supports-hyperlinks "^2.3.0" + svg-tags "^1.0.0" + table "^6.8.1" + v8-compile-cache "^2.3.0" + write-file-atomic "^4.0.2" + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.2.0, supports-hyperlinks@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +svgo@^2.7.0, svgo@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +swagger2openapi@^7.0.6: + version "7.0.8" + resolved "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz" + integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== + dependencies: + call-me-maybe "^1.0.1" + node-fetch "^2.6.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + oas-validator "^5.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +synckit@^0.8.5: + version "0.8.5" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.5.0" + +table@^6.8.1: + version "6.8.1" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.1.11, tar@^6.1.13, tar@^6.1.2: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz" + integrity sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA== + dependencies: + is-stream "^3.0.0" + temp-dir "^2.0.0" + type-fest "^2.12.2" + unique-string "^3.0.0" + +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: + version "5.3.6" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + +terser@^5.10.0, terser@^5.14.1: + version "5.16.1" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz" + integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through2@^2.0.1, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-glob@^0.2.9: + version "0.2.9" + resolved "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + +tiny-invariant@^1.0.2: + version "1.3.1" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tiny-relative-date@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" + integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== + +tiny-warning@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +traverse@~0.6.6: + version "0.6.7" + resolved "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz" + integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== + +treeverse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" + integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz" + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +ts-node@^10.8.1: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsc-files@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/tsc-files/-/tsc-files-1.1.3.tgz" + integrity sha512-G6uXkTNofGU9EE1fYBaCpR72x/aqXW4PDAuznWj4JYlDwhcaKnUn4CiCHBMc89lDxLmikK+hhaEWLoTPEKKvXg== + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tuf-js@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" + integrity sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg== + dependencies: + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-fest@^1.0.1, type-fest@^1.0.2: + version "1.4.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.0.0, type-fest@^2.12.2, type-fest@^2.5.0: + version "2.19.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +"typescript@^4.6.4 || ^5.0.0", typescript@^4.7.4: + version "4.9.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== + +ua-parser-js@^0.7.30: + version "0.7.35" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" + integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-join@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz" + integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-compile-cache@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vscode-languageserver-textdocument@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz" + integrity sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q== + +vscode-uri@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz" + integrity sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA== + +wait-on@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== + dependencies: + axios "^0.25.0" + joi "^17.6.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.5.4" + +walk-up-path@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" + integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.0, wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-bundle-analyzer@^4.5.0: + version "4.7.0" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz" + integrity sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.9.3: + version "4.11.1" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.2, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.73.0: + version "5.77.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz" + integrity sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +webpackbar@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== + dependencies: + chalk "^4.1.0" + consola "^2.15.3" + pretty-time "^1.1.0" + std-env "^3.0.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^1.2.14, which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.0.3, word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz" + integrity sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +write-file-atomic@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + +ws@^7.3.1: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.4.2: + version "8.12.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz" + integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml-ast-parser@0.0.43: + version "0.0.43" + resolved "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz" + integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.2.1: + version "2.3.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^16.1.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.0, yargs@^17.5.1: + version "17.6.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yargs@^17.0.1: + version "17.7.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==