<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: HOL (Hashgraph Online)</title>
    <description>The latest articles on DEV Community by HOL (Hashgraph Online) (@hol).</description>
    <link>https://dev.to/hol</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12608%2Fcbc4252d-042e-4203-bcc5-f1a27d5b24e0.png</url>
      <title>DEV Community: HOL (Hashgraph Online)</title>
      <link>https://dev.to/hol</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hol"/>
    <language>en</language>
    <item>
      <title>Trust Before Install: Why We Built Codex Plugin Scanner</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Thu, 02 Apr 2026 03:06:11 +0000</pubDate>
      <link>https://dev.to/hol/trust-before-install-why-we-built-codex-plugin-scanner-479b</link>
      <guid>https://dev.to/hol/trust-before-install-why-we-built-codex-plugin-scanner-479b</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/trust-before-install-why-we-built-codex-plugin-scanner" rel="noopener noreferrer"&gt;https://hol.org/blog/trust-before-install-why-we-built-codex-plugin-scanner&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Codex plugins can do real work.&lt;/p&gt;

&lt;p&gt;They can package skills, connect apps, expose MCP servers, and extend what Codex can access or automate. That makes them powerful. It also means they introduce a new trust surface.&lt;/p&gt;

&lt;p&gt;A plugin is not just a manifest file. It can include remote endpoints, local commands, repository workflows, install metadata, marketplace metadata, and reusable skills that influence behavior. Runtime safeguards still matter, but they are only part of the story. Teams also need a way to evaluate plugin quality and risk before a plugin gets installed, shared, or listed publicly.&lt;/p&gt;

&lt;p&gt;That is why we built &lt;strong&gt;Codex Plugin Scanner&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is an open-source scanner for Codex plugins that checks security, publishability, MCP risk, workflow hygiene, and overall ecosystem readiness. The goal is simple: make it easier to understand whether a plugin is safe and well-structured before it spreads.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Most existing security tooling was not built for this ecosystem.&lt;/p&gt;

&lt;p&gt;A linter can catch syntax issues. A secret scanner can catch some exposed credentials. A dependency scanner can point out vulnerable packages. Those tools are useful, but they do not answer the main questions plugin authors, reviewers, and registries actually have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Is this plugin manifest valid and publishable?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are its declared paths safe?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does it point to risky MCP endpoints?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does it normalize unsafe approval patterns?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does it ship repository automation that introduces supply-chain risk?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is it ready for listing in a broader plugin ecosystem?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gap gets bigger as the ecosystem grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Codex Plugin Scanner does
&lt;/h2&gt;

&lt;p&gt;Codex Plugin Scanner was built specifically for Codex plugins. It scores the applicable plugin surface from &lt;strong&gt;0 to 100&lt;/strong&gt;, produces structured findings, and helps maintainers catch issues before release.&lt;/p&gt;

&lt;p&gt;The scanner evaluates plugins across several categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Manifest validation
&lt;/h3&gt;

&lt;p&gt;It checks whether the plugin manifest exists, parses correctly, includes required fields, uses semantic versioning, and contains the metadata needed for distribution.&lt;/p&gt;

&lt;p&gt;It also validates interface metadata, verifies assets and links, and checks that referenced paths stay inside the repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Security
&lt;/h3&gt;

&lt;p&gt;It looks for common security problems such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;hardcoded secrets&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dangerous MCP command patterns&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;insecure remote MCP transports&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;approval bypass defaults&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shell injection patterns&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unsafe dynamic execution patterns like &lt;code&gt;eval()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Operational security
&lt;/h3&gt;

&lt;p&gt;This is one of the most useful parts of the scanner.&lt;/p&gt;

&lt;p&gt;A plugin does not just ship code. It often ships automation. The scanner checks GitHub workflows for issues like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;third-party actions that are not pinned to full SHAs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;overly broad workflow permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unsafe checkout patterns&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;missing dependency update automation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;missing lockfiles or weak dependency pinning&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That helps teams catch supply-chain issues that are easy to miss in a basic plugin review.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Best practices
&lt;/h3&gt;

&lt;p&gt;The scanner also checks for project hygiene, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;LICENSE&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;SECURITY.md&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.codexignore&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;committed &lt;code&gt;.env&lt;/code&gt; files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;missing skills directories&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;malformed &lt;code&gt;SKILL.md&lt;/code&gt; frontmatter&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Marketplace and ecosystem readiness
&lt;/h3&gt;

&lt;p&gt;If a plugin includes marketplace metadata, the scanner validates that too. This makes it easier to assess whether a plugin is ready to be listed, shared, or ingested into registries and discovery surfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Skill security
&lt;/h3&gt;

&lt;p&gt;When skills are present, the scanner can perform deeper analysis. It also supports optional Cisco-backed skill analysis for teams that want an additional review layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the scoring model matters
&lt;/h2&gt;

&lt;p&gt;We did not want a score that was noisy or misleading.&lt;/p&gt;

&lt;p&gt;A lot of scanners treat every possible surface as mandatory. That creates bad results. A small plugin gets penalized for not shipping marketplace metadata. A simple skills package gets scored as incomplete because it does not expose MCP configuration.&lt;/p&gt;

&lt;p&gt;That does not reflect reality.&lt;/p&gt;

&lt;p&gt;Codex Plugin Scanner only scores the surfaces that actually apply to the plugin being scanned. If a plugin does not include &lt;code&gt;.mcp.json&lt;/code&gt;, it is not penalized for that. If it does not use marketplace metadata, those checks are not counted against it.&lt;/p&gt;

&lt;p&gt;That makes the final score much more useful across different plugin types.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for real workflows
&lt;/h2&gt;

&lt;p&gt;The scanner is designed to fit into the workflows teams already use.&lt;/p&gt;

&lt;p&gt;You can run it locally during development, wire it into CI, use it in pre-commit, or export results into GitHub code scanning.&lt;/p&gt;

&lt;p&gt;It supports multiple output formats, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;text&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JSON&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Markdown&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SARIF&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A typical run looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;codex-plugin-scanner
codex-plugin-scanner ./my-plugin &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--format&lt;/span&gt; sarif &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; codex-plugin-scanner.sarif &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fail-on-severity&lt;/span&gt; high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That makes it straightforward to use as a local quality gate or as part of an automated release process.&lt;/p&gt;

&lt;h2&gt;
  
  
  More than a scanner
&lt;/h2&gt;

&lt;p&gt;One thing we cared about from the start was making the output useful beyond a terminal window.&lt;/p&gt;

&lt;p&gt;The GitHub Action can export a machine-readable payload with metadata such as plugin name, description, score, grade, severity counts, source repository, source SHA, scanner version, and timestamp.&lt;/p&gt;

&lt;p&gt;That opens the door to things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;plugin registry ingestion&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;automated badges&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;awesome-list submissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ecosystem dashboards&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CI trust gates&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, the scanner is not just for maintainers. It can also become part of the broader trust infrastructure around the plugin ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for the ecosystem
&lt;/h2&gt;

&lt;p&gt;We think the Codex plugin ecosystem needs a trust layer.&lt;/p&gt;

&lt;p&gt;As more people build and publish plugins, the challenge is no longer just creating functionality. It is helping users and reviewers understand what they are installing and whether it meets a reasonable standard for safety and quality.&lt;/p&gt;

&lt;p&gt;That does not mean one score should replace human judgment. It should not.&lt;/p&gt;

&lt;p&gt;What it should do is make the obvious problems easier to catch, make reviews more consistent, and give teams a common baseline for plugin quality.&lt;/p&gt;

&lt;p&gt;That is the role Codex Plugin Scanner is meant to play.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we built it
&lt;/h2&gt;

&lt;p&gt;We built Codex Plugin Scanner because trust should not be an afterthought.&lt;/p&gt;

&lt;p&gt;If plugins are going to become a serious part of how developers and teams extend Codex, then the ecosystem needs tooling that is built for that exact surface area. Not generic security theater. Not a checklist copied from somewhere else. Something purpose-built.&lt;/p&gt;

&lt;p&gt;That is what this project is.&lt;/p&gt;

&lt;p&gt;It is an open-source scanner for a new plugin ecosystem that needs better safety, clearer standards, and better distribution hygiene from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get involved
&lt;/h2&gt;

&lt;p&gt;If you are building Codex plugins, maintaining a registry, or thinking about trust and distribution in this ecosystem, take a look at the project and try it on your own repositories.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/hashgraph-online/codex-plugin-scanner" rel="noopener noreferrer"&gt;https://github.com/hashgraph-online/codex-plugin-scanner&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We think the ecosystem will be healthier if plugin quality is easier to measure, easier to improve, and easier to trust.&lt;/p&gt;

</description>
      <category>codex</category>
    </item>
    <item>
      <title>Building a Decentralized Registry in Go with HCS-2 on Hedera</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/hol/building-a-decentralized-registry-in-go-with-hcs-2-on-hedera-2j4m</link>
      <guid>https://dev.to/hol/building-a-decentralized-registry-in-go-with-hcs-2-on-hedera-2j4m</guid>
      <description>&lt;p&gt;With the explosive growth of AI agents, distributed systems, and decentralized applications (dApps), there's an increasing need for immutable, decentralized data sharing. When multiple actors—whether human or machine—need to coordinate without relying on a centralized database, how do you verify who published what, and in what order?&lt;/p&gt;

&lt;p&gt;Enter the &lt;strong&gt;Hedera Consensus Service (HCS)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;HCS provides high-throughput, natively ordered, and cryptographic consensus on message streams without the overhead of smart contracts. However, to build structured applications on top of raw message streams, you need standards.&lt;/p&gt;

&lt;p&gt;That's why we recently published the Official &lt;a href="https://github.com/hashgraph-online/standards-sdk-go" rel="noopener noreferrer"&gt;&lt;strong&gt;Hashgraph Online Standards SDK for Go&lt;/strong&gt;&lt;/a&gt;, a complete reference implementation for the &lt;a href="https://hol.org/docs/standards" rel="noopener noreferrer"&gt;Hiero Consensus Specifications (HCS)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will explore &lt;strong&gt;HCS-2: Topic Registries&lt;/strong&gt; and show you how to build a decentralized registry in Go from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Go?&lt;a href="https://hol.org/blog/2026/02/28/building-decentralized-registry-go-hedara/#why-go" rel="noopener noreferrer"&gt;Direct link to Why Go?​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Go (Golang) is uniquely positioned for decentralized systems. Its native concurrency model (goroutines), fast compilation, and strongly typed ecosystem make it the language of choice for building robust infrastructure like the Hedera Mirror Node, Hyperledger Fabric, and countless Web3 indexers.&lt;/p&gt;

&lt;p&gt;By releasing a dedicated Go SDK for HCS, we are providing Go developers with a first-class, typed, and idiomatic path to interacting with decentralized standards on the Hedera public ledger.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an HCS-2 Topic Registry?&lt;a href="https://hol.org/blog/2026/02/28/building-decentralized-registry-go-hedara/#what-is-an-hcs-2-topic-registry" rel="noopener noreferrer"&gt;Direct link to What is an HCS-2 Topic Registry?​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://hol.org/docs/standards/hcs-2" rel="noopener noreferrer"&gt;&lt;strong&gt;HCS-2 Specification&lt;/strong&gt;&lt;/a&gt; defines a standard for creating append-only, verifiable data registries on Hedera.&lt;/p&gt;

&lt;p&gt;At its core, a registry is a Hedera topic where messages conform to a specific JSON schema. HCS-2 supports two types of registries:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Append-Only&lt;/strong&gt; : A continuous stream of events or records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indexed&lt;/strong&gt; : A key-value store where later entries can "overwrite" or update the state of previous keys using deterministic indexing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is perfect for use cases like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Agent identity directories&lt;/li&gt;
&lt;li&gt;Decentralized package managers&lt;/li&gt;
&lt;li&gt;Supply chain provenance logs&lt;/li&gt;
&lt;li&gt;Certificate revocation lists&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's write some code to see this in action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites&lt;a href="https://hol.org/blog/2026/02/28/building-decentralized-registry-go-hedara/#prerequisites" rel="noopener noreferrer"&gt;Direct link to Prerequisites​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Before we begin, you'll need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go 1.22 or higher installed.&lt;/li&gt;
&lt;li&gt;A Hedera Testnet account (Account ID and Private Key). You can get one from the &lt;a href="https://portal.hedera.com/" rel="noopener noreferrer"&gt;Hedera Developer Portal&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a new directory for your project and initialize a Go module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir go-registry-democd go-registry-demogo mod init go-registry-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, install the Standards SDK for Go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go get github.com/hashgraph-online/standards-sdk-go@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set your environment variables (or place them in a &lt;code&gt;.env&lt;/code&gt; file):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export HEDERA_ACCOUNT_ID="0.0.xxxxx"export HEDERA_PRIVATE_KEY="302..."export HEDERA_NETWORK="testnet"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1: Initialize the HCS-2 Client&lt;a href="https://hol.org/blog/2026/02/28/building-decentralized-registry-go-hedara/#step-1-initialize-the-hcs-2-client" rel="noopener noreferrer"&gt;Direct link to Step 1: Initialize the HCS-2 Client​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;First, let's create our main Go file and initialize the &lt;code&gt;hcs2&lt;/code&gt; client. The SDK provides a clean configuration pattern for setting up the client.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package mainimport (    "context"   "fmt"   "log"   "os"    "github.com/hashgraph-online/standards-sdk-go/pkg/hcs2")func main() {   ctx := context.Background() // Initialize the HCS-2 Client  // Notice we can pull configuration directly from the environment   client, err := hcs2.NewClient(hcs2.ClientConfig{ OperatorAccountID: os.Getenv("HEDERA_ACCOUNT_ID"), OperatorPrivateKey: os.Getenv("HEDERA_PRIVATE_KEY"), Network: "testnet", // Explicitly use testnet  })  if err != nil { log.Fatalf("Failed to initialize HCS-2 client: %v", err)    }   fmt.Println("Successfully initialized HCS-2 Client!")}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Creating an Indexed Registry&lt;a href="https://hol.org/blog/2026/02/28/building-decentralized-registry-go-hedara/#step-2-creating-an-indexed-registry" rel="noopener noreferrer"&gt;Direct link to Step 2: Creating an Indexed Registry​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Now, let's create a new decentralized registry. We will create an &lt;strong&gt;Indexed&lt;/strong&gt; registry, which functions like a global, immutable key-value store.&lt;/p&gt;

&lt;p&gt;When you create a registry using the SDK, it communicates directly with the Hedera network to allocate a new cryptographic Consensus Topic and formats the topic memo according to the HCS-2 specification.&lt;/p&gt;

&lt;p&gt;Append this to your &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // ... previous code ...    fmt.Println("Creating a new HCS-2 Indexed Registry...") // Create the registry  result, err := client.CreateRegistry(ctx, hcs2.CreateRegistryOptions{ RegistryType: hcs2.RegistryTypeIndexed, UseOperatorAsAdmin: true, // We retain administrative control UseOperatorAsSubmit: true, // We must sign future entries   })  if err != nil { log.Fatalf("Failed to create registry: %v", err)    }   topicID := result.TopicID.String()  fmt.Printf("✅ Registry created successfully!\nTopic ID: %s\n", topicID)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Writing Data to the Registry&lt;a href="https://hol.org/blog/2026/02/28/building-decentralized-registry-go-hedara/#step-3-writing-data-to-the-registry" rel="noopener noreferrer"&gt;Direct link to Step 3: Writing Data to the Registry​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;With our topic ID in hand, we can now publish structured entries to the registry.&lt;/p&gt;

&lt;p&gt;In an Indexed registry, updating the state of a specific item is as simple as publishing a new message with the same &lt;code&gt;Index&lt;/code&gt; (key). The SDK automatically constructs the correct JSON payload and signs it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // ... previous code ...    // Let's define the data we want to register    // We'll register two physical IoT devices  entries := []struct { Index string Data map[string]any  }{ { Index: "device-001", Data: map[string]any{"type": "sensor", "status": "active"}, }, { Index: "device-002", Data: map[string]any{"type": "actuator", "status": "offline"}, },   }   for _, entry := range entries { fmt.Printf("Registering %s...\n", entry.Index) publishResult, err := client.PublishIndexedEntry(ctx, hcs2.PublishIndexedEntryOptions{ TopicID: topicID, Index: entry.Index, Data: entry.Data, }) if err != nil { log.Fatalf("Failed to publish entry: %v", err) } fmt.Printf("Published entry securely at Sequence #%d\n", publishResult.SequenceNumber)    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Reading the Decentralized State&lt;a href="https://hol.org/blog/2026/02/28/building-decentralized-registry-go-hedara/#step-4-reading-the-decentralized-state" rel="noopener noreferrer"&gt;Direct link to Step 4: Reading the Decentralized State​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Writing is only half the battle. How do we retrieve the state of our registry?&lt;/p&gt;

&lt;p&gt;Because HCS topics are public, anyone (not just you) can read the state of this registry using a Hedera Mirror Node. The SDK provides built-in methods to query the mirror node, parse the messages, and reconstruct the final "state" of the key-value store.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // ... previous code ...    fmt.Println("Fetching current registry state from Hedera Mirror Node...")   // Fetch all valid entries for our topic    state, err := client.GetIndexedRegistryState(ctx, topicID)  if err != nil { log.Fatalf("Failed to fetch state: %v", err)    }   fmt.Println("\n--- Current Registry State ---") for key, value := range state { fmt.Printf("Key [%s]: %v\n", key, value)    }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you ever published a new message for &lt;code&gt;device-001&lt;/code&gt; saying &lt;code&gt;"status": "maintenance"&lt;/code&gt;, the &lt;code&gt;GetIndexedRegistryState&lt;/code&gt; function would automatically resolve the history and return the most recent valid state for that key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood&lt;a href="https://hol.org/blog/2026/02/28/building-decentralized-registry-go-hedara/#under-the-hood" rel="noopener noreferrer"&gt;Direct link to Under the Hood​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;When you use the &lt;code&gt;standards-sdk-go&lt;/code&gt;, you are interacting with the Hedera network through strongly typed, validated interfaces.&lt;/p&gt;

&lt;p&gt;But what's actually happening?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Memos&lt;/strong&gt; : The &lt;code&gt;CreateRegistry&lt;/code&gt; call automatically formats the &lt;code&gt;memo&lt;/code&gt; of the Hedera topic to &lt;code&gt;hcs-2;indexed&lt;/code&gt;, signaling to the rest of the ecosystem how to interpret the messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema Enforcement&lt;/strong&gt; : The SDK ensures that messages submitted to the topic strictly adhere to the HCS-2 JSON schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consensus Targeting&lt;/strong&gt; : Messages are delivered instantly across the globe with fair-ordering consensus applied by the Hedera validators.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Next Steps&lt;a href="https://hol.org/blog/2026/02/28/building-decentralized-registry-go-hedara/#next-steps" rel="noopener noreferrer"&gt;Direct link to Next Steps​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;We've barely scratched the surface of what the Standards SDK can do. From this foundation, you can dive into more advanced protocols:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hol.org/docs/standards/hcs-14" rel="noopener noreferrer"&gt;&lt;strong&gt;HCS-14 (Universal Agent IDs)&lt;/strong&gt;&lt;/a&gt;: Resolve AI identities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registry Broker&lt;/strong&gt; : Use the &lt;code&gt;pkg/registrybroker&lt;/code&gt; to interact directly with the global &lt;a href="https://hol.org/" rel="noopener noreferrer"&gt;Hashgraph Online Registry Broker&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ready to start building?&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://hol.org/docs/libraries/standards-sdk/" rel="noopener noreferrer"&gt;Dive into the SDK Documentation&lt;/a&gt;&lt;/strong&gt; or star the &lt;strong&gt;&lt;a href="https://github.com/hashgraph-online/standards-sdk-go" rel="noopener noreferrer"&gt;standards-sdk-go repository on GitHub&lt;/a&gt;&lt;/strong&gt; to stay updated on the latest Go ecosystem releases!&lt;/p&gt;

</description>
      <category>go</category>
      <category>hedera</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
