|
|
@@ -2,9 +2,17 @@
|
|
|
|
|
|
import argparse
|
|
|
from urllib.parse import urlparse
|
|
|
+
|
|
|
+import flask
|
|
|
+import json
|
|
|
+app = flask.Flask(__name__)
|
|
|
+
|
|
|
from src.crypto import Signing
|
|
|
from src.protocol import Protocol
|
|
|
from src.block import GENESIS_BLOCK
|
|
|
+from src.chainbuilder import ChainBuilder
|
|
|
+from src.mining import Miner
|
|
|
+from src.transaction import TransactionInput
|
|
|
|
|
|
def parse_addr_port(val):
|
|
|
url = urlparse("//" + val)
|
|
|
@@ -17,6 +25,29 @@ def parse_addr_port(val):
|
|
|
assert url.hostname is not None
|
|
|
return (url.hostname, url.port)
|
|
|
|
|
|
+def rpc_server(port, chainbuilder):
|
|
|
+
|
|
|
+ @app.route("/transactions", methods=['POST'])
|
|
|
+ def get_transactions_for_key():
|
|
|
+ key = Signing(flask.request.data)
|
|
|
+ transactions = set()
|
|
|
+ outputs = set()
|
|
|
+ for b in chainbuilder.primary_block_chain.blocks:
|
|
|
+ for t in b.transactions:
|
|
|
+ for i, target in enumerate(t.targets):
|
|
|
+ if target.recipient_pk == key:
|
|
|
+ transactions.add(t)
|
|
|
+ outputs.add(TransactionInput(t.get_hash(), i))
|
|
|
+ for b in chainbuilder.primary_block_chain.blocks:
|
|
|
+ for t in b.transactions:
|
|
|
+ for inp in t.inputs:
|
|
|
+ if inp in outputs:
|
|
|
+ transactions.add(t)
|
|
|
+
|
|
|
+ return json.dumps([t.to_json_compatible() for t in transactions])
|
|
|
+
|
|
|
+ app.run(port=port)
|
|
|
+
|
|
|
def main():
|
|
|
parser = argparse.ArgumentParser(description="Blockchain Miner.")
|
|
|
parser.add_argument("--listen-address", default="",
|
|
|
@@ -25,8 +56,10 @@ def main():
|
|
|
help="The port where the P2P server should listen. Defaults a dynamically assigned port.")
|
|
|
parser.add_argument("--mining-pubkey", type=argparse.FileType('rb'),
|
|
|
help="The public key where mining rewards should be sent to. No mining is performed if this is left unspecified.")
|
|
|
- parser.add_argument("--bootstrap-peer", action='append', type=parse_addr_port,
|
|
|
+ parser.add_argument("--bootstrap-peer", action='append', type=parse_addr_port, default=[],
|
|
|
help="Addresses of other P2P peers in the network.")
|
|
|
+ parser.add_argument("--rpc-port", type=int, default=40203,
|
|
|
+ help="The port number where the wallet can find an RPC server.")
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
@@ -36,11 +69,11 @@ def main():
|
|
|
args.mining_pubkey.close()
|
|
|
miner = Miner(proto, pubkey)
|
|
|
miner.start_mining()
|
|
|
+ chainbuilder = miner.chainbuilder
|
|
|
+ else:
|
|
|
+ chainbuilder = ChainBuilder(proto)
|
|
|
|
|
|
- # TODO: start RPC
|
|
|
- import time
|
|
|
- while True:
|
|
|
- time.sleep(2**31)
|
|
|
+ rpc_server(args.rpc_port, chainbuilder)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
main()
|