Initial commit
This commit is contained in:
commit
e143984090
BIN
chronograf/chronograf-v1.db
Normal file
BIN
chronograf/chronograf-v1.db
Normal file
Binary file not shown.
36
docker-compose.yml
Normal file
36
docker-compose.yml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
version: "2"
|
||||||
|
|
||||||
|
services:
|
||||||
|
rng:
|
||||||
|
build: rng
|
||||||
|
ports:
|
||||||
|
- "8001:80"
|
||||||
|
|
||||||
|
hasher:
|
||||||
|
build: hasher
|
||||||
|
ports:
|
||||||
|
- "8002:80"
|
||||||
|
|
||||||
|
worker:
|
||||||
|
build: worker
|
||||||
|
environment:
|
||||||
|
- INFLUXDB_DB=chocominer
|
||||||
|
- INFLUXDB_USER=chocominer
|
||||||
|
- INFLUXDB_USER_PASSWORD=Ru5icohx6ic8eiVaejeequ6aiMav1Oa
|
||||||
|
- USER
|
||||||
|
|
||||||
|
influxdb:
|
||||||
|
image: influxdb:alpine
|
||||||
|
environment:
|
||||||
|
- INFLUXDB_DB=chocominer
|
||||||
|
- INFLUXDB_READ_USER=chronograf
|
||||||
|
- INFLUXDB_READ_USER_PASSWORD=eBoo8geingie8ziejeeg8bein6Yai1a
|
||||||
|
- INFLUXDB_WRITE_USER=chocominer
|
||||||
|
- INFLUXDB_WRITE_USER_PASSWORD=Ru5icohx6ic8eiVaejeequ6aiMav1Oa
|
||||||
|
|
||||||
|
chronograf:
|
||||||
|
image: chronograf:alpine
|
||||||
|
volumes:
|
||||||
|
- ./chronograf:/var/lib/chronograf
|
||||||
|
ports:
|
||||||
|
- "8888:8888"
|
7
hasher/Dockerfile
Normal file
7
hasher/Dockerfile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
FROM ruby:alpine
|
||||||
|
RUN apk add --update build-base curl
|
||||||
|
RUN gem install sinatra
|
||||||
|
RUN gem install thin
|
||||||
|
ADD hasher.rb /
|
||||||
|
CMD ["ruby", "hasher.rb"]
|
||||||
|
EXPOSE 80
|
18
hasher/hasher.rb
Normal file
18
hasher/hasher.rb
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
require 'digest'
|
||||||
|
require 'sinatra'
|
||||||
|
require 'socket'
|
||||||
|
|
||||||
|
set :bind, '0.0.0.0'
|
||||||
|
set :port, 80
|
||||||
|
|
||||||
|
post '/' do
|
||||||
|
# Simulate a bit of delay
|
||||||
|
sleep 0.1
|
||||||
|
content_type 'text/plain'
|
||||||
|
"#{Digest::SHA2.new().update(request.body.read)}"
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/' do
|
||||||
|
"HASHER running on #{Socket.gethostname}\n"
|
||||||
|
end
|
||||||
|
|
5
rng/Dockerfile
Normal file
5
rng/Dockerfile
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
FROM python:alpine
|
||||||
|
RUN pip install Flask
|
||||||
|
COPY rng.py /
|
||||||
|
CMD ["python", "rng.py"]
|
||||||
|
EXPOSE 80
|
31
rng/rng.py
Normal file
31
rng/rng.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
from flask import Flask, Response
|
||||||
|
import os
|
||||||
|
import socket
|
||||||
|
import time
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# Enable debugging if the DEBUG environment variable is set and starts with Y
|
||||||
|
app.debug = os.environ.get("DEBUG", "").lower().startswith('y')
|
||||||
|
|
||||||
|
hostname = socket.gethostname()
|
||||||
|
|
||||||
|
urandom = os.open("/dev/urandom", os.O_RDONLY)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def index():
|
||||||
|
return "RNG running on {}\n".format(hostname)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/<int:how_many_bytes>")
|
||||||
|
def rng(how_many_bytes):
|
||||||
|
# Simulate a little bit of delay
|
||||||
|
time.sleep(0.1)
|
||||||
|
return Response(
|
||||||
|
os.read(urandom, how_many_bytes),
|
||||||
|
content_type="application/octet-stream")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host="0.0.0.0", port=80, threaded=False)
|
5
worker/Dockerfile
Normal file
5
worker/Dockerfile
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
FROM python:alpine
|
||||||
|
RUN pip install influxdb
|
||||||
|
RUN pip install requests
|
||||||
|
COPY worker.py /
|
||||||
|
CMD ["python", "worker.py"]
|
103
worker/worker.py
Normal file
103
worker/worker.py
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import requests
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
from influxdb import InfluxDBClient
|
||||||
|
|
||||||
|
DEBUG = os.environ.get("DEBUG", "").lower().startswith("y")
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
if DEBUG:
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
else:
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
logging.getLogger("requests").setLevel(logging.WARNING)
|
||||||
|
|
||||||
|
client = InfluxDBClient('influxdb', 8086, os.environ.get("INFLUXDB_USER", "chocominer"), os.environ.get("INFLUXDB_USER_PASSWORD", "chocominer"), os.environ.get("INFLUXDB_DB", "chocominer"))
|
||||||
|
|
||||||
|
def get_random_bytes():
|
||||||
|
r = requests.get("http://rng/32")
|
||||||
|
return r.content
|
||||||
|
|
||||||
|
|
||||||
|
def hash_bytes(data):
|
||||||
|
r = requests.post("http://hasher/",
|
||||||
|
data=data,
|
||||||
|
headers={"Content-Type": "application/octet-stream"})
|
||||||
|
hex_hash = r.text
|
||||||
|
return hex_hash
|
||||||
|
|
||||||
|
def current_chunk():
|
||||||
|
r = requests.get("https://virli.nemunai.re/chunk")
|
||||||
|
return r.content.decode()
|
||||||
|
|
||||||
|
def claim_chunk(random_bytes):
|
||||||
|
r = requests.post("https://virli.nemunai.re/chunk",
|
||||||
|
data='{"proof": "' + random_bytes + '", "login": "' + os.environ.get("USER", "nemunaire") + '"}',
|
||||||
|
headers={"Content-Type": "application/json"})
|
||||||
|
return r.content
|
||||||
|
|
||||||
|
|
||||||
|
chunk = "12"
|
||||||
|
def update_chunk():
|
||||||
|
global chunk
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
chunk = current_chunk()
|
||||||
|
time.sleep(1)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def work_loop(interval=1):
|
||||||
|
deadline = 0
|
||||||
|
loops_done = 0
|
||||||
|
while True:
|
||||||
|
if time.time() > deadline:
|
||||||
|
log.info("{} units of work done, updating hash counter"
|
||||||
|
.format(loops_done))
|
||||||
|
client.write_points([{
|
||||||
|
"measurement": "hashes",
|
||||||
|
"fields": {
|
||||||
|
"value": loops_done
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
loops_done = 0
|
||||||
|
deadline = time.time() + interval
|
||||||
|
work_once()
|
||||||
|
loops_done += 1
|
||||||
|
|
||||||
|
|
||||||
|
def work_once():
|
||||||
|
log.debug("Doing one unit of work")
|
||||||
|
time.sleep(0.1)
|
||||||
|
random_bytes = get_random_bytes()
|
||||||
|
hex_hash = hash_bytes(random_bytes + chunk[0].encode())
|
||||||
|
log.info("Nugget found: {}...{} (looking for {})".format(hex_hash[:8], hex_hash[-2:], chunk[1:]))
|
||||||
|
client.write_points([{
|
||||||
|
"measurement": "nuggets",
|
||||||
|
"fields": {
|
||||||
|
"value": str(hex_hash),
|
||||||
|
"proof": random_bytes.hex(),
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
|
||||||
|
if hex_hash.startswith(chunk[1:]) and claim_chunk(random_bytes.hex()) == b"true":
|
||||||
|
log.debug("CHUNK FOUND \o/")
|
||||||
|
client.write_points([{
|
||||||
|
"measurement": "chunks",
|
||||||
|
"fields": {
|
||||||
|
"value": str(hex_hash),
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
threading.Thread(target=update_chunk).start()
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
work_loop()
|
||||||
|
except:
|
||||||
|
log.exception("In work loop:")
|
||||||
|
log.error("Waiting 10s and restarting.")
|
||||||
|
time.sleep(10)
|
Reference in New Issue
Block a user