mirror of
https://github.com/Xahau/xahau-web.git
synced 2025-11-04 12:15:49 +00:00
Compare commits
41 Commits
Ekiserrepe
...
575598f42e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
575598f42e | ||
|
|
77e3d8b001 | ||
|
|
29df0aece7 | ||
|
|
8f7545b541 | ||
|
|
896959c613 | ||
|
|
8758ac2cf1 | ||
|
|
ee862a8ba7 | ||
|
|
c25e8f7c57 | ||
|
|
206a614f74 | ||
|
|
bab4e61c4e | ||
|
|
4246025324 | ||
|
|
5b989f3ecc | ||
|
|
1ea99fa904 | ||
|
|
209aff06b9 | ||
|
|
6032c14645 | ||
|
|
cf6c6667d6 | ||
|
|
381c5e1a9f | ||
|
|
8f3bd1f9be | ||
|
|
67b0b6629d | ||
|
|
1543b0e4c1 | ||
|
|
8f758976fb | ||
|
|
ddea8e0012 | ||
|
|
4eb2df7c97 | ||
|
|
023d4ffb38 | ||
|
|
e3be8bbf4b | ||
|
|
69de1779a3 | ||
|
|
9085768920 | ||
|
|
4a8e181d38 | ||
|
|
99bd4ba34e | ||
|
|
915aacc2d6 | ||
|
|
09ab2dee29 | ||
|
|
3c8cfe206f | ||
|
|
7d4eebdfb4 | ||
|
|
cdd2f5058c | ||
|
|
2a73058eab | ||
|
|
5747a948a6 | ||
|
|
6fe9c25db9 | ||
|
|
b87b096cce | ||
|
|
b1ce5e6fd3 | ||
|
|
0fe5e830d6 | ||
|
|
ee9a946e77 |
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -26,8 +26,6 @@ jobs:
|
||||
|
||||
- name: Setup Biome
|
||||
uses: biomejs/setup-biome@v2
|
||||
with:
|
||||
version: latest
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
19
CONTRIBUTING.md
Normal file
19
CONTRIBUTING.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Thank You!
|
||||
Public contributions to the documentation are welcome. When contributing, please help with consistency and clarity by adhering to the below guidelines.
|
||||
|
||||
# Disambiguation
|
||||
* Strive for brevity and clarity. Avoid jargon and use a professional writing tone. Adhere to standards, such as [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119).
|
||||
* When referring to the software `xahaud`, use a lowercase "x" and include the 'd'. When referring to the broader `Xahau Network`, capitalize both terms and,if appropriate, subsequently use the capitalized term "the Network". Use the capitalized `Xahau` or the all caps abbreviation `XAH` when referring to the currency.
|
||||
* Be mindful that this documentation is shared by a global community. Avoid culture-specific jargon or slang.
|
||||
|
||||
# Formatting
|
||||
* Relative and absolute linking are both permitted. When changing the directory structure or renaming individual pages, use grep to ensure all links are updated. Header, footer, index page, navigation bar, and links on other pages all need to be updated manually.
|
||||
* The use of second person ("you") is permitted.
|
||||
* Individual webpages may be formatted using Markdown, HTML, CSS, and JavaScript in any combination. To the extent possible, favor style templates and avoid inline CSS.
|
||||
* When using bulleted or numbered lists end sentences with a period ('.'), unless doing so interferes with content. For example, if a bulleted list item ends with a link to a webpage, do not add a '.' at the end of the link, as doing so breaks the link. Similarly, do not add a '.' after code snippets.
|
||||
* Capitalize proper nouns, including "Testnet" and "Mainnet". Prefer single word for these terms.
|
||||
* Use square brackets inside code snippets to offset user specific information, such as file names and paths. For example: `cd [/path/to/xahaud] && ./xahaud server_info`
|
||||
* Wrap multi-line code examples in three backticks: "```".
|
||||
|
||||
# General Guidelines
|
||||
* Include meaningful commit messages.
|
||||
@@ -33,4 +33,8 @@ All commands are run from the root of the project, from a terminal:
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||
|
||||
## Standards for Formatting Contributions
|
||||
|
||||
When contributing, please adhere to the standards defined in "[contributing.md](contributing.md)".
|
||||
|
||||
@@ -6,6 +6,7 @@ import starlight from '@astrojs/starlight'
|
||||
import tailwindcss from '@tailwindcss/vite'
|
||||
import { defineConfig } from 'astro/config'
|
||||
import starlightOpenAPI, { openAPISidebarGroups } from 'starlight-openapi'
|
||||
import { remarkGlobalReferences } from './src/plugins/remarkGlobalReferences'
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
@@ -279,15 +280,13 @@ export default defineConfig({
|
||||
{
|
||||
label: 'Infrastructure',
|
||||
items: [
|
||||
'docs/infrastructure/node-requirements',
|
||||
{
|
||||
label: 'Running a Node',
|
||||
collapsed: true,
|
||||
items: [
|
||||
'docs/infrastructure/running-a-node/running-a-mainnet-node',
|
||||
'docs/infrastructure/running-a-node/running-a-testnet-node',
|
||||
],
|
||||
},
|
||||
'docs/infrastructure/system-requirements',
|
||||
'docs/infrastructure/installing-xahaud',
|
||||
'docs/infrastructure/updating-xahaud',
|
||||
'docs/infrastructure/enabling-validation',
|
||||
'docs/infrastructure/identity',
|
||||
'docs/infrastructure/interacting',
|
||||
'docs/infrastructure/advanced-configuration',
|
||||
{
|
||||
label: 'Building Xahau (Dev)',
|
||||
collapsed: true,
|
||||
@@ -311,6 +310,9 @@ export default defineConfig({
|
||||
}),
|
||||
mdx(),
|
||||
],
|
||||
markdown: {
|
||||
remarkPlugins: [remarkGlobalReferences],
|
||||
},
|
||||
vite: {
|
||||
plugins: [tailwindcss()],
|
||||
},
|
||||
|
||||
287
package-lock.json
generated
287
package-lock.json
generated
@@ -9,15 +9,18 @@
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"@astrojs/mdx": "^4.3.0",
|
||||
"@astrojs/node": "^9.4.4",
|
||||
"@astrojs/react": "^4.3.0",
|
||||
"@astrojs/starlight": "^0.34.4",
|
||||
"@astrojs/starlight-tailwind": "^4.0.1",
|
||||
"@headlessui/react": "^2.2.4",
|
||||
"@heroicons/react": "^2.2.0",
|
||||
"@tailwindcss/vite": "^4.1.11",
|
||||
"altcha": "^2.2.4",
|
||||
"astro": "^5.10.1",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"remark-reference-links": "^7.0.0",
|
||||
"starlight-openapi": "^0.19.1",
|
||||
"tailwindcss": "^4.1.11",
|
||||
"vanilla-cookieconsent": "^3.1.0"
|
||||
@@ -26,6 +29,12 @@
|
||||
"@biomejs/biome": "^2.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@altcha/crypto": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@altcha/crypto/-/crypto-0.0.1.tgz",
|
||||
"integrity": "sha512-qZMdnoD3lAyvfSUMNtC2adRi666Pxdcw9zqfMU5qBOaJWqpN9K+eqQGWqeiKDMqL0SF+EytNG4kR/Pr/99GJ6g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@ampproject/remapping": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
|
||||
@@ -108,6 +117,26 @@
|
||||
"astro": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@astrojs/node": {
|
||||
"version": "9.4.4",
|
||||
"resolved": "https://registry.npmjs.org/@astrojs/node/-/node-9.4.4.tgz",
|
||||
"integrity": "sha512-zQelZmeejnpw3Y5cj2gCyAZ6HT7tjgsWLZH8k40s3bTaT6lqJXlPtKJeIsuEcod21vZLODqBEQeu0CWrWm01EQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@astrojs/internal-helpers": "0.7.3",
|
||||
"send": "^1.2.0",
|
||||
"server-destroy": "^1.0.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"astro": "^5.7.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@astrojs/node/node_modules/@astrojs/internal-helpers": {
|
||||
"version": "0.7.3",
|
||||
"resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.3.tgz",
|
||||
"integrity": "sha512-6Pl0bQEIChuW5wqN7jdKrzWfCscW2rG/Cz+fzt4PhSQX2ivBpnhXgFUCs0M3DCYvjYHnPVG2W36X5rmFjZ62sw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@astrojs/prism": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz",
|
||||
@@ -2700,6 +2729,31 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/altcha": {
|
||||
"version": "2.2.4",
|
||||
"resolved": "https://registry.npmjs.org/altcha/-/altcha-2.2.4.tgz",
|
||||
"integrity": "sha512-UrU2izh1pISqzd7TCAJiJB2N+r7roqA348Qxt1gJlW5k9pJpbDDmMcDaxfuet9h/WFE6Snrritu/WusmERarrg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@altcha/crypto": "^0.0.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@rollup/rollup-linux-x64-gnu": "4.18.0"
|
||||
}
|
||||
},
|
||||
"node_modules/altcha/node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||
"version": "4.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz",
|
||||
"integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
]
|
||||
},
|
||||
"node_modules/ansi-align": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
|
||||
@@ -2799,13 +2853,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/astro": {
|
||||
"version": "5.10.1",
|
||||
"resolved": "https://registry.npmjs.org/astro/-/astro-5.10.1.tgz",
|
||||
"integrity": "sha512-DJVmt+51jU1xmgmAHCDwuUgcG/5aVFSU+tcX694acAZqPVt8EMUAmUZcJDX36Z7/EztnPph9HR3pm72jS2EgHQ==",
|
||||
"version": "5.13.2",
|
||||
"resolved": "https://registry.npmjs.org/astro/-/astro-5.13.2.tgz",
|
||||
"integrity": "sha512-yjcXY0Ua3EwjpVd3GoUXa65HQ6qgmURBptA+M9GzE0oYvgfuyM7bIbH8IR/TWIbdefVUJR5b7nZ0oVnMytmyfQ==",
|
||||
"dependencies": {
|
||||
"@astrojs/compiler": "^2.12.2",
|
||||
"@astrojs/internal-helpers": "0.6.1",
|
||||
"@astrojs/markdown-remark": "6.3.2",
|
||||
"@astrojs/internal-helpers": "0.7.2",
|
||||
"@astrojs/markdown-remark": "6.3.6",
|
||||
"@astrojs/telemetry": "3.3.0",
|
||||
"@capsizecss/unpack": "^2.4.0",
|
||||
"@oslojs/encoding": "^1.1.0",
|
||||
@@ -2848,6 +2902,7 @@
|
||||
"rehype": "^13.0.2",
|
||||
"semver": "^7.7.1",
|
||||
"shiki": "^3.2.1",
|
||||
"smol-toml": "^1.3.4",
|
||||
"tinyexec": "^0.3.2",
|
||||
"tinyglobby": "^0.2.12",
|
||||
"tsconfck": "^3.1.5",
|
||||
@@ -2861,7 +2916,7 @@
|
||||
"xxhash-wasm": "^1.1.0",
|
||||
"yargs-parser": "^21.1.1",
|
||||
"yocto-spinner": "^0.2.1",
|
||||
"zod": "^3.24.2",
|
||||
"zod": "^3.24.4",
|
||||
"zod-to-json-schema": "^3.24.5",
|
||||
"zod-to-ts": "^1.2.0"
|
||||
},
|
||||
@@ -2892,6 +2947,39 @@
|
||||
"astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0"
|
||||
}
|
||||
},
|
||||
"node_modules/astro/node_modules/@astrojs/internal-helpers": {
|
||||
"version": "0.7.2",
|
||||
"resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.2.tgz",
|
||||
"integrity": "sha512-KCkCqR3Goym79soqEtbtLzJfqhTWMyVaizUi35FLzgGSzBotSw8DB1qwsu7U96ihOJgYhDk2nVPz+3LnXPeX6g=="
|
||||
},
|
||||
"node_modules/astro/node_modules/@astrojs/markdown-remark": {
|
||||
"version": "6.3.6",
|
||||
"resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.6.tgz",
|
||||
"integrity": "sha512-bwylYktCTsLMVoCOEHbn2GSUA3c5KT/qilekBKA3CBng0bo1TYjNZPr761vxumRk9kJGqTOtU+fgCAp5Vwokug==",
|
||||
"dependencies": {
|
||||
"@astrojs/internal-helpers": "0.7.2",
|
||||
"@astrojs/prism": "3.3.0",
|
||||
"github-slugger": "^2.0.0",
|
||||
"hast-util-from-html": "^2.0.3",
|
||||
"hast-util-to-text": "^4.0.2",
|
||||
"import-meta-resolve": "^4.1.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
"mdast-util-definitions": "^6.0.0",
|
||||
"rehype-raw": "^7.0.0",
|
||||
"rehype-stringify": "^10.0.1",
|
||||
"remark-gfm": "^4.0.1",
|
||||
"remark-parse": "^11.0.0",
|
||||
"remark-rehype": "^11.1.2",
|
||||
"remark-smartypants": "^3.0.2",
|
||||
"shiki": "^3.2.1",
|
||||
"smol-toml": "^1.3.4",
|
||||
"unified": "^11.0.5",
|
||||
"unist-util-remove-position": "^5.0.0",
|
||||
"unist-util-visit": "^5.0.0",
|
||||
"unist-util-visit-parents": "^6.0.1",
|
||||
"vfile": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"node_modules/astro/node_modules/semver": {
|
||||
"version": "7.7.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
|
||||
@@ -3382,6 +3470,15 @@
|
||||
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
|
||||
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="
|
||||
},
|
||||
"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==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/dequal": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
|
||||
@@ -3469,6 +3566,12 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"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==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/electron-to-chromium": {
|
||||
"version": "1.5.177",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz",
|
||||
@@ -3479,6 +3582,15 @@
|
||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
|
||||
},
|
||||
"node_modules/encodeurl": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
|
||||
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/enhanced-resolve": {
|
||||
"version": "5.18.2",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz",
|
||||
@@ -3584,6 +3696,12 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"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==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/escape-string-regexp": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
|
||||
@@ -3679,6 +3797,15 @@
|
||||
"@types/estree": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/etag": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/eventemitter3": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
|
||||
@@ -3767,6 +3894,15 @@
|
||||
"unicode-trie": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/fresh": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
|
||||
"integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||
@@ -4215,6 +4351,31 @@
|
||||
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
|
||||
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="
|
||||
},
|
||||
"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==",
|
||||
"license": "MIT",
|
||||
"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-errors/node_modules/statuses": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
||||
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/i18next": {
|
||||
"version": "23.16.8",
|
||||
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz",
|
||||
@@ -4246,6 +4407,12 @@
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/inline-style-parser": {
|
||||
"version": "0.2.4",
|
||||
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
|
||||
@@ -5737,6 +5904,27 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/mime-db": {
|
||||
"version": "1.54.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
|
||||
"integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-types": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
|
||||
"integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"mime-db": "^1.54.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/minipass": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
|
||||
@@ -5888,6 +6076,18 @@
|
||||
"resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
|
||||
"integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="
|
||||
},
|
||||
"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==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ee-first": "1.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/oniguruma-parser": {
|
||||
"version": "0.12.1",
|
||||
"resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz",
|
||||
@@ -6147,6 +6347,15 @@
|
||||
"resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
|
||||
"integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="
|
||||
},
|
||||
"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==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/react": {
|
||||
"version": "19.1.0",
|
||||
"resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
|
||||
@@ -6421,6 +6630,20 @@
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/remark-reference-links": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/remark-reference-links/-/remark-reference-links-7.0.0.tgz",
|
||||
"integrity": "sha512-OMACEps7CkpBio5nutUToCcXFJr9QkkoHdku41iIholMdFZ0jdRxgFmPm2B7R+DSvW83ZShdA3ubWTH+C3M6Eg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/mdast": "^4.0.0",
|
||||
"unist-util-visit": "^5.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/remark-rehype": {
|
||||
"version": "11.1.2",
|
||||
"resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
|
||||
@@ -6593,6 +6816,40 @@
|
||||
"semver": "bin/semver.js"
|
||||
}
|
||||
},
|
||||
"node_modules/send": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
|
||||
"integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"debug": "^4.3.5",
|
||||
"encodeurl": "^2.0.0",
|
||||
"escape-html": "^1.0.3",
|
||||
"etag": "^1.8.1",
|
||||
"fresh": "^2.0.0",
|
||||
"http-errors": "^2.0.0",
|
||||
"mime-types": "^3.0.1",
|
||||
"ms": "^2.1.3",
|
||||
"on-finished": "^2.4.1",
|
||||
"range-parser": "^1.2.1",
|
||||
"statuses": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/server-destroy": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
|
||||
"integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/setprototypeof": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
|
||||
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/sharp": {
|
||||
"version": "0.33.5",
|
||||
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
|
||||
@@ -6752,6 +7009,15 @@
|
||||
"astro": ">=5.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/statuses": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
|
||||
"integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/stream-replace-string": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz",
|
||||
@@ -6910,6 +7176,15 @@
|
||||
"url": "https://github.com/sponsors/SuperchupuDev"
|
||||
}
|
||||
},
|
||||
"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==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/tr46": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||
|
||||
@@ -11,15 +11,18 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/mdx": "^4.3.0",
|
||||
"@astrojs/node": "^9.4.4",
|
||||
"@astrojs/react": "^4.3.0",
|
||||
"@astrojs/starlight": "^0.34.4",
|
||||
"@astrojs/starlight-tailwind": "^4.0.1",
|
||||
"@headlessui/react": "^2.2.4",
|
||||
"@heroicons/react": "^2.2.0",
|
||||
"@tailwindcss/vite": "^4.1.11",
|
||||
"altcha": "^2.2.4",
|
||||
"astro": "^5.10.1",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"remark-reference-links": "^7.0.0",
|
||||
"starlight-openapi": "^0.19.1",
|
||||
"tailwindcss": "^4.1.11",
|
||||
"vanilla-cookieconsent": "^3.1.0"
|
||||
|
||||
@@ -16,6 +16,7 @@ import logo from '../assets/xahau-logo.svg'
|
||||
<a href="/ecosystem">Ecosystem</a>
|
||||
<a href="/roadmap">Roadmap</a>
|
||||
<a href="/docs/compliance/responsible-disclosure">Break Xahau</a>
|
||||
<a href="/fraud-report">Report Fraud</a>
|
||||
<a href="/docs/resources/media-kit">Media kit</a>
|
||||
<a href="/privacy-policy">Privacy Policy</a>
|
||||
</div>
|
||||
@@ -25,7 +26,7 @@ import logo from '../assets/xahau-logo.svg'
|
||||
<a href="/docs/protocol-reference/transactions">Protocol Reference</a>
|
||||
<a href="/docs/hooks">Hooks</a>
|
||||
<a href="/docs/data-apis">Data APIs</a>
|
||||
<a href="/docs/infrastructure/node-requirements">Infrastructure</a>
|
||||
<a href="/docs/infrastructure/system-requirements">Infrastructure</a>
|
||||
<a href="/docs/resources/whitepaper">Whitepaper</a>
|
||||
</div>
|
||||
<div class="col-span-1 md:col-span-2 flex flex-col gap-3">
|
||||
@@ -35,4 +36,4 @@ import logo from '../assets/xahau-logo.svg'
|
||||
<a href="https://discord.com/invite/UzU58haAn4" target="_blank">Community Discord</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</footer>
|
||||
|
||||
@@ -29,7 +29,7 @@ const docs = [
|
||||
{ name: 'Protocol Reference', href: '/docs/protocol-reference/transactions' },
|
||||
{ name: 'Hooks', href: '/docs/hooks' },
|
||||
{ name: 'Data APIs', href: '/docs/data-apis' },
|
||||
{ name: 'Infrastructure', href: '/docs/infrastructure/node-requirements' },
|
||||
{ name: 'Infrastructure', href: '/docs/infrastructure/system-requirements' },
|
||||
{ name: 'Whitepaper', href: '/docs/resources/whitepaper' },
|
||||
]
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ To opt-out of Balance Adjustments, omit the Issuer field and set Flags to 1. Doi
|
||||
"Account": "<rAddr...>",
|
||||
"TransactionType": "ClaimReward",
|
||||
"NetworkID": 21337,
|
||||
"Flags" 1
|
||||
"Flags": 1
|
||||
}
|
||||
```
|
||||
|
||||
@@ -41,7 +41,7 @@ All interactions with this amendment are via the ClaimReward transaction:
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "<rAddr...>",
|
||||
"Account": "<rAddr...>",
|
||||
"TransactionType": "ClaimReward",
|
||||
"Issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"NetworkID": 21337
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: Account Managment
|
||||
---
|
||||
import { Aside } from '@astrojs/starlight/components';
|
||||
import { LinkCard } from '@astrojs/starlight/components';
|
||||
|
||||
The Account Management features in the Xahau network are a crucial component for users to manage their accounts effectively.
|
||||
|
||||
@@ -13,25 +13,25 @@ This includes several transaction types that enable users to perform various ope
|
||||
|
||||
The `AccountSet` transaction type allows users to modify the properties of their accounts. This includes settings such as transfer rate, account flags, and more.
|
||||
|
||||
[accountset.md](/docs/protocol-reference/transactions/transaction-types/accountset.md)
|
||||
<LinkCard title="AccountSet" href="/docs/protocol-reference/transactions/transaction-types/accountset" />
|
||||
|
||||
#### AccountDelete
|
||||
|
||||
The `AccountDelete` transaction type enables users to delete their accounts from the Xahau network. This operation is irreversible and should be used with caution.
|
||||
|
||||
[accountdelete.md](/docs/protocol-reference/transactions/transaction-types/accountdelete.md)
|
||||
<LinkCard title="AccountDelete" href="/docs/protocol-reference/transactions/transaction-types/accountdelete" />
|
||||
|
||||
#### SetRegularKey
|
||||
|
||||
The `SetRegularKey` transaction type allows users to set a regular key pair for their account. This key pair can be used as an alternative to the master key pair for signing transactions.
|
||||
|
||||
[setregularkey.md](/docs/protocol-reference/transactions/transaction-types/setregularkey.md)
|
||||
<LinkCard title="SetRegularKey" href="/docs/protocol-reference/transactions/transaction-types/setregularkey" />
|
||||
|
||||
#### SignersListSet
|
||||
#### SignerListSet
|
||||
|
||||
The `SignersListSet` transaction type enables users to set a list of signers for their account. This is particularly useful for multi-signature accounts where multiple parties are required to sign off on transactions.
|
||||
The `SignerListSet` transaction type enables users to set a list of signers for their account. This is particularly useful for multi-signature accounts where multiple parties are required to sign off on transactions.
|
||||
|
||||
[signerlistset.md](/docs/protocol-reference/transactions/transaction-types/signerlistset.md)
|
||||
<LinkCard title="SignerListSet" href="/docs/protocol-reference/transactions/transaction-types/signerlistset" />
|
||||
|
||||
#### Import
|
||||
|
||||
@@ -39,6 +39,6 @@ The `Import` transaction type is used to import transactions from other networks
|
||||
|
||||
Please note that the process of importing for the issuer involves specific transaction types and requires careful configuration. Always ensure that the hooks are correctly set up and that the transactions are valid for the intended operations.
|
||||
|
||||
[import.md](/docs/protocol-reference/transactions/transaction-types/import.md)
|
||||
<LinkCard title="Import" href="/docs/protocol-reference/transactions/transaction-types/import" />
|
||||
|
||||
These transaction types provide users with a comprehensive set of tools for managing their accounts on the Xahau network. As with all operations, users should ensure they understand the implications of each transaction type before use.
|
||||
|
||||
@@ -201,7 +201,7 @@ If a Transaction Type does not appear in the table then it has no TSHes **other
|
||||
| Account | Account | Strong |
|
||||
| Account | RegularKey | Strong |
|
||||
|
||||
**SignersListSet**
|
||||
**SignerListSet**
|
||||
|
||||
| OTXN | TSH | SignerListSet |
|
||||
| ------- | ------- | ------------- |
|
||||
|
||||
@@ -22,12 +22,7 @@ It also covers the different ledger objects integral to the network's operation,
|
||||
|
||||
### Infrastructure
|
||||
|
||||
The Infrastructure section provides detailed instructions for setting up the build environment on both Ubuntu 22.04 and macOS 13.5.2.
|
||||
Infrastructure is the core of the Xahau Network. Servers running the xahaud software enable users to do things like submit, verify, and query transactions. The documentation in this section provides instructions for installing, updating, configuring, and building xahaud. Concepts, such as attesting to the identity of a given server or running xahaud as a validator, are also discussed.
|
||||
|
||||
In the 'Building Xahau' chapter, you will find a step-by-step guide through the process of establishing environmental variables, installing core and Xahaud dependencies, and compiling the software.
|
||||
|
||||
This includes the acquisition and setup of essential components like LLVM, Boost, WasmEdge, and Protobuf. The steps explain why certain versions and configurations are needed to ensure compatibility and optimal performance.
|
||||
|
||||
This section ends with cloning the Xahau repository and creating the Xahaud target, setting developers on the path to adding to or deploying the Xahau network.
|
||||
|
||||
**We hope this documentation provides you with the information you need to understand, use, and contribute to Xahau. Happy exploring!**
|
||||
**We hope this documentation provides you with the information you need to understand, use, and contribute to the Xahau Network. Happy exploring!**
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: Advanced xahaud Configuration
|
||||
---
|
||||
There are numerous configuration options available to xahaud operators. This section will cover some of the more commonly used options, including those required for clustering servers and configuring databases.
|
||||
|
||||
For complete documentation on configuration options, please see the example configuration files in the [xahaud GitHub repository](https://github.com/Xahau/xahaud/tree/dev/cfg).
|
||||
|
||||
## Running Databases in Memory
|
||||
Users seeking to maximize xahaud performance may choose to run databases in memory, rather than on dedicated storage media. Memory databases are not suited for machines storing history, as the databases are not persistent across xahaud restarts. Likewise, the amount of history stored is contingent on available system memory. Thus, `online_delete` and `advisory_delete` are required in the `xahaud.cfg` to prevent out of memory errors. When using a memory database, it is advisable to disable SWAP, as SWAP writes the contents of memory to disk, thereby potentially defeating the benefits obtained by storing the database in memory.
|
||||
|
||||
To enable the memory database, edit the `xahaud.cfg` file:
|
||||
|
||||
```
|
||||
[relational_db]
|
||||
type=RWDB
|
||||
|
||||
[node_db]
|
||||
type=RWDB # RWDB is the memory database
|
||||
online_delete=256 # This value should be low on machines using memory databases. '256' is the minimum value.
|
||||
advisory_delete=0 # Do not require human intervention to delete history. This is necessary for preventing out of memory errors.
|
||||
```
|
||||
|
||||
## Clustering
|
||||
Clustering allows xahaud operators to configure multiple xahaud servers so that the servers trust one another, thereby reducing workload. Properly clustered servers can share information about malicious or problematic websocket, rpc, and peer connections, while also automatically propagating submitted transactions throughout the cluster. Thus, if a transaction is submitted on a sever with a higher load than the transaction's fee allows for, the transaction will still propagate to other servers in the cluster, thereby increasing the probability that the transaction is included in an upcoming ledger.
|
||||
|
||||
Administrators operating xahaud validators can benefit from clustering, as the cluster provides connectivity for the highly secure validator, thereby eliminating the need for the validator to connect to unknown or untrusted servers.
|
||||
|
||||
Server operators should not cluster their servers with servers outside of their own control. Likewise, clustered servers should have low latency connections, ideally being located in the same data center.
|
||||
|
||||
Generating cluster seeds (public/private keys) is done via the `validation_create` [API method](../../features/http-websocket-apis/admin-api-methods). While the method name includes the term 'validation', this method is not used to [create the keys](../enabling-validation) used to sign validation messages. Instead, it is used to create keys to identify any xahaud server, validating or non-validating.
|
||||
|
||||
To create a cluster:
|
||||
1. On each xahaud instance that will be included in the cluster, generate a public key and seed: `./xahaud validation_create`
|
||||
2. Open each server's `xahaud.cfg` file, and add or edit the following sections:
|
||||
* `[ips_fixed]` - Include the IPv4/6 addresses and peer listening ports (e.g., `10.1.1.2 21337`) for other servers that will be in the cluster. The listening port is defined under the `[port_peer]` stanza in the `xahaud.cfg` file on the server listening for incoming connections. The default listening port for the main Xahau Network is `21337`.
|
||||
* `[node_seed]` - The output in the `validation_seed` field from the `validation_create` command. This is a private key, and it must be installed on the same server on which it was generated.
|
||||
* `[cluster_nodes]` - The output from the `validation_public_key` field of the `validation_create` command. This is a public key, and it must be installed on peer servers, not the server on which it was generated.
|
||||
3. Restart xahaud on each server in the cluster: `systemctl restart xahaud`
|
||||
4. Backup each server's `xahaud.cfg`.
|
||||
5. Verify connectivity among clustered peers via the [peers](../../features/http-websocket-apis/admin-api-methods) API method: `./xahaud peers`
|
||||
|
||||
The cluster section of a `xahaud.cfg` file might look like this:
|
||||
```
|
||||
[ips_fixed]
|
||||
10.1.1.2 21337 # Clustered peer 1
|
||||
10.1.1.3 21337 # Clustered peer 2
|
||||
10.1.1.4 21337 # Clustered peer 3
|
||||
|
||||
[cluster_nodes]
|
||||
n9LzAHaB7ka318dAJWLQD1WkpGR86NyvaCzrtUAt4PuNtDCTCqxn # validation_public_key from clustered peer 1
|
||||
n9KWNMsRdQ66jYHLCVgFBAQAzb16DwDioVdXSuV8pTcfEfaHkdvZ # validation_public_key from clustered peer 2
|
||||
n9JFK8xUcy9S9TBmCcZKKmY28LEVjTurcpzC5XkXnyAAj1Svytee # validation_public_key from clustered peer 3
|
||||
|
||||
[node_seed]
|
||||
sn8QEFTpBM8nydnLD6FjxKN845uRG # Private validation_seed from the local xahaud instance
|
||||
|
||||
```
|
||||
@@ -90,7 +90,7 @@ deb http://apt.llvm.org/ llvm-toolchain-- main
|
||||
# Add the apt-repo directly with add-apt-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-14 main"
|
||||
```
|
||||
|
||||
### Install Rippled Dependencies
|
||||
### Install Xahaud Dependencies
|
||||
|
||||
Install CMake
|
||||
|
||||
|
||||
48
src/content/docs/docs/infrastructure/enabling-validation.mdx
Normal file
48
src/content/docs/docs/infrastructure/enabling-validation.mdx
Normal file
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: Enabling Validation in xahaud
|
||||
---
|
||||
Validators are xahaud nodes that are configured with an additional public/private keypair, which is used to sign each proposed ledger. Thus, validators are the primary mechanism used to achieve consensus regarding the order in which transactions are applied on the Xahau Network.
|
||||
|
||||
## Background Considerations
|
||||
Running a validating xahaud server may seem straight forward, however, there are a number of considerations for production node operators including uptime and security. This following introductory sections provide background on these considerations.
|
||||
|
||||
### Security and Availability
|
||||
When running xahaud as a validator, system security and availability are critical. Validator operators are expected to actively monitor their servers and to respond quickly to outages. Some validator operators choose to host standby machines in diverse data centers, so they can quickly recover from outages. While it is possible to host a reliable validator in one's home, it is unlikely that such a setup could provide sufficient stability and security for the validator to gain broader trust (e.g., inclusion on published UNLs). Similarly, validator operators are strongly discouraged from running software other than xahaud on a machine used as a xahaud validator, since this increases the probability of running out of resources or exposing a security vulnerability. System administrators who require websocket or RPC access to a server are encouraged to run different machines for queries, so resources are not taken away from the critical task of validating ledgers.
|
||||
<br></br>
|
||||
The private/public validation keypair should be stored and backed up in a secure, offline environment. Anyone with access to the keys of a trusted validator has potential to harm the network. After installing a validation token into the xahaud.cfg file, it is advised to restrict read access (`chmod 400 xahaud.cfg`) and change ownership of the file to "root" or "xahaud", depending on the type of install (`chown root:root xahaud.cfg`).
|
||||
|
||||
### Identity Attestation
|
||||
To avoid a [Sybil attack](https://en.wikipedia.org/wiki/Sybil_attack) and build trust, validating xahaud nodes attest to their identity by cryptographically signing a domain name with their validation keys. This signature is then hosted at the same domain, in a [TOML format file](../identity). In addition to verifying the identity of a validator, this TOML file can also be used to verify the identity of individual account holders on the Xahau Network, by providing an attestation signed by the private account key instead of the private validation key. The TOML file should be hosted on a web server with TLS encryption enabled at:<br></br><code>https://[your-domain.com]/.well-known/xahau.toml</code><br></br>
|
||||
|
||||
### Peering
|
||||
To maintain a high level of security, xahaud nodes that are configured as validators should only peer with known, trusted peers. Enabling the `peer_private` setting and explicitly defining `ips_fixed` in the xahaud.cfg file will force a server to only connect to defined peers. Operating system and hardware level protections, such as firewalls, provide additional reassurance that the server is only connecting to defined peers. However, this can be a challenge, as validators with too few peers, typically less than about five, are at risk of falling out of sync with the rest of the network.
|
||||
|
||||
### Governance and Trust
|
||||
The Xahau Network utilizes the [Governance Game](../../features/governance-game) as a democratic method for managing the Network. Additionally, each xahaud instance participating in the Network is required to install a list of trusted validating servers, called a Unique Node List or UNL. Thus, the existing governance participants can vote a new validator into a seat at the governance table. Separately, trusted UNL publishers, such as the [InFTF](https://inftf.org), can choose to include a validator in their recommended list of trusted validators. Running a validator does not guarantee inclusion in either the Governance Game or any UNL. Typically, validating servers that are selected for inclusion in the governance process have:
|
||||
1. High availability
|
||||
- Effective 24/7/365 monitoring with rapid responses to outages
|
||||
2. High agreement with the rest of the network
|
||||
3. An identified owner/operator and a clear geographic location
|
||||
4. A proactive approach to updating and voting for [amendments](../../features/amendments) and fees
|
||||
- This requires taking the time to watch what is in development
|
||||
|
||||
## Enabling Validation
|
||||
Switching a stock xahaud server into a validator is a straight forward process. Essentially, users will generate a public/private keypair, which is then used to generate a token using an ephemeral key derived from the master pair. That token is installed into the `xahaud.cfg` file, thereby instructing xahaud to propose validations to the Network.
|
||||
|
||||
### Building the Validation Keys Tool
|
||||
At this time, there is not an official release of the software used for generating validation keys. Thus, users can either build the tool from scratch or rely on a packaged version provided with rippled (this tool is not packaged with the xahaud binary). The instructions for building the tool are the same as the instructions for building rippled, and they are provided on the [ripple/validator-keys-tool](https://github.com/ripple/validator-keys-tool) repository page. There are also some [packaged binaries](https://github.com/jscottbranson/xahau-examples/) available in unofficial repositories. Users seeking to generate keys for production validators should build the tool from scratch on a secure, air-gapped machine.
|
||||
|
||||
While xahaud provides the `validation_create` [Admin API method](../../features/http-websocket-apis/admin-api-methods), this method is NOT capable of generating the necessary validation token or allowing for domain verification. Thus, despite the name, the `validation_create` method is used to create public/private keys to identify a server broadly, for example when [clustering multiple servers](../advanced-configuration).
|
||||
|
||||
### Generating and Installing Validation Keys
|
||||
Consider using an offline machine to generate validation keys and a validation token.
|
||||
1. Navigate to the directory containing the validation keys tool: `cd [/path/to/tool]`
|
||||
2. Generate a new keypair: `./validator-keys create_keys`
|
||||
3. The newly generated keypair is stored in `/home/[username]/[.ripple or .xahaud]/validator-keys.json`. The storage path depends on which version of the validator-keys-tool is used.
|
||||
4. Ideally, validators should provide identity attestation. To do so, set your domain in the validator-keys.json file: `./validator-keys set_domain [example.com]`
|
||||
- If you do not wish to provide an identifying domain, generate a validation token without a domain: `./validator-keys create_token --keyfile /home/[username]/.xahaud/validator-keys.json`
|
||||
5. Review the output of the previous command. Note the `[validator_token]`, as this will be installed in xahaud.cfg to enable validation. If a domain was set, note the `attestation=""` line, as it will need to be added into the TOML file served at your domain.
|
||||
- Anytime the tool is used to generate a new `validator_token`, a field, `token_sequence`, is incremented in the `validator-keys.json` file. The Network will ignore validations from any server that has a token generated with a lower sequence number than the highest observed number. For example, if your validation token has sequence number "3" and you generate a new token with sequence number "2", validations from any machine using the new token with the lower sequence number will be ignored. This feature enables server operators to generate a new token, rather than generating new master validation keys, in the event of a security compromise or other incident.
|
||||
6. Open xahaud.cfg and paste in the `[validation_token]`, then restart the xahaud service.
|
||||
7. Paste the `attestation=""` into your [TOML](../identity) file to prove the identity of your validator.
|
||||
8. Ensure private validation keys are stored securely, ideally separate from the validator.
|
||||
179
src/content/docs/docs/infrastructure/identity.mdx
Normal file
179
src/content/docs/docs/infrastructure/identity.mdx
Normal file
@@ -0,0 +1,179 @@
|
||||
---
|
||||
title: Serving a TOML File for Identity Verification
|
||||
---
|
||||
***Identity verification requires two parts. NEVER TRUST TOML FILES OR ON NETWORK VALIDATOR/ACCOUNT ATTESTATIONS ALONE TO CONFIRM IDENTITY, AS ANYONE CAN SET THEM. A website (URL) must claim ownership of the validator/account, and the on-network data must match.***
|
||||
|
||||
Given that trust is foundational to the Xahau Network, it is ideal for entities operating xahaud validators to take credit for their servers. Identity attestation provides users with assurances that one entity isn't gaining disproportionate control over the trusted (default UNL) validators in the Network. This is is done by publishing two attestations: one from a validating server on the Xahau Network and a second from a web server that serves the identifying domain over TLS. Thus, the validator claims association with the web domain and the web domain claims association with the validator. *Without both of these claims, it is not possible to trust the identity attestation.*
|
||||
|
||||
Similarly, individual Xahau account holders might wish to publish a TOML file attesting that specific accounts on the network are under their control. Account ownership attestations are particularly relevant for enterprises, such as exchanges or financial institutions. As with validators, these attestations require two parts: a web server that claims ownership of a Xahau Network address as well as an on-network account address that claims to be owned by the same domain. Account attestations provide users with confidence that they are routing deposits to the correct address.
|
||||
|
||||
The contents and structure of this file are similar to those used by [Stellar](https://developers.stellar.org/docs/tokens/publishing-asset-info) and the [XRP Ledger](https://xrpl.org/docs/references/xrp-ledger-toml). Since the file can contain custom fields, it is important to allow flexibility when building tools designed to parse the TOML file.
|
||||
|
||||
## Web Server and DNS Configuration
|
||||
1. The file contents must be in the [TOML format](https://github.com/toml-lang/toml).
|
||||
2. The TOML file must be served from: `https://[optional-subdomain.your-domain.com]/.well-known/xahau.toml`
|
||||
* The path `/.well-known/xahau.toml` must not be altered. The path must be all lower case.
|
||||
* [RFC 5785](https://datatracker.ietf.org/doc/html/rfc5785) contains more information on the "/.well-known/" path.
|
||||
3. A TLS certificate chaining to a trusted certificate authority must be used to encrypt connections serving the TOML file.
|
||||
4. DNS Sec is recommended for the domain.
|
||||
5. Subdomains may be used to serve the file, and identical files may be hosted from multiple subdomains.
|
||||
6. Content type for the file is `application/toml`.
|
||||
7. The TOML file must be served with a CORS header: `Access-Control-Allow-Origin: *`
|
||||
8. Additional headers may be served with the TOML file, if needed.
|
||||
9. Custom or nonstandard fields may be added to the TOML file, as required by individual users.
|
||||
10. No field is strictly required in the TOML file.
|
||||
|
||||
### CORS Configuration
|
||||
Apache:
|
||||
```
|
||||
<Location "/.well-known/xahau.toml">
|
||||
Header set Access-Control-Allow-Origin "*"
|
||||
</Location>
|
||||
```
|
||||
Nginx:
|
||||
```
|
||||
location /.well-known/xahau.toml {
|
||||
add_header 'Access-Control-Allow-Origin' '*';
|
||||
}
|
||||
```
|
||||
|
||||
### TOML File Contents
|
||||
TOML files are typically subdivided into sections describing the TOML file itself (metadata), principals (responsible parties), and claimed assets including: validators, non-validating xahaud servers, accounts, and issued currencies.
|
||||
|
||||
#### Example TOML
|
||||
The below example is intended to illustrate all sections that are commonly included in a Xahau Network TOML file. Individual users may not have all of these sections in their TOML file, and some users may need to include multiple of the same section. For example, if one exchange issues multiple currencies, it would include a `[[CURRENCIES]]` section for each IOU issued on the Network.
|
||||
```
|
||||
[METADATA]
|
||||
modified = 2025-08-04T14:24:34.123Z
|
||||
expired = 2025-12-31T14:24:34.123Z
|
||||
|
||||
[ORGANIZATION]
|
||||
name = "A Company B.V."
|
||||
website = "https://example.com"
|
||||
email = "contact@example.com"
|
||||
|
||||
[[PRINCIPALS]]
|
||||
name = "A. Person"
|
||||
email = "a_person@example.com"
|
||||
social_1 = "https://www.linkedin.com/company/incfintech"
|
||||
x = "@IncFinTech"
|
||||
|
||||
[[VALIDATORS]]
|
||||
public_key = "nHBixLw8q7XUP5AKceK2aZriN67PPjQW7JJ7hLkJgxvkTTs5go6k"
|
||||
attestation = "07FA61020CA5E0605BE29D213DCC33F934B631EB6215F52D3E99D8AEA841272E300758B5C03CD2332190307324B4869838B77BAD275B31CF59D13E8FA6A8780B"
|
||||
owner_country = "US"
|
||||
server_country = "CA"
|
||||
network_asn = "398726"
|
||||
network = "21337"
|
||||
unl = "https://vl.xahau.org"
|
||||
|
||||
[[SERVERS]]
|
||||
ws = "wss://"
|
||||
json_rpc = "https://"
|
||||
peer = "https://"
|
||||
network = "21337"
|
||||
|
||||
[[ACCOUNTS]]
|
||||
address = "rabc..."
|
||||
network = "21337"
|
||||
desc = "This wallet is used for client deposits."
|
||||
|
||||
[[CURRENCIES]]
|
||||
code = "USD"
|
||||
issuer = "rabc..."
|
||||
symbol = "$"
|
||||
network = "21337"
|
||||
display_decimals = 2
|
||||
|
||||
[[CURRENCIES]]
|
||||
code = "EUR"
|
||||
issuer = "rabc..."
|
||||
symbol = "€"
|
||||
network = "21337"
|
||||
display_decimals = 2
|
||||
```
|
||||
|
||||
#### Metadata
|
||||
Dates/times in the TOML file should be specified in UTC and include millisecond precision. For example, `2025-08-04T14:24:34.123Z`. Only one metadata section can be included in a TOML file.
|
||||
<table>
|
||||
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
|
||||
<tr><td>`modified`</td><td>Date-Time</td><td>Date and time when the TOML was most recently modified.</td></tr>
|
||||
<tr><td>`expires`</td><td>Date-Time</td><td>After this date/time, the TOML file will be considered expired and thus invalid.</td></tr>
|
||||
</table>
|
||||
|
||||
#### Organization
|
||||
If an entity rather than an individual is claiming responsibility for the TOML file, that entity should use this section to identify itself. It would be unusual and likely an error for one TOML file to have multiple `[ORGANIZATION]` sections. If multiple sections are needed, ensure an additional set of brackets are added: `[[ORGANIZATION]]`.
|
||||
<table>
|
||||
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
|
||||
<tr><td>`name`</td><td>String</td><td>The name of organization hosting the TOML file.</td></tr>
|
||||
<tr><td>`email`</td><td>String</td><td>Email address for the organization.</td></tr>
|
||||
<tr><td>`website`</td><td>String</td><td>Website for the organization (typically this is the same as the URL where the TOML is hosted).</td></tr>
|
||||
<tr><td>`social_[x]`</td><td>String</td><td>Link to a social media profile. This field is not standardized at this time. Thus, `x = "@IncFinTech` and `social_1 = https://x.com/IncFinTech` are both valid.</td></tr>
|
||||
</table>
|
||||
|
||||
#### Principals
|
||||
This section is used to identify individual points of contact for the Xahau Network infrastructure and/or accounts.
|
||||
<table>
|
||||
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
|
||||
<tr><td>`name`</td><td>String</td><td>The name of an individual responsible for overseeing the organizations Xahau Network operations.</td></tr>
|
||||
<tr><td>`email`</td><td>String</td><td>Email address for the principal.</td></tr>
|
||||
<tr><td>`website`</td><td>String</td><td>Website for the principal.</td></tr>
|
||||
<tr><td>`social_[x]`</td><td>String</td><td>Link to a social media profile. This field is not standardized at this time. Thus, `x = "@IncFinTech` and `social_1 = https://x.com/IncFinTech` are both valid.</td></tr>
|
||||
</table>
|
||||
|
||||
#### Validators
|
||||
Validator operators are strongly encouraged to publish an attestation as proof of ownership. Providing geographic and ISP information is important, as it enables trusted (dUNL) list publishers to evaluate the geographic diversity of trusted validators on the network. If too many trusted validators are concentrated in one geographic region or on one network ASN, there is a risk to the broader network.
|
||||
<table>
|
||||
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
|
||||
<tr><td>`public_key`</td><td>String</td><td>The master public key used to validations.</td></tr>
|
||||
<tr><td>`attestation`</td><td>String</td><td>Domain attestation generated by the validator-keys tool.</td></tr>
|
||||
<tr><td>`owner_country`</td><td>String</td><td>[ISO-3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) country code for the entity or person in charge of the server.</td></tr>
|
||||
<tr><td>`server_country`</td><td>String</td><td>ISO-3166-2 country code for the server's physical location.</td></tr>
|
||||
<tr><td>`network_asn`</td><td>String</td><td>The Autonomous System Number (ASN) for the Internet Service Provider(s) providing internet connectivity to the server.</td></tr>
|
||||
<tr><td>`network`</td><td>String</td><td>Identifies which network (Mainnet, Testnet, etc.) the server participates in.</td></tr>
|
||||
<tr><td>`unl`</td><td>String</td><td>A URL hosting the list of trusted validators that the validator subscribes to.</td></tr>
|
||||
</table>
|
||||
|
||||
#### Servers
|
||||
Network participants who provide public peering or API access via websocket or RPC can publish details for accessing individual servers.
|
||||
<table>
|
||||
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
|
||||
<tr><td>`ws`</td><td>String</td><td>The URL for public websocket access. This begins with "ws:// or wss://".</td></tr>
|
||||
<tr><td>`json_rpc`</td><td>String</td><td>The URL for public RPC access. This begins with "http:// or https://".</td></tr>
|
||||
<tr><td>`peer`</td><td>String</td><td>URL other servers can use to peer with the server identified in the TOML.</td></tr>
|
||||
<tr><td>`network`</td><td>String</td><td>Identifies which network (Mainnet, Testnet, etc.) the server participates in.</td></tr>
|
||||
</table>
|
||||
|
||||
#### Accounts
|
||||
Entities needing account verification can use this section to claim ownership of a given Xahau Network wallet.
|
||||
<table>
|
||||
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
|
||||
<tr><td>`address`</td><td>String</td><td>The encoded public key (beginning with `r`) identifying a Xahau Network wallet.</td></tr>
|
||||
<tr><td>`network`</td><td>String</td><td>Identifies which network (Mainnet, Testnet, etc.) the wallet is used on.</td></tr>
|
||||
<tr><td>`desc`</td><td>String</td><td>Human readable description of what the wallet is used for.</td></tr>
|
||||
</table>
|
||||
|
||||
#### Currencies
|
||||
It is possible for multiple wallets to issue currencies with the same currency code. ***Thus, it is critical that users verify the issuing wallet as well as the currency code.***
|
||||
<table>
|
||||
<thead><tr><td>Field</td><td>Data Type</td><td>Description</td></tr></thead>
|
||||
<tr><td>`code`</td><td>String</td><td>The ticker symbol of the token as three digits or 40 hex characters. This field is case sensitive.</td></tr>
|
||||
<tr><td>`issuer`</td><td>String</td><td>The wallet address (beginning with `r`) that issued the currency. The referenced wallet should be present in the `[[ACCOUNTS]]` section of the TOML file.</td></tr>
|
||||
<tr><td>`symbol`</td><td>String</td><td>The symbol (e.g., "$") used to identify the currency.</td></tr>
|
||||
<tr><td>`network`</td><td>String</td><td>Identifies which network (Mainnet, Testnet, etc.) the currency is issued on.</td></tr>
|
||||
<tr><td>`display_decimals`</td><td>Integer</td><td>The number of digits to the right of the decimal point that clients should display when showing quantities of the currency.</td></tr>
|
||||
</table>
|
||||
|
||||
## Validator Domain Verification
|
||||
Hosting the `xahau.toml` file enables domain owners to claim ownership of a validator. However, it is critical that the validator also acknowledge this ownership, so third parties can reliably trust network operators. Since validators form the backbone of forward progress on the Xahau Network, it is important that operators appropriately secure their private validation keys.
|
||||
|
||||
If you are not familiar with the Validator Keys Tool, see the page on [Enabling Validation in xahaud](../enabling-validation).
|
||||
|
||||
Users who have already complete the steps on the Enabling Validation page do not need to repeat them. Simply paste the `attestation = ""` field into the TOML file and ensure the correct `[validator_token]` is installed in the `xahaud.cfg`.
|
||||
|
||||
Users who did not configure a domain when they initially generated a validation token may do so by running `./validator-keys set_domain [example.com]`. Prior to attempting to set the domain, ensure that the master validation key JSON file is stored in the correct path: `/home/[username]/[.ripple or .xahaud]/validator-keys.json`.
|
||||
|
||||
## Wallet Address Verification
|
||||
Consistent with validator domain verification, verifying ownership of a wallet address on the Xahau Network requires two components: A TOML file served over a TLS encrypted connection (with a properly chained certificate) from the domain claiming ownership and a transaction from the wallet address verifying the ownership claim. To claim ownership of a wallet address:
|
||||
1. Include the address as an `[[accounts]]` section in the TOML file.
|
||||
2. Submit an [AccountSet transaction](../../protocol-reference/transactions/transaction-types/accountset) with the `Domain` field specified.
|
||||
61
src/content/docs/docs/infrastructure/installing-xahaud.mdx
Normal file
61
src/content/docs/docs/infrastructure/installing-xahaud.mdx
Normal file
@@ -0,0 +1,61 @@
|
||||
---
|
||||
title: Installing xahaud
|
||||
description: >-
|
||||
The software behind Xahau is open source, and anyone can run a node locally. Users can run a Docker container, a local instance, or a binary file.
|
||||
---
|
||||
When running a node, users will have to configure settings based on whether the node will run on the test network or the main network. When transitioning a single node from one network to the other, database files must be wiped, except wallet.db, which contains the server's identity credentials.
|
||||
|
||||
In addition to [building from scratch](../building-xahau), there are three ways to install xahaud: Docker, locally, and using a portable binary. The below install methods all rely on the xahaud builds published at: [https://build.xahau.tech](https://build.xahau.tech), though the end result is different.
|
||||
## Docker Container
|
||||
|
||||
To run xahaud in a Docker Container:
|
||||
|
||||
1. Clone the appropriate (Mainnet or Testnet) Xahau Docker GitHub repository using the URL in the table below: <code>git clone [repository-url]</code>
|
||||
2. Navigate to the repository directory: <code>cd [repository-name]</code>
|
||||
3. Run: <code>./build</code>
|
||||
4. Run: <code>./up</code>
|
||||
5. Commands and additional information are located in the README.md file in the Docker repository. Configuration files and databases are located in the `store` directory inside the Docker directory.
|
||||
|
||||
## Local Install
|
||||
The Xahau Docker repositories (Mainnet and Testnet) each contains a script to automate the local install process, so that xahaud can be run outside of Docker. These scripts will create systemd files, a 'xahaud' user, and default configuration files. The URLs for these scripts are in the table at the bottom of this page. To install locally:
|
||||
|
||||
1. Download and run the install script: <code>curl -sL [https://link-to-script] | bash</code>
|
||||
2. Edit the configuration file: <code>/opt/xahahud/etc/xahaud.cfg</code>
|
||||
3. Verify and, if needed, edit the contents of the trusted validators file: <code>/opt/xahaud/etc/validators-xahau.txt</code>
|
||||
4. Start and enable xahaud to run automatically: <code>systemctl enable --now xahaud</code>
|
||||
5. Verify xahaud is running: <code>/opt/xahaud/bin/xahaud server_info</code>
|
||||
|
||||
## Binary Files
|
||||
Users seeking to install xahaud in non-traditional environments (e.g., outside Ubuntu) may benefit from the binary release packages, which are built with necessary dependencies. This install process is essentially the same as the "Local Install", however, xahaud is not configured as a systemd service and config files are not installed in default directories.
|
||||
1. Download the latest release from [https://build.xahau.tech](https://build.xahau.tech)
|
||||
2. Download and edit the relevant configuration and trusted validators files (see the table below for links to Mainnet and Testnet configurations). Ensure the paths to the validators-xahau.txt file, the database directory, and the logfile are accessible.
|
||||
3. Change permissions on the downloaded binary, so it is executable: <code>chmod 500 [/path/to/xahaud]</code>
|
||||
4. Consider restricting access to xahaud.cfg and validators-xahau.txt: <code>chmod 400 xahaud.cfg validators-xahau.txt</code>
|
||||
5. Run the binary: <code>./[path/to/xahaud] --net --conf [path to xahaud.cfg]</code>
|
||||
6. Verify xahaud is running: <code>./[path/to/xahaud] server_info</code>
|
||||
|
||||
## Resources, Peering, and Configurations
|
||||
This peering is relevant for both Docker containers and local installations.
|
||||
|
||||
<table style="width: 100%; table-layout: fixed;">
|
||||
<thead><tr><th>Resource</th><th>Main Network</th><th>Test Network</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Documentation and Resources</td><td><a href="https://xahau.network/">https://xahau.network/</a></td><td>Same as Mainnet</td></tr>
|
||||
<tr><td>Hooks Smart Contract Documentation</td><td><a href="https://xrpl-hooks.readme.io/">https://xrpl-hooks.readme.io</a></td><td>Same as Mainnet</td></tr>
|
||||
<tr><td>Explorer</td><td><a href="https://explorer.xahau.network/">https://explorer.xahau.network/</a></td><td><a href="https://explorer.xahau-test.net/">https://explorer.xahau-test.net</a></td></tr>
|
||||
<tr><td>Public WebSocket URL</td><td><a href="wss://xahau.network">wss://xahau.network</a></td><td><a href="wss://xahau-test.net">wss://xahau-test.net</a></td></tr>
|
||||
<tr><td>Network ID and Peer Listening Port</td><td>21337 <a href="https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=21337">IANA assigned port</a></td><td>21338</td></tr>
|
||||
<tr>
|
||||
<td>Peering and Bootstrap Servers</td>
|
||||
<td>bacab.alloy.ee 21337<br></br>hubs.xahau.as16089.net 21337</td>
|
||||
<td>79.110.60.122 21338<br></br>79.110.60.124 21338<br></br>79.110.60.125 21338<br></br>79.110.60.121 21338<br></br><br></br>2a0c:3bc0::1c74 21338<br></br>2a0c:3bc0::169d 21338<br></br>2a0c:3bc0::1aaf 21338<br></br>2a0c:3bc0::1d78 21338</td>
|
||||
</tr>
|
||||
<tr><td>Docker Container</td><td><a href="https://github.com/Xahau/mainnet-docker">https://github.com/Xahau/mainnet-docker</a></td><td><a href="https://github.com/Xahau/Xahau-Testnet-Docker">https://github.com/Xahau/Xahau-Testnet-Docker</a></td></tr>
|
||||
<tr><td>Local Install Scripts</td><td><a href="https://raw.githubusercontent.com/Xahau/mainnet-docker/refs/heads/main/xahaud-install-update.sh">https://raw.githubusercontent.com/Xahau/mainnet-docker/refs/heads/main/xahaud-install-update.sh</a></td><td><a href="https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/xahaud-install-update.sh">https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/xahaud-install-update.sh</a></td></tr>
|
||||
<tr><td>Binary Releases</td><td><a href="https://build.xahau.tech">https://build.xahau.tech</a></td><td>Same as Mainnet</td></tr>
|
||||
<tr><td>Sample Configuration File</td><td><a href="https://github.com/Xahau/mainnet-docker/blob/main/store/etc/xahaud.sample.cfg">https://github.com/Xahau/mainnet-docker/blob/main/store/etc/xahaud.sample.cfg</a></td><td><a href="https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/store/etc/xahaud.cfg">https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/store/etc/xahaud.cfg</a></td></tr>
|
||||
<tr><td>Sample Trusted Validators (UNL) File</td><td><a href="https://github.com/Xahau/mainnet-docker/blob/main/store/etc/validators-xahau.sample.txt">https://github.com/Xahau/mainnet-docker/blob/main/store/etc/validators-xahau.sample.txt</a></td><td><a href="https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/store/etc/validators-xahau.txt">https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/store/etc/validators-xahau.txt</a></td></tr>
|
||||
<tr><td>Documented Configuration Files</td><td><a href="https://github.com/Xahau/xahaud/tree/dev/cfg">https://github.com/Xahau/xahaud/tree/dev/cfg</a></td><td>Same as Mainnet</td></tr>
|
||||
<tr><td>Github Build Actions (release numbers)</td><td style="word-break: break-all;"><a href="https://github.com/Xahau/xahaud/actions?query=branch%3Arelease+is%3Asuccess+build+using+docker">https://github.com/Xahau/xahaud/actions?query=branch%3Arelease+is%3Asuccess+build+using+docker</a></td><td>Same as Mainnet</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
34
src/content/docs/docs/infrastructure/interacting.mdx
Normal file
34
src/content/docs/docs/infrastructure/interacting.mdx
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Interacting With xahaud Using Websocket and RPC
|
||||
---
|
||||
The xahaud software provides both websocket and RPC interfaces that can be configured for a variety of use cases, such as submitting transactions or querying ledger history. Some users may choose to place proxy software in front of xahaud to provide encryption, load balancing, or other benefits. It is possible to install TLS certificates in the xahaud.cfg file using parameters such as `ssl_key = [/path/to/key]`.
|
||||
|
||||
## Configuring Websocket and RPC Ports
|
||||
To enable listening ports, edit the `xahaud.cfg` file. Enabled ports are listed under the `[server]` stanza in the configuration file. Each port listed under the `[server]` section must be further defined via it's own stanza. In addition to configuring websocket or RPC ports, administrators can also configure the port used to listen for incoming peer connections (`port_peer`). On validating servers, it is ideal to remove `port_peer` from the configuration file, to avoid incoming connections. A configuration file with the peer protocol, one websocket port, and one RPC port might look like:<br></br><br></br>
|
||||
|
||||
```
|
||||
[server]
|
||||
port_peer
|
||||
port_ws_public
|
||||
port_rpc_public
|
||||
|
||||
[port_peer] # Name of the port.
|
||||
protocol = peer # Required field.
|
||||
port = 21337 # Required field.
|
||||
ip = :: # Address of interface to bind to.
|
||||
|
||||
[port_ws_public]
|
||||
protocol = ws
|
||||
port = 16006
|
||||
ip = ::
|
||||
limit = 150 # Maximum number of clients allowed to connect to a given port. "0" is unlimited.
|
||||
admin = [ 10.10.10.5, 10.11.11.0/24 ] # IP addresses or subnets allowed to submit [admin](../../features/http-websocket-apis/admin-api-methods) requests.
|
||||
secure_gateway = [ 10.10.10.20, 10.15.15.0/24 ] # Addresses allowed to send X-Forwarded-For and X-User headers.
|
||||
|
||||
[port_rpc_public]
|
||||
protocol = http
|
||||
port = 16007
|
||||
ip = ::
|
||||
```
|
||||
<br></br>
|
||||
Additional configuration options for websocket and RPC connections are available in the [Example Configuration File](https://github.com/Xahau/xahaud/blob/dev/cfg/rippled-example.cfg).
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
title: Node Requirements
|
||||
---
|
||||
Hardware requirements for nodes (RPC, validator, ...) should be generally along the lines of the specs outlined below.
|
||||
|
||||
For specific node use cases (e.g. full history) specs may differ (and grow) over time.
|
||||
|
||||
### Nodes should run (reasonably) well for own use with:
|
||||
|
||||
* CPU: 6+ cores
|
||||
* Memory: 16GB+ (32GB advised)
|
||||
* Disk IO: 10k random RW
|
||||
* Disk size: 100GB+
|
||||
* Filesystem: EXT4/XFS/...
|
||||
* Network IO: 100Mbit+
|
||||
|
||||
### Nodes for future (network growth) production use:
|
||||
|
||||
<table><thead><tr><th width="140"></th><th width="200">Minimum</th><th width="199">Preferred</th><th>Ideal</th></tr></thead><tbody><tr><td>CPU</td><td>16 cores</td><td>20+ cores</td><td>40+ cores</td></tr><tr><td>Memory</td><td>32GB</td><td>64GB</td><td>128GB+</td></tr><tr><td>Disk IO</td><td>15k random RW</td><td>20k random RW</td><td>30k random RW</td></tr><tr><td>Disk Size</td><td>500GB</td><td>1TB</td><td>2TB</td></tr><tr><td>Filesystem</td><td>XFS</td><td>XFS</td><td>XFS</td></tr><tr><td>Network IO</td><td>500Mbit+</td><td>1Gbit</td><td>10Gbit</td></tr></tbody></table>
|
||||
@@ -1,26 +0,0 @@
|
||||
---
|
||||
title: Running a Mainnet Node
|
||||
description: >-
|
||||
Xahau Mainnet allows for running your own local node. You can run a Docker
|
||||
Container or connect with your own local running instance.
|
||||
---
|
||||
### Connecting to the Xahau Mainnet with Docker
|
||||
|
||||
To connect to the Xahau Mainnet you can use this docker container:
|
||||
|
||||
[https://github.com/Xahau/mainnet-docker](https://github.com/Xahau/mainnet-docker)
|
||||
|
||||
1. Clone the repository
|
||||
2. Run `./build`
|
||||
3. Run `./up`
|
||||
4. Check the README for commands, etc. [https://github.com/Xahau/mainnet-docker/blob/main/README.md](https://github.com/Xahau/mainnet-docker/blob/main/README.md)
|
||||
5. Connect using WebSockets or RPC:\
|
||||
WebSocket: `ws://localhost:16006`\
|
||||
RPC (HTTP POST): `http://localhost:16007`
|
||||
|
||||
## Local instance
|
||||
|
||||
### Peering info
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="236.34908136482937"></th><th></th></tr></thead><tbody><tr><td>Info</td><td><a href="https://xahau.network/">https://xahau.network/</a></td></tr><tr><td>Explorer</td><td><a href="https://explorer.xahau.network/">https://explorer.xahau.network/</a></td></tr><tr><td>Technical docs</td><td><a href="https://xrpl-hooks.readme.io/">https://xrpl-hooks.readme.io</a></td></tr><tr><td>WebSocket URL</td><td><a href="wss://xahau.network">wss://xahau.network</a></td></tr><tr><td>Public peering </td><td>Network ID: <strong><code>21337</code></strong></td></tr><tr><td></td><td>- Hub (Cluster) 1: <code>bacab.alloy.ee 21337</code></td></tr><tr><td></td><td>- Hub (Cluster) 2: <code>hubs.xahau.as16089.net 21337</code></td></tr><tr><td></td><td>- Hub 3: <code>xahau-1.cabbit.tech 21337</code></td></tr><tr><td></td><td>- Hub 4: <code>xahau-2.cabbit.tech 21337</code></td></tr><tr><td>Binary & config</td><td><p>For ubuntu 22.04:<br /><br /><strong>Download:</strong></p><p><a href="https://build.xahau.tech"><strong>https://build.xahau.tech</strong></a></p><p></p><p>For the latest release build numbers, see the <a href="https://github.com/Xahau/xahaud/actions?query=branch%3Arelease+is%3Asuccess+build+using+docker"><strong>Github Build Actions</strong></a>.</p><p><br />Extract, then run:<br /><code>./xahaud --net --conf xahaud.cfg</code> Config file sample (to be saved as <code>xahaud.cfg</code>):</p><ul><li><p><a href="https://github.com/Xahau/mainnet-docker/blob/main/store/etc/xahaud.sample.cfg">https://github.com/Xahau/mainnet-docker/blob/main/store/etc/xahaud.cfg</a></p><ul><li>Edit the database path, etc if needed.</li></ul></li><li>In the same folder as the <code>xahaud.cfg</code> config, the <code>validators-xahau.txt</code> file should be stored:<br /><br /><a href="https://github.com/Xahau/mainnet-docker/blob/main/store/etc/validators-xahau.sample.txt">https://github.com/Xahau/mainnet-docker/blob/main/store/etc/validators-xahau.txt</a></li></ul></td></tr><tr><td>UNL (VL)</td><td><a href="https://vl.xahau.org/">https://vl.xahau.org/</a></td></tr></tbody></table>
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
title: Running a Testnet Node
|
||||
description: >-
|
||||
Xahau Testnet allows for running your own local node. You can run a Docker
|
||||
Container or connect with your own local running instance.
|
||||
---
|
||||
### Connecting to the Xahau Testnet with Docker
|
||||
|
||||
To connect to the Xahau Testnet (Hooks V3 testnet) you can use this Docker container:
|
||||
|
||||
[https://github.com/Xahau/Xahau-Testnet-Docker/](https://github.com/Xahau/Xahau-Testnet-Docker/)
|
||||
|
||||
1. Clone the repository
|
||||
2. Run `./build`
|
||||
3. Run `./up`
|
||||
4. Check the README for commands, etc.\
|
||||
[https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/README.md](https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/README.md)
|
||||
5. Connect using WebSockets or RPC:\
|
||||
WebSocket: `ws://localhost:16006`\
|
||||
RPC (HTTP POST): `http://localhost:16007`
|
||||
|
||||
## Local instance
|
||||
|
||||
### Peering info
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="181"></th><th></th></tr></thead><tbody><tr><td>Info & Faucet</td><td><a href="https://xahau-test.net/">https://xahau-test.net</a></td></tr><tr><td>Explorer</td><td><a href="https://explorer.xahau-test.net/">https://explorer.xahau-test.net</a></td></tr><tr><td>Technical docs</td><td><a href="https://xrpl-hooks.readme.io/">https://xrpl-hooks.readme.io</a></td></tr><tr><td>WebSocket URL</td><td><a href="https://xahau-test.net/">wss://xahau-test.net</a></td></tr><tr><td>Public peering V4</td><td>Network ID: <strong><code>21338</code></strong><br /><br /><code>79.110.60.122</code> Port: 21338<br /><code>79.110.60.124</code> Port: 21338<br /><code>79.110.60.125</code> Port: 21338<br /><code>79.110.60.121</code> Port: 21338</td></tr><tr><td>Public peering V4</td><td><p><code>2a0c:3bc0::1c74</code> Port: 21338</p><p><code>2a0c:3bc0::169d</code> Port: 21338</p><p><code>2a0c:3bc0::1aaf</code> Port: 21338</p><p><code>2a0c:3bc0::1d78</code> Port: 21338</p></td></tr><tr><td>Binary & config</td><td><p>For ubuntu 22.04:<br /><br /><strong>Download:</strong></p><p><a href="https://build.xahau.tech/2023.9.25-dev%2B336"><strong>https://build.xahau.tech</strong></a> <strong>- fetch the latest RELEASE version</strong><br /></p><p>Extract, then run: <br /><code>./xahaud --net --quorum=2 --conf xahaud.cfg</code> Config file sample (to be saved as <code>xahaud.cfg</code>):</p><ul><li><p><a href="https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/store/etc/xahaud.cfg">https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/store/etc/xahaud.cfg</a></p><ul><li>Edit the database path, etc if needed.</li></ul></li><li>In the same folder as the <code>xahaud.cfg</code> config, the <code>validators-xahau.txt</code> file should be stored:<br /><br /><a href="https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/store/etc/validators-xahau.txt">https://github.com/Xahau/Xahau-Testnet-Docker/blob/main/store/etc/validators-xahau.txt</a></li></ul></td></tr><tr><td>Validators</td><td><code>[validators]</code><br /><code>nHBoJCE3wPgkTcrNPMHyTJFQ2t77EyCAqcBRspFCpL6JhwCm94VZ</code><br /><code>nHUVv4g47bFMySAZFUKVaXUYEmfiUExSoY4FzwXULNwJRzju4XnQ</code><br /><code>nHBvr8avSFTz4TFxZvvi4rEJZZtyqE3J6KAAcVWVtifsE7edPM7q</code><br /><code>nHUH3Z8TRU57zetHbEPr1ynyrJhxQCwrJvNjr4j1SMjYADyW1WWe</code></td></tr></tbody></table>
|
||||
|
||||
|
||||
|
||||
### Integrating Xumm with Hooks V3
|
||||
|
||||
<figure>
|
||||

|
||||
</figure>
|
||||
|
||||
To connect Xumm to the Hooks V3 staging net, scan this QR with the QR scanner in Xumm to add the endpoint (above) to the Xumm node list.
|
||||
24
src/content/docs/docs/infrastructure/system-requirements.mdx
Normal file
24
src/content/docs/docs/infrastructure/system-requirements.mdx
Normal file
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: System Requirements
|
||||
---
|
||||
Hardware requirements for nodes customized for various tasks (e.g., RPC/WS, hubs, validators, etc.) should be consistent with the specs outlined below. Consider tailoring your individual system based on your intended use case.
|
||||
|
||||
## Types of Nodes
|
||||
It is possible to run xahaud in diverse configurations, based on a users needs. Similarly, one xahaud server can be configured for multiple purposes, such as a full history server that is also used for RPC/WS calls. The server's purpose dictates necessary system requirements. Some xahaud configurations might include:
|
||||
1. Stock server - This term is commonly used to refer to any xahaud node that is not configured as a validator. A stock server generally has very few changes from the default configuration.
|
||||
2. Full history servers - Are useful for querying historic data. In addition to a large amount of storage space, potentially higher disk IOPS and network bandwidth are needed, depending on the number of users querying the server.
|
||||
3. RPC/Websocket servers - Are tailored for tasks such as submitting transactions or querying current ledger data, like order books or the validation stream. Nginx or other proxy sofware is often placed in front of RPC/WS servers to provide load balancing, encryption, and other benefits.
|
||||
4. Hub server - Peering between nodes is critical for relaying messages across the Xahau Network, and a single server can be configured to provide peering for hundreds of peers. However, a large amount of bandwidth can be required (10 Gbit+).
|
||||
5. [Validating servers](../enabling-validation) - Validators differ from other types of nodes, in that they require an additional cryptographic key to be installed, so they can sign off on the sequence of transactions in a proposed ledger. As availability and security are critical, it is not recommended to use a validator for other functions.
|
||||
|
||||
## General Notes
|
||||
* Builds are typically tested on Ubuntu LTS. However, Docker, portable binaries, custom builds, and other install methods allow for diverse operating system support.
|
||||
* Typically one IPv4 and/or IPv6 address is needed for each xahaud instance. Running multiple instances behind one IPv4 address is not recommended.
|
||||
* Machines storing full history must use XFS or similar to avoid limitations with single file size in EXT4 (max. file size of 16TB). If storing less history, EXT4 is sufficient.
|
||||
* It may be possible to run xahaud on machines that do not meet the below "Minimum" specifications for production servers. However, doing so risks instability.
|
||||
* These system requirements may grow over time. For example, disk space for full history servers is consistently increasing.
|
||||
* As of August 6, 2025 <strong>the full history for the Xahau Network is approximately 8TB</strong>.
|
||||
|
||||
## Recommended Specs for Production xahaud Servers
|
||||
|
||||
<table><thead><tr><th width="140"></th><th width="200">Minimum</th><th width="199">Preferred</th><th>Ideal</th></tr></thead><tbody><tr><td>CPU (2.5+ GHz x86_64)</td><td>8 cores</td><td>20 cores</td><td>40+ cores</td></tr><tr><td>Memory</td><td>32GB</td><td>64GB</td><td>128GB+</td></tr><tr><td>Disk IO (sustained)</td><td>15k random RW</td><td>20k random RW</td><td>30k random RW</td></tr><tr><td>Disk Size</td><td>500GB</td><td>1TB</td><td>20TB+</td></tr><tr><td>Filesystem</td><td>XFS</td><td>XFS</td><td>XFS</td></tr><tr><td>Network IO</td><td>500Mbit+</td><td>1Gbit</td><td>10Gbit</td></tr></tbody></table>
|
||||
49
src/content/docs/docs/infrastructure/updating-xahaud.mdx
Normal file
49
src/content/docs/docs/infrastructure/updating-xahaud.mdx
Normal file
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: Updating xahaud
|
||||
---
|
||||
The process for updating xahaud varies depending on the install method used, however, all three methods rely on the releases published at [https://build.xahau.tech](https://build.xahau.tech). When updating a validator, hub, or other 'critical' infrastructure, please check the network health prior to restarting a server to install an update. It is possible to automate the update process using a crontab entry and an update script, however, administrators are discouraged from doing so, as automatic updates may result in restarts at times when the network is unstable. Similarly, human presence allows operators to ensure updates are successful, thereby minimizing downtime.
|
||||
|
||||
## Backup
|
||||
Users should always keep backups of:
|
||||
1. The primary configuration file: `xahaud.cfg`
|
||||
- Location varies based on install type.
|
||||
2. The trusted validators file: `validators-xahau.txt`
|
||||
- Location is specified in 'xahaud.cfg'.
|
||||
3. The server's identity credentials: `wallet.db`
|
||||
- Located in the database directory defined in 'xahaud.cfg'.
|
||||
4. Validators must keep their validation private key backed up in a secure, offline location.
|
||||
|
||||
## Updating Docker Containers
|
||||
Updating xahaud inside a Docker container involves replacing the currently running binary with the new version, downloaded from [https://build.xahau.tech](https://build.xahau.tech). This can be accomplished either by replacing the xahaud binary inside the container or by updating the entire container.
|
||||
<br></br>
|
||||
To update the xahaud binary inside a running Docker container:
|
||||
1. Download the [script](https://gist.githubusercontent.com/WietseWind/2ed35d85dcd056d82645de2958934f86/raw/34be773fd6af42e82cc3a21baf70bfb1e2a6c583/update.sh): `wget https://gist.githubusercontent.com/WietseWind/2ed35d85dcd056d82645de2958934f86/raw/34be773fd6af42e82cc3a21baf70bfb1e2a6c583/update.sh`
|
||||
2. Edit the script and change the first line to the [release version](https://build.xahau.tech) you would like to install.
|
||||
3. Run the script: `bash ./update.sh`
|
||||
4. Verify xahaud is running: `docker exec xahaud-[mainnet/testnet] xahaud server_info`
|
||||
<br></br>
|
||||
To replace the current Docker image with a new version, without overwriting databases or configuration files (which are ignored via the .gitignore file):
|
||||
1. Navigate to the repository: `cd [/path/to/docker-repo]`
|
||||
2. Update to the latest version `git pull`
|
||||
3. List running Docker containers and note the name of the xahaud container: `docker ps`
|
||||
4. Stop the old xahaud instance: `docker stop xahaud-[mainnet/testnet]`
|
||||
5. Remove the old instance: `docker rm xahaud-[mainnet/testnet]`
|
||||
6. Start the new instance: `./build && ./up`
|
||||
|
||||
## Updating Local Installations
|
||||
To update a locally installed version of xahaud, simply replace the current binary with a new binary:
|
||||
1. Download the new binary from: [https://build.xahau.tech](https://build.xahau.tech)
|
||||
2. Mark the new binary executable: `chmod +x [/path/to/download]`
|
||||
3. Stop the currently running xahaud instance: `/opt/xahaud/bin/xahaud stop`
|
||||
4. Replace the old binary with the new: `mv [/path/to/download] /opt/xahaud/bin/xahaud`
|
||||
5. Start xahaud: `systemctl start xahaud`
|
||||
6. Verify xahaud is running: `/opt/xahaud/bin/xahaud server_info`
|
||||
<br></br>
|
||||
A [script](https://gist.githubusercontent.com/WietseWind/9480a4fc95e904e54524406005c8c963/raw/2b200fdc2e5b471ae4f6625674aff1765d63e744/update.sh) that automates the above steps is available.
|
||||
|
||||
## Updating Binary Files
|
||||
Updating the xahaud binary files is essentially the same as the original install instructions:
|
||||
1. Remove the currently running version: `rm [/path/to/xahaud]`
|
||||
2. Download the new version: [https://build.xahau.tech](https://build.xahau.tech)
|
||||
3. Mark the download as executable: `chmod 500 [/path/to/xahaud]`
|
||||
4. Start xahaud: `./[path/to/xahud] --net --conf [/path/to/xahaud.cfg]`
|
||||
@@ -42,7 +42,7 @@ To remove the `Domain` field from an account, send an AccountSet with the Domain
|
||||
You can put any domain in your account's `Domain` field. To prove that an account and domain belong to the same person or business, you need a "two-way link":
|
||||
|
||||
* Accounts you own should have a domain you own in the `Domain` field.
|
||||
* At that domain, host an xah-ledger.toml file listing accounts you own, and optionally other information about how you use Xahau.
|
||||
* At that domain, host a [xahau.toml](../../../infrastructure/identity) file listing accounts you own, and optionally other information about how you use Xahau.
|
||||
|
||||
### AccountSet Flags
|
||||
|
||||
@@ -61,6 +61,7 @@ The available AccountSet flags are:
|
||||
| Flag Name | Decimal Value | Corresponding Ledger Flag | Description |
|
||||
| --------------------------------- | ------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `asfAccountTxnID` | 5 | (None) | Track the ID of this account's most recent transaction. Required for `AccountTxnID` |
|
||||
| `asfAllowTrustLineClawback` | 17 | `lsfAllowTrustLineClawback` | Enables an account to clawback tokens it has issued. This flag can only be enabled if the account’s owner directory is empty (no trust lines, offers, escrows, payment channels, checks, or signer lists). Once set, it cannot be undone. |
|
||||
| `asfAuthorizedNFTokenMinter` | 10 | (None) | Enable to allow another account to mint non-fungible tokens (NFTokens) on this account's behalf. Specify the authorized account in the `NFTokenMinter` field of the AccountRoot object. To remove an authorized minter, enable this flag and omit the `NFTokenMinter` field. _(Added by the \[NonFungibleTokensV1_1 amendment]\[].)_ |
|
||||
| `asfDefaultRipple` | 8 | `lsfDefaultRipple` | Enable rippling on this account's trust lines by default. |
|
||||
| `asfDepositAuth` | 9 | `lsfDepositAuth` | Enable Deposit Authorization on this account. _(Added by the \[DepositAuth amendment]\[].)_ |
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
title: Clawback
|
||||
description: >-
|
||||
Revoke tokens that were previously issued by your account.
|
||||
---
|
||||
\[[Source](https://github.com/Xahau/xahaud/blob/dev/src/ripple/app/tx/impl/Clawback.cpp)]
|
||||
|
||||
_(Added by the \[Clawback amendment]\[].)_
|
||||
|
||||
Revoke tokens that were previously issued by your account. The **Clawback** feature is disabled by default. To use it, you must first submit an **AccountSet** transaction that enables *Allow Trust Line Clawback*. If your account has already issued tokens, you cannot enable Clawback afterward. You can only activate *Allow Trust Line Clawback* if your owner directory is completely empty — meaning before creating trust lines, offers, escrows, payment channels, checks, or signer lists. Once enabled, Clawback becomes a permanent capability of your account and cannot be undone.
|
||||
|
||||
---
|
||||
|
||||
## Example
|
||||
|
||||
```json
|
||||
{
|
||||
"TransactionType": "Clawback",
|
||||
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
|
||||
"Amount": {
|
||||
"currency": "USD",
|
||||
"issuer": "rfkE1aSy9G8Upk4JssnwBxhEv5p4mn2KTy",
|
||||
"value": "123.45"
|
||||
}
|
||||
}
|
||||
````
|
||||
|
||||
---
|
||||
|
||||
### Fields
|
||||
|
||||
A **Clawback** transaction includes:
|
||||
|
||||
| Field | JSON Type | Description |
|
||||
| -------- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `Amount` | *Currency Amount* | The quantity to be revoked, as well as the counterparty from which it is taken. The `value` must not be zero. If greater than the holder’s balance, the entire balance is revoked. In the `issuer` sub-field, specify the holder’s address (not the issuer’s). |
|
||||
|
||||
In Xahau, an IOU/Non-XAH token on a trust line always has an issuer, but trust lines are bidirectional and under certain settings both sides may act as issuers. In this transaction, the issuer’s address goes in the `Account` field, while the holder’s address goes in the `issuer` sub-field of `Amount`.
|
||||
|
||||
---
|
||||
|
||||
## Error Cases
|
||||
|
||||
Besides the standard transaction errors, Clawback may fail with:
|
||||
|
||||
| Error Code | Description |
|
||||
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `temDISABLED` | The **Clawback** amendment is not enabled on Xahau. |
|
||||
| `temBAD_AMOUNT` | The holder’s balance is zero. (It is not an error if the specified amount exceeds the holder’s balance — in that case, the full available balance is revoked). Also occurs if the counterparty in `Amount` is the same account submitting the transaction. |
|
||||
| `tecNO_LINE` | No trust line exists with the specified counterparty, or the trust line has a balance of zero. |
|
||||
| `tecNO_PERMISSION` | Happens if you try to enable `lsfAllowTrustLineClawback` while `lsfNoFreeze` is already enabled, or vice versa. |
|
||||
|
||||
@@ -27,21 +27,21 @@ _Added by the \[XahauGenesis amendment]\[] and the \[Hooks amendment]\[]_
|
||||
|
||||
### Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Description |
|
||||
| ------------ | --------- | ------------- | -------------------------------------------------------------------------------- |
|
||||
| Account | String | AccountID | The address of the genesis account that will mint and distribute XAH. |
|
||||
| GenesisMints | Array | Array | An array of objects representing the destinations and amounts of the minted XAH. |
|
||||
| Field | JSON Type | Internal Type | Description |
|
||||
| -------------- | --------- | ------------- | -------------------------------------------------------------------------------- |
|
||||
| `Account` | String | AccountID | The address of the genesis account that will mint and distribute XAH. |
|
||||
| `GenesisMints` | Array | Array | An array of objects representing the destinations and amounts of the minted XAH. |
|
||||
|
||||
### GenesisMint Object
|
||||
|
||||
The GenesisMint transaction includes an array of objects called `GenesisMints`. Each object represents a destination account and the amount of XAH to be minted and distributed to that account.
|
||||
|
||||
| Field | JSON Type | Internal Type | Description |
|
||||
| --------------- | --------- | ------------- | -------------------------------------------------------------------------- |
|
||||
| Destination | String | AccountID | The address of the account that will receive the minted XAH. |
|
||||
| Amount | String | Amount | The amount of XAH to be minted and distributed to the destination account. |
|
||||
| GovernanceFlags | String | Hash256 | _(Optional)_ The governance flags associated with the destination account. |
|
||||
| GovernanceMarks | String | Hash256 | _(Optional)_ The governance marks associated with the destination account. |
|
||||
| Field | JSON Type | Internal Type | Description |
|
||||
| ----------------- | --------- | ------------- | -------------------------------------------------------------------------- |
|
||||
| `Destination` | String | AccountID | The address of the account that will receive the minted XAH. |
|
||||
| `Amount` | String | Amount | The amount of XAH to be minted and distributed to the destination account. |
|
||||
| `GovernanceFlags` | String | Hash256 | _(Optional)_ The governance flags associated with the destination account. |
|
||||
| `GovernanceMarks` | String | Hash256 | _(Optional)_ The governance marks associated with the destination account. |
|
||||
|
||||
### Special Transaction Cost
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ _(Added by the \[Import amendment]\[].)_
|
||||
|
||||
### Notes
|
||||
|
||||
_It is recommended that if you use a `SignersList` or `RegularKey` to sign your transactions that you key your accounts **FIRST** before attempting to _B2M_ XAH_ .
|
||||
_It is recommended that if you use a `SignerList` or `RegularKey` to sign your transactions that you key your accounts **FIRST** before attempting to _B2M_ XAH_ .
|
||||
|
||||
* If the inner (xpop) transaction is `AccountSet` the mainet existing flags will be transfered to the new network.
|
||||
* If the inner (xpop) transaction is `SetRegularKey` with the `RegularKey` field omitted or empty, and a signers list does not exist for the account then the `lsfDisableMaster` flag will be set on the account.
|
||||
|
||||
@@ -64,9 +64,9 @@ Xahau's governance structure differs from XRPL's. Xahau has its own approach to
|
||||
|
||||
#### Node Requirements
|
||||
|
||||
Running a Xahau node has different requirements compared to an XRPL node. These differences could be related to the technical specifications needed to support Xahau's unique features and network demands.
|
||||
Running a Xahau node has different requirements compared to an XRPL node. These differences relate to the technical specifications needed to support Xahau's unique features and network demands.
|
||||
|
||||
<LinkCard title="Node Requirements" href="../infrastructure/node-requirements" />
|
||||
<LinkCard title="System Requirements" href="../infrastructure/system-requirements" />
|
||||
|
||||
#### Native Token
|
||||
|
||||
|
||||
13
src/content/references/global.md
Normal file
13
src/content/references/global.md
Normal file
@@ -0,0 +1,13 @@
|
||||
<!-- Currently, remarkPlugins does not support HMR, so you will need to restart the dev server if you change this file. -->
|
||||
[Internal Type]: /docs/protocol-reference/binary-format
|
||||
[Sequence Number]: /docs/protocol-reference/data-types/#account-sequence
|
||||
[Index Number]: /docs/protocol-reference/data-types/#index-number
|
||||
[SHA-512Half]: /docs/protocol-reference/data-types/#hashes
|
||||
[Specifying Time]: /docs/protocol-reference/data-types/#specifying-time
|
||||
[seconds since the Ripple Epoch]: /docs/protocol-reference/data-types/#specifying-time
|
||||
[Ledger Index]: /docs/protocol-reference/data-types/#ledger-index
|
||||
[ledger index]: /docs/protocol-reference/data-types/#ledger-index
|
||||
[Hash]: /docs/protocol-reference/data-types/#hashes
|
||||
[Address]: /docs/protocol-reference/data-types/#addresses
|
||||
[Currency Amount]: /docs/protocol-reference/data-types/#specifying-currency-amounts
|
||||
[drops of XAH]: /docs/protocol-reference/data-types/#specifying-currency-amounts
|
||||
5
src/content/references/pseudo-transactions.md
Normal file
5
src/content/references/pseudo-transactions.md
Normal file
@@ -0,0 +1,5 @@
|
||||
EnableAmendment
|
||||
EmitFailure
|
||||
SetFee
|
||||
UNLModify
|
||||
UNLReport
|
||||
38
src/content/references/transactions.md
Normal file
38
src/content/references/transactions.md
Normal file
@@ -0,0 +1,38 @@
|
||||
AccountDelete
|
||||
AccountSet
|
||||
CheckCancel
|
||||
CheckCash
|
||||
CheckCreate
|
||||
ClaimReward
|
||||
Clawback
|
||||
DepositPreauth
|
||||
EscrowCancel
|
||||
EscrowCreate
|
||||
EscrowFinish
|
||||
GenesisMint
|
||||
Import
|
||||
Invoke
|
||||
NFTokenAcceptOffer
|
||||
NFTokenBurn
|
||||
NFTokenCancelOffer
|
||||
NFTokenCreateOffer
|
||||
NFTokenMint
|
||||
OfferCancel
|
||||
OfferCreate
|
||||
Payment
|
||||
PaymentChannelClaim
|
||||
PaymentChannelCreate
|
||||
PaymentChannelFund
|
||||
Remit
|
||||
SetHook
|
||||
SetRegularKey
|
||||
SetRemarks
|
||||
SignerListSet
|
||||
SpinalTap
|
||||
TicketCreate
|
||||
TrustSet
|
||||
URITokenBurn
|
||||
URITokenBuy
|
||||
URITokenCancelSellOffer
|
||||
URITokenCreateSellOffer
|
||||
URITokenMint
|
||||
@@ -57,30 +57,30 @@ const { frontmatter } = Astro.props
|
||||
<div class="flex-none container mx-auto py-12 text-left max-w-7xl p-6">
|
||||
<h1 class="text-3xl md:text-4xl font-extrabold text-black mb-4">Network statistics</h1>
|
||||
<h2 class="text-xl md:text-2xl font-semibold text-black mb-8">Xahau in numbers</h2>
|
||||
<div class="items-end grid grid-cols-3 md:grid-cols-9 gap-4">
|
||||
<div class="text-black flex flex-col col-span-2 md:col-span-3 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
|
||||
<div class="items-end grid grid-cols-6 md:grid-cols-9 gap-4">
|
||||
<div class="text-black flex flex-col col-span-4 md:col-span-3 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
|
||||
<h3 class="text-xl md:text-2xl font-semibold">Accounts</h3>
|
||||
<h4 class="text-4xl md:text-6xl font-extrabold">130K+</h4>
|
||||
</div>
|
||||
<div class="text-black flex flex-col col-span-1 md:col-span-2 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
|
||||
<div class="text-black flex flex-col col-span-2 md:col-span-2 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
|
||||
<h3 class="text-xl md:text-2xl font-semibold">Hooks installed</h3>
|
||||
<h4 class="text-4xl md:text-6xl font-extrabold">5K+</h4>
|
||||
</div>
|
||||
<div class="text-xahau-secondary flex flex-col col-span-1 md:col-span-2 min-h-40 items-start justify-end p-4 bg-xahau-gray border-black border-2">
|
||||
<div class="text-xahau-secondary flex flex-col col-span-2 md:col-span-2 min-h-40 items-start justify-end p-4 bg-xahau-gray border-black border-2">
|
||||
<h3 class="text-xl md:text-2xl font-semibold">Nodes</h3>
|
||||
<h4 class="text-4xl md:text-6xl font-extrabold">300+</h4>
|
||||
</div>
|
||||
<div class="text-xahau-secondary flex flex-col col-span-1 md:col-span-2 row-start-auto md:row-start-2 min-h-40 items-start justify-end p-4 bg-xahau-gray border-black border-2">
|
||||
<div class="text-xahau-secondary flex flex-col col-span-4 md:col-span-2 row-start-auto md:row-start-2 min-h-40 items-start justify-end p-4 bg-xahau-gray border-black border-2">
|
||||
<h3 class="text-xl md:text-2xl font-semibold">Transactions/24h</h3>
|
||||
<h4 class="text-4xl md:text-6xl font-extrabold">1.5M+</h4>
|
||||
</div>
|
||||
<div class="text-black flex flex-col col-span-2 md:col-span-3 row-start-auto md:row-start-2 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
|
||||
<div class="text-black flex flex-col col-span-6 md:col-span-3 row-start-auto md:row-start-2 min-h-40 items-start justify-end p-4 bg-white border-black border-2">
|
||||
<h3 class="text-xl md:text-2xl font-semibold">Ledgers closed</h3>
|
||||
<h4 class="text-4xl md:text-6xl font-extrabold">15M+</h4>
|
||||
<h4 class="text-4xl md:text-6xl font-extrabold">16M+</h4>
|
||||
</div>
|
||||
<a href="/docs/infrastructure/node-requirements/" class="col-span-3 row-start-auto md:row-start-2 px-10 h-12 flex items-center justify-center bg-xahau-green text-black text-base font-bold hover:bg-black hover:text-white transition">Want to run a node?</a>
|
||||
<a href="/docs/infrastructure/system-requirements/" class="col-span-6 row-start-auto md:row-start-2 px-10 h-12 flex items-center justify-center bg-xahau-green text-black text-base font-bold hover:bg-black hover:text-white transition">Want to run a node?</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<slot />
|
||||
</BaseLayout>
|
||||
</BaseLayout>
|
||||
|
||||
385
src/pages/fraud-report.astro
Normal file
385
src/pages/fraud-report.astro
Normal file
@@ -0,0 +1,385 @@
|
||||
---
|
||||
import '../styles/main.css'
|
||||
import PageLayout from '../layouts/PageLayout.astro'
|
||||
import PageSection from '../components/PageSection.astro'
|
||||
|
||||
const frontmatter = {
|
||||
title: 'Report Fraud',
|
||||
description: 'Have you been scammed or hacked? Here is what to do!'
|
||||
}
|
||||
---
|
||||
|
||||
<PageLayout frontmatter={frontmatter} wide="true">
|
||||
<PageSection align="center">
|
||||
<p>Xahau is a public blockchain, with no governing party that can freeze or retrieve funds, close accounts, or otherwise keep people from their assets.</p>
|
||||
<div class="p-4 bg-green-50 border border-green-200 rounded-lg my-4">
|
||||
<strong>We can't reverse or cancel transactions, no-one can.</strong>
|
||||
</div>
|
||||
<p>We can flag accounts used for illicit activity, which will:</p>
|
||||
<ul class="list-disc list-outside">
|
||||
<li>Be included in our API that exchanges and other entities are using for AML compliance to monitor deposits, and possibly withhold illicit funds.</li>
|
||||
<li>Movement of funds will be auto-traced and we will receive notifications whenever they move, no matter how old the case is.</li>
|
||||
<li>In case of a scam, warn other users through wallet software and exchanges using our API, not to send funds to a flagged account.</li>
|
||||
</ul>
|
||||
|
||||
<h3 class="mt-4">1. Submit the address to Xahau Forensics</h3>
|
||||
<p>We maintain the largest fraudulent address registry on Xahau and is used by several entities to combat illicit activity.</p>
|
||||
<h3 class="mt-4">2. Report your case to law enforcement</h3>
|
||||
<p>Report it to the local police and if your country has an online report form for cybercrime or financial crime, report it there as well.</p>
|
||||
<h3 class="mt-4">3. Follow up on your police report</h3>
|
||||
<p>We work with law enforcement. Let them know that we have the information – the odds are that we are also in contact with other victims and can help law enforcement combine cases across jurisdictions and provide actionable intelligence.</p>
|
||||
<h2 class="mt-4">What can you expect?</h2>
|
||||
<ul class="list-disc list-outside">
|
||||
<li>We can't reverse or cancel transactions, no-one can.</li>
|
||||
<li>We do our best to have funds seized when they leave Xahau, by working with exchanges and other off ramps – both through our fraudulent address registry API and by manually making contact.</li>
|
||||
<li>When you report an account to us, you can expect us to treat your report with as much attention than any other report.</li>
|
||||
<li>We get many reports every single day. If an account is added to our fraudulent address registry, we are taking the best care of it along with all other cases.</li>
|
||||
<li>If money is seized we will contact you (if you have left us a way to contact you).</li>
|
||||
<li>To reclaim funds you <strong>have</strong> to work with law enforcement for paperwork</li>
|
||||
</ul>
|
||||
<div class="p-4 bg-green-50 border border-green-200 rounded-lg my-4">
|
||||
<strong>We monitor hundreds of cases at the same time and can't hold hands on a case-by-case basis. We will only contact you if we have good news!</strong>
|
||||
</div>
|
||||
</PageSection>
|
||||
|
||||
<main class="page-content flex-1 container mx-auto max-w-4xl p-6">
|
||||
<div class="bg-white rounded-lg shadow-lg p-8">
|
||||
<!-- Success message (hidden by default, shown via JS) -->
|
||||
<div id="success-message" class="mb-6 p-6 bg-green-50 border-2 border-green-500 text-green-800 rounded-lg hidden shadow-md">
|
||||
<div class="flex items-center mb-2">
|
||||
<svg class="w-6 h-6 mr-2 text-green-500" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
|
||||
</svg>
|
||||
<p class="font-bold text-lg">Success!</p>
|
||||
</div>
|
||||
<p class="mb-2">Thank you for your report. It has been submitted successfully.</p>
|
||||
<p class="text-sm mt-3 font-semibold">Report ID: <code id="report-id" class="bg-green-200 px-3 py-1 rounded text-green-900"></code></p>
|
||||
</div>
|
||||
|
||||
<!-- Error message (hidden by default, shown via JS) -->
|
||||
<div id="error-message" class="mb-6 p-6 bg-red-50 border-2 border-red-500 text-red-800 rounded-lg hidden shadow-md">
|
||||
<div class="flex items-center mb-2">
|
||||
<svg class="w-6 h-6 mr-2 text-red-500" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/>
|
||||
</svg>
|
||||
<p class="font-bold text-lg">Error</p>
|
||||
</div>
|
||||
<p id="error-text" class="whitespace-pre-wrap"></p>
|
||||
</div>
|
||||
|
||||
<!-- Form container -->
|
||||
<div id="form-container">
|
||||
<form id="fraud-report-form" class="space-y-6">
|
||||
<div>
|
||||
<label for="address" class="block text-sm font-semibold text-gray-700 mb-2">
|
||||
Xahau Address <span class="text-red-500">*</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
id="address"
|
||||
name="address"
|
||||
required
|
||||
placeholder="rXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
||||
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-xahau-green focus:border-transparent transition-all"
|
||||
/>
|
||||
<p class="text-sm text-gray-500 mt-1">Enter the Xahau address associated with the fraudulent activity</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="description" class="block text-sm font-semibold text-gray-700 mb-2">
|
||||
Description <span class="text-red-500">*</span>
|
||||
</label>
|
||||
<textarea
|
||||
id="description"
|
||||
name="description"
|
||||
required
|
||||
rows="6"
|
||||
placeholder="Describe the fraudulent activity"
|
||||
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-xahau-green focus:border-transparent transition-all"
|
||||
></textarea>
|
||||
<p class="text-sm text-gray-500 mt-1">Provide as much detail as possible to help us investigate</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="url" class="block text-sm font-semibold text-gray-700 mb-2">
|
||||
URL <span class="text-gray-400 text-xs">(Optional)</span>
|
||||
</label>
|
||||
<input
|
||||
type="url"
|
||||
id="url"
|
||||
name="url"
|
||||
placeholder="Optional URL related to the fraud"
|
||||
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-xahau-green focus:border-transparent transition-all"
|
||||
/>
|
||||
<p class="text-sm text-gray-500 mt-1">Provide a URL if relevant (e.g., scam website, social media post)</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="category_suggested" class="block text-sm font-semibold text-gray-700 mb-2">
|
||||
Suggested Category <span class="text-gray-400 text-xs">(Optional)</span>
|
||||
</label>
|
||||
<select
|
||||
id="category_suggested"
|
||||
name="category_suggested"
|
||||
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-xahau-green focus:border-transparent transition-all bg-white"
|
||||
>
|
||||
<option value="">Select a category...</option>
|
||||
<option value="giveaway">Giveaway</option>
|
||||
<option value="theft">Theft</option>
|
||||
<option value="other">Other</option>
|
||||
</select>
|
||||
<p class="text-sm text-gray-500 mt-1">Help us categorize the type of fraud</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="reporter_contact" class="block text-sm font-semibold text-gray-700 mb-2">
|
||||
Contact Information <span class="text-gray-400 text-xs">(Optional)</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
id="reporter_contact"
|
||||
name="reporter_contact"
|
||||
placeholder="Optional contact information, for example e-mail, X handle or Telegram username"
|
||||
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-xahau-green focus:border-transparent transition-all"
|
||||
/>
|
||||
<p class="text-sm text-gray-500 mt-1">Provide contact info if you're willing to help with follow-up questions</p>
|
||||
</div>
|
||||
|
||||
<div class="bg-gray-50 p-4 rounded-lg border border-gray-200">
|
||||
<altcha-widget
|
||||
name="altcha"
|
||||
challengeurl="https://api.analytics.xahau.network/captcha/challenge"
|
||||
hidefooter="false"
|
||||
hidelogo="false"
|
||||
></altcha-widget>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center justify-between pt-4">
|
||||
<p class="text-sm text-gray-600">
|
||||
<span class="text-red-500">*</span> Required fields
|
||||
</p>
|
||||
<button
|
||||
type="submit"
|
||||
class="px-8 py-3 bg-xahau-green-dark text-white font-semibold rounded-lg hover:bg-xahau-green transition-all transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-xahau-green focus:ring-offset-2"
|
||||
>
|
||||
Submit Report
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- Submit another report button (hidden by default) -->
|
||||
<div id="another-report-btn" class="mt-6 hidden">
|
||||
<button
|
||||
onclick="location.reload()"
|
||||
class="inline-block px-6 py-3 bg-xahau-green-dark text-white font-semibold rounded-lg hover:bg-xahau-green transition-all no-underline"
|
||||
>
|
||||
Submit Another Report
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-8 bg-blue-50 border border-blue-200 rounded-lg p-6 pt-0">
|
||||
<h3 class="text-lg font-semibold text-blue-900 mb-3">Privacy & Security</h3>
|
||||
<ul class="space-y-2 text-sm text-blue-800">
|
||||
<li class="flex items-start">
|
||||
<svg class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
|
||||
</svg>
|
||||
<span>This form uses ALTCHA, a privacy-compliant CAPTCHA that doesn't track you</span>
|
||||
</li>
|
||||
<li class="flex items-start">
|
||||
<svg class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
|
||||
</svg>
|
||||
<span>Your report is submitted securely to the Xahau Forensics network</span>
|
||||
</li>
|
||||
<li class="flex items-start">
|
||||
<svg class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
|
||||
</svg>
|
||||
<span>Reports are reviewed and used to improve network security</span>
|
||||
</li>
|
||||
<li class="flex items-start">
|
||||
<svg class="w-5 h-5 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
|
||||
</svg>
|
||||
<span>No personal information is required to submit a report</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 text-center text-sm text-gray-600">
|
||||
<p>
|
||||
Xahau Forensics is run by <a href="https://inftf.org" class="text-xahau-green-dark underline hover:text-black">INFTF</a>.
|
||||
</p>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<script is:inline type="module">
|
||||
// Import ALTCHA widget
|
||||
import 'https://cdn.jsdelivr.net/npm/altcha/dist/altcha.min.js';
|
||||
|
||||
// Wait for the widget to be ready
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const form = document.getElementById('fraud-report-form');
|
||||
const altchaWidget = document.querySelector('altcha-widget');
|
||||
const successMessage = document.getElementById('success-message');
|
||||
const errorMessage = document.getElementById('error-message');
|
||||
const errorText = document.getElementById('error-text');
|
||||
const reportIdEl = document.getElementById('report-id');
|
||||
const formContainer = document.getElementById('form-container');
|
||||
const anotherReportBtn = document.getElementById('another-report-btn');
|
||||
|
||||
if (!form || !altchaWidget) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Listen for state changes on the ALTCHA widget
|
||||
let isVerified = false;
|
||||
|
||||
altchaWidget.addEventListener('statechange', (event) => {
|
||||
isVerified = event.detail.state === 'verified';
|
||||
});
|
||||
|
||||
// Handle form submission
|
||||
form.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
|
||||
// Hide previous messages
|
||||
errorMessage.classList.add('hidden');
|
||||
successMessage.classList.add('hidden');
|
||||
|
||||
// Check verification state
|
||||
if (!isVerified) {
|
||||
errorText.textContent = 'Please complete the CAPTCHA verification before submitting.';
|
||||
errorMessage.classList.remove('hidden');
|
||||
|
||||
// Scroll to top of the white card container
|
||||
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
|
||||
if (card) {
|
||||
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Get ALTCHA payload - try multiple methods
|
||||
let altchaSolution = null;
|
||||
|
||||
// Try getting from FormData first (if widget name attribute works)
|
||||
const formData = new FormData(form);
|
||||
altchaSolution = formData.get('altcha');
|
||||
|
||||
// If not found, try getting directly from widget
|
||||
if (!altchaSolution) {
|
||||
// The widget stores the solution in a hidden input or as a property
|
||||
const hiddenInput = form.querySelector('input[name="altcha"]');
|
||||
if (hiddenInput) {
|
||||
altchaSolution = hiddenInput.value;
|
||||
}
|
||||
}
|
||||
|
||||
// Try getting from data attribute
|
||||
if (!altchaSolution) {
|
||||
altchaSolution = altchaWidget.dataset.payload;
|
||||
}
|
||||
|
||||
if (!altchaSolution) {
|
||||
errorText.textContent = 'CAPTCHA verification failed. Please complete the challenge and try again.';
|
||||
errorMessage.classList.remove('hidden');
|
||||
|
||||
// Scroll to top of the white card container
|
||||
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
|
||||
if (card) {
|
||||
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const requestBody = {
|
||||
address: formData.get('address'),
|
||||
description: formData.get('description'),
|
||||
altcha_solution: altchaSolution
|
||||
};
|
||||
|
||||
// Add optional fields
|
||||
if (formData.get('url')) requestBody.url = formData.get('url');
|
||||
if (formData.get('category_suggested')) requestBody.category_suggested = formData.get('category_suggested');
|
||||
if (formData.get('reporter_contact')) requestBody.reporter_contact = formData.get('reporter_contact');
|
||||
|
||||
// Disable submit button and show loading state
|
||||
const submitBtn = form.querySelector('button[type="submit"]');
|
||||
const originalText = submitBtn.textContent;
|
||||
submitBtn.disabled = true;
|
||||
submitBtn.innerHTML = '<span class="flex items-center justify-center"><svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg>Submitting...</span>';
|
||||
|
||||
try {
|
||||
const response = await fetch('https://api.analytics.xahau.network/ufr', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(requestBody)
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (response.ok) {
|
||||
// Show success message
|
||||
reportIdEl.textContent = result.reportId || 'unknown';
|
||||
successMessage.classList.remove('hidden');
|
||||
errorMessage.classList.add('hidden');
|
||||
formContainer.style.display = 'none';
|
||||
anotherReportBtn.classList.remove('hidden');
|
||||
|
||||
// Scroll to top of the white card container
|
||||
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
|
||||
if (card) {
|
||||
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
} else {
|
||||
// Show error message
|
||||
const errorMsg = Array.isArray(result.message)
|
||||
? result.message.join(', ')
|
||||
: (result.message || 'Failed to submit report. Please try again.');
|
||||
errorText.textContent = errorMsg;
|
||||
errorMessage.classList.remove('hidden');
|
||||
successMessage.classList.add('hidden');
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.innerHTML = originalText;
|
||||
|
||||
// Scroll to top of the white card container
|
||||
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
|
||||
if (card) {
|
||||
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
errorText.textContent = 'Network error: Unable to connect to the server. Please check your connection and try again.';
|
||||
errorMessage.classList.remove('hidden');
|
||||
successMessage.classList.add('hidden');
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.innerHTML = originalText;
|
||||
|
||||
// Scroll to top of the white card container
|
||||
const card = document.querySelector('.bg-white.rounded-lg.shadow-lg');
|
||||
if (card) {
|
||||
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
altcha-widget {
|
||||
--altcha-primary-color: #007b3d;
|
||||
--altcha-background-color: #ffffff;
|
||||
--altcha-border-color: #e1e5e9;
|
||||
--altcha-text-color: #333333;
|
||||
--altcha-border-radius: 8px;
|
||||
--altcha-font-family: 'Onest', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
}
|
||||
</style>
|
||||
</PageLayout>
|
||||
|
||||
168
src/plugins/remarkGlobalReferences.ts
Normal file
168
src/plugins/remarkGlobalReferences.ts
Normal file
@@ -0,0 +1,168 @@
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { visit } from 'unist-util-visit'
|
||||
|
||||
const parseRules: {
|
||||
path: string
|
||||
parse: (content: string) => { label: string; url: string }[]
|
||||
}[] = [
|
||||
{
|
||||
path: 'src/content/references/global.md',
|
||||
parse: (content: string) => {
|
||||
const lines = content.split('\n')
|
||||
const result: { label: string; url: string }[] = []
|
||||
for (const line of lines) {
|
||||
const match = line.match(/^\[([^\]]+)\]:\s*(.+)$/)
|
||||
if (match) {
|
||||
const [, label, url] = match
|
||||
result.push({ label, url: url.trim() })
|
||||
}
|
||||
}
|
||||
return result
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'src/content/references/transactions.md',
|
||||
parse: (content: string) => {
|
||||
const lines = content.split('\n')
|
||||
const result: { label: string; url: string }[] = []
|
||||
for (const line of lines) {
|
||||
if (line.length > 0) {
|
||||
const url = `/docs/protocol-reference/transactions/transaction-types/${line.toLowerCase()}`
|
||||
result.push({ label: `${line}`, url })
|
||||
result.push({ label: `${line} transaction`, url })
|
||||
result.push({ label: `${line} transactions`, url })
|
||||
}
|
||||
}
|
||||
return result
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'src/content/references/pseudo-transactions.md',
|
||||
parse: (content: string) => {
|
||||
const lines = content.split('\n')
|
||||
const result: { label: string; url: string }[] = []
|
||||
for (const line of lines) {
|
||||
if (line.length > 0) {
|
||||
const url = `/docs/protocol-reference/transactions/pseudo-transaction-types/${line.toLowerCase()}`
|
||||
result.push({ label: `${line}`, url })
|
||||
result.push({ label: `${line} transaction`, url })
|
||||
result.push({ label: `${line} transactions`, url })
|
||||
}
|
||||
}
|
||||
return result
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
/**
|
||||
* Remark plugin to resolve reference-style links from global.md
|
||||
*/
|
||||
export function remarkGlobalReferences() {
|
||||
let globalRefs: Record<string, string> | null = null
|
||||
|
||||
function loadGlobalReferences() {
|
||||
if (globalRefs !== null) return globalRefs
|
||||
|
||||
try {
|
||||
globalRefs = {}
|
||||
for (const rule of parseRules) {
|
||||
const content = readFileSync(rule.path, 'utf-8')
|
||||
const refs = rule.parse(content)
|
||||
for (const ref of refs) {
|
||||
globalRefs[ref.label] = ref.url
|
||||
}
|
||||
}
|
||||
|
||||
return globalRefs
|
||||
} catch (error: any) {
|
||||
console.warn('Could not load global.md references:', error.message)
|
||||
globalRefs = {}
|
||||
return globalRefs
|
||||
}
|
||||
}
|
||||
|
||||
return function transformer(tree: any) {
|
||||
const refs = loadGlobalReferences()
|
||||
|
||||
// Find all reference-style links in the format [text][]
|
||||
visit(tree, 'linkReference', (node) => {
|
||||
if (
|
||||
node.referenceType === 'shortcut' ||
|
||||
node.referenceType === 'collapsed'
|
||||
) {
|
||||
const label = node.label || node.children?.[0]?.value
|
||||
|
||||
if (label && refs[label]) {
|
||||
// Convert linkReference to a regular link
|
||||
node.type = 'link'
|
||||
node.url = refs[label]
|
||||
delete node.referenceType
|
||||
delete node.identifier
|
||||
delete node.label
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// Also look for escaped reference-style links in text nodes: \[label]\[]
|
||||
visit(tree, 'text', (node, index, parent) => {
|
||||
if (!node.value) return
|
||||
|
||||
// Find escaped reference-style links: \[label]\[]
|
||||
const pattern = /\\?\[([^\]]+)\\?\]\\?\[\]/g
|
||||
const replacements = []
|
||||
let match: RegExpExecArray | null = null
|
||||
|
||||
match = pattern.exec(node.value)
|
||||
while (match !== null) {
|
||||
const [fullMatch, label] = match
|
||||
if (refs[label]) {
|
||||
replacements.push({
|
||||
start: match.index,
|
||||
end: match.index + fullMatch.length,
|
||||
label,
|
||||
url: refs[label],
|
||||
})
|
||||
}
|
||||
match = pattern.exec(node.value)
|
||||
}
|
||||
|
||||
// Apply replacements from right to left to maintain indices
|
||||
if (replacements.length > 0) {
|
||||
const newNodes = []
|
||||
let lastIndex = 0
|
||||
|
||||
for (const replacement of replacements) {
|
||||
// Add text before the replacement
|
||||
if (replacement.start > lastIndex) {
|
||||
newNodes.push({
|
||||
type: 'text',
|
||||
value: node.value.slice(lastIndex, replacement.start),
|
||||
})
|
||||
}
|
||||
|
||||
// Add the link
|
||||
newNodes.push({
|
||||
type: 'link',
|
||||
url: replacement.url,
|
||||
children: [{ type: 'text', value: replacement.label }],
|
||||
})
|
||||
|
||||
lastIndex = replacement.end
|
||||
}
|
||||
|
||||
// Add remaining text
|
||||
if (lastIndex < node.value.length) {
|
||||
newNodes.push({
|
||||
type: 'text',
|
||||
value: node.value.slice(lastIndex),
|
||||
})
|
||||
}
|
||||
|
||||
// Replace the current node with the new nodes
|
||||
if (parent && typeof index === 'number') {
|
||||
parent.children.splice(index, 1, ...newNodes)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,10 @@ header img {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table code {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Light mode colors. */
|
||||
:root {
|
||||
--sl-color-accent-low: #c3e0c9;
|
||||
|
||||
Reference in New Issue
Block a user