{ "info": { "author": "wetblanketcc", "author_email": "35851045+wetblanketcc@users.noreply.github.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: AsyncIO", "Intended Audience :: Financial and Insurance Industry", "Intended Audience :: Information Technology", "Intended Audience :: Science/Research", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3 :: Only", "Topic :: System :: Networking" ], "description": "**`aiostratum_proxy`** is a Stratum Protocol proxy (ie cryptocurrency/mining) built using Python3. It was built to be a modern, code-concise, **extensible**, and fast replacement for existing aging Stratum Protocol proxy solutions & implementations.\n\n* Requires Python 3.5 or greater (built with `asyncio` using `async`/`await` syntax)\n* Extensible: easily implement new coin/algorithm 'stratum-like' protocols as dynamically-loaded, external Python3 modules (via config file)\n* Can run multiple proxies at the same time (ie. mine different coins on different pools)\n* Each proxy supports up to 65536 miner connections (per pool connection), each mining a separate nonce space (dependent on miner support)\n* Supports plaintext and secure connections (ie. TLS/SSL) for both incoming miner connections and outgoing pool connections\n* Plain socket transport only (ie. not JSONRPC over HTTP, HTTP Push, or HTTP Poll); this is the defacto standard in the cryptocurrency space\n\n#### Donations\n\nI built this on my own time, outside of my day job. If you find this mining proxy useful, donate to help continue development. **I value my time.**\n\n* **BTC**: 1BS4QYAFiya4tsjyvHeY945biKnDj6bRA4\n* **LTC**:\ufeff LTN1LPGnJjHMKq4DcuQYifQgLfT4Phmn9d\n* **ETH**: 0x4B005e68D323bdABD8eeD1D415117Ff1B57b3EC5\n* **BTCP**: b1CACK65UTwzmHGw2VvyozdPsRLMb8utGLg\n* **ZCL**: t1eoqTqyatJzL2rErW83waZLQHZLKuipMbi\n\n#### Installation\n\nInstallation is simple:\n\n```\npip install aiostratum-proxy\n```\n\nHowever, for an isolated and more robust installation, you should consider using Python virtual environments:\n\n```\n# this will create a directory 'containing' the Python3 virtual environment\npython3 -m venv aiostratum_proxy\n\ncd aiostratum_proxy\n\n# this will install the aiostratum-proxy package\nbin/pip install aiostratum-proxy\n\n# verify the installation by checking the package version\nbin/aiostratum-proxy --version\n```\n\n#### Usage\n\nInstallation creates a new command-line shortcut called `aiostratum-proxy`; it has built-in command-line help, just run:\n\n```\nbin/aiostratum-proxy --help\n```\n\nA config file is needed for the proxy to run; you can generate one:\n\n```\nbin/aiostratum-proxy --generate-config > proxy-config.yaml\n```\n\nOpen and edit the generated `proxy-config.yaml` in a text editor. The config file's syntax is YAML ([here's a good guide to YAML](https://github.com/Animosity/CraftIRC/wiki/Complete-idiot's-introduction-to-yaml)).\n\nTo run `aiostratum-proxy`, pass it your edited config file:\n\n```\nbin/aiostratum-proxy --config proxy-config.yaml\n```\n\n\n#### Supported Algorithms/Coins\n\n`aiostratum-proxy` was designed to be modular and extensible when it comes to coin and algorithm support. This is done via miner+pool protocol module pairs (more on this below).\n\nCurrent support includes:\n\n* any coin based on Equihash (ZCash, ZClassic, Bitcoin Gold, Bitcoin Private, etc):\n * miner module: `aiostratum_proxy.protocols.equihash.EquihashWorkerProtocol`\n * pool module: `aiostratum_proxy.protocols.equihash.EquihashPoolProtocol`\n* (**EXPERIMENTAL/UNTESTED**/probably not working just yet) Bitcoin (and related coins):\n * miner module: `aiostratum_proxy.protocols.stratum.StratumWorkerProtocol`\n * pool module: `aiostratum_proxy.protocols.stratum.StratumPoolProtocol`\n\nAs you can see, it is possible for a protocol implementation (ie. both the worker & pool sides) to support multiple coins, assuming they share some common ancestry or have heavily borrowed technical decisions.\n\n#### Add Support for New Coins & Algorithms\n\nThe terms 'Stratum' and 'Stratum Protocol' are used broadly (perhaps too much so) in the cryptocurrency ecosystem. The concept behind the Stratum protocol started with the specific desire to improve the efficiency of Bitcoin mining pools.\n\nIn time, the rise of altcoins demanded a similar approach to managing the communications between miners and pools. For whatever reason, most altcoins have tweaked the original Stratum spec to their needs, borrowing and learning from prior mistakes.\n\nTo add support for a new coin or algorithm, there are two options:\n\n1. Use an existing protocol implementation and tweak; note that this means if there are future changes, it may have cascading impacts (see the Equihash protocol pair as an example, it is based off of the Stratum protocol pair)\n1. Create a new protocol pairing by implementing both `BasePoolProtocol` (to handle connections to pools) and `BaseWorkerProtocol` (to handle incoming miner connections)\n\nFor example, if you were implementing Monero support:\n\n1. Create a new Python module with the Monero 'worker' and 'pool' protocol class implementations\n1. Add the new Monero worker/pool classes to your proxy config file\n1. You will need to ensure your Python module is visible within `PYTHONPATH` to use it within your proxy YAML config file\n1. **Consider [submitting it as a pull request](https://github.com/wetblanketcc/aiostratum_proxy/pulls) to `aiostratum_proxy`!** If so, you would place the new module alongside the existing Equihash implementation at `aiostratum_proxy.protocols.monero`\n\n\n#### Future Considerations\n\nCommunity involvement is appreciated. [Code review](https://github.com/wetblanketcc/aiostratum_proxy), [pull requests for bug fixes & new protocols](https://github.com/wetblanketcc/aiostratum_proxy/pulls), [reporting issues](https://github.com/wetblanketcc/aiostratum_proxy/issues), spreading the word - all appreciated.\n\n##### TODO:\n\nCommunity feedback on the following is appreciated.\n\n* More coin/algo support\n* Complete `mining.set_extranonce` support\n* Consider additional authentication improvements (currently miners aren't authenticated)\n * authenticate miners locally within proxy via config\n * authenticate miners via passthru to pool; would require per-pool mappings of username/password for fallback pools in config?\n* Consider immediate reply to miner share submissions instead of waiting for pool response\n* HAProxy `PROXY` protocol support\n\n#### Related & Informative Links\n\n1. [Stratum Protocol Specification](https://slushpool.com/help/manual/stratum-protocol)\n1. [Stratum Protocol Specification Draft](https://docs.google.com/document/d/17zHy1SUlhgtCMbypO8cHgpWH73V5iUQKk_0rWvMqSNs/edit?hl=en_US)\n1. [Stratum Protocol Bitcoin Wiki Page](https://en.bitcoin.it/wiki/Stratum_mining_protocol)\n1. [Original Bitcointalk.org Stratum Announcement](https://bitcointalk.org/index.php?topic=108533.0)\n1. [Follow-on Bitcointalk.org Stratum Discussion](https://bitcointalk.org/index.php?topic=557991.0)\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/wetblanketcc/aiostratum_proxy", "keywords": "async asyncio aio crypto cryptocurrency blockchain mining stratum protocol proxy pool equihash bitcoinlitecoin", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "aiostratum-proxy", "package_url": "https://pypi.org/project/aiostratum-proxy/", "platform": "", "project_url": "https://pypi.org/project/aiostratum-proxy/", "project_urls": { "Homepage": "https://github.com/wetblanketcc/aiostratum_proxy" }, "release_url": "https://pypi.org/project/aiostratum-proxy/1.1/", "requires_dist": [ "aiojsonrpc2 (==1.0.0)", "PyYAML (==3.12)" ], "requires_python": ">=3.5", "summary": "Python3 asyncio stratum protocol mining proxy", "version": "1.1" }, "last_serial": 4349456, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "5c7fa5f0b6e3e0af998ec1da83b2edc7", "sha256": "708f67de44eb2da143d112029d3bcb5899e0933b88052b75e8899f128da7b98a" }, "downloads": -1, "filename": "aiostratum_proxy-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5c7fa5f0b6e3e0af998ec1da83b2edc7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 19968, "upload_time": "2018-03-21T02:52:54", "url": "https://files.pythonhosted.org/packages/8d/c9/145fd30935ede0769e116f4556030220768e85e4497af3e9c88292aef44a/aiostratum_proxy-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a0d717bbd432804cb510a1ba8dd9cbea", "sha256": "810d30451bd8df3ee46a10210dfdd4137328521d8650c6bf10b69a10eac8f7b6" }, "downloads": -1, "filename": "aiostratum_proxy-1.0.0.tar.gz", "has_sig": false, "md5_digest": "a0d717bbd432804cb510a1ba8dd9cbea", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 14417, "upload_time": "2018-03-21T02:52:56", "url": "https://files.pythonhosted.org/packages/24/9e/cd69957232bd89dda9d15008325f015cf61c69805d6f9038061545a9d3f8/aiostratum_proxy-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "fe95309ce4e9a480ba4bbec2a679f67f", "sha256": "e4c6884367da99692594f576c188e9da30b6db46fd1415ab36b4bb1013bf5a19" }, "downloads": -1, "filename": "aiostratum_proxy-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fe95309ce4e9a480ba4bbec2a679f67f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 15949, "upload_time": "2018-07-12T18:16:45", "url": "https://files.pythonhosted.org/packages/29/07/c1e3157179515561853febf2071459d4dc70795e6065c839a3fefc650069/aiostratum_proxy-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "08c8212c1a7bd6779dedb11e615944c4", "sha256": "ba9c0416a199e9483ee2eae0349fc845cbc0541f105e587879f8967cc79566bf" }, "downloads": -1, "filename": "aiostratum_proxy-1.0.1.tar.gz", "has_sig": false, "md5_digest": "08c8212c1a7bd6779dedb11e615944c4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 14293, "upload_time": "2018-07-12T18:16:45", "url": "https://files.pythonhosted.org/packages/14/ed/33f609f8b0d4e528275eb61a499335f916faf353e98d15b094be6fd75ca4/aiostratum_proxy-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "ae2c333fe666a672a13faa3e3b27e2da", "sha256": "aee9eb3a01672172d3c6785e8bfabcd32779f3dca11e7e4214fbcda7dfdff647" }, "downloads": -1, "filename": "aiostratum_proxy-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ae2c333fe666a672a13faa3e3b27e2da", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 15981, "upload_time": "2018-07-13T17:36:03", "url": "https://files.pythonhosted.org/packages/29/6c/7f1eaf253cae0ea73ecb0c8639b8964cb7bec0ac04241bd1be732247824a/aiostratum_proxy-1.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b94623031b198eea66104d8114594a6e", "sha256": "9c8c9d149732b83c40108c56cbbd087eeb3bd590416144a5ce3284fc8957494d" }, "downloads": -1, "filename": "aiostratum_proxy-1.0.2.tar.gz", "has_sig": false, "md5_digest": "b94623031b198eea66104d8114594a6e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 14190, "upload_time": "2018-07-13T17:36:05", "url": "https://files.pythonhosted.org/packages/c1/ec/f412fc36c72929849e78cd4f84ef63bae07f4f74d736381fc46e676a136a/aiostratum_proxy-1.0.2.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "4079a797b6f81a1291fb4db087e17f4f", "sha256": "3f11c04a77237b460170da1ebbea11c511543d6f9a1523a692f378ce63290e1a" }, "downloads": -1, "filename": "aiostratum_proxy-1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "4079a797b6f81a1291fb4db087e17f4f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 15959, "upload_time": "2018-10-07T14:44:14", "url": "https://files.pythonhosted.org/packages/78/08/2a407073bdea2f5542ce9385bfa35380c9a6d64dffd629cd996fd63f51d5/aiostratum_proxy-1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "037b7e7fe52bc6b9c2f8f5de82eabd1d", "sha256": "7339fae8899aed6d2e98ef8a6ba1f283818b843cd8603af0e6e3a17e510eb97e" }, "downloads": -1, "filename": "aiostratum_proxy-1.1.tar.gz", "has_sig": false, "md5_digest": "037b7e7fe52bc6b9c2f8f5de82eabd1d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 14196, "upload_time": "2018-10-07T14:44:16", "url": "https://files.pythonhosted.org/packages/84/ab/9ec2e756825e42f0bba4525a0d3d3c3740cea0305aac9ffceb8d6813cfda/aiostratum_proxy-1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4079a797b6f81a1291fb4db087e17f4f", "sha256": "3f11c04a77237b460170da1ebbea11c511543d6f9a1523a692f378ce63290e1a" }, "downloads": -1, "filename": "aiostratum_proxy-1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "4079a797b6f81a1291fb4db087e17f4f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 15959, "upload_time": "2018-10-07T14:44:14", "url": "https://files.pythonhosted.org/packages/78/08/2a407073bdea2f5542ce9385bfa35380c9a6d64dffd629cd996fd63f51d5/aiostratum_proxy-1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "037b7e7fe52bc6b9c2f8f5de82eabd1d", "sha256": "7339fae8899aed6d2e98ef8a6ba1f283818b843cd8603af0e6e3a17e510eb97e" }, "downloads": -1, "filename": "aiostratum_proxy-1.1.tar.gz", "has_sig": false, "md5_digest": "037b7e7fe52bc6b9c2f8f5de82eabd1d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 14196, "upload_time": "2018-10-07T14:44:16", "url": "https://files.pythonhosted.org/packages/84/ab/9ec2e756825e42f0bba4525a0d3d3c3740cea0305aac9ffceb8d6813cfda/aiostratum_proxy-1.1.tar.gz" } ] }