There are several ways to load the necessary configuration at startup. This tutorial will just hard-code all parameters. You could also parse it from command line flags or read a json/yaml file. The configuration parameters are highly dependent on the blockchain that you want to use go-perun with. Since this example only uses Ethereum it only needs Ethereum parameters.

We put all parameters in a config struct and create a global cfg variable that will hold the configuration:

type config struct {
	mnemonic string                   // Ethereum wallet mnemonic.
	chainURL string                   // Url of the Ethereum node.
	hosts    map[Role]string          // Hosts for incoming connections.
	addrs    map[Role]*wallet.Address // Wallet addresses of both roles.

// cfg saves the global configuration.
var cfg config

RoleAlice and RoleBob are constants with values 0 and 1 for easier access:

type Role int

const (
	RoleAlice Role = iota

func (r Role) String() string {
	switch r {
	case RoleAlice:
		return "Alice"
	case RoleBob:
		return "Bob"
	return fmt.Sprintf("%d", r)

Then we need an init function that will set all fields of the configuration on startup:

func init() {
	cfg.mnemonic = "pistol kiwi shrug future ozone ostrich match remove crucial oblige cream critic"
	cfg.chainURL = "ws://"
	// Set the Host that the go-perun Client will bind to.
	cfg.hosts = map[Role]string{
		RoleAlice: "",
		RoleBob:   "",
	// Fix the on-chain addresses of Alice and Bob.
	cfg.addrs = map[Role]*wallet.Address{
		RoleAlice: wallet.AsWalletAddr(common.HexToAddress("0x2EE1ac154435f542ECEc55C5b0367650d8A5343B")),
		RoleBob:   wallet.AsWalletAddr(common.HexToAddress("0x70765701b79a4e973dAbb4b30A72f5a845f22F9E")),

The on-chain addresses can be hard-coded here since we already know them from the ganache-cli setup.