Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - litepresence

Pages: 1 2 3 4 [5] 6 7 8 9 10
61
General Discussion / Re: Cleaned out!
« on: January 03, 2020, 07:34:34 pm »
bitshares.org still links to an insecure client version

I spoke w/ DL, he thanked for reminder... it is bumped on his todo list.

62
I really like the general model prescribed here.

It might be that workers in general could be better received by the voting community if they were not put out there like trillion dollar US government "defense authorization acts" where voting is all or nothing.   

The way thing have seemed up until now... its either you want to vote for "core team budget" yea/nay or "dexbot budget" yea/nay... and perhaps you want some of the things core is doing to be funded or some of the things dexbot is doing to be funded.... but you don't agree with the whole package.  Not to single out any line item, but maybe you don't want to support dev travel to blockchain events for example.  The all or nothing packaging of the workers tends to turn ala carte items into what is perceived as dependent political pork riders.    Perhaps, a better model would be employment of individuals for 6 month contracts instead of teams.   Or funding of distinct projects or subcategories of dev - instead of all or none dev offerings.   I think voters prefer this level of control which avoids a sense of perceived "pork" which ultimately ends chaotically as a "poison pill" amendment wrecks an ongoing otherwise helpful worker offering.


Quote
Rider (legislation)

In legislative procedure, a rider is an additional provision added to a bill or other measure under the consideration by a legislature, having little connection with the subject matter of the bill.[1] Riders are usually created as a tactic to pass a controversial provision that would not pass as its own bill. Occasionally, a controversial provision is attached to a bill not to be passed itself but to prevent the bill from being passed (in which case it is called a wrecking amendment or poison pill).
https://en.wikipedia.org/wiki/Rider_%28legislation%29

63
Stakeholder Proposals / Re: BSIP86: 1000:1 Core BTS Token Reverse Split
« on: December 31, 2019, 03:03:17 pm »
Reverse stock split will not solve BTS problem, it might create more
In traditional rhetoric this is called a Proof Surrogate. Please expand on your thoughts, else this is just a logical fallacy.

64
Stakeholder Proposals / BSIP86: 1000:1 Core BTS Token Reverse Split
« on: December 30, 2019, 08:27:22 pm »
https://github.com/litepresence/bsips/blob/patch-1/bsip-0086.md

Code: [Select]
    BSIP: BSIP 86
    Title: 1000:1 Reverse Split of Core BTS Token
    Authors: litepresence finitestate@tutamail.com
    Status: Draft
    Type: Protocol
    Created: 2019-12-30
    Discussion: https://bitsharestalk.org/index.php?topic=31970.0


# Abstract

As we approach Jan 1, 2020, the current trading price for BTS core token vs. BTC has fallen below 200 satoshi.  It also fell below 200 satoshi in February 2018.  Since inception, the price of the core BTS token has spent about 50% of its time below 1000 satoshi vs. BTC.  Beneath 1000 satoshi, BTS has only had 3 significant figures to trade at centralized exchanges.  Significant figures of a number are the non-leading-zero digits, which carry meaning - contributing to its measurement resolution.

In stock markets, stock splits and reverse stock splits are routine actions performed by corporations, upon consent of shareholders.  We find in traditional stock markets, prices are maintained such that there are always between 4 and 5 significant figures vs. the national currency.   That is, most stock prices, in high volume markets, typically range from 10.00 to 999.99.   When they get outside of that range, a stock split; or reverse stock split is a routine consideration taken up among shareholders and initiated by corporate management.   

Exchanges do not tend to change their user interface or back-end to accommodate assets, which do not fit within their existing framework.  In Bitcoin markets, that framework allows for precision up to 8 digits; 0.00000000.  Likewise in USD and CNY markets, the precision offered is typically 0.00.   


# Motivation

The motivation of this split is to increase share price immediately; to prevent delisting risk, encourage listing acceptance at new exchanges, and more generally encourage higher trade volume at centralized exchanges, by removing the delisting threat.   


# Rational

Exchanges generally specify a minimum bid price for an asset to be listed.  If the asset falls below this bid price and remains lower than that threshold level over a certain period, it risks being delisted from the exchange.  In the cryptocurrency space this price threshold is often proprietary, though experience shows it is typically set between 200 and 500 satoshi.  Secondly, in fear of being stuck with a delisted asset, traders are hesitant to purchase a currency who's exchange price is approaching the delisting threshold.   Over time, this rational fear decreases trading volume, which has a cascading effect on the price of an already weakened asset.  Further, when a coin is delisted from exchange there is a typically a sharp, immediately negative effect on market price.   

Additionally, when an asset price is at the bottom end of 3 significant figures, such as is the current case of Bitshares at 200 satoshi; there is now 0.5% change in value for every up or down tick in price.  At 100 satoshi, that becomes one full percent change in value for every tick in tradable asset price vs BTC (the core currency BTS is traded against at most centralized exchanges).  The core properties of money are Durability, Portability, Divisibility and Intrinsic value.   When price is moving in ticks of half-a-percent measurment resolution at every trade, the properties of Divisibility and Intrinsic Value come into question. 

In traditional stock markets, upon a reverse stock split, there is an immediate and proportional change in market price to the split ratio.   Instead of trading at 0.00000200 in CEX markets, Bitshares would immediately trade at 0.00200000.   Markets are very reliable and resilient in this regard.   There would be no immediate effect on market cap or the vaule of individual holdings vs. USD, CNY, or BTC.  However, the delisting risk profile would immediately and permanently change. 

The BTS:USD price, likewise would move from $0.0149 (current) to $14.90 on markets.  This would open doors for the BTS:USD pairing, where exchanges specify price in cents, to be a rational consideration.


# Specifications

The specification for this change is simple:

- 1000:1 reverse split
- Core token asset precision changed from 5 to 8
- All open orders on DEX vs the core BTS token would be scaled accordingly
- All loans used to issue bitASSETs would also be scaled

Currently the chain supports 15 digits in format:

Code: [Select]
    X,XXX,XXX,XXX.XXXXX
   
After the split it still supports 15 digits in the new format:

Code: [Select]
    X,XXX,XXX.XXXXXXXX
Current maximum supply is:

Code: [Select]
    3,600,570,502.00000
   
After the split maximum supply is:

Code: [Select]
    3,600,570.00000000 (or if possible 3,600,570.50200000)
Put simply:

However many BTS are in existence is divided by 1000.  However many you have personally is divided by 1000. 

If there is rounding to be done, round down.

If it is technically less challenging to "air drop" a new token at 1000:1 ratio and rename it:

Code: [Select]
    newBTS, BTS3, bitBTS, coreBTS, BTS2020, etc.
Then lock trading / transfer of the original BTS core token, to initiate the reverse split; this would be acceptable as well, so long as all major exchanges are put on notice of the upcoming change and agree to distribute the air drop after the protocol upgrade.


# Discussion

https://bitsharestalk.org/index.php?topic=31970.0


# Summary for Shareholders


Significant figures in financial markets send key signals to both traders and exchange operators.   BTS has consistently traded at 3 significant figures vs BTC in satoshis; and less than 1 US Dollar (currently 1.5 cents).   Making this change to the core protocol, will eliminate delisting risk at centralized exchanges due to the very concrete issue of divisibility vs. the value of Bitcoin; while opening doors to USD markets which trade with 2 decimal precision.


# Copyright:

WTFPL - wtfpl.net


# See Also

Quote
The number one reason for a reverse stock split is because the stock exchanges—like the NYSE or Nasdaq—set minimum price requirements for shares that trade on their exchanges. And when a company’s shares decline to near - or below - that level, the easiest way to stay in compliance with the exchange is to reduce the number of outstanding shares so that the price of the individual shares - like magic - automatically rises. And when that happens, the company’s shares can remain trading on the exchange.

- https://cabotwealth.com/daily/how-to-invest/reverse-stock-splits-shareholders/

# Additional Resources

- https://www.investopedia.com/terms/r/reversesplit.asp
- https://www.investopedia.com/ask/answers/06/reversestocksplit.asp
- https://www.fool.com/knowledge-center/whats-a-reverse-stock-split-and-can-it-really-help.aspx
- https://www.wallstreetmojo.com/reverse-stock-split
- https://en.wikipedia.org/wiki/Reverse_stock_split
- https://www.upcounsel.com/reverse-stock-split
- https://www.stocksplithistory.com/reverse-stock-splits
- https://finance.zacks.com/reverse-stock-split-good-bad-2298.html

65
Code: [Select]
If (current price >  two-day moving average price) {
  feed price = current price;
}
Else{
  feed price = two-day moving average price;
}

this logic is not applicable to the situation at hand

there is no price on bitshares dex; there is only:

Code: [Select]
amount_asset1/amount_asset2or

Code: [Select]
amount_asset2/amount_asset1
so for this reason you cannot use a "greater than" operator on price vs a moving average of price to initiate action; because what then is the desired effect if we swap the market?   say BTS:CNY vs how do we handle CNY:BTS market?

what is "price greater than moving average"?

It does not work.

What you are looking to do is normalize outliers in the dataset to prevent extremes.

What I would suggest in such a case:
Code: [Select]
price = qty_A[-1]/qty_B[-1]
inverse = qty_B[-1]/qty_A[-1]

if price > (2*qty_A[-2])/qty_B[-2]:
   
    B_scale = qty_B[-1]/qty_B[-2]
    qty_A[-1] = B_scale*2*qty_A[-2]

elif inverse > (2*qty_B[-2])/qty_A[-2]

    A_scale = qty_A[-1]/qty_A[-2]
    qty_B[-1] = A_scale*2*qty_B[-2]

this would be a balanced solution to the issue which did not favor either currency.

It would also allow for price exploration; but not beyond two times the previous price in either direction; up or down.

I use this same mechanism to normalize my candle data when I want to optimize parameters for a finite state machine with machine learning techniques.   Less than 2X previous or greater than 1/2 previous has always served me well to filter otherwise unrealistic pricing from crypto markets.

66
Technical Support / Re: Account Hijacked
« on: March 28, 2019, 02:17:45 pm »
I am documenting this issue here:

https://github.com/bitshares/bsips/issues/154

BSIP: Proposals Scam Prevention #154

67
General Discussion / Re: microDEX <-> metaNODE <-> manualSIGNING
« on: February 23, 2019, 10:32:53 pm »


1 week run time achieved and UI is still 100ms responsive to buy/sell/cancel requests.

I forgot to mention that all auth'd ops occur in parallel processes; so you can order several buy/sell operations prior to the first actually executing (which takes a few seconds).

68
Technical Support / 1000 Candles of Historical HLOC from the DEX
« on: February 17, 2019, 05:00:46 pm »
BTS/bitUSD



list of dicts of human readable numpy arrays

Code: [Select]
from websocket import create_connection as wss  # handshake to node
from json import dumps as json_dumps
from json import loads as json_loads
import matplotlib.pyplot as plt
from datetime import datetime
from pprint import pprint
import numpy as np
import time


def public_nodes():
    return [
        'wss://altcap.io/wss',
        'wss://api-ru.bts.blckchnd.com/ws',
        'wss://api.bitshares.bhuz.info/wss',
        'wss://api.bitsharesdex.com/ws',
        'wss://api.bts.ai/ws',
        'wss://api.bts.blckchnd.com/wss',
        'wss://api.bts.mobi/wss',
        'wss://api.bts.network/wss',
        'wss://api.btsgo.net/ws',
        'wss://api.btsxchng.com/wss',
        'wss://api.dex.trading/ws',
        'wss://api.fr.bitsharesdex.com/ws',
        'wss://api.open-asset.tech/wss',
        'wss://atlanta.bitshares.apasia.tech/wss',
        'wss://australia.bitshares.apasia.tech/ws',
        'wss://b.mrx.im/wss',
        'wss://bit.btsabc.org/wss',
        'wss://bitshares.crypto.fans/wss',
        'wss://bitshares.cyberit.io/ws',
        'wss://bitshares.dacplay.org/wss',
        'wss://bitshares.dacplay.org:8089/wss',
        'wss://bitshares.openledger.info/wss',
        'wss://blockzms.xyz/ws',
        'wss://bts-api.lafona.net/ws',
        'wss://bts-seoul.clockwork.gr/ws',
        'wss://bts.liuye.tech:4443/wss',
        'wss://bts.open.icowallet.net/ws',
        'wss://bts.proxyhosts.info/wss',
        'wss://btsfullnode.bangzi.info/ws',
        'wss://btsws.roelandp.nl/ws',
        'wss://chicago.bitshares.apasia.tech/ws',
        'wss://citadel.li/node/wss',
        'wss://crazybit.online/wss',
        'wss://dallas.bitshares.apasia.tech/wss',
        'wss://dex.iobanker.com:9090/wss',
        'wss://dex.rnglab.org/ws',
        'wss://dexnode.net/ws',
        'wss://england.bitshares.apasia.tech/ws',
        'wss://eu-central-1.bts.crypto-bridge.org/wss',
        'wss://eu.nodes.bitshares.ws/ws',
        'wss://eu.openledger.info/ws',
        'wss://france.bitshares.apasia.tech/ws',
        'wss://frankfurt8.daostreet.com/wss',
        'wss://japan.bitshares.apasia.tech/wss',
        'wss://kc-us-dex.xeldal.com/ws',
        'wss://kimziv.com/ws',
        'wss://la.dexnode.net/ws',
        'wss://miami.bitshares.apasia.tech/ws',
        'wss://na.openledger.info/ws',
        'wss://ncali5.daostreet.com/wss',
        'wss://netherlands.bitshares.apasia.tech/ws',
        'wss://new-york.bitshares.apasia.tech/ws',
        'wss://node.bitshares.eu/ws',
        'wss://node.market.rudex.org/wss',
        'wss://nohistory.proxyhosts.info/wss',
        'wss://openledger.hk/wss',
        'wss://paris7.daostreet.com/wss',
        'wss://relinked.com/wss',
        'wss://scali10.daostreet.com/wss',
        'wss://seattle.bitshares.apasia.tech/wss',
        'wss://sg.nodes.bitshares.ws/ws',
        'wss://singapore.bitshares.apasia.tech/ws',
        'wss://status200.bitshares.apasia.tech/wss',
        'wss://us-east-1.bts.crypto-bridge.org/ws',
        'wss://us-la.bitshares.apasia.tech/ws',
        'wss://us-ny.bitshares.apasia.tech/ws',
        'wss://us.nodes.bitshares.ws/wss',
        'wss://valley.bitshares.apasia.tech/ws',
        'wss://ws.gdex.io/ws',
        'wss://ws.gdex.top/wss',
        'wss://ws.hellobts.com/wss',
        'wss://ws.winex.pro/wss'
    ]


def wss_handshake(node):
    global ws
    ws = wss(node, timeout=5)


def wss_query(params):
    query = json_dumps({"method": "call",
                        "params": params,
                        "jsonrpc": "2.0",
                        "id": 1})
    ws.send(query)
    ret = json_loads(ws.recv())
    try:
        return ret['result']  # if there is result key take it
    except:
        return ret


def rpc_market_history(currency_id, asset_id, period, start, stop):

    ret = wss_query(["history",
                     "get_market_history",
                     [currency_id,
                      asset_id,
                      period,
                      to_iso_date(start),
                      to_iso_date(stop)]])
    return ret


def chartdata(pair, start, stop, period):
    pass  # as per extinctionEVENT cryptocompare call


def rpc_lookup_asset_symbols(asset, currency):
    ret = wss_query(['database',
                     'lookup_asset_symbols',
                     [[asset, currency]]])
    asset_id = ret[0]['id']
    asset_precision = ret[0]['precision']
    currency_id = ret[1]['id']
    currency_precision = ret[1]['precision']

    return asset_id, asset_precision, currency_id, currency_precision

def backtest_candles(raw):  # HLOCV numpy arrays

    # gather complete dataset so only one API call is required
    d = {}
    d['unix'] = []
    d['high'] = []
    d['low'] = []
    d['open'] = []
    d['close'] = []
    for i in range(len(raw)):
        d['unix'].append(raw[i]['time'])
        d['high'].append(raw[i]['high'])
        d['low'].append(raw[i]['low'])
        d['open'].append(raw[i]['open'])
        d['close'].append(raw[i]['close'])
    del raw
    d['unix'] = np.array(d['unix'])
    d['high'] = np.array(d['high'])
    d['low'] = np.array(d['low'])
    d['open'] = np.array(d['open'])
    d['close'] = np.array(d['close'])

    # normalize high and low data
    for i in range(len(d['close'])):
        if d['high'][i] > 2 * d['close'][i]:
            d['high'][i] = 2 * d['close'][i]
        if d['low'][i] < 0.5 * d['close'][i]:
            d['low'][i] = 0.5 * d['close'][i]

    return d

def from_iso_date(date):  # returns unix epoch given iso8601 datetime
    return int(time.mktime(time.strptime(str(date),
                                         '%Y-%m-%dT%H:%M:%S')))


def to_iso_date(unix):  # returns iso8601 datetime given unix epoch
    return datetime.utcfromtimestamp(int(unix)).isoformat()


def parse_market_history():

    ap = asset_precision  # quote
    cp = currency_precision  # base
    history = []
    for i in range(len(g_history)):
        h = ((float(int(g_history[i]['high_quote'])) / 10 ** cp) /
            (float(int(g_history[i]['high_base'])) / 10 ** ap))
        l = ((float(int(g_history[i]['low_quote'])) / 10 ** cp) /
            (float(int(g_history[i]['low_base'])) / 10 ** ap))
        o = ((float(int(g_history[i]['open_quote'])) / 10 ** cp) /
            (float(int(g_history[i]['open_base'])) / 10 ** ap))
        c = ((float(int(g_history[i]['close_quote'])) / 10 ** cp) /
            (float(int(g_history[i]['close_base'])) / 10 ** ap))
        cv = (float(int(g_history[i]['quote_volume'])) / 10 ** cp)
        av = (float(int(g_history[i]['base_volume'])) / 10 ** ap)
        vwap = cv / av
        t = int(min(time.time(),
               (from_iso_date(g_history[i]['key']['open']) + 86400)))
        history.append({'high': h,
                        'low': l,
                        'open': o,
                        'close': c,
                        'vwap': vwap,
                        'currency_v': cv,
                        'asset_v': av,
                        'time': t})
    return history

print("\033c")

node_id = 2
calls = 5  # number of requests
candles = 200  # candles per call
period = 86400  # data resolution
asset = 'BTS'
currency = 'USD'

# fetch node list
nodes = public_nodes()
# select one node from list
wss_handshake(nodes[node_id])
# gather cache data to describe asset and currency
asset_id, asset_precision, currency_id, currency_precision = (
    rpc_lookup_asset_symbols(asset, currency))
print(asset_id, asset_precision, currency_id, currency_precision)


full_history = []
now = time.time()
window = period * candles
for i in range((calls - 1), -1, -1):
    print('i', i)
    currency_id = '1.3.121'
    asset_id = '1.3.0'
    start = now - (i + 1) * window
    stop = now - i * window
    g_history = rpc_market_history(currency_id,
                                   asset_id,
                                   period,
                                   start,
                                   stop)
    print(g_history)
    history = parse_market_history()
    full_history += history

pprint(full_history)
print(len(full_history))

data = backtest_candles(full_history)

fig = plt.figure()
ax = plt.axes()
fig.patch.set_facecolor('black')
ax.patch.set_facecolor('0.1')
ax.yaxis.tick_right()
ax.spines['bottom'].set_color('0.5')
ax.spines['top'].set_color(None)
ax.spines['right'].set_color('0.5')
ax.spines['left'].set_color(None)
ax.tick_params(axis='x', colors='0.7', which='both')
ax.tick_params(axis='y', colors='0.7', which='both')
ax.yaxis.label.set_color('0.9')
ax.xaxis.label.set_color('0.9')
plt.yscale('log')

x = data['unix']
plt.plot(x, data['high'], color='white')
plt.plot(x, data['low'], color='white')
plt.plot(x, data['open'], color='aqua')
plt.plot(x, data['close'], color='blue')

plt.show()

RPC call to public node

get_market_history()

Is in graphene format; ie no decimal places, no human readable pricing

(min_to_receive/10^receive_precision) / (amount_to_sell/10^sell_precision)

gives you this:



I give you this:



crypto long, moar coinz short!

- uncle lp

69
Technical Support / Re: Assert Exception: min_to_receive.amount > 0:
« on: February 14, 2019, 08:53:42 pm »
on the backend there are no decimals in prices OR amounts

everything is integers in this format:

(amount_to_sell / 10^precision_of_asset1)
(min_to_receive / 10^precision_of_asset2)

each asset has a precision... if you get too close to its precision... ie trying to sell dust then this will get rounded to zero and rejected.

70
latencyTEST.py

github/litepresence/extinction-event/EV

71
General Discussion / Re: API Node Latency Map
« on: February 14, 2019, 07:08:50 pm »
You can still use this script on your own machine, but I am no longer keeping this live updated; my internet bandwidth is very limited.  Please contact me on telegram @litepresence if you would like to keep a public version alive and I'll point this thread at it.

my github has recently been updated to newer version, you no longer need the basemap, the script will aquire it externally from imgur

72
General Discussion / microDEX <-> metaNODE <-> manualSIGNING
« on: February 14, 2019, 05:29:58 pm »


I have set out to ensure UI buy/sell/cancel ALWAYS works when I push buttons and never have to think about which node to pick, slow connectivity, idiosyncrasies of graphene speak, or the bugs of "full featured software". 

Just on demand buy/sell/cancel.

Go to my github repo...

`github/litepresence/extinction-event/EV`

You get copy of each of these and plop in one folder

microDEX.py
manualSIGNING.py
metaNODE.py


each script is about 50kb; 1500 lines; very small, quick/easy to read

all dependencies are `pip3 install` the stack does NOT require pybitshares

Code: [Select]
SYSTEM REQUIREMENTS
linux / python3

MODULES YOU WILL NEED
ecdsa
numpy
tkinter
requests
secp256k1
websocket-client


metaNODE
is statistically curated public api data
you run this in a separate terminal before launching microDEX

manualSIGNING
is your private authenticated ops api
microDEX imports the broker(order) method from manualSIGNING to sign transactions with a WIF key.  manualSIGNING is a purpose built fork of pybitshares for signing limit orders about 1/40th the size of the full package.

microDEX
is your buy/sell/cancel user interface
built on tkinter, it communicates with metaNODE at nanosecond speed and places orders via manualSIGNING to the fastest nodes in the network.

it runs 24/7 maintaining 100ms response time on button clicks
all buy/sell/cancel ops occur in timed out parallel process to the UI process; nothing can get hung
extremely reactive, 99.99% uptime, never rogue or stale; statistically curated public api data
when new version is available microDEX will inform you at startup and allow in script update

I maintain a "heavily commented", "minimal dependencies", "minimal viable product", "pep8", and "procedural-style" script.

you can demo the platform without providing any acct details

there is also metaNODEwhitepaper and manualSIGNGwhitepaper in my repo

enjoy, pro bono

crypto long, moar coinz short!

-uncle lp





POST SCRIPT:

YES! this stack does take your wif key, and performs ECDSA. 
<THIS SHOULD CONCERN YOU>
Scammers can use these methods to take all ur cryptoz!!!
<THIS SHOULD CONCERN YOU>
You should NOT blindly trust ANYONE to write a GUI wallet for you. 
You should read ANY script with access to your funds before giving it your keys!

73
General Discussion / Re: API Node Latency Map
« on: February 14, 2019, 05:17:34 pm »
What does the large pulsating circle around geographical points indicate? Activity?

the bigger the circle the faster the response time to USA east coast

74
General Discussion / Re: API Node Latency Map
« on: December 13, 2018, 01:05:42 am »
updated repo

- removed whitespace from uploaded images for easier incorporation into user websites
- uploaded basemap.png to repo
- added list of seed nodes to jsonbin under key 'SEEDS' with data ('ip', 'ping', 'geolocation')
- plotting seed nodes on top with yellow dots
- added UTC timestamp to images
- removed misleading green dots in africa from the lens flare in the base map

new sample:




this should satisfy most requirements of issue 1348

https://github.com/bitshares/bitshares-core/issues/1348


75
General Discussion / API Node Latency Map
« on: December 07, 2018, 10:30:21 pm »
for data you go here:

https://api.jsonbin.io/b/5c06e4f71deea01014bd4261/latest#Bitshares_Latency

This jsonbin api is at a stationary location.

I update the latency info hourly via python script; I'm on east coast US.

at the link you will find json dictionary with keys:

['GEO', 'COUNT', 'PING', 'URLS', 'LIVE', 'SOURCE_CODE', 'MAP_URL', 'MISSION', 'UTC', 'UNIX', 'OWNER', 'LOCATION', 'UNIVERSE']

UNIVERSE is all known bitshares public api nodes mentioned in various github projects; I suspect I have the largest known list of bitshares public api domains

URLS are github urls where node lists can be found; this tool does not contain a list of nodes.  Instead it goes to many different repos on github (such as bitshares, cryptobridge, rudex) etc.  where people have configuration files with lists of nodes; if they update their repo with new nodes, the script finds them with web scraping methods

LIVE is a list of tested nodes that respond within 10 seconds and have a head block number that is not stale. 

PING is list of tuples of ping time for each LIVE node

GEO is geo location data (country, city, longitude, latitude) for each LIVE node as provided by ip-api.com or ipinfo.io

COUNT is number of live nodes vs number of nodes in universe

SOURCE_CODE is my github were you can get this tool and run it yourself to produce your own web hosted latency map in distributed fashion.  The latency script will also give you information as to why each down node failed to connect.  A full report looks like this:

https://pastebin.com/JL4DZzwY

You can also pick up copy of metaNODE and ExtinctionEvent while you're there :D

UNIX and UTC are time stamp when this jsonbin was last updated

MAP_URL is a link to a visual image of the data on the jsonbin;
the map url will change every hour!


it will be something like:
https://vgy.me/dgCE1C.png


and look like one frame of this gif





source code is here, WTFPL:

https://github.com/litepresence/extinction-event/blob/master/EV/bitshares-latency.py

todo list... upload 24hr animations instead of still images


thanks to free and easy to use api services that make this project is possible:

ip-api.com
jsonbin.io
vgy.me



Pages: 1 2 3 4 [5] 6 7 8 9 10