diff --git a/README.md b/README.md index 7ffbac4..64055b5 100644 --- a/README.md +++ b/README.md @@ -30,18 +30,22 @@ Bismuth Readme * https://github.com/EggPool * https://github.com/hclivess -### License: +### Links: -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. +Bismuth Foundation: +* https://github.com/bismuthfoundation -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +Twitter: +* https://twitter.com/bismuthplatform +* https://twitter.com/bismuthdev +* https://twitter.com/EggPoolNet + +Discord (main support and community place): +* https://discord.gg/dKVZd4z + +Facebook: +* https://web.facebook.com/cryptobismuth + +Reddit: +* https://www.reddit.com/r/cryptobismuth/ -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/_MOST_USEFUL_FILES.md b/_MOST_USEFUL_FILES.md index 4a6be32..7932151 100644 --- a/_MOST_USEFUL_FILES.md +++ b/_MOST_USEFUL_FILES.md @@ -51,7 +51,7 @@ Web part of the zircodice casino. ## Bismuth Core API -https://github.com/EggPool/BismuthAPI +https://github.com/bismuthfoundation/BismuthAPI ## Bismuth plugins https://github.com/bismuthfoundation/BismuthPlugins diff --git a/auto-install/bis-node-alone-install.sh b/auto-install/bis-node-alone-install.sh new file mode 100644 index 0000000..c61501d --- /dev/null +++ b/auto-install/bis-node-alone-install.sh @@ -0,0 +1,180 @@ +#!/bin/bash +# 2019 - Bismuth Foundation +# Distributed under the MIT software license, see http://www.opensource.org/licenses/mit-license.php. + +# Usage: bash ./bis-node-alone-install.sh +# or one liner : curl https://raw.githubusercontent.com/bismuthfoundation/Bismuth/master/auto-install/bis-node-alone-install.sh|bash +# Setup a regular Bismuth node alone on a fresh Ubuntu 18 install. + +# BEWARE: check configure_firewall to activate. + +VERSION="0.1.1" + +create_swap() { + if [ -d /swapfile ]; then + echo "Swap file already there" + else + fallocate -l 3G /swapfile + chmod 600 /swapfile + mkswap /swapfile + swapon /swapfile + echo "/swapfile none swap sw 0 0" >> /etc/fstab + echo "Swap file activated" + fi +} + +config_os() { + if ! cat /etc/security/limits.conf | grep "root soft nofile 65535"; then + echo "root soft nofile 65535" >> /etc/security/limits.conf + echo "root hard nofile 65535" >> /etc/security/limits.conf + fi + if ! cat /etc/sysctl.conf | grep "fs.file-max = 100000"; then + echo "fs.file-max = 100000" >> /etc/sysctl.conf + fi + if ! cat /etc/sysctl.conf | grep "vm.swappiness = 10"; then + echo "vm.swappiness = 10" >> /etc/sysctl.conf + fi + if ! cat /etc/sysctl.conf | grep "vm.vfs_cache_pressure = 50"; then + echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.conf + fi + sysctl -p + echo 1 > /proc/sys/net/ipv4/tcp_low_latency +} + + +update_repos() { + echo "Updating repos..." + DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" update + DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade +} + + +install_dependencies() { + echo "Installing apt dependencies" + # apt update -y + # This may be enough, + # apt install ufw unzip ntpdate python3-pip sqlite3 -y + apt install ufw unzip ntpdate python3-pip sqlite3 build-essential python3-dev -y + # ntpdate ntp.ubuntu.com + # apt install ntp -y +} + + +configure_firewall() { + echo "*NOT* Configuring Firewall" + #ufw disable + #ufw allow ssh/tcp + #ufw limit ssh/tcp + # node port + #ufw allow 5658/tcp + # HN port + #ufw allow 6969/tcp + # Wallet server + #ufw allow 8150/tcp + # Websocket server + #ufw allow 8155/tcp + #ufw logging on + #ufw default deny incoming + #ufw default allow outgoing + #ufw --force enable +} + + +download_node() { + echo "Fetching Node" + cd + if [ -f ./v4.3.0.1-beta.1.tar.gz ]; then + rm v4.3.0.1-beta.1.tar.gz + fi + wget https://github.com/bismuthfoundation/Bismuth/archive/v4.3.0.1-beta.1.tar.gz + tar -zxf v4.3.0.1-beta.1.tar.gz + mv Bismuth-4.3.0.1-beta.1 Bismuth + cd Bismuth + echo "Configuring node" + echo "ram=False" >> config_custom.txt + echo "full_ledger=True" >> config_custom.txt + echo "mempool_ram=False" >> config_custom.txt + echo "Downloading bootstrap" + cd static + if [ -f ./ledger-verified.tar.gz ]; then + rm ledger-verified.tar.gz + fi + wget https://snapshots.s3.nl-ams.scw.cloud/ledger-verified.tar.gz + tar -zxf ledger-verified.tar.gz + # Make some room + rm ledger-verified.tar.gz + echo "Getting node sentinel" + cd /root/Bismuth + wget https://gist.githubusercontent.com/EggPool/e7ad9baa2b32e4d7d3ba658a40b6d643/raw/934598c7ff815180b913d6549bd2d9688e016855/node_sentinel.py + echo "Installing PIP requirements" + pip3 install setuptools ipwhois + pip3 install -r requirements-node.txt +} + +install_plugin() { + echo "Installing companion plugin" + mkdir /root/Bismuth/plugins + mkdir /root/Bismuth/plugins/500_hypernode + cd /root/Bismuth/plugins/500_hypernode + wget https://raw.githubusercontent.com/bismuthfoundation/hypernode/master/node_plugin/__init__.py +} + +start_node() { + echo "Starting node" + cd + screen -d -S node -m bash -c "cd Bismuth;python3 node.py" -X quit +} + +wait_ledger() { + echo "Waiting for ledger to download and extract" + while true; do + if [ ! -f /root/Bismuth/static/ledger.db ]; then + echo "." + sleep 10 + else + break + fi + done +} + + +add_cron_jobs() { + # Node sentinel + echo "Inserting example node sentinel cronjob, but not activated" + if ! crontab -l | grep "node_sentinel"; then + (crontab -l ; echo "#* * * * * cd /root/Bismuth;python3 node_sentinel.py") | crontab - + fi +} + +if [ "$(whoami)" != "root" ]; then + echo "Script must be run as root" + exit -1 +fi + +while true; do + if [ -d /root/Bismuth ]; then + printf "/root/Bismuth/ already exists! The installer will delete this folder. Continue anyway?(Y/n)" + pID=$(ps -ef | grep node.py | awk '{print $2}' | head -n 1) + kill ${pID} + rm -rf /root/Bismuth/ + break + else + break + fi +done + +cd +create_swap +config_os +update_repos +install_dependencies +configure_firewall +download_node +install_plugin + +# cron_jobs are what will launch at boot and auto-restart node - not acctivated by default. +add_cron_jobs + + +echo "Rebooting server." +reboot diff --git a/auto-install/readme.md b/auto-install/readme.md new file mode 100644 index 0000000..1c309e4 --- /dev/null +++ b/auto-install/readme.md @@ -0,0 +1,17 @@ +# Auto install script + +**This is an auto install for NODE alone** +To be used by devs, exchanges, service providers. +If you want to host a Hypernode, please use the 2 in 1 auto installer at https://github.com/bismuthfoundation/hypernode/tree/master/auto-install + +- Tested on Ubuntu 18 Only +- Needs login as root +- will reboot the vps after install + +- Experimental, use at your own risks, may break your vps and need os reinstall +- Does **not** set up the UFW firewall, to avoid conflicts with ssh port or other apps. see firewall sectino of the sccript if needed. + +- Works well for me :) + +A Docker images is now also available: +https://github.com/bismuthfoundation/Bismuth-Docker/tree/master/node diff --git a/check_tx.md b/check_tx.md new file mode 100644 index 0000000..a337357 --- /dev/null +++ b/check_tx.md @@ -0,0 +1,44 @@ +# check_tx.py + +A Demo script that takes a transaction id as input, and sends back a json with it's status +- Unknown +- In mempool + (shows timestamp, from, to, amount, first 50 chars of openfield) +- In ledger + (shows timestamp, from, to, amount, first 50 chars of openfield as well as number of confirmations) + +## How to run + +This script is supposed to be run in the node directory, it needs access to both `ledger.db` and `mempool.db`. +It takes the ledger path from the default config.txt file. + +# Output examples + +Here are a few sample outputs. +(Imaginary data) + +## Unknown Txid + +`python3 check_tx.py bZ8/XjQhKX4GmlVmettD8H1+Tdh+FG8zXfghfdgh` + + +``` +{"Status": "Unknown", "TxId": "bZ8/XjQhKX4GmlVmettD8H1+Tdh+FG8zXfghfdgh"} +``` + +## Tx in Mempool + +`python3 check_tx.py anotheroneinthepool` + +``` +{"Amount": 0, "Timestamp": 1517594747.07, "Address": "371a2a76a527d0a45aac441fc3170a9e609e59abd134aa4bca726211", "Recipient": "371a2a76a527d0a45aac441fc3170a9e609e59abd134aa4bca726211", "Block": 498059, "Openfield": "a9443a88b04834e8001ddc3569491d31a2b9c61765f99d1c62", "TxId": "bZ8/XjQhKX4GmlVmettD8H1+Tdh+FG8zX", "Status": "Mempool"} +``` + +## Confirmed Tx, in ledger + + +`python3 check_tx.py bZ8/XjQhKX4GmlVmettD8H1+Tdh+FG8zX` + +``` +{"Amount": 0, "Confirmations": 2, "Timestamp": 1517594747.07, "Address": "371a2a76a527d0a45aac441fc3170a9e609e59abd134aa4bca726211", "Recipient": "371a2a76a527d0a45aac441fc3170a9e609e59abd134aa4bca726211", "Block": 498059, "Openfield": "a9443a88b04834e8001ddc3569491d31a2b9c61765f99d1c62", "TxId": "bZ8/XjQhKX4GmlVmettD8H1+Tdh+FG8zX", "Status": "Confirmed"} +``` diff --git a/check_tx.py b/check_tx.py new file mode 100644 index 0000000..481cc16 --- /dev/null +++ b/check_tx.py @@ -0,0 +1,83 @@ +""" +check_tx.py + +A Demo script that takes a transaction id as input, and sends back a json with it's status +- unknown +- in mempool (shows timestamp, from, to, amount, first 50 chars of openfield) +- in ledger (shows timestamp, from, to, amount, first 50 chars of openfield as well as number of confirmations) + +This script is supposed to be run in the node directory, it needs access to both ledger.db and mempool.db +""" + +import sqlite3, sys, json +import options + +# Default ledger path +ledger_path = "static/ledger.db" + +# Default mempool path +mempool_path = "mempool.db" + + +def list_to_tx(result): + """ + Converts the query result into a dict + """ + result[4] = result[4][:50] + keys = ["Timestamp", "Address", "Recipient", "Amount", "Openfield", "Block"] + return dict(zip(keys,result)) + + +def is_in_mempool(txid): + """ + If txid is in mempool, sends back details of the tx + """ + mempool = sqlite3.connect(mempool_path) + mempool.text_factory = str + m = mempool.cursor() + m.execute("SELECT timestamp, address, recipient, amount, openfield FROM transactions WHERE signature like ?;", (txid+"%",)) + result = m.fetchone() + if result: + return (True, list_to_tx(list(result))) + else: + return (False, None) + + +def is_in_ledger(txid): + """ + If txid is in ledger, sends back details of the tx and number of confirmations + """ + ledger = sqlite3.connect(ledger_path) + ledger.text_factory = str + m = ledger.cursor() + m.execute("SELECT timestamp, address, recipient, amount, openfield, block_height FROM transactions WHERE signature like ?;", (txid+"%",)) + result = m.fetchone() + if result: + m.execute("SELECT block_height FROM transactions ORDER BY block_height desc LIMIT 1") + last = m.fetchone() + return (True, list_to_tx(list(result)), last[0]) + else: + return (False, None, None) + + +if __name__ == "__main__": + if len(sys.argv) != 2: + txid = input("No argument detected, please insert command manually\n") + else: + txid = sys.argv[1] + + res = {"TxId":txid, "Status":"Unknown"} + + isit, details = is_in_mempool(txid) + if isit: + res["Status"] = "Mempool" + res.update(details) + + isit, details, lastblock = is_in_ledger(txid) + if isit: + res["Status"] = "Confirmed" + res.update(details) + res["Confirmations"] = lastblock - res["Block"] + + print(json.dumps(res)) + diff --git a/node.py b/node.py index a935f82..3865fd4 100644 --- a/node.py +++ b/node.py @@ -1966,6 +1966,7 @@ def verify(db_handler): node.logger.app_log.warning("Error: {}".format(e)) raise + def add_indices(db_handler: dbhandler.DbHandler): CREATE_TXID4_INDEX_IF_NOT_EXISTS = "CREATE INDEX IF NOT EXISTS TXID4_Index ON transactions(substr(signature,1,4))" CREATE_MISC_BLOCK_HEIGHT_INDEX_IF_NOT_EXISTS = "CREATE INDEX IF NOT EXISTS 'Misc Block Height Index' on misc(block_height)" @@ -1986,6 +1987,7 @@ def add_indices(db_handler: dbhandler.DbHandler): node.logger.app_log.warning("Finished creating indices") + if __name__ == "__main__": # classes node = node.Node() diff --git a/peers_test.txt b/peers_test.txt index ac63f37..06c8488 100644 --- a/peers_test.txt +++ b/peers_test.txt @@ -1 +1 @@ -{"127.0.0.1": "2829"} \ No newline at end of file +{"127.0.0.1": "2829", "51.15.97.143": "2829"}