twister-data-guard/follower.py

88 lines
2.5 KiB
Python
Raw Normal View History

2021-06-26 12:32:44 +03:00
#!/usr/bin/python
#
# Auto-following/reading bot written in Python 2 has a mission to safe distributed data shared in the twister network
2021-06-26 12:32:44 +03:00
# (https://github.com/twisterarmy/twister-data-guard)
# This script based on the official usernameCrawler
# (https://github.com/miguelfreitas/twister-core/blob/master/contrib/usernameCrawler.py)
#
# Downloaded data is cached in a python pickle file, so it may be executed
# again and it won't need to get everything all over again (you may run it
# from cron scripts, for example)
2021-06-26 11:57:31 +03:00
2021-06-26 12:32:44 +03:00
import sys, cPickle
dbFileName = "twisterDataGuard.pickle" # service database file
nodeUserName = "twisterdataguard" # twister wallet (user)
2021-06-27 03:02:51 +03:00
blocksInStep = 100 # locks processing by the one step
squattersStop = 20 # max users per block. Reset the blocksInStep on this quantity to prevent CPU overload
class MyDb:
lastBlockHash = 0
dataLock = False
2021-06-26 12:32:44 +03:00
try:
from bitcoinrpc.authproxy import AuthServiceProxy
except ImportError as exc:
sys.stderr.write("Error: install python-bitcoinrpc (https://github.com/jgarzik/python-bitcoinrpc)\n")
exit(-1)
serverUrl = "http://user:pwd@127.0.0.1:28332"
if len(sys.argv) > 1:
serverUrl = sys.argv[1]
squattersStopCurrent = squattersStop
2021-06-26 12:32:44 +03:00
twister = AuthServiceProxy(serverUrl)
try:
db = cPickle.load(open(dbFileName))
nextHash = db.lastBlockHash
dataLock = db.dataLock
2021-06-26 12:32:44 +03:00
except:
db = MyDb()
nextHash = twister.getblockhash(0)
dataLock = db.dataLock
if not dataLock:
db.dataLock = True
cPickle.dump(db, open(dbFileName, "w"))
print "blockchain reading..."
2021-06-26 12:32:44 +03:00
while True:
2021-06-26 12:32:44 +03:00
block = twister.getblock(nextHash)
db.lastBlockHash = block["hash"]
2021-06-26 16:11:12 +03:00
if squattersStopCurrent < 0:
db.dataLock = False
break
blocksInStep = blocksInStep - 1
if blocksInStep < 0:
db.dataLock = False
break
2021-06-26 16:11:12 +03:00
print "read block", str(block["height"])# + "\r",
2021-06-26 16:11:12 +03:00
squattersStopCurrent = squattersStop
for u in block["usernames"]:
print "follow", u
twister.follow(nodeUserName, [u])
squattersStopCurrent = squattersStopCurrent - 1
if block.has_key("nextblockhash"):
nextHash = block["nextblockhash"]
else:
print "database is up to date..."
break
2021-06-26 16:11:12 +03:00
cPickle.dump(db, open(dbFileName, "w"))
2021-06-26 12:32:44 +03:00
print "task completed."
2021-06-26 12:32:44 +03:00
else:
print "operation locked by the running process."