{"id":14967016,"url":"https://github.com/golemfactory/devp2p-playground","last_synced_at":"2026-03-11T03:30:54.960Z","repository":{"id":86423495,"uuid":"97466258","full_name":"golemfactory/devp2p-playground","owner":"golemfactory","description":"Random experimentation with devp2p","archived":false,"fork":false,"pushed_at":"2017-09-28T14:39:44.000Z","size":65,"stargazers_count":2,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"choke","last_synced_at":"2025-04-06T00:03:07.969Z","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":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/golemfactory.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2017-07-17T10:53:58.000Z","updated_at":"2022-10-27T07:09:41.000Z","dependencies_parsed_at":"2023-04-02T11:34:39.224Z","dependency_job_id":null,"html_url":"https://github.com/golemfactory/devp2p-playground","commit_stats":{"total_commits":63,"total_committers":1,"mean_commits":63.0,"dds":0.0,"last_synced_commit":"72a80ca221cffa770740a85bed293565f0eb9eaa"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/golemfactory/devp2p-playground","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golemfactory%2Fdevp2p-playground","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golemfactory%2Fdevp2p-playground/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golemfactory%2Fdevp2p-playground/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golemfactory%2Fdevp2p-playground/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/golemfactory","download_url":"https://codeload.github.com/golemfactory/devp2p-playground/tar.gz/refs/heads/choke","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golemfactory%2Fdevp2p-playground/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30369379,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"online","status_checked_at":"2026-03-11T02:00:07.027Z","response_time":84,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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-09-24T13:37:17.915Z","updated_at":"2026-03-11T03:30:54.929Z","avatar_url":"https://github.com/golemfactory.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# An app for testing various DevP2P proof-of-concepts\n\n## Running\n\nUse `run_one.py` to start one node, or `run_many.py` to start multiple nodes in one process.\nThey both take a list of additional bootstrap nodes as arguments (`enode://` URIs).\nEdit the scripts to set number of nodes, min/max number of peers, RNG seed, etc.\nThe RNG seed from the run scripts is used for generating keypairs, make sure you don't have multiple nodes with the same keypair.\n\nBy default, each node will derive its port number by adding its node number to 29870. \n\nThere is currently no NAT traversal in pydevp2p.\nFor node A to connect to node B, node B's devp2p port must be reachable from node A, and node A must receive the address and port under which node B is reachable from it, either explicitely as a bootstrap node, or from a neighbour that can reach node B under _the same address_.\nSo eg. if both A and B are behind NAT, and node C is not, and both A and B are connected to C, then A won't be able to connect to B's private address. \n\n## TCP console\n\nEach node will start TCP console at port equal to its devp2p port minus 100 (eg.\nnode 12 will have devp2p port 29882 and console port 29782). You can connect to it with telnet, netcat, etc.\n\nAnything you type that starts with `/` will be handled by respective `cmd_...` method in `app.py` (eg. `/foo` will be handled by `cmd_foo`).\nAnything you type that doesn't start with `/` will be handled by `cmd_chat`.\n\n## PoCs:\n\nThe following proof of concepts are implemented:\n- broadcast chat (useful for testing connectivity)\n- direct file transfer (`/file \u003cfilename\u003e` command)\n- bittorrent-over-devp2p file transfer (`/seed \u003cfilename\u003e` command)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgolemfactory%2Fdevp2p-playground","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgolemfactory%2Fdevp2p-playground","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgolemfactory%2Fdevp2p-playground/lists"}