Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Latest commit

History

146 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Raftify

CircleCIcodecovGo Report CardLicense

⚠️ This project has not yet had a security audit or stress test and is therefore not ready for use in production! Use at your own risk!

Raftify is a Go implementation of the Raft leader election algorithm without the Raft log and enables the creation of a self-managing cluster of nodes by transforming an application into a Raft node. It is meant to be a more cost-efficient small-scale alternative to running a validator cluster with a separate full-fledged Raft consensus layer.

It is designed to be directly embedded into an application and provide a direct way of communicating between individual nodes, omitting the overhead caused by replicating a log. Raftify was built with one particular use case in mind: running a self-managing cluster of Cosmos validators.

Requirements

  • Golang 1.14+

Configuration Reference

The configuration is to be provided in a raftify.json file and must be located in the working directory specified in the second parameter of the InitNode method.

ℹ️ For Gaia, the working directory is ~/.gaiad/config/ by default.

KeyValueDescription
idstring(Mandatory) The node's identifier.
Must be unique.
max_nodesint(Mandatory) The self-imposed limit of nodes to be run in the cluster.
Must be greater than 0 and must never be exceeded.
expectint(Mandatory) The number of nodes expected to be online in order to bootstrap the cluster and start the leader election. Once the expected number of nodes is online, all cluster members will be started simultaneously.
Must be 1 or higher and must never exceed the self-imposed max_nodes limit.
⚠️ Please use expect = 1 for single-node setups only. If you plan on running more than one node, set the expect value to the final cluster size on ALL nodes.
encryptstring(Optional) The hex representation of the secret key used to encrypt messages.
The value must be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
Use this tool to generate a key.
performanceint(Optional) The modifier used to multiply the maximum and minimum timeout and ticker settings. Higher values increase leader stability and reduce bandwidth and CPU but also increase the time needed to recover from a leader failure.
Must be 1 or higher. Defaults to 1 which is also the maximum performance setting.
log_levelstring(Optional) The minimum log level for console log messages.
Can be DEBUG, INFO, WARN, ERR. Defaults to WARN.
bind_addrstring(Optional) The address to bind the node application to.
Defaults to 0.0.0.0.
bind_portstring(Optional) The port to bind the node application to.
Defaults to 7946.
peer_list[]string(Optional) The list of IP addresses of all cluster members (optionally including the address of the local node). It is used to determine the quorum in a non-bootstrapped cluster.
For example, if your peerlist has n = 3 nodes then math.Floor((n/2)+1) = 2 nodes will need to be up and running to bootstrap the cluster.
Addresses must be provided in the host:port format.
Must not be empty if more than one node is expected.

Example Configuration

{
"id": "My-Unique-Name",
"max_nodes": 3,
"expect": 3,
"encrypt": "8ba4770b00f703fcc9e7d94f857db0e76fd53178d3d55c3e600a9f0fda9a75ad",
"performance": 1,
"log_level": "WARN",
"bind_addr": "192.168.0.25",
"bind_port": 3000,
"peer_list": [
"192.168.0.25:3000",
"192.168.0.26:3000",
"192.168.0.27:3000"
]
}

Getting Started

For a step-by-step guide on how to get started with your raftified Cosmos validator, check out this tutorial.

Testing

Use

makeunit-tests

to run unit tests, and

makeintegration-tests

to run integration tests.

About

Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node.

Topics

Resources

Contributing

Security policy

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - BlockscapeNetwork/raftify: Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node. · GitHub
Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Latest commit

History

146 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Raftify

CircleCIcodecovGo Report CardLicense

⚠️ This project has not yet had a security audit or stress test and is therefore not ready for use in production! Use at your own risk!

Raftify is a Go implementation of the Raft leader election algorithm without the Raft log and enables the creation of a self-managing cluster of nodes by transforming an application into a Raft node. It is meant to be a more cost-efficient small-scale alternative to running a validator cluster with a separate full-fledged Raft consensus layer.

It is designed to be directly embedded into an application and provide a direct way of communicating between individual nodes, omitting the overhead caused by replicating a log. Raftify was built with one particular use case in mind: running a self-managing cluster of Cosmos validators.

Requirements

  • Golang 1.14+

Configuration Reference

The configuration is to be provided in a raftify.json file and must be located in the working directory specified in the second parameter of the InitNode method.

ℹ️ For Gaia, the working directory is ~/.gaiad/config/ by default.

KeyValueDescription
idstring(Mandatory) The node's identifier.
Must be unique.
max_nodesint(Mandatory) The self-imposed limit of nodes to be run in the cluster.
Must be greater than 0 and must never be exceeded.
expectint(Mandatory) The number of nodes expected to be online in order to bootstrap the cluster and start the leader election. Once the expected number of nodes is online, all cluster members will be started simultaneously.
Must be 1 or higher and must never exceed the self-imposed max_nodes limit.
⚠️ Please use expect = 1 for single-node setups only. If you plan on running more than one node, set the expect value to the final cluster size on ALL nodes.
encryptstring(Optional) The hex representation of the secret key used to encrypt messages.
The value must be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
Use this tool to generate a key.
performanceint(Optional) The modifier used to multiply the maximum and minimum timeout and ticker settings. Higher values increase leader stability and reduce bandwidth and CPU but also increase the time needed to recover from a leader failure.
Must be 1 or higher. Defaults to 1 which is also the maximum performance setting.
log_levelstring(Optional) The minimum log level for console log messages.
Can be DEBUG, INFO, WARN, ERR. Defaults to WARN.
bind_addrstring(Optional) The address to bind the node application to.
Defaults to 0.0.0.0.
bind_portstring(Optional) The port to bind the node application to.
Defaults to 7946.
peer_list[]string(Optional) The list of IP addresses of all cluster members (optionally including the address of the local node). It is used to determine the quorum in a non-bootstrapped cluster.
For example, if your peerlist has n = 3 nodes then math.Floor((n/2)+1) = 2 nodes will need to be up and running to bootstrap the cluster.
Addresses must be provided in the host:port format.
Must not be empty if more than one node is expected.

Example Configuration

{
"id": "My-Unique-Name",
"max_nodes": 3,
"expect": 3,
"encrypt": "8ba4770b00f703fcc9e7d94f857db0e76fd53178d3d55c3e600a9f0fda9a75ad",
"performance": 1,
"log_level": "WARN",
"bind_addr": "192.168.0.25",
"bind_port": 3000,
"peer_list": [
"192.168.0.25:3000",
"192.168.0.26:3000",
"192.168.0.27:3000"
]
}

Getting Started

For a step-by-step guide on how to get started with your raftified Cosmos validator, check out this tutorial.

Testing

Use

makeunit-tests

to run unit tests, and

makeintegration-tests

to run integration tests.

About

Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node.

Topics

Resources

Contributing

Security policy

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - BlockscapeNetwork/raftify: Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node. · GitHub
Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Latest commit

History

146 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Raftify

CircleCIcodecovGo Report CardLicense

⚠️ This project has not yet had a security audit or stress test and is therefore not ready for use in production! Use at your own risk!

Raftify is a Go implementation of the Raft leader election algorithm without the Raft log and enables the creation of a self-managing cluster of nodes by transforming an application into a Raft node. It is meant to be a more cost-efficient small-scale alternative to running a validator cluster with a separate full-fledged Raft consensus layer.

It is designed to be directly embedded into an application and provide a direct way of communicating between individual nodes, omitting the overhead caused by replicating a log. Raftify was built with one particular use case in mind: running a self-managing cluster of Cosmos validators.

Requirements

  • Golang 1.14+

Configuration Reference

The configuration is to be provided in a raftify.json file and must be located in the working directory specified in the second parameter of the InitNode method.

ℹ️ For Gaia, the working directory is ~/.gaiad/config/ by default.

KeyValueDescription
idstring(Mandatory) The node's identifier.
Must be unique.
max_nodesint(Mandatory) The self-imposed limit of nodes to be run in the cluster.
Must be greater than 0 and must never be exceeded.
expectint(Mandatory) The number of nodes expected to be online in order to bootstrap the cluster and start the leader election. Once the expected number of nodes is online, all cluster members will be started simultaneously.
Must be 1 or higher and must never exceed the self-imposed max_nodes limit.
⚠️ Please use expect = 1 for single-node setups only. If you plan on running more than one node, set the expect value to the final cluster size on ALL nodes.
encryptstring(Optional) The hex representation of the secret key used to encrypt messages.
The value must be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
Use this tool to generate a key.
performanceint(Optional) The modifier used to multiply the maximum and minimum timeout and ticker settings. Higher values increase leader stability and reduce bandwidth and CPU but also increase the time needed to recover from a leader failure.
Must be 1 or higher. Defaults to 1 which is also the maximum performance setting.
log_levelstring(Optional) The minimum log level for console log messages.
Can be DEBUG, INFO, WARN, ERR. Defaults to WARN.
bind_addrstring(Optional) The address to bind the node application to.
Defaults to 0.0.0.0.
bind_portstring(Optional) The port to bind the node application to.
Defaults to 7946.
peer_list[]string(Optional) The list of IP addresses of all cluster members (optionally including the address of the local node). It is used to determine the quorum in a non-bootstrapped cluster.
For example, if your peerlist has n = 3 nodes then math.Floor((n/2)+1) = 2 nodes will need to be up and running to bootstrap the cluster.
Addresses must be provided in the host:port format.
Must not be empty if more than one node is expected.

Example Configuration

{
"id": "My-Unique-Name",
"max_nodes": 3,
"expect": 3,
"encrypt": "8ba4770b00f703fcc9e7d94f857db0e76fd53178d3d55c3e600a9f0fda9a75ad",
"performance": 1,
"log_level": "WARN",
"bind_addr": "192.168.0.25",
"bind_port": 3000,
"peer_list": [
"192.168.0.25:3000",
"192.168.0.26:3000",
"192.168.0.27:3000"
]
}

Getting Started

For a step-by-step guide on how to get started with your raftified Cosmos validator, check out this tutorial.

Testing

Use

makeunit-tests

to run unit tests, and

makeintegration-tests

to run integration tests.

About

Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node.

Topics

Resources

Contributing

Security policy

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - BlockscapeNetwork/raftify: Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node. · GitHub
Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Latest commit

History

146 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Raftify

CircleCIcodecovGo Report CardLicense

⚠️ This project has not yet had a security audit or stress test and is therefore not ready for use in production! Use at your own risk!

Raftify is a Go implementation of the Raft leader election algorithm without the Raft log and enables the creation of a self-managing cluster of nodes by transforming an application into a Raft node. It is meant to be a more cost-efficient small-scale alternative to running a validator cluster with a separate full-fledged Raft consensus layer.

It is designed to be directly embedded into an application and provide a direct way of communicating between individual nodes, omitting the overhead caused by replicating a log. Raftify was built with one particular use case in mind: running a self-managing cluster of Cosmos validators.

Requirements

  • Golang 1.14+

Configuration Reference

The configuration is to be provided in a raftify.json file and must be located in the working directory specified in the second parameter of the InitNode method.

ℹ️ For Gaia, the working directory is ~/.gaiad/config/ by default.

KeyValueDescription
idstring(Mandatory) The node's identifier.
Must be unique.
max_nodesint(Mandatory) The self-imposed limit of nodes to be run in the cluster.
Must be greater than 0 and must never be exceeded.
expectint(Mandatory) The number of nodes expected to be online in order to bootstrap the cluster and start the leader election. Once the expected number of nodes is online, all cluster members will be started simultaneously.
Must be 1 or higher and must never exceed the self-imposed max_nodes limit.
⚠️ Please use expect = 1 for single-node setups only. If you plan on running more than one node, set the expect value to the final cluster size on ALL nodes.
encryptstring(Optional) The hex representation of the secret key used to encrypt messages.
The value must be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
Use this tool to generate a key.
performanceint(Optional) The modifier used to multiply the maximum and minimum timeout and ticker settings. Higher values increase leader stability and reduce bandwidth and CPU but also increase the time needed to recover from a leader failure.
Must be 1 or higher. Defaults to 1 which is also the maximum performance setting.
log_levelstring(Optional) The minimum log level for console log messages.
Can be DEBUG, INFO, WARN, ERR. Defaults to WARN.
bind_addrstring(Optional) The address to bind the node application to.
Defaults to 0.0.0.0.
bind_portstring(Optional) The port to bind the node application to.
Defaults to 7946.
peer_list[]string(Optional) The list of IP addresses of all cluster members (optionally including the address of the local node). It is used to determine the quorum in a non-bootstrapped cluster.
For example, if your peerlist has n = 3 nodes then math.Floor((n/2)+1) = 2 nodes will need to be up and running to bootstrap the cluster.
Addresses must be provided in the host:port format.
Must not be empty if more than one node is expected.

Example Configuration

{
"id": "My-Unique-Name",
"max_nodes": 3,
"expect": 3,
"encrypt": "8ba4770b00f703fcc9e7d94f857db0e76fd53178d3d55c3e600a9f0fda9a75ad",
"performance": 1,
"log_level": "WARN",
"bind_addr": "192.168.0.25",
"bind_port": 3000,
"peer_list": [
"192.168.0.25:3000",
"192.168.0.26:3000",
"192.168.0.27:3000"
]
}

Getting Started

For a step-by-step guide on how to get started with your raftified Cosmos validator, check out this tutorial.

Testing

Use

makeunit-tests

to run unit tests, and

makeintegration-tests

to run integration tests.

About

Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node.

Topics

Resources

Contributing

Security policy

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - BlockscapeNetwork/raftify: Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node. · GitHub
Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Latest commit

History

146 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Raftify

CircleCIcodecovGo Report CardLicense

⚠️ This project has not yet had a security audit or stress test and is therefore not ready for use in production! Use at your own risk!

Raftify is a Go implementation of the Raft leader election algorithm without the Raft log and enables the creation of a self-managing cluster of nodes by transforming an application into a Raft node. It is meant to be a more cost-efficient small-scale alternative to running a validator cluster with a separate full-fledged Raft consensus layer.

It is designed to be directly embedded into an application and provide a direct way of communicating between individual nodes, omitting the overhead caused by replicating a log. Raftify was built with one particular use case in mind: running a self-managing cluster of Cosmos validators.

Requirements

  • Golang 1.14+

Configuration Reference

The configuration is to be provided in a raftify.json file and must be located in the working directory specified in the second parameter of the InitNode method.

ℹ️ For Gaia, the working directory is ~/.gaiad/config/ by default.

KeyValueDescription
idstring(Mandatory) The node's identifier.
Must be unique.
max_nodesint(Mandatory) The self-imposed limit of nodes to be run in the cluster.
Must be greater than 0 and must never be exceeded.
expectint(Mandatory) The number of nodes expected to be online in order to bootstrap the cluster and start the leader election. Once the expected number of nodes is online, all cluster members will be started simultaneously.
Must be 1 or higher and must never exceed the self-imposed max_nodes limit.
⚠️ Please use expect = 1 for single-node setups only. If you plan on running more than one node, set the expect value to the final cluster size on ALL nodes.
encryptstring(Optional) The hex representation of the secret key used to encrypt messages.
The value must be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
Use this tool to generate a key.
performanceint(Optional) The modifier used to multiply the maximum and minimum timeout and ticker settings. Higher values increase leader stability and reduce bandwidth and CPU but also increase the time needed to recover from a leader failure.
Must be 1 or higher. Defaults to 1 which is also the maximum performance setting.
log_levelstring(Optional) The minimum log level for console log messages.
Can be DEBUG, INFO, WARN, ERR. Defaults to WARN.
bind_addrstring(Optional) The address to bind the node application to.
Defaults to 0.0.0.0.
bind_portstring(Optional) The port to bind the node application to.
Defaults to 7946.
peer_list[]string(Optional) The list of IP addresses of all cluster members (optionally including the address of the local node). It is used to determine the quorum in a non-bootstrapped cluster.
For example, if your peerlist has n = 3 nodes then math.Floor((n/2)+1) = 2 nodes will need to be up and running to bootstrap the cluster.
Addresses must be provided in the host:port format.
Must not be empty if more than one node is expected.

Example Configuration

{
"id": "My-Unique-Name",
"max_nodes": 3,
"expect": 3,
"encrypt": "8ba4770b00f703fcc9e7d94f857db0e76fd53178d3d55c3e600a9f0fda9a75ad",
"performance": 1,
"log_level": "WARN",
"bind_addr": "192.168.0.25",
"bind_port": 3000,
"peer_list": [
"192.168.0.25:3000",
"192.168.0.26:3000",
"192.168.0.27:3000"
]
}

Getting Started

For a step-by-step guide on how to get started with your raftified Cosmos validator, check out this tutorial.

Testing

Use

makeunit-tests

to run unit tests, and

makeintegration-tests

to run integration tests.

About

Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node.

Topics

Resources

Contributing

Security policy

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - BlockscapeNetwork/raftify: Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node. · GitHub
Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Latest commit

History

146 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Raftify

CircleCIcodecovGo Report CardLicense

⚠️ This project has not yet had a security audit or stress test and is therefore not ready for use in production! Use at your own risk!

Raftify is a Go implementation of the Raft leader election algorithm without the Raft log and enables the creation of a self-managing cluster of nodes by transforming an application into a Raft node. It is meant to be a more cost-efficient small-scale alternative to running a validator cluster with a separate full-fledged Raft consensus layer.

It is designed to be directly embedded into an application and provide a direct way of communicating between individual nodes, omitting the overhead caused by replicating a log. Raftify was built with one particular use case in mind: running a self-managing cluster of Cosmos validators.

Requirements

  • Golang 1.14+

Configuration Reference

The configuration is to be provided in a raftify.json file and must be located in the working directory specified in the second parameter of the InitNode method.

ℹ️ For Gaia, the working directory is ~/.gaiad/config/ by default.

KeyValueDescription
idstring(Mandatory) The node's identifier.
Must be unique.
max_nodesint(Mandatory) The self-imposed limit of nodes to be run in the cluster.
Must be greater than 0 and must never be exceeded.
expectint(Mandatory) The number of nodes expected to be online in order to bootstrap the cluster and start the leader election. Once the expected number of nodes is online, all cluster members will be started simultaneously.
Must be 1 or higher and must never exceed the self-imposed max_nodes limit.
⚠️ Please use expect = 1 for single-node setups only. If you plan on running more than one node, set the expect value to the final cluster size on ALL nodes.
encryptstring(Optional) The hex representation of the secret key used to encrypt messages.
The value must be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
Use this tool to generate a key.
performanceint(Optional) The modifier used to multiply the maximum and minimum timeout and ticker settings. Higher values increase leader stability and reduce bandwidth and CPU but also increase the time needed to recover from a leader failure.
Must be 1 or higher. Defaults to 1 which is also the maximum performance setting.
log_levelstring(Optional) The minimum log level for console log messages.
Can be DEBUG, INFO, WARN, ERR. Defaults to WARN.
bind_addrstring(Optional) The address to bind the node application to.
Defaults to 0.0.0.0.
bind_portstring(Optional) The port to bind the node application to.
Defaults to 7946.
peer_list[]string(Optional) The list of IP addresses of all cluster members (optionally including the address of the local node). It is used to determine the quorum in a non-bootstrapped cluster.
For example, if your peerlist has n = 3 nodes then math.Floor((n/2)+1) = 2 nodes will need to be up and running to bootstrap the cluster.
Addresses must be provided in the host:port format.
Must not be empty if more than one node is expected.

Example Configuration

{
"id": "My-Unique-Name",
"max_nodes": 3,
"expect": 3,
"encrypt": "8ba4770b00f703fcc9e7d94f857db0e76fd53178d3d55c3e600a9f0fda9a75ad",
"performance": 1,
"log_level": "WARN",
"bind_addr": "192.168.0.25",
"bind_port": 3000,
"peer_list": [
"192.168.0.25:3000",
"192.168.0.26:3000",
"192.168.0.27:3000"
]
}

Getting Started

For a step-by-step guide on how to get started with your raftified Cosmos validator, check out this tutorial.

Testing

Use

makeunit-tests

to run unit tests, and

makeintegration-tests

to run integration tests.

About

Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node.

Topics

Resources

Contributing

Security policy

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - BlockscapeNetwork/raftify: Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node. · GitHub
Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Latest commit

History

146 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Raftify

CircleCIcodecovGo Report CardLicense

⚠️ This project has not yet had a security audit or stress test and is therefore not ready for use in production! Use at your own risk!

Raftify is a Go implementation of the Raft leader election algorithm without the Raft log and enables the creation of a self-managing cluster of nodes by transforming an application into a Raft node. It is meant to be a more cost-efficient small-scale alternative to running a validator cluster with a separate full-fledged Raft consensus layer.

It is designed to be directly embedded into an application and provide a direct way of communicating between individual nodes, omitting the overhead caused by replicating a log. Raftify was built with one particular use case in mind: running a self-managing cluster of Cosmos validators.

Requirements

  • Golang 1.14+

Configuration Reference

The configuration is to be provided in a raftify.json file and must be located in the working directory specified in the second parameter of the InitNode method.

ℹ️ For Gaia, the working directory is ~/.gaiad/config/ by default.

KeyValueDescription
idstring(Mandatory) The node's identifier.
Must be unique.
max_nodesint(Mandatory) The self-imposed limit of nodes to be run in the cluster.
Must be greater than 0 and must never be exceeded.
expectint(Mandatory) The number of nodes expected to be online in order to bootstrap the cluster and start the leader election. Once the expected number of nodes is online, all cluster members will be started simultaneously.
Must be 1 or higher and must never exceed the self-imposed max_nodes limit.
⚠️ Please use expect = 1 for single-node setups only. If you plan on running more than one node, set the expect value to the final cluster size on ALL nodes.
encryptstring(Optional) The hex representation of the secret key used to encrypt messages.
The value must be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
Use this tool to generate a key.
performanceint(Optional) The modifier used to multiply the maximum and minimum timeout and ticker settings. Higher values increase leader stability and reduce bandwidth and CPU but also increase the time needed to recover from a leader failure.
Must be 1 or higher. Defaults to 1 which is also the maximum performance setting.
log_levelstring(Optional) The minimum log level for console log messages.
Can be DEBUG, INFO, WARN, ERR. Defaults to WARN.
bind_addrstring(Optional) The address to bind the node application to.
Defaults to 0.0.0.0.
bind_portstring(Optional) The port to bind the node application to.
Defaults to 7946.
peer_list[]string(Optional) The list of IP addresses of all cluster members (optionally including the address of the local node). It is used to determine the quorum in a non-bootstrapped cluster.
For example, if your peerlist has n = 3 nodes then math.Floor((n/2)+1) = 2 nodes will need to be up and running to bootstrap the cluster.
Addresses must be provided in the host:port format.
Must not be empty if more than one node is expected.

Example Configuration

{
"id": "My-Unique-Name",
"max_nodes": 3,
"expect": 3,
"encrypt": "8ba4770b00f703fcc9e7d94f857db0e76fd53178d3d55c3e600a9f0fda9a75ad",
"performance": 1,
"log_level": "WARN",
"bind_addr": "192.168.0.25",
"bind_port": 3000,
"peer_list": [
"192.168.0.25:3000",
"192.168.0.26:3000",
"192.168.0.27:3000"
]
}

Getting Started

For a step-by-step guide on how to get started with your raftified Cosmos validator, check out this tutorial.

Testing

Use

makeunit-tests

to run unit tests, and

makeintegration-tests

to run integration tests.

About

Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node.

Topics

Resources

Contributing

Security policy

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - BlockscapeNetwork/raftify: Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node. · GitHub
Skip to content
This repository was archived by the owner on Mar 23, 2024. It is now read-only.

Latest commit

History

146 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Raftify

CircleCIcodecovGo Report CardLicense

⚠️ This project has not yet had a security audit or stress test and is therefore not ready for use in production! Use at your own risk!

Raftify is a Go implementation of the Raft leader election algorithm without the Raft log and enables the creation of a self-managing cluster of nodes by transforming an application into a Raft node. It is meant to be a more cost-efficient small-scale alternative to running a validator cluster with a separate full-fledged Raft consensus layer.

It is designed to be directly embedded into an application and provide a direct way of communicating between individual nodes, omitting the overhead caused by replicating a log. Raftify was built with one particular use case in mind: running a self-managing cluster of Cosmos validators.

Requirements

  • Golang 1.14+

Configuration Reference

The configuration is to be provided in a raftify.json file and must be located in the working directory specified in the second parameter of the InitNode method.

ℹ️ For Gaia, the working directory is ~/.gaiad/config/ by default.

KeyValueDescription
idstring(Mandatory) The node's identifier.
Must be unique.
max_nodesint(Mandatory) The self-imposed limit of nodes to be run in the cluster.
Must be greater than 0 and must never be exceeded.
expectint(Mandatory) The number of nodes expected to be online in order to bootstrap the cluster and start the leader election. Once the expected number of nodes is online, all cluster members will be started simultaneously.
Must be 1 or higher and must never exceed the self-imposed max_nodes limit.
⚠️ Please use expect = 1 for single-node setups only. If you plan on running more than one node, set the expect value to the final cluster size on ALL nodes.
encryptstring(Optional) The hex representation of the secret key used to encrypt messages.
The value must be either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
Use this tool to generate a key.
performanceint(Optional) The modifier used to multiply the maximum and minimum timeout and ticker settings. Higher values increase leader stability and reduce bandwidth and CPU but also increase the time needed to recover from a leader failure.
Must be 1 or higher. Defaults to 1 which is also the maximum performance setting.
log_levelstring(Optional) The minimum log level for console log messages.
Can be DEBUG, INFO, WARN, ERR. Defaults to WARN.
bind_addrstring(Optional) The address to bind the node application to.
Defaults to 0.0.0.0.
bind_portstring(Optional) The port to bind the node application to.
Defaults to 7946.
peer_list[]string(Optional) The list of IP addresses of all cluster members (optionally including the address of the local node). It is used to determine the quorum in a non-bootstrapped cluster.
For example, if your peerlist has n = 3 nodes then math.Floor((n/2)+1) = 2 nodes will need to be up and running to bootstrap the cluster.
Addresses must be provided in the host:port format.
Must not be empty if more than one node is expected.

Example Configuration

{
"id": "My-Unique-Name",
"max_nodes": 3,
"expect": 3,
"encrypt": "8ba4770b00f703fcc9e7d94f857db0e76fd53178d3d55c3e600a9f0fda9a75ad",
"performance": 1,
"log_level": "WARN",
"bind_addr": "192.168.0.25",
"bind_port": 3000,
"peer_list": [
"192.168.0.25:3000",
"192.168.0.26:3000",
"192.168.0.27:3000"
]
}

Getting Started

For a step-by-step guide on how to get started with your raftified Cosmos validator, check out this tutorial.

Testing

Use

makeunit-tests

to run unit tests, and

makeintegration-tests

to run integration tests.

About

Go package implementing the Raft leader election algorithm, used to turn any application into a Raft node.

Topics

Resources

Contributing

Security policy

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages