Foundatio
FoundatioFx/Foundatio
A skill your agent uses when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs.
Help users discover Ethereum peer addresses over devp2p when they don't have an enode:// URL yet — discv4 Kademlia UDP discovery, discv5 authenticated discovery, DNS ENR-tree bootstrapping…
$ npx skills add Nethereum/Nethereum --skill devp2p-peer-discovery -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Nethereum/Nethereum devp2p-peer-discovery --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-peer-discovery .claude/skills/devp2p-peer-discovery && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "devp2p-peer-discovery" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-peer-discovery into .claude/skills/devp2p-peer-discovery/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-peer-discovery", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-peer-discoveryType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Nethereum/Nethereum --skill devp2p-peer-discovery -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Nethereum/Nethereum devp2p-peer-discovery --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-peer-discovery .agents/skills/devp2p-peer-discovery && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "devp2p-peer-discovery" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-peer-discovery into .agents/skills/devp2p-peer-discovery/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-peer-discovery", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Nethereum/Nethereum --skill devp2p-peer-discovery -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Nethereum/Nethereum devp2p-peer-discovery --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-peer-discovery .cursor/skills/devp2p-peer-discovery && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "devp2p-peer-discovery" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-peer-discovery into .cursor/skills/devp2p-peer-discovery/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-peer-discovery", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Nethereum/Nethereum.git --path plugins/nethereum-skills/skills/devp2p-peer-discovery--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Nethereum/Nethereum --skill devp2p-peer-discovery -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Nethereum/Nethereum devp2p-peer-discovery --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-peer-discovery .gemini/skills/devp2p-peer-discovery && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "devp2p-peer-discovery" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-peer-discovery into .gemini/skills/devp2p-peer-discovery/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-peer-discovery", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Nethereum/Nethereum devp2p-peer-discoveryInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Nethereum/Nethereum --skill devp2p-peer-discovery -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-peer-discovery .github/skills/devp2p-peer-discovery && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "devp2p-peer-discovery" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-peer-discovery into .github/skills/devp2p-peer-discovery/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-peer-discovery", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Nethereum/Nethereum --skill devp2p-peer-discovery -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Nethereum/Nethereum devp2p-peer-discovery --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-peer-discovery .opencode/skills/devp2p-peer-discovery && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "devp2p-peer-discovery" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-peer-discovery into .opencode/skills/devp2p-peer-discovery/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-peer-discovery", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
devp2p-peer-discoveryHelp users discover Ethereum peer addresses over devp2p when they don't have an enode:// URL yet — discv4 Kademlia UDP discovery, discv5 authenticated discovery, DNS ENR-tree bootstrapping…
Devp2p Peer Discovery is an agent skill from Nethereum/Nethereum. Help users discover Ethereum peer addresses over devp2p when they don't have an enode:// URL yet — discv4 Kademlia UDP discovery, discv5 authenticated discovery, DNS ENR-tree bootstrapping (EIP-1459), or persisting a stable node identity/peer cache with Nethereum (.NET). Use this skill whenever the user mentions peer discovery, discv4, discv5, ENR, enode, finding Ethereum nodes, bootnodes, DNS discovery tree, or persisting a node key/peer list across restarts.
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs. It works with Ethereum and .NET. The repository describes itself as: Ethereum .Net cross platform integration library. The licence is MIT.
Read from SKILL.md and the folder at commit 229f278. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dotnetFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.nethereum.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Devp2p Peer Discovery loads about 2.7k tokens when it runs. Until then it costs about 122 tokens; SKILL.md has 1,044 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Nethereum/Nethereum at commit 229f278, republished under its MIT licence (© Nethereum). 1,044 words, ~2,691 tokens.
.claude/skills/devp2p-peer-discovery/SKILL.md (or your agent's skills folder).Dialing a peer (see devp2p-peer-connect) assumes you already have an enode:// URL. In practice, a node starting cold has none — it needs to find other nodes on the network before it can dial anyone. This skill covers the three discovery mechanisms Nethereum implements — discv4 (the original Kademlia UDP protocol), discv5 (its authenticated successor), and DNS ENR-tree lookup (EIP-1459, for bootstrapping from a small number of well-known DNS names) — plus two supporting pieces every long-running node needs: a stable node identity and a memory of which peers were worth reconnecting to.
dotnet add package Nethereum.DevP2PYou'll want a persisted node identity (below) rather than a throwaway EthECKey.GenerateKey() — discovery is precisely the mechanism by which other nodes learn your enode:// and remember you, so a node-id that changes every restart defeats the point.
A stable enode across restarts is what lets a remote peer durably trust your node by node-id — bond once, reconnect for weeks. NodeKeyStore.LoadOrCreate loads a raw 32-byte private key from path, or generates and saves one on first run:
using Nethereum.DevP2P.NodeDb;
// EthECKey LoadOrCreate(string path, Action<string> log = null)
var localKey = NodeKeyStore.LoadOrCreate("nodekey");Run this once at node startup instead of EthECKey.GenerateKey(). The first run creates nodekey on disk; every subsequent run loads the same key, so your node's identity (and any reputation peers have built for it) survives restarts.
| Mechanism | Transport | Use when |
|---|---|---|
| discv4 | Unencrypted, signed UDP (Kademlia) | Talking to older/simpler clients; bonding with a known seed list |
| discv5 | Authenticated UDP (WHOAREYOU + HKDF session keys, AES-GCM) | Mainnet-style discovery; the modern default with TalkReq/TalkResp extensibility |
| DNS ENR-tree (EIP-1459) | DNS TXT records | Bootstrapping from a small number of trusted, well-known hostnames rather than hardcoded IPs |
All three ultimately hand you the same thing: a list of enode (or ENR) addresses to feed into StaticPeerConnector/RlpxConnection (see devp2p-peer-connect). They differ in how much trust and infrastructure they assume up front.
Discv5Discovery.StartMainnet is the fastest way to get a discv5 node walking the network: it builds the listener, signs a local ENR, seeds the mainnet bootnodes, starts the routing-table walk, and hands back both objects — you own teardown of each:
using Nethereum.DevP2P.Discv5;
using Nethereum.Signer;
var localKey = EthECKey.GenerateKey();
var (discovery, listener) = Discv5Discovery.StartMainnet(
localKey,
enqueueEnode: enode => Console.WriteLine($"discovered {enode}")); // feed your dial loop here
// ... on shutdown — the service does NOT dispose the listener it walks:
await discovery.StopAsync();
await listener.DisposeAsync();Every enode string handed to enqueueEnode is a live candidate — pass it straight into StaticPeerConnector.ConnectAsync, or queue it for your own dial scheduler. Note the two-step shutdown: Discv5Discovery stops the periodic walk, but it doesn't own the listener's socket, so you dispose that separately.
The full signature exposes tuning most callers don't need day one — a custom bind address/port, a logger, and a pre-dial fork-ID filter so you never bother dialing peers on the wrong chain:
(Discv5PeerDiscoveryService Discovery, Discv5Listener Listener) StartMainnet(
EthECKey localKey,
Action<string> enqueueEnode,
IPAddress bindAddress = null,
int udpPort = 0,
Action<string> log = null,
Func<byte[], bool> ethForkIdFilter = null,
CancellationToken ct = default)Discv5Discovery is a convenience wrapper; underneath, discovery is a signed UDP request/response protocol. This is easiest to see with the older discv4 protocol, whose ping/pong bonding is exercised directly by a test — two Discv4Listeners on loopback, each auto-responding to the other's messages:
var keyA = EthECKey.GenerateKey();
var keyB = EthECKey.GenerateKey();
var tableA = new Discv4RoutingTable(keyA.GetPubKeyNoPrefix());
var tableB = new Discv4RoutingTable(keyB.GetPubKeyNoPrefix());
using var nodeA = new Discv4Listener(keyA, tableA);
using var nodeB = new Discv4Listener(keyB, tableB);
nodeA.Start(udpPort: 0, bindAddress: IPAddress.Loopback);
nodeB.Start(udpPort: 0, bindAddress: IPAddress.Loopback);
nodeB.PingReceived += async (_, e) =>
{
var pong = new Discv4PongMessage
{
To = new Discv4Endpoint { IP = e.Sender.Address, UdpPort = (ushort)e.Sender.Port, TcpPort = 0 },
PingHash = e.PingHash,
Expiration = DateTimeOffset.UtcNow.AddMinutes(1).ToUnixTimeSeconds()
};
await nodeB.SendPongAsync(e.Sender, pong);
};
var ping = new Discv4PingMessage
{
Version = 4,
From = new Discv4Endpoint { IP = IPAddress.Loopback, UdpPort = (ushort)nodeA.Port, TcpPort = 30303 },
To = new Discv4Endpoint { IP = IPAddress.Loopback, UdpPort = (ushort)nodeB.Port, TcpPort = 0 },
Expiration = DateTimeOffset.UtcNow.AddMinutes(1).ToUnixTimeSeconds()
};
await nodeA.SendPingAsync(new IPEndPoint(IPAddress.Loopback, nodeB.Port), ping);
// After the round trip, both routing tables have learned about each other:
// tableA.Count >= 1 and tableB.Count >= 1This is the EIP-868 endpoint-proof bonding step: a node only adds a peer to its Kademlia routing table after a successful ping/pong round trip, which is what makes discv4 resistant to naive amplification/spoofing attacks. Discv4Listener has AutoRespond = true by default, so in practice you rarely wire the PingReceived handler yourself — the harvester below does it for you.
For day-to-day use you don't drive ping/pong by hand — PeerDiscoveryService.DiscoverAsync bonds with a list of seed enodes and returns the flat list of enodes it discovered:
Task<List<string>> DiscoverAsync(
IEnumerable<string> seedEnodes, TimeSpan perSeedTimeout, CancellationToken ct)Feed it your bootnodes (or a previously-discovered peer list — see the persistent cache below) and it returns candidates ready for StaticPeerConnector.
Note: this signature is verified against
src/Nethereum.DevP2P/README.md, but no tagged doc-example test exercises the harvester end-to-end — only the lower-levelDiscv4Listenerping/pong above is test-backed.
Some networks publish their bootstrap peer list as a DNS TXT-record tree rather than a hardcoded list — this is how go-ethereum distributes its mainnet bootnodes, for example. EnrTreeResolver.ResolveAsync walks an enrtree:// URL into a flat list of enode URLs:
Task<List<string>> ResolveAsync(
string enrtreeUrl, TimeSpan timeout, int maxLeaves, CancellationToken ct)EnrTreeResolver falls back from OS DNS to a public resolver if needed, and Nethereum ships the mainnet all/snap/les tree URLs baked in, so you rarely need to source one yourself. Use this when you want to bootstrap a node with zero hardcoded IPs — just the tree's root name.
Two different identifiers are in play across discv4 and discv5, and mixing them up is a common source of confusion:
keccak256(pubkey), a further hash of that same key.ENR records (EnrRecord, from Nethereum.Model.Enr) carry a node's discv5 identity and are set on a listener via LocalEnrEncoded / LocalEnrSequence.
Discovery finds candidates; it doesn't know which of them turned out to be reliable. PersistentPeerCache records dial success/failure per peer and returns your preferred enodes across restarts, so a node doesn't have to rediscover its whole working peer set from scratch every time it starts.
Note:
PersistentPeerCacheis documented insrc/Nethereum.DevP2P/README.mdas a bullet point (recording dial success/failure, returning preferred enodes) but has no method signature block in the README and no tagged doc-example test — its role is verified from the README prose only.
| Symptom | Cause | Fix |
|---|---|---|
Discv5Discovery.StartMainnet never calls enqueueEnode | Bound to an address/port that's unreachable from the internet (e.g. behind strict NAT with no port forwarding), or outbound UDP blocked | Confirm the UDP port is reachable; check firewall/NAT |
discv4 PingReceived never fires in your own listener code | AutoRespond already handled it — you don't usually need to also handle PingReceived yourself unless customizing bonding | Only hook PingReceived/PongReceived for diagnostics or custom logic |
| Node's peer reputation resets every deploy | Using EthECKey.GenerateKey() at startup instead of NodeKeyStore.LoadOrCreate | Persist the node key; see "Persist your node identity" above |
| DNS ENR-tree resolution times out | timeout/maxLeaves too small for the tree's depth, or OS DNS is filtering TXT records | Increase timeout; EnrTreeResolver falls back to a public resolver automatically |
| I want to… | Use |
|---|---|
| Get discovering with the least setup (mainnet-style) | Discv5Discovery.StartMainnet |
| Match an older/simpler peer set, or need fine control over bonding | Discv4Listener + PeerDiscoveryService.DiscoverAsync |
| Bootstrap with zero hardcoded IPs | EnrTreeResolver.ResolveAsync against a known enrtree:// root |
| Keep working peers across restarts | PersistentPeerCache |
| Keep the same node-id across restarts | NodeKeyStore.LoadOrCreate |
Once you have candidate enodes, dial them with StaticPeerConnector.ConnectAsync — see the devp2p-peer-connect skill.
For full documentation, see: https://docs.nethereum.com/docs/devp2p/guide-peer-discovery
© Nethereum, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in plugins/nethereum-skills/skills/devp2p-peer-discovery of Nethereum/Nethereum.
Open the folder on GitHubat commit 229f278
Devp2p Peer Discovery next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Devp2p Peer Discovery this skillNethereum/Nethereum | 2.3k | — | ~2.7k | Automated safety check: Pass | MIT | |
| FoundatioFoundatioFx/Foundatio | 2.1k | — | ~3.9k | Automated safety check: Pass | Apache-2.0 | |
| Aspnet Corefanslead/ReverseProxy.Store | 163 | 2 repos | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Msal Auth Code FlowAzureAD/microsoft-authentication-library-for-dotnet | 1.5k | — | ~917 | Automated safety check: Pass | MIT | |
| Tsp Csharpquerylenshq/ef-querylens | 225 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Msal Client CredentialsAzureAD/microsoft-authentication-library-for-dotnet | 1.5k | — | ~1.1k | Automated safety check: Pass | MIT |
FoundatioFx/Foundatio
A skill your agent uses when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs.
fanslead/ReverseProxy.Store
Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development.
AzureAD/microsoft-authentication-library-for-dotnet
Authorization Code Flow for web applications using MSAL.NET confidential client to sign in users and access APIs on their behalf
querylenshq/ef-querylens
Comprehensive C and .NET development skill for TSP projects.
AzureAD/microsoft-authentication-library-for-dotnet
Client Credentials Flow for service-to-service (daemon) authentication in MSAL.NET without user involvement
madeyoga/AuthEndpoints
Drive the AuthEndpoints HTTP API via the in-repo test host (cookie sessions, Identity bearer, Simple JWT, CSRF, ReAuth).
Nethereum/Nethereum
Help users batch multiple calls into a single UserOperation and sponsor gas with paymasters using Nethereum Account Abstraction.
Nethereum/Nethereum
Help users run an ERC-4337 bundler using Nethereum — set up in-process or standalone bundlers with mempool, validation, reputation, and JSON-RPC server.
Nethereum/Nethereum
Encode and decode Ethereum ABI data with Nethereum. An agent skill from Nethereum/Nethereum.
Nethereum/Nethereum
Fetch contract ABIs from Sourcify, Etherscan, and 4Byte Directory using the composite ABIInfoStorage pattern (.NET/C).
Nethereum/Nethereum
Help users implement ERC-4337 Account Abstraction with Nethereum — send UserOperations, use smart accounts, route contract calls through a bundler, enable gasless transactions, or work with AA in…
Nethereum/Nethereum
Validate and format Ethereum addresses with Nethereum. An agent skill from Nethereum/Nethereum.
Categories
Help users discover Ethereum peer addresses over devp2p when they don't have an enode:// URL yet — discv4 Kademlia UDP discovery, discv5 authenticated discovery, DNS ENR-tree bootstrapping…. Devp2p Peer Discovery is an agent skill from Nethereum/Nethereum.NET).
Devp2p Peer Discovery fits situations like: the user mentions peer discovery; finding Ethereum nodes; DNS discovery tree; persisting a node key/peer list across restarts.
Run `npx skills add Nethereum/Nethereum --skill devp2p-peer-discovery -a claude-code`. Or copy the skill folder (plugins/nethereum-skills/skills/devp2p-peer-discovery in Nethereum/Nethereum) into .claude/skills/devp2p-peer-discovery in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Nethereum/Nethereum --skill devp2p-peer-discovery -a codex`. Or copy the skill folder (plugins/nethereum-skills/skills/devp2p-peer-discovery in Nethereum/Nethereum) into .agents/skills/devp2p-peer-discovery in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Nethereum/Nethereum --skill devp2p-peer-discovery -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/devp2p-peer-discovery, .gemini/skills/devp2p-peer-discovery, .github/skills/devp2p-peer-discovery and .opencode/skills/devp2p-peer-discovery in your project.
Going by SKILL.md and its folder, Devp2p Peer Discovery needs the command-line tools its instructions call (dotnet).
SKILL.md names 1 domain. As links in the text: docs.nethereum.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Devp2p Peer Discovery is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Devp2p Peer Discovery: Foundatio (FoundatioFx/Foundatio, 2.1k stars), Aspnet Core (fanslead/ReverseProxy.Store, 163 stars), Msal Auth Code Flow (AzureAD/microsoft-authentication-library-for-dotnet, 1.5k stars) and Tsp Csharp (querylenshq/ef-querylens, 225 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Nethereum (a GitHub organization) maintains it in Nethereum/Nethereum, which has 2,260 GitHub stars. The repository holds 71 skills in this directory. The repository was last updated on October 5, 2026.
Source: Nethereum/Nethereum on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.