mirror of
https://github.com/monero-project/research-lab.git
synced 2024-12-22 19:49:35 +00:00
88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
import MiniNero
|
|
import ed25519
|
|
import binascii
|
|
import PaperWallet
|
|
import cherrypy
|
|
import os
|
|
import time
|
|
import bitmonerod
|
|
import SimpleXMR2
|
|
|
|
def HexSigningPubKey(s):
|
|
return binascii.hexlify(ed25519.publickey(ed25519.encodeint(MiniNero.hexToInt(s))))
|
|
|
|
def Signature(m, sk):
|
|
#note this seems to return nicely sized version of the signature
|
|
#contrast with, i.e. tweetnacl..
|
|
sk2 = ed25519.encodeint(MiniNero.hexToInt(sk))
|
|
pk = ed25519.publickey(sk2)
|
|
return binascii.hexlify(ed25519.signature(m, sk2, pk))
|
|
|
|
def Verify(sig, m, pk):
|
|
return ed25519.checkvalid(binascii.unhexlify(sig), m, binascii.unhexlify(pk))
|
|
|
|
class MiniNeroServer:
|
|
|
|
exposed = True
|
|
|
|
def GET(self, id=None):
|
|
times = str(int(time.time()))
|
|
return (times)
|
|
|
|
def POST(self, signature, Type, timestamp, amount=None, destination=None, pid=None, mixin=None):
|
|
times= int(time.time())
|
|
pubkey = MiniNeroPk
|
|
message = Type+amount.replace('.', 'd')+timestamp+destination
|
|
ver = Verify(signature.encode("utf8"), message.encode("utf8"), pubkey)
|
|
if abs(times - int(timestamp)) > 30:
|
|
ver = False
|
|
return ('fail based on timestamp too old')
|
|
|
|
if Type == 'address':
|
|
if (ver):
|
|
print("do rpc call")
|
|
#bitmonerod.myAddress()
|
|
return ("Your Address is ")
|
|
if Type == 'balance':
|
|
if (ver):
|
|
print("do rpc call")
|
|
#bitmonerod.myAddress()
|
|
return ('your balance is ??')
|
|
if Type == 'send':
|
|
if (ver) :
|
|
#create xmr2 order async, return uuid
|
|
uuid, xmr_amount, xmr_addr, xmr_pid = SimpleXMR2.btc2xmr(destination, amount)
|
|
bitmonerod.send(xmr_addr, float(xmr_amount), xmr_pid, 3)
|
|
return ('order uuid: '+uuid)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
#check if api pubkey is created, if not create it:
|
|
if(os.path.isfile('MiniNeroPubKey.py')):
|
|
from MiniNeroPubKey import *
|
|
try:
|
|
MiniNeroPk
|
|
except NameError:
|
|
MiniNeroSk= PaperWallet.skGen()
|
|
MiniNeroPk= HexSigningPubKey(MiniNeroSk)
|
|
print("Your new api secret key is:")
|
|
print(MiniNeroSk)
|
|
print("You should save this in a password manager")
|
|
print("Your pubkey will be stored in MiniNeroPubKey.py")
|
|
f = open('MiniNeroPubKey.py', 'w')
|
|
f.write("MiniNeroPk = \'"+MiniNeroPk+"\'")
|
|
print("Your MiniNeroServer PubKey is:")
|
|
print(MiniNeroPk)
|
|
|
|
#Launch Cherry Server
|
|
cherrypy.tree.mount(
|
|
MiniNeroServer(), '/api/mininero',
|
|
{'/':
|
|
{'request.dispatch': cherrypy.dispatch.MethodDispatcher()}
|
|
}
|
|
)
|
|
|
|
cherrypy.server.socket_host = '0.0.0.0' #run on metal
|
|
cherrypy.engine.start()
|
|
cherrypy.engine.block()
|