Open-source project
algorand/go-algorand avatar
algorand/go-algorand

go-algorand: Building and Running an Algorand Node

Algorand's official implementation in Go.

1,437 stars539 forksGoNOASSERTION

At a glance

What is it?
go-algorand is Algorand's official Go implementation, containing the consensus, ledger, networking, node, REST API, and transaction-signing components. It fits protocol engineers and operators who need to build or run an Algorand node, but it is too large and infrastructure-heavy for applications that only need an Algorand client.
Who is it for?
go-algorand is appropriate for protocol contributors, node operators, and developers who need direct access to Algorand's ledger, agreement, networking, and REST components. It is the wrong dependency for an application that only submits transactions through an existing network endpoint.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Why go-algorand Exists Beyond Transaction SDK Use

go-algorand implements the Algorand protocol rather than merely providing a client library for an existing network. It contains the code that participates in agreement, maintains the ledger, exchanges peer messages, serves HTTP interfaces, and manages transactions. Its intended users include Go developers modifying the protocol implementation, engineers operating a node, and teams that need to build Algorand tools from the official source tree.

That scope matters. An application that only needs to construct or submit a transaction does not need the agreement service, peer mesh, transaction pool, node lifecycle manager, and ledger state machine. go-algorand is therefore most relevant when the node itself is part of the product or research target. Smaller client work belongs closer to the REST interface exposed by `daemon/algod/api`, although the README excerpt does not identify a separate SDK package that should be used instead.

The repository also separates transaction signing into `daemon/kmd`. That daemon can run separately from `algod`, which supports signing on an air-gapped computer. The separation reflects a concrete security boundary in the architecture: a machine that sends transactions to the network does not have to be the machine holding signing capabilities.

go-algorand Agreement, Ledger, and Network Data Flow

The participating daemon is `algod`. According to the repository layout, it participates in agreement, submits and confirms transactions, and exposes the Algorand Ledger through a REST interface. The `node` package integrates the agreement, ledger, network, and data subsystems and owns their initialization and shutdown. This is a full protocol stack rather than a thin service wrapper.

Incoming network traffic follows the `network` subsystem, which maintains peer connections over WebSockets. It supports peer and broadcast messages, then routes them to registered handlers. The `agreement` subsystem implements Algorand's Byzantine Agreement protocol. The README states that participating accounts can confirm blocks in a fork-safe manner when sufficient account stake follows the protocol correctly. Blocks committed by agreement are applied by the ledger state machine, and transaction queries and account queries are served over the node's interfaces.

Before transactions enter blocks, `data/pools` holds transactions seen by a node in memory for possible proposal. The `data/bookkeeping` package defines blocks and transaction batches, while `data/transactions` defines operations against Algorand state. Consensus-related credentials live under `data/committee`, and protocol versions, message tags, cryptographic domain-separation prefixes, and canonical encoding are handled by `protocol`.

This division gives contributors clear ownership boundaries, but it also means an upgrade can cross several subsystems. Agreement, transaction encoding, ledger execution, peer behavior, and API behavior must remain consistent. The repository's unit and integration test targets reflect that breadth.

Building go-algorand with Its Required Go Toolchain

The source build assumes a functioning development environment. The required language version comes from `go.mod`, which declares Go 1.25.0 and the `go1.25.3` toolchain. The repository Dockerfile independently uses `GO_VERSION="1.25.3"` when building in Ubuntu 24.04. The README identifies Ubuntu 24.04 as the official release target and says the core engineering team uses Linux and OSX.

Clone the repository, enter it, and run the project's development configuration script. This follows the README exactly; it does not replace the prerequisite Go installation.

bash
git clone https://github.com/algorand/go-algorand
cd go-algorand
./scripts/configure_dev.sh

After configuration completes, the README says the checkout is ready to build. The build is driven by `make`, and the installed binaries are placed under `${GOPATH}/bin` unless the Go environment defines a separate destination through the Makefile's handling of `GOBIN`.

bash
make install

The developer workflow includes separate checks for formatting, linting, automatic fixes, and vetting. The README also provides a combined `make sanity` target, but it does not explain which individual checks that target expands to.

bash
make fmt
make lint
make fix
make vet

Use the documented test commands when validating a source build. Unit tests and integration tests have distinct targets, so a successful unit run does not stand in for the integration suite.

bash
make test
make integration

Starting goal with a Default or Testnet Data Directory

A successful `make install` produces binaries in `${GOPATH}/bin` and initializes a data directory at `~/.algorand`, according to the README. The first real node operation is to start it with `goal` and explicitly select that directory.

bash
${GOPATH}/bin/goal node start -d ~/.algorand

This command launches the node using the standard local data path. The README provides `carpenter` as a way to view activity, which is useful for observing whether the process is connecting, syncing, or participating.

bash
${GOPATH}/bin/carpenter -d ~/.algorand

For a separate testnet directory, create a directory and copy the testnet `genesis.json` into it. Supplying the correct Genesis file is not optional because it defines the network the node expects.

bash
mkdir ~/testnet_data
cp installer/genesis/testnet/genesis.json ~/testnet_data/genesis.json
${GOPATH}/bin/goal node start -d ~/testnet_data

The repository also contains Genesis files for mainnet, testnet, and betanet under `installer/genesis/`. The README does not document rollback, snapshot restoration, database migration, or the operational steps for switching an existing node from one network to another. Those procedures therefore need verification against the developer documentation before production use.

REST, Signing, and Container Boundaries in go-algorand

Client-facing REST behavior belongs to `daemon/algod/api`, while transaction signing belongs to `daemon/kmd`. Keeping these daemons separate permits a deployment in which `algod` handles participation and state access while `kmd` runs on an air-gapped signing computer. That arrangement is useful when network access and private signing authority must remain on different hosts.

The repository also provides a multi-stage `Dockerfile`. Its builder is based on Ubuntu 24.04, installs Go 1.25.3, copies Genesis and installation files, and builds `algod` components into `/node/bin`. Its final image is based on `debian:bookworm-20250630-slim`, creates a dedicated `algorand` user, and sets these environment values:

dockerfile
ENV PATH="/node/bin:${PATH}" ALGOD_PORT="8080" KMD_PORT="7833" ALGORAND_DATA="/algod/data"

The Dockerfile declares ports for the `algod` REST API, KMD REST API, Algorand Gossip, and Prometheus metrics. The visible environment names identify `8080` for `ALGOD_PORT` and `7833` for `KMD_PORT`. The repository file is truncated in the available description, so it would be unsafe to infer every published port mapping or the complete container startup command from this excerpt.

For application developers, the `algod` REST interface is the clearest documented integration boundary. For node and protocol work, the Go packages beneath `ledger`, `agreement`, `network`, `crypto`, and `data` are the relevant entry points. For signing, evaluate the operational boundary between `kmd` and `algod` rather than treating both as one process.

Maintenance, Upgrades, and the Custom go-algorand Licence

The repository is not archived. Its last push was on 2026-10-16, and the listed releases include `v5.0.3-stable` on 2026-10-12 and `v5.0.2-stable` on 2026-09-15. That release history and recent push indicate continuing source and release work. It does not remove the cost of evaluating protocol changes against a particular deployment.

The repository carries several release branches in its README build table, including `rel/stable`, `rel/beta`, and `rel/nightly`. The presence of BetaNet and nightly test workflows shows that development channels are part of the project, but it does not make those channels suitable for production. Operators should select a branch and corresponding network deliberately rather than treating every recent commit as interchangeable with a stable release.

Upgrading may affect more than the `goal` binary. `algod`, `kmd`, network configuration, Genesis material, ledger state, protocol behavior, and REST clients can all be relevant to a deployment. The README excerpt does not document a node upgrade procedure or rollback procedure. Its documented validation tools are `make test`, `make integration`, `make sanity`, and the repository's branch-specific nightly workflows.

The licence classification is `Other`, and the repository includes `COPYING` and `COPYING_FAQ` rather than relying only on a standard GitHub licence label. This review cannot state legal implications without those files' text. Before incorporating code, distributing binaries, or operating the software, read `LICENSE`, `COPYING`, and `COPYING_FAQ` for the applicable permissions and conditions.

Editorial conclusion

go-algorand is appropriate for protocol contributors, node operators, and developers who need direct access to Algorand's ledger, agreement, networking, and REST components. It is the wrong dependency for an application that only submits transactions through an existing network endpoint. Before adoption, inspect the custom LICENSE and COPYING files for the intended use, then verify that the selected release branch, Genesis file, network, data directory, and Go version match the deployment plan.

Frequently asked questions

What Go version does go-algorand require?

The repository's `go.mod` declares Go 1.25.0 and selects the `go1.25.3` toolchain. The Dockerfile also builds with `GO_VERSION="1.25.3"`.

How do I build go-algorand from source?

Clone the repository, run `./scripts/configure_dev.sh`, and then run `make install`. The README places the resulting binaries under `${GOPATH}/bin` and initializes `~/.algorand`.

How do I run a go-algorand node on testnet?

Create a data directory, copy `installer/genesis/testnet/genesis.json` into it, and start the node with `${GOPATH}/bin/goal node start -d ~/testnet_data`.

Official sources

  1. algorand/go-algorand on GitHub
  2. Issues
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/algorand-go-algorand.svg)](https://hysenlabs.com/projects/algorand-go-algorand)

Was this useful?