Skip to content
Algorand's official implementation in Go.
Go Shell C HTML Python Makefile
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Changetemplate (#76) Jun 25, 2019
agreement Relay pinned value in partitionPolicy() (#214) Aug 12, 2019
auction Serialize concurrent access to data in the auction tracker. (#331) Sep 18, 2019
catchup Block/Tracker DB reset on switching to archival mode Sep 10, 2019
cmd add wallet flag to goal asset (#475) Nov 6, 2019
components Implement Algorand. Jun 11, 2019
config Change version to 2.0.0 (#468) Nov 5, 2019
crypto Explicitly disallow txns from zero address (#420) Oct 25, 2019
daemon scan for ledger x device id (#458) Oct 30, 2019
data fix assembler type checking on bnz,load,store (#469) Nov 7, 2019
debug Support streaming in the coroner debug tool. (#33) Jun 14, 2019
docker Revisit s3_release_bucket usage in build scripts (#348) Sep 26, 2019
docs Cleanup some doc ambiguity and cross link documentation. Issue #183 (#… Jul 30, 2019
gen Decouple the AccountManager.DeleteOldKeys disk persistence execution (#… Sep 27, 2019
installer Add Raspberry PI build machine to travis (#365) Oct 3, 2019
ledger fix testnet stall (hopefully) (#491) Nov 8, 2019
libgoal improve ux for goal asset config (#463) Nov 1, 2019
logging Optimize block assembly of previously included transactions (#454) Oct 30, 2019
netdeploy Decouple the AccountManager.DeleteOldKeys disk persistence execution (#… Sep 27, 2019
network Move TelemetryURL to SRV Record (#374) Oct 16, 2019
node Optimize OnNewBlock low hanging fruits (#471) Nov 5, 2019
nodecontrol
protocol Implement domain separation for LogicSig ed25519verify. (#394) Oct 18, 2019
rpcs Add the ability to mark an account as Non-Participating. (#261) Sep 25, 2019
scripts Quick fix to build release scripts until we have a generalized soluti… Oct 24, 2019
shared Fix fee increase in transaction pool (#448) Oct 31, 2019
test test overlapping leases (#495) Nov 8, 2019
tools Clean up contracts. (#481) Nov 8, 2019
util Fix bug in updater, which would prevent it from picking the correct p… Oct 15, 2019
wallet Implement Algorand. Jun 11, 2019
.gitattributes Add .gitattributes file (#29) Jun 14, 2019
.gitignore Logic sig eval (#236) Oct 16, 2019
.travis.yml revert travis tag changes (#477) Nov 6, 2019
CONTRIBUTING.md Add GitHub templates. (#48) Jun 18, 2019
COPYING Implement Algorand. Jun 11, 2019
COPYING_FAQ Update COPYING_FAQ to add contact emails. (#9) Jun 12, 2019
Makefile Optimize travis compilation stages (#373) Oct 10, 2019
README.md Readme file changes: shorter lines, brew requirement and typo fixes. (#… Sep 30, 2019
THANKS.md Modify THANKS: Nanyan's sortition bug report. (#247) Aug 16, 2019
go.mod Logic sig eval (#236) Oct 16, 2019
go.sum Logic sig eval (#236) Oct 16, 2019

README.md

Build Status

go-algorand

Algorand's official implementation in Go.

Algorand is a permissionless, pure proof-of-stake blockchain that delivers decentralization, scalability, security, and transaction finality.

Getting Started

Our developer website has the most up to date information about using and installing the algorand platform.

Building from source

Development is done using the Go Programming Language version 1.12.x, and this document assumes that you have a functioning environment setup. If you need assistance setting up an environment please visit the official Go documentation website.

Linux / OSX

We currently strive to support Debian based distributions with Ubuntu 18.04 being our official release target. Our core engineering team uses Linux and OSX, so both environments are well supported for development.

OSX only: Homebrew (brew) must be installed before continuing. Here are the installation requirements.

Initial environment setup:

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

At this point you are ready to build go-algorand. We use make and have a number of targets to automate common tasks.

build

make install

test

# unit tests
make test

# integration tests
make integration

style and checks

make fmt
make lint
make fix
make vet

or alternatively

make sanity

Running a node

Once the software is built you'll find binaries in ${GOPATH}/bin, and a data directory will be initialized at ~/.algorand. Start your node with ${GOPATH}/bin/goal node start -d ~/.algorand, use ${GOPATH}/bin/carpenter -d ~/.algorand to see activity. Refer to the developer website for how to use the different tools.

Providing your own data directory

You can run a node out of other directories than ~/.algorand and join networks other than mainnet. Just make a new directory and copy into it the genesis.json file for the network. For example:

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

Genesis files for mainnet, testnet, and betanet can be found in installer/genesis/.

Contributing (Code, Documentation, Bugs, Etc)

Please refer to our CONTRIBUTING document.

Project Layout

go-algorand is split into various subpackages.

The following packages provide core functionality to the algod and kmd daemons, as well as other tools and commands:

  • crypto contains the cryptographic constructions we're using for hashing, signatures, and VRFs. There are also some Algorand-specific details here about spending keys, protocols keys, one-time-use signing keys, and how they relate to each other.
  • config holds configuration parameters. These include parameters used locally by the node as well as parameters which must be agreed upon by the protocol.
  • data defines various types used throughout the codebase.
    • basics holds basic types such as MicroAlgos, account data, and addresses.
    • account defines accounts, including "root" accounts (which can spend money) and "participation" accounts (which can participate in the agreement protocol).
    • transactions defines transactions that accounts can issue against the Algorand state. These include standard payments and also participation key registration transactions.
    • bookkeeping defines blocks, which are batches of transactions atomically committed to Algorand.
    • pools implements the transaction pool. The transaction pool holds transactions seen by a node in memory before they are proposed in a block.
    • committee implements the credentials that authenticate a participating account's membership in the agreement protocol.
  • ledger (README) contains the Algorand Ledger state machine, which holds the sequence of blocks. The Ledger executes the state transitions that result from applying these blocks. It answers queries on blocks (e.g., what transactions were in the last committed block?) and on accounts (e.g., what is my balance?).
  • protocol declares constants used to identify protocol versions, tags for routing network messages, and prefixes for domain separation of cryptographic inputs. It also implements the canonical encoder.
  • network contains the code for participating in a mesh network based on websockets. Maintains connection to some number of peers, (optionally) accepts connections from peers, sends point to point and broadcast messages, and receives messages routing them to various handler code (e.g. agreement/gossip/network.go registers three handlers).
    • rpcs contains the HTTP RPCs used by algod processes to query one another.
  • agreement (README) contains the agreement service, which implements Algorand's Byzantine Agreement protocol. This protocol allows participating accounts to quickly confirm blocks in a fork-safe manner, provided that sufficient account stake is correctly executing the protocol.
  • node integrates the components above and handles initialization and shutdown. It provides queries into these components.

daemon defines the two daemons which provide Algorand clients with services:

  • daemon/algod holds the algod daemon, which implements a participating node. algod allows a node to participate in the agreement protocol, submit and confirm transactions, and view the state of the Algorand Ledger.
    • daemon/algod/api (README) is the REST interface used for interactions with algod.
  • daemon/kmd (README) holds the kmd daemon. This daemon allows a node to sign transactions. Because kmd is separate from algod, kmd allows a user to sign transactions on an air-gapped computer.

The following packages allow developers to interface with the Algorand system:

  • cmd holds the primary commands defining entry points into the system.
    • cmd/catchupsrv (README) is a tool to assist with processing historic blocks on a new node.
  • libgoal exports a Go interface useful for developers of Algorand clients.
  • debug holds secondary commands which assist developers during debugging.

The auction package implements the Algorand auctions.

The following packages contain tools to help Algorand developers deploy networks of their own:

  • nodecontrol
  • tools
  • docker
  • commandandcontrol (README) is a tool to automate a network of algod instances.
  • components
  • netdeploy

A number of packages provide utilities for the various components:

  • logging is a wrapper around logrus.
  • util contains a variety of utilities, including a codec, a sqlite wrapper, a goroutine pool, a timer interface, node metrics, and more.

test contains end-to-end tests for the above components.

License

License: AGPL v3

Please see the COPYING_FAQ for details about how to apply our license.

Copyright (C) 2019, Algorand Inc

You can’t perform that action at this time.