Generating a load of keys for testing in Go - Kauri
Write Article
Create Collection
Import from medium
Sign in
POSTED 04 Aug 2019 18:16

Generating a load of keys for testing in Go

Dave Appleton

I am in the process of releasing my very "hacky" golang test environment that deep links into the go-ethereum code base.

An important part of testing smart contracts is to be able to generate and use an arbitrary number of keys/addresses to sign / send / receive transactions. Ideally we should not be using live key pairs so I created memorykeys which you can find at

Thanks to Jeff Wilke for pointing me to the go-ethereum crypto module back in 2015

Objectives of this library

This library allows us to generate and use keys on an ad-hoc basis without storing them for re-use on a subsequent run.

We reference these keys by name and obtain

  • the private key (for signing)
  • a transaction object encapsulating that key for future use with ABIGEN
  • the address


It is not expected to be necessary for concurrent creation of keys so keys are stored in a map which is not safe for concurrent writes.


GetPrivateKey(keyname) create a keypair associated with the name on first call, subsequent calls return the previous value.

   launcher,err := memorykeys.GetPrivateKey("launcher")

GetAddress(keyName string) gets the address associated with a key. Creates the key if it does not exist

   recipient,err := GetAddress("recipient")

GetTransactor(keyName string) gets a transaction object for use with ABIGEN objects. Creates the key if necessary.

   deployer, err := GetTransactor("deployer")

ImportPrivateKey(keyName, hexKey) imports a hex encoded private key for use. BE CAREFUL NOT TO USE PRODUCTION KEYS

    privateKey := "d31a46c5322e8e8a7e11f51cf9c4073fea42d33b431b5e7e76a82518fc178ea8"
    key, err := ImportPrivateKey("imported", privateKey)