Supplementary Guide to Staking on Ethereum For Existing Stakers
--
Last updated: 12-November-2023
This is a supplementary guide to my newly released staking guides:
- Guide to Staking on Ethereum (Ubuntu/Lighthouse)
- Guide to Staking on Ethereum (Ubuntu/Prysm)
- Guide to Staking on Ethereum (Ubuntu/Nimbus)
- Guide to Staking on Ethereum (Ubuntu/Teku)
It is ONLY intended for existing stakers — those who used my ORIGINAL Ethereum 2.0 mainnet guides (now deprecated) who are having trouble migrating their setup to a Merge-Ready state using my new guides linked above.
NOTE: Do not use this guide if you didn’t follow my original Ethereum 2.0 mainnet guides. Use my new guides linked above to create your staking setup.
NOTE: Do not use this guide if you have already migrated your staking setup to a Merge-Ready state using my new guides linked above. You are a champ.
This supplementary guide walks through each client from my original guides and shows you what to change. Assumption is that you used the same directory paths and account names, etc. from my original guides. Also that your validators are loaded and clients are synced, etc. Basically everything should be working per my original guide. If you changed things, like the account or service name, or datadir, then make the necessary adjustments.
Once you have gone through this supplementary guide you should have a:
- JWT Authentication Token
- A functioning Merge Ready Geth client (if you are using Geth)
- A functioning Merge Ready Consensus Client
Once done, you should be at parity with whichever new guide linked above matches your chosen Consensus Client (Lighthouse, Prysm, Nimbus, Teku).
Disclaimer
This article (the guide) is for informational purposes only and does not constitute professional advice. The author does not guarantee accuracy of the information in this article and the author is not responsible for any damages or losses incurred by following this article. A full disclaimer can be found at the bottom of this page — please read before continuing.
Disk Space
If you are running low, especially after moving from an Infura Eth1 setup to installing your own Eth1 (Execution Client) client, this guide explains how to add a new SSD. No warranty — I haven’t tried it myself, so use at your own risk.
JWT Authentication Token
You’ll need this or things wont work. If you haven’t already, create it and then forget about it:
$ sudo mkdir -p /var/lib/jwtsecret
$ openssl rand -hex 32 | sudo tee /var/lib/jwtsecret/jwt.hex > /dev/null
Execution Client
If you haven’t installed an Execution Client (Besu, or Erigon, or Geth, or Nethermind) — basically an Eth1 node — use any of the new guides linked above to install it. Don’t forget to update the firewall to allow port 30303 (see the guide). You’ll need it to be Merge Ready. Infura is no longer an option. The Execution Client requires about 650–700GB disk space fully synced, so make sure your SSD is big enough.
NOTE: If you want to install Geth for your Execution Client and you didn’t use my original guide, DO NOT use the instructions below to install Geth — they are for old school Geth installations that used my original guide. To fresh install Geth, use my new guides linked above, instead. Don’t forget to update the firewall to allow port 30303 (see the guide).
NOTE: If you want to SWITCH from Geth, which is currently a MAJORITY Execution Client (big penalty risk if major bug, not good for decentralization), to one of the minority clients head on over to one of my new guides linked above for instructions on installing a MINORITY Execution Client (reduced penalty risk if major bug, good for decentralization). Before you do so, I have included Appendix A — Uninstalling Geth below that shows you how to remove geth.
Geth
In my new guides I made some changes to the way Geth is setup. The reasons are:
(a) To bring its setup into alignment with the other Execution clients. My guides try to keep things as consistent as possible. It makes it easier for users to switch between clients and easier for the community to support users who followed the guides.
(b) Get rid of the PPA (Personal Package Archive) installation. Besides being inconsistent, each time you run sudo apt update
for any reason, it might try to update the Geth package. Maybe you don’t want to do that. The approach I use in my new guides allows you to easily choose whatever version you would like to install.
To update to the new Geth setup (won’t impact the data directory):
Stop Geth:
$ sudo systemctl stop geth
Remove Geth:
$ sudo apt remove -y geth
Remove Geth PPA:
$ sudo add-apt-repository --remove ppa:ethereum/ethereum
Download latest Geth:
Go here to get the Latest release of Geth. Right-click on the Geth for Linux button and copy the download link to the tar.gz file. Replace the link in the box below with the new one, if necessary.
$ cd ~
$ curl -LO https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.11.5-a38f4108.tar.gz
Extract it, copy it, clean up.
$ tar xvf geth-linux-amd64-1.11.5-a38f4108.tar.gz
$ cd geth-linux-amd64-1.11.5-a38f4108
$ sudo cp geth /usr/local/bin
$ cd ~
$ rm geth-linux-amd64-1.11.5-a38f4108.tar.gz
$ rm -r geth-linux-amd64-1.11.5-a38f4108
Rename the Geth account username and group (goeth
-> geth
):
$ sudo usermod -l geth goeth
$ sudo groupmod -n geth goeth
Rename the Geth data directory (goethereum
-> geth
):
$ sudo mv /var/lib/goethereum /var/lib/geth
Give the systemd service permissions to access the data directory:
$ sudo chown -R geth:geth /var/lib/geth
Modify the Geth systemd service config using:
$ sudo nano /etc/systemd/system/geth.service
So that it looks like:
[Unit]
Description=Geth Execution Client (Mainnet)
After=network.target
Wants=network.target[Service]
User=geth
Group=geth
Type=simple
Restart=always
RestartSec=5
TimeoutStopSec=600
ExecStart=/usr/local/bin/geth --mainnet --datadir /var/lib/geth --authrpc.jwtsecret /var/lib/jwtsecret/jwt.hex --db.engine pebble[Install]
WantedBy=default.target
The bits that changed are in bold.
Press <CTRL> + X then Y then <ENTER> to save and exit.
Refresh, restart, monitor:
$ sudo systemctl daemon-reload
$ sudo systemctl start geth
$ sudo journalctl -fu geth.service
Geth now matches the new guides, and is Merge-Ready.
NOTE: If you need to Prune the Geth database to reclaim some disk space see Appendix B — Pruning Geth.
Consensus Clients
My original guides covered the installation of Lighthouse, Nimbus, Prysm, or Teku. Instructions are below for converting them into a Merge Ready state.
Lighthouse
If you used my original guide to install Lighthouse, you can update the existing installation as follows:
Get the latest version of Lighthouse:
Go here and identify the Latest release. In the Binaries section copy the download link to the lighthouse-v…-x86_64-unknown-linux-gnu.tar.gz file. Replace the link in the box below with the new one, if necessary.
$ cd ~
$ curl -LO https://github.com/sigp/lighthouse/releases/download/v3.1.0/lighthouse-v3.1.0-x86_64-unknown-linux-gnu.tar.gz
Stop the Lighthouse beacon chain node and validator:
$ sudo systemctl stop lighthousevalidator
$ sudo systemctl stop lighthousebeacon
Extract it, copy it, clean it up:
$ tar xvf lighthouse-v3.1.0-x86_64-unknown-linux-gnu.tar.gz
$ sudo cp lighthouse /usr/local/bin
$ rm lighthouse-v3.1.0-x86_64-unknown-linux-gnu.tar.gz
$ rm lighthouse
Lighthouse Beacon Chain
Modify the Lighthouse Beacon Chain Node systemd service config using:
$ sudo nano /etc/systemd/system/lighthousebeacon.service
So that it looks like:
[Unit]
Description=Lighthouse Consensus Client BN (Mainnet)
Wants=network-online.target
After=network-online.target[Service]
User=lighthousebeacon
Group=lighthousebeacon
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse bn --network mainnet --datadir /var/lib/lighthouse --http --execution-endpoint http://127.0.0.1:8551 --execution-jwt /var/lib/jwtsecret/jwt.hex[Install]
WantedBy=multi-user.target
The bits that changed are in bold.
NOTE: The checkpoint sync stuff was left out since your Lighthouse Beacon Chain Node should already be synced.
Press <CTRL> + X then Y then <ENTER> to save and exit.
Refresh, restart, monitor:
$ sudo systemctl daemon-reload
$ sudo systemctl start lighthousebeacon
$ sudo journalctl -fu lighthousebeacon
Lighthouse Validator
Modify the Lighthouse Validator systemd service config using:
$ sudo nano /etc/systemd/system/lighthousevalidator.service
So that it looks like:
[Unit]
Description=Lighthouse Consensus Client VC (Mainnet)
Wants=network-online.target
After=network-online.target[Service]
User=lighthousevalidator
Group=lighthousevalidator
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse vc --network mainnet --datadir /var/lib/lighthouse --suggested-fee-recipient FeeRecipientAddress --graffiti "<yourgraffiti>"[Install]
WantedBy=multi-user.target
The bits that changed are in bold.
Replace FeeRecipientAddress
with an Ethereum address in your control.
Replace <yourgraffiti>
with your graffiti (max 32 characters).
E.g.:
ExecStart=/usr/local/bin/lighthouse vc --network mainnet --datadir /var/lib/lighthouse --suggested-fee-recipient 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 --graffiti "Validatoor"
Press <CTRL> + X then Y then <ENTER> to save and exit.
Refresh, restart, monitor:
$ sudo systemctl daemon-reload
$ sudo systemctl start lighthousevalidator
$ sudo journalctl -fu lighthousevalidator
Lighthouse now matches the new guide, and is Merge-Ready.
Nimbus
If you used my original guide to install Nimbus, you can update the existing installation as follows:
Get the latest version of Nimbus:
Go here and identify the Latest release. In the Assets section copy the download link to the nimbus-eth2_Linux_amd64…tar.gz file. Replace the link in the box below with the new one, if necessary.
$ cd ~
$ curl -LO https://github.com/status-im/nimbus-eth2/releases/download/v22.9.0/nimbus-eth2_Linux_amd64_22.9.0_667c3c97.tar.gz
Stop the Nimbus client:
$ sudo systemctl stop nimbus
Extract it, copy it, clean it up:
$ tar xvf nimbus-eth2_Linux_amd64_22.9.0_667c3c97.tar.gz
$ cd nimbus-eth2_Linux_amd64_22.9.0_667c3c97
$ sudo cp build/nimbus_beacon_node /usr/local/bin
$ cd ~
$ rm nimbus-eth2_Linux_amd64_22.9.0_667c3c97.tar.gz
$ rm -r nimbus-eth2_Linux_amd64_22.9.0_667c3c97
Modify the Nimbus systemd service config using:
$ sudo nano /etc/systemd/system/nimbus.service
So that it looks like:
[Unit]
Description=Nimbus Consensus Client (Mainnet)
Wants=network-online.target
After=network-online.target[Service]
User=nimbus
Group=nimbus
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/nimbus_beacon_node --network=mainnet --data-dir=/var/lib/nimbus --web3-url=http://127.0.0.1:8551 --jwt-secret=/var/lib/jwtsecret/jwt.hex --suggested-fee-recipient=FeeRecipientAddress --graffiti="<yourgraffiti>"[Install]
WantedBy=multi-user.target
The bits that changed are in bold.
Replace FeeRecipientAddress
with an Ethereum address in your control.
Replace <yourgraffiti>
with your graffiti (max 32 characters).
E.g.:
ExecStart=/usr/local/bin/nimbus_beacon_node --network=mainnet --data-dir=/var/lib/nimbus --web3-url=http://127.0.0.1:8551 --jwt-secret=/var/lib/jwtsecret/jwt.hex --suggested-fee-recipient=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 --graffiti="Validatoor"
Press <CTRL> + X then Y then <ENTER> to save and exit.
Refresh, restart, monitor:
$ sudo systemctl daemon-reload
$ sudo systemctl start nimbus
$ sudo journalctl -fu nimbus
Nimbus now matches the new guide, and is Merge-Ready.
Prysm
If you used my original guide to install Prysm, you can update the existing installation as follows:
Get the latest version of Prysm:
Go here and identify the Latest release. In the Assets section (expand if necessary) copy the download links to the beacon-chain-v…-linux-amd64 file and the validator-v…-linux-amd64 file. Replace the links in the box below with the new one, if necessary.
$ cd ~
$ curl -LO https://github.com/prysmaticlabs/prysm/releases/download/v3.1.1/beacon-chain-v3.1.1-linux-amd64$ curl -LO https://github.com/prysmaticlabs/prysm/releases/download/v3.1.1/validator-v3.1.1-linux-amd64
Stop the Prysm beacon chain node and validator:
$ sudo systemctl stop prysmvalidator
$ sudo systemctl stop prysmbeacon
Rename it, make it executable, copy it, clean it up:
$ mv beacon-chain-v3.1.1-linux-amd64 beacon-chain
$ mv validator-v3.1.1-linux-amd64 validator$ chmod +x beacon-chain
$ chmod +x validator$ sudo cp beacon-chain /usr/local/bin
$ sudo cp validator /usr/local/bin$ rm beacon-chain && rm validator
Prysm Beacon Chain
Modify the Prysm Beacon Chain Node systemd service config using:
$ sudo nano /etc/systemd/system/prysmbeacon.service
So that it looks like:
[Unit]
Description=Prysm Consensus Client BN (Mainnet)
Wants=network-online.target
After=network-online.target[Service]
User=prysmbeacon
Group=prysmbeacon
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/beacon-chain --mainnet --datadir=/var/lib/prysm/beacon --execution-endpoint=http://127.0.0.1:8551 --jwt-secret=/var/lib/jwtsecret/jwt.hex --suggested-fee-recipient=FeeRecipientAddress --accept-terms-of-use[Install]
WantedBy=multi-user.target
The bits that changed are in bold.
Replace FeeRecipientAddress
with an Ethereum address in your control.
E.g.:
ExecStart=/usr/local/bin/beacon-chain --mainnet --datadir=/var/lib/prysm/beacon --execution-endpoint=http://127.0.0.1:8551 --jwt-secret=/var/lib/jwtsecret/jwt.hex --suggested-fee-recipient=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 --accept-terms-of-use
NOTE: The checkpoint sync stuff was left out since your Prysm Beacon Chain Node should already be synced.
Press <CTRL> + X then Y then <ENTER> to save and exit.
Refresh, restart, monitor:
$ sudo systemctl daemon-reload
$ sudo systemctl start prysmbeacon
$ sudo journalctl -fu prysmbeacon
Prysm Validator
Modify the Prysm Validator systemd service config using:
$ sudo nano /etc/systemd/system/prysmvalidator.service
So that it looks like:
[Unit]
Description=Prysm Consensus Client VC (Mainnet)
Wants=network-online.target
After=network-online.target[Service]
User=prysmvalidator
Group=prysmvalidator
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/validator --datadir=/var/lib/prysm/validator --wallet-dir=/var/lib/prysm/validator --wallet-password-file=/var/lib/prysm/validator/password.txt --suggested-fee-recipient=FeeRecipientAddress --graffiti="<yourgraffiti>" --accept-terms-of-use[Install]
WantedBy=multi-user.target
The bits that changed are in bold.
Replace FeeRecipientAddress
with an Ethereum address in your control.
Replace <yourgraffiti>
with your graffiti (max 32 characters).
E.g.:
ExecStart=/usr/local/bin/validator --datadir=/var/lib/prysm/validator --wallet-dir=/var/lib/prysm/validator --wallet-password-file=/var/lib/prysm/validator/password.txt --suggested-fee-recipient=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 --graffiti="Validatoor" --accept-terms-of-use
Press <CTRL> + X then Y then <ENTER> to save and exit.
Refresh, restart, monitor:
$ sudo systemctl daemon-reload
$ sudo systemctl start prysmvalidator
$ sudo journalctl -fu prysmvalidator
Prysm now matches the new guide, and is Merge-Ready.
Teku
If you used my original guide to install Teku, you can update the existing installation as follows:
Get the latest version of Teku:
Go here and identify the Latest release. In the Downloads section copy the download link to the tar.gz file. Replace the link in the box below with the new one, if necessary.
$ cd ~
$ curl -LO https://artifacts.consensys.net/public/teku/raw/names/teku.tar.gz/versions/22.9.0/teku-22.9.0.tar.gz
Stop the Teku client:
$ sudo systemctl stop teku
Extract it, copy it, clean it up:
$ tar xvf teku-22.9.0.tar.gz
$ sudo rm -r /usr/local/bin/teku # <-- Remove the old files
$ sudo cp -a teku-22.9.0 /usr/local/bin/teku
$ rm teku-22.9.0.tar.gz
$ rm -r teku-22.9.0
Modify the Teku systemd service config using:
$ sudo nano /etc/systemd/system/teku.service
So that it looks like:
[Unit]
Description=Teku Consensus Client (Mainnet)
Wants=network-online.target
After=network-online.target[Service]
User=teku
Group=teku
Type=simple
Restart=always
RestartSec=5
Environment="JAVA_OPTS=-Xmx5g"
Environment="TEKU_OPTS=-XX:-HeapDumpOnOutOfMemoryError"
ExecStart=/usr/local/bin/teku/bin/teku --network=mainnet --data-path=/var/lib/teku --validator-keys=/var/lib/teku/validator_keys:/var/lib/teku/validator_keys --ee-endpoint=http://127.0.0.1:8551 --ee-jwt-secret-file=/var/lib/jwtsecret/jwt.hex --validators-proposer-default-fee-recipient=FeeRecipientAddress --validators-graffiti="<yourgraffiti>"[Install]
WantedBy=multi-user.target
The bits that changed are in bold.
Replace FeeRecipientAddress
with an Ethereum address in your control.
Replace <yourgraffiti>
with your graffiti (max 32 characters).
E.g.:
ExecStart=/usr/local/bin/teku/bin/teku --network=mainnet --data-path=/var/lib/teku --validator-keys=/var/lib/teku/validator_keys:/var/lib/teku/validator_keys --ee-endpoint=http://127.0.0.1:8551 --ee-jwt-secret-file=/var/lib/jwtsecret/jwt.hex --validators-proposer-default-fee-recipient=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 --validators-graffiti="Validatoor"
Press <CTRL> + X then Y then <ENTER> to save and exit.
Refresh, restart, monitor:
$ sudo systemctl daemon-reload
$ sudo systemctl start teku
$ sudo journalctl -fu teku
Teku now matches the new guide, and is Merge-Ready.
Final Remarks and Recommended Next Steps
Thanks for the opportunity. Hopefully this guide was helpful for you.
Next steps
- Get familiar with beaconcha.in so you can monitor your validators
- Use the beaconcha.in mobile app to monitor your validators
- Join the Ethstaker Discord for important notifications
- Share feedback on Discord (somer112), Twitter, or Reddit
- Help others on the EthStaker Discord or EthStaker Reddit
- Share this guide with your friends!
- Tips appreciated:
- somer.eth
- 0x32B74B90407309F6637245292cd90347DE658A37
Appendix A — Uninstalling Geth
If you installed Geth using my original Ethereum 2.0 mainnet guides, you can follow the instructions below to remove it.
NOTE: You may want to sync a second Execution Client first before you remove Geth. Not critical pre-merge, critical post-merge. Keep in mind that you’ll need around 700GB disk space available to sync a second client and you may need to modify the port number (30303) for either Geth or the new Execution Client to avoid a clash.
Stop and disable the geth service.
$ sudo systemctl stop geth
$ sudo systemctl disable geth
Remove the geth service.
$ sudo rm /etc/systemd/system/geth.service
$ sudo rm /usr/lib/systemd/system/geth.service
$ sudo systemctl daemon-reload
$ sudo systemctl reset-failed
Remove the geth software and the PPA repository.
$ sudo apt remove -y geth
$ sudo add-apt-repository --remove ppa:ethereum/ethereum
$ sudo apt autoremove
Delete data directory and user. Adjust directory path and user as necessary.
$ sudo rm -r /var/lib/goethereum
$ sudo deluser goeth
Geth should now be removed. You can install one of the other Execution Clients using my guides linked at the top of this page.
Here is an example from another user who migrated from Geth to Besu.
Appendix B — Pruning Geth
To avoid running out of disk space on your server, it may be useful to periodically run a prune operation on the Geth database. This operation will attempt to reduce the size of (prune) the Geth database. Thanks to Yorick Downe and his excellent guide for help with this section.
Some important prerequisites:
- You have followed the instructions above to update Geth to a Merge Ready state.
- Geth must be fully synced.
- Geth logs are not showing “state snapshot generation” messages. You can see the service log output using
$ sudo journalctl -fu geth.service
. If it is, it should show an “eta” with a time interval. Allow that to elapse + 128 blocks (~35 mins) before starting the prune operation. - Geth will not be operating normally during the prune operation. The prune operation takes around 4–6 hours.
- There must be more than 25GB free space on your server for the prune to run without risk of failure. Check available space using the
df -h
command. For example, the output below shows the main partition is/dev/hda1
and there is 82GB free:
ethstaker@ETH-STAKER-001:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 796M 996K 795M 1% /run
/dev/hda1 155G 74G 82G 48% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda15 105M 5.2M 100M 5% /boot/efi
tmpfs 796M 0 796M 0% /run/user/1000
If you meet the pre-requisites above then continue on. If not, check for advice on how to proceed with the EthStaker community on Reddit or Discord.
Start the Prune Operation
To run the prune it is necessary to update the service configuration for Geth to add the required prune command.
Stop the geth service.
$ sudo systemctl stop geth
Open the geth service systemd configuration file.
$ sudo nano /etc/systemd/system/geth.service
Add the snapshot prune-state
instruction at the end of the ExecStart
line.
[Unit]
Description=Geth Execution Client (Mainnet)
After=network.target
Wants=network.target[Service]
User=geth
Group=geth
Type=simple
Restart=always
RestartSec=5
TimeoutStopSec=600
ExecStart=/usr/local/bin/geth --mainnet --datadir /var/lib/geth --authrpc.jwtsecret /var/lib/jwtsecret/jwt.hex --db.engine pebble snapshot prune-state[Install]
WantedBy=default.target
Press <CTRL> + X then Y then <ENTER> to save and exit.
Reload systemd to reflect the changes and start the geth service. Check status to make sure it’s running correctly.
$ sudo systemctl daemon-reload
$ sudo systemctl start geth
$ sudo systemctl status geth
From Yorick’s guide:
Geth will prune in 3 stages: “Iterating state snapshot”, “Pruning state data”, and “Compacting database”. During the “Compacting database” stage, it may not output any log entries for an hour or so (mainstream SSD IOPS). Don’t restart it when this happens, let it run!
If you see messages about “generating snapshot” and an ETA during the prune, you don’t actually have a snapshot yet! Either the --datadir
and/or USER aren't right, or Geth just didn't have enough time to complete the snapshot. In that case, do stop the process, run Geth normally again, and observe its logs until snapshot has completed and is 128 blocks old.
Once the prune has completed open the geth service systemd configuration file.
$ sudo systemctl stop geth
$ sudo nano /etc/systemd/system/geth.service
Remove the snapshot prune-state
instruction at the end of the ExecStart
line.
[Unit]
Description=Geth Execution Client (Mainnet)
After=network.target
Wants=network.target[Service]
User=geth
Group=geth
Type=simple
Restart=always
RestartSec=5
TimeoutStopSec=600
ExecStart=/usr/local/bin/geth --mainnet --datadir /var/lib/geth --authrpc.jwtsecret /var/lib/jwtsecret/jwt.hex --db.engine pebble[Install]
WantedBy=default.target
Press <CTRL> + X then Y then <ENTER> to save and exit.
Reload systemd to reflect the changes and start the geth service. Check status to make sure it’s running correctly.
$ sudo systemctl daemon-reload
$ sudo systemctl start geth
$ sudo systemctl status geth # <-- Check for errors
$ sudo journalctl -fu geth.service # <-- Monitor
The prune operation is now complete. Geth should start syncing to the head of the chain. You can check how much disk space was freed up using df -h
.
Full Disclaimer
This article (the guide) is for informational purposes only and does not constitute professional advice. The author does not warrant or guarantee the accuracy, integrity, quality, completeness, currency, or validity of any information in this article. All information herein is provided “as is” without warranty of any kind and is subject to change at any time without notice. The author disclaims all express, implied, and statutory warranties of any kind, including warranties as to accuracy, timeliness, completeness, or fitness of the information in this article for any particular purpose. The author is not responsible for any direct, indirect, incidental, consequential or any other damages arising out of or in connection with the use of this article or in reliance on the information available on this article. This includes any personal injury, business interruption, loss of use, lost data, lost profits, or any other pecuniary loss, whether in an action of contract, negligence, or other misuse, even if the author has been informed of the possibility.