{"id":19830686,"url":"https://github.com/crytic/fluxture","last_synced_at":"2025-07-03T14:41:00.585Z","repository":{"id":37072587,"uuid":"306871516","full_name":"crytic/fluxture","owner":"crytic","description":"A crawling framework for blockchains and peer-to-peer systems","archived":false,"fork":false,"pushed_at":"2023-09-04T22:06:59.000Z","size":207,"stargazers_count":46,"open_issues_count":3,"forks_count":9,"subscribers_count":17,"default_branch":"master","last_synced_at":"2025-05-22T23:51:31.358Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crytic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-10-24T11:45:46.000Z","updated_at":"2024-03-04T15:08:11.000Z","dependencies_parsed_at":"2025-05-01T15:46:20.600Z","dependency_job_id":null,"html_url":"https://github.com/crytic/fluxture","commit_stats":{"total_commits":160,"total_committers":4,"mean_commits":40.0,"dds":"0.10624999999999996","last_synced_commit":"7c16b0c949b53af6fddfe6602ea86e482bacd29f"},"previous_names":["trailofbits/fluxture"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/crytic/fluxture","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crytic%2Ffluxture","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crytic%2Ffluxture/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crytic%2Ffluxture/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crytic%2Ffluxture/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crytic","download_url":"https://codeload.github.com/crytic/fluxture/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crytic%2Ffluxture/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260552871,"owners_count":23026918,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-12T11:24:44.055Z","updated_at":"2025-07-03T14:41:00.555Z","avatar_url":"https://github.com/crytic.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fluxture\n\n[![PyPI version](https://badge.fury.io/py/fluxture.svg)](https://badge.fury.io/py/fluxture)\n[![Tests](https://github.com/trailofbits/fluxture/workflows/Tests/badge.svg)](https://github.com/trailofbits/fluxture/actions)\n[![Slack Status](https://slack.empirehacking.nyc/badge.svg)](https://slack.empirehacking.nyc)\n\nFluxture is a lightweight crawler for peer-to-peer networks like Blockchains. It currently supports the latest version\nof the Bitcoin protocol: 70015. It implements the minimum amount of the Bitcoin protocol necessary to collect geographic\nand topological information.\n\n## Quickstart\n\n```commandline\npip3 install fluxture\n```\n\nOr, to install from source (_e.g._, for development):\n\n```commandline\n$ git clone https://github.com/trailofbits/fluxture\n$ cd fluxture\n$ pip3 install -e '.[dev]'\n```\n\n## Usage\n\nTo crawl the Bitcoin network, run:\n\n```commandline\nfluxture crawl bitcoin --database crawl.db\n```\n\nThe crawl database is a SQLite database that can be reused between crawls.\n\n## Geolocation\n\nFluxture uses the MaxMind GeoLite2 City database for geolocating nodes based upon their IP address. Various Fluxture\ncommands will either require a path to the database, or a MaxMind license key (which will be used to automatically\ndownload the database). You can sign up for a free MaxMind license key,\n[here](https://www.maxmind.com/en/geolite2/signup).\n\nA KML file (which can be imported to Google Maps or Google Earth) can be generated from a crawl using:\n\n```commandline\nfluxture kml --group-by ip crawl.db output.kml\n```\n\nThe geolocation database can be updated from MaxMind by running:\n\n```commandline\nfluxture update-geo-db\n```\n\nAn existing crawl database can be re-analyzed for missing or updated geolocations (_e.g._, from an updated MaxMind database) by running:\n\n```commandline\nfluxture geolocate crawl.db\n```\n\n## Topological Analysis\n\nFluxture can calculate topological statistics about the centrality of a crawled network by running:\n\n```commandline\nfluxture topology crawl.db\n```\n\n## Programmatic Interface\n\n```python\nfrom fluxture.crawl_schema import CrawlDatabase\n\nwith CrawlDatabase(\"crawl.db\") as db:\n    for node in db.nodes:\n        print(f\"Node {node.ip}:{node.port} {node.state!s}\")\n        location = node.get_location()\n        if location is not None:\n            print(f\"\\tLocation:\\t{location.continent_code}\\t{location.country_code}\\t{location.city}\")\n        else:\n            print(\"\\tLocation:\\t?\")\n        version = node.get_version()\n        if version is not None:\n            print(f\"\\tVersion:\\t{version.version!s}\")\n        else:\n            print(\"\\tVersion:\\t?\")\n        print(f\"\\tOut-Edges:\\t{', '.join(str(neighbor.ip) for neighbor in node.get_latest_edges())}\")\n```\n\n## License and Acknowledgements\n\nThis research was developed by [Trail of Bits](https://www.trailofbits.com/) based upon work supported by DARPA under\nContract No. HR001120C0084.  Any opinions, findings and conclusions or recommendations expressed in this material are\nthose of the authors and do not necessarily reflect the views of the United States Government or DARPA.\nIt is licensed under the [Apache 2.0 license](LICENSE). © 2020–2021, Trail of Bits.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrytic%2Ffluxture","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrytic%2Ffluxture","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrytic%2Ffluxture/lists"}