<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://chrispinnock.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://chrispinnock.com/" rel="alternate" type="text/html" /><updated>2026-08-14T14:33:14+00:00</updated><id>https://chrispinnock.com/feed.xml</id><title type="html">Chris Pinnock</title><subtitle>Publications, podcasts and articles about blockchain, Tezos, Russian, diet and many things.</subtitle><author><name>Chris Pinnock</name></author><entry><title type="html">Signal Vox 9</title><link href="https://chrispinnock.com/2026/08/13/signalvox.html" rel="alternate" type="text/html" title="Signal Vox 9" /><published>2026-08-13T05:50:00+00:00</published><updated>2026-08-13T05:50:00+00:00</updated><id>https://chrispinnock.com/2026/08/13/signalvox</id><content type="html" xml:base="https://chrispinnock.com/2026/08/13/signalvox.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/toFeOfvYEJU?si=PFftMsJmweDkXjoc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>🪄 “Computers aren’t magic. They just do things quickly.”</p>

<p>👤 AI does them very quickly — but the fundamentals haven’t gone anywhere: identity, access control, least privilege, data segregation, supply chain, governance and good old fashioned human judgement.</p>

<p>🎙️ In Signal Vox Episode 9, I join Greg Collins, Mark Westgate, Tiago Rosado &amp; Vin Marc Maguire to talk about when AI stops simply answering questions and starts doing things.</p>

<p>🖇️ https://www.youtube.com/watch?v=toFeOfvYEJU</p>]]></content><author><name>Chris Pinnock</name></author><summary type="html"><![CDATA[Signal Vox with Vin and team]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/signalvox3.png" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/signalvox3.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Setting up a Tezos node with gcloud (2026)</title><link href="https://chrispinnock.com/tezos/gcloud/" rel="alternate" type="text/html" title="Setting up a Tezos node with gcloud (2026)" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://chrispinnock.com/tezos/tezosgcloud</id><content type="html" xml:base="https://chrispinnock.com/tezos/gcloud/"><![CDATA[<!--
## Abstract

We install a [Tezos](https://www.tezos.com/) node on [Google Cloud Platform](https://cloud.google.com/) using the ```gcloud``` command.
-->

<h2 id="introduction">Introduction</h2>

<p><a href="https://tezos.com">Tezos</a> is a proof-of-stake blockchain. Anyone can run a Tezos node to participate in the network and contribute to the integrity and resilience of the network. Recently I needed to bring up some Tezos nodes quickly on the <a href="https://cloud.google.com/">Google Cloud Platform (GCP)</a>. There are many ways to install Tezos on GCP. One can use docker images, software packages or build from source. To provision the virtual machines on GCP, one can use tools like <a href="https://www.terraform.io/">Terraform</a> or <a href="https://www.pulumi.com">Pulumi</a>. On this occasion I wanted to get some hands-on experience with the GCP command line tool, <code class="language-plaintext highlighter-rouge">gcloud</code>.</p>

<center><img src="/assets/featuredimages/tezos.jpg" style="float:right;margin:20px;border-radius: 8px;" /></center>

<p>As with most cloud services, it’s possible to interact with GCP on the Unix or Windows command line. <code class="language-plaintext highlighter-rouge">gcloud</code> enables you to interactively provision services by typing commands and by extension allows you to write scripts to provision services very quickly.</p>

<p>GCP has the advantage that for many of its services, the web front-end offers the <code class="language-plaintext highlighter-rouge">gcloud</code> command line code for provisioning tasks. This makes it incredibly easy to write provisioning scripts for small projects.</p>

<p>In the GCP Console, there is a feature called Google Cloud Shell in which one can run a Unix shell and run <code class="language-plaintext highlighter-rouge">gcloud</code>. However <code class="language-plaintext highlighter-rouge">gcloud</code> also runs natively on Linux, Macs and Windows machines.</p>

<p>In this article we will install a Tezos node completely from the command line. We will use the Google Cloud Shell in the browser, but you can follow along with <code class="language-plaintext highlighter-rouge">gcloud</code> installed on your machine if you want. You will need a GCP billing account either with billing credits or a payment method defined.</p>

<p>Please note that you may incur charges if you use the examples below. Do not forget to delete any unwanted resources that you create on GCP to avoid unexpected bills.</p>

<p>For more details on Tezos, please refer to the <a href="https://tezos.com">Tezos website</a>. Please also refer to my <a href="/tezos/node/">article on setting up a Tezos node</a>.</p>

<h2 id="outline">Outline</h2>

<p>We will install a Tezos node and participate in <em>bakingnet</em>. This is a test network specifically for testing nodes and bakers.</p>

<p>A node keeps the full blockchain data or a subset of it depending on the history mode. There are three history modes for a node - <em>archive</em>, <em>full</em> and <em>rolling</em>. An archive node has all the blockchain data from the first block (Genesis block) to the present day. A full node is able to provide most information about the chain but has some information summarised to save on space. A rolling node contains enough blocks so that the node can participate in the network. We will set up a rolling node because the disc space required is minimal.</p>

<p>We will use the GCP Compute Engine to bring up a virtual machine with Debian 13 Linux. We will install <a href="https://octez.tezos.com/docs">Octez</a>, the reference implementation of the Tezos protocol and we will install it using <a href="https://packages.tzinit.org/">binary packages</a> supplied by the Tezos Foundation.</p>

<p>Alternatively, you could choose to participate in the production Tezos network <em>mainnet</em> but it will take longer to download and import the snapshot.</p>

<p>The resources for this article can be found at <a href="https://github.com/drchrispinnock/gcp-node-example">GitHub</a>.</p>

<h2 id="installation">Installation</h2>

<p>1. Login to the <a href="https://console.cloud.google.com/">Google Cloud Platform Console</a> with your Google account. If this is your first login, you will need to activate the account and set up a billing method<sup id="fnref:2"><a href="#fn:2" class="footnote" rel="footnote" role="doc-noteref">1</a></sup>.</p>

<p>2. Start the Cloud Shell. The Cloud Shell runs in a web browser. You can start it by clicking the Cloud Shell button at the top right of the console, here highlighted in green:</p>

<p><img src="/assets/2023/06/20/CloudShell.png" alt="Starting Cloud Shell" /></p>

<p>Alternatively, you can install <code class="language-plaintext highlighter-rouge">gcloud</code> on your machine and work from there. You can download it from <a href="https://cloud.google.com/sdk/docs/install">Google</a>. Follow the installation instructions<sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">2</a></sup> and once installed, use <code class="language-plaintext highlighter-rouge">gcloud init</code> to set up the software for your GCP account.</p>

<p>3. By running commands in the Cloud Shell, add a new project to GCP, then set it as the default so that future commands run on the project. In the examples below we split lines with \, but you will need to be careful cutting and pasting directly from this document. To make life easier, we have supplied the commands in a <a href="https://github.com/drchrispinnock/gcp-node-example/blob/main/commands.txt">text file</a>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcloud projects create my-tezos-project-chris \
	--name="My first GCP Tezos node"
gcloud config set project my-tezos-project-chris
</code></pre></div></div>

<p><img src="/assets/2023/06/20/CloudShellInAction.png" alt="Cloud Shell" /></p>

<p>4. You can add the project to your billing account using <code class="language-plaintext highlighter-rouge">gcloud</code>. If you are working on a corporate account, you will need the help of your GCP billing administrator.</p>

<p>You can list your billing accounts as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gcloud billing accounts list
ACCOUNT_ID            NAME          OPEN MASTER_ACCOUNT_ID
DEADBE-E1DEAD-BEEF12  Acme Widgets  True
</code></pre></div></div>

<p>Then attach your account as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcloud billing projects link my-tezos-project-chris \
    --billing-account DEADBE-E1DEAD-BEEF12
</code></pre></div></div>

<p>5. Services on GCP need to be enabled before they can be used. We want to run virtual machines so we need to enable Compute Engine (note that this command can take some time to complete):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcloud services enable compute.googleapis.com
</code></pre></div></div>

<p>6. Cloud resources run under service accounts on GCP. For our exercise, we can either use the default compute service account or we can create a dedicated service account. Obtain the default compute service account as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gcloud iam service-accounts list

DISPLAY NAME: Compute Engine default service account
EMAIL: 123456789123-compute@developer.gserviceaccount.com
DISABLED: False
</code></pre></div></div>

<p>Alternatively create a dedicated service account using a name of 6 characters or more. For example:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gcloud iam service-accounts create tezosaccount \
        --display-name="Tezos Service Account"
$ gcloud iam service-accounts list
DISPLAY NAME: Tezos Service Account
EMAIL: tezosaccount@my-tezos-project-chris.iam.gserviceaccount.com
DISABLED: False

DISPLAY NAME: Compute Engine default service account
EMAIL: 123456789123-compute@developer.gserviceaccount.com
DISABLED: False
</code></pre></div></div>

<p>Notice how the service account address is constructed from the short account name and the project name.</p>

<p>7. Bring up a virtual machine (VM). We are going to use the zone <em>europe-west6-a</em> in Zürich, but you can choose any zone you want. We will use the <em>e2-standard-2</em> instance. It has 8GB of RAM and it is sufficient to run a node. We will be using Debian 13 Linux. Also note that we will use 80GB of disc. This is fine for a rolling node.</p>

<p>Make sure that you substitute the service account, project ID, zone and instance name with your desired ones below. This declaration is long and needs care when cutting and pasting. We’ve used some variables to simplify it. (Remember to check the <a href="https://github.com/drchrispinnock/gcp-node-example/blob/main/commands.txt">commands helper</a> file if you are having trouble copying and pasting.)</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ZONE=europe-west6-a
PROJECT=my-tezos-project-chris
NAME=my-tezos-node
SERVICEACCT=123456789123-compute@developer.gserviceaccount.com

gcloud compute instances create ${NAME} \
	--zone=${ZONE} \
	--machine-type=e2-standard-2 \
	--create-disk=auto-delete=yes,boot=yes,device-name=${NAME},\
image=projects/debian-cloud/global/images/debian-13-trixie-v20260310,\
mode=rw,size=80,\
type=projects/${PROJECT}/zones/${ZONE}/diskTypes/pd-balanced \
	--network-interface=network-tier=PREMIUM,\
stack-type=IPV4_ONLY,subnet=default \
	--maintenance-policy=MIGRATE \
	--provisioning-model=STANDARD \
	--scopes=https://www.googleapis.com/auth/cloud-platform \
	--no-shielded-secure-boot \
	--shielded-vtpm \
	--shielded-integrity-monitoring \
	--reservation-affinity=any \
	--labels=goog-ec-src=vm_add-gcloud \
	--service-account=${SERVICEACCT}
</code></pre></div></div>

<p>You can get more details by using the <code class="language-plaintext highlighter-rouge">gcloud</code> help functions, e.g. <code class="language-plaintext highlighter-rouge">gcloud compute instances create --help</code>, but we briefly describe the options here.</p>

<p>The <em>zone</em> and <em>machine-type</em> options are used to specify the zone and instance type we have chosen. The <em>create-disk</em> declaration specifies the 80GB boot disk along with the initial image the machine will run. Note that the project name, instance name and zone are in the declaration, as is the Debian Linux image name.</p>

<p>The <em>network-interface</em> option defines an IPv4 network interface in the default VPC of the GCP account.</p>

<p>The <em>maintenance-policy</em> is used when the underlying hardware is under maintenance. The <em>MIGRATE</em> policy means that GCP will attempt to migrate the instance in such circumstances. Alternatively one can use <em>TERMINATE</em> and the VM will be terminated instead.</p>

<p>The <em>provisioning-model</em> is used to declare <em>STANDARD</em> or <em>SPOT</em> provisioning. Spot VMs are spare capacity and have lower pricing than standard VMs. Spot VMs have no guaranteed run-time and are suitable for applications that do not need to be available all the time. They are not suitable for our node application.</p>

<p>The <em>scopes</em> option is used to declare the services that the VM can access. The help page lists all available scopes.</p>

<p>The next four options are more complicated and the interested reader can find out about them from the documentation. The <em>no-shielded-secure-boot</em> option disables secure boot, the <em>shielded-vtpm</em> option will ensure the VM is booted with the Trusted Platform Module enabled and the <em>shielded-integrity-monitoring</em> option enables monitoring of the boot integrity. The <em>reservation-affinity</em> option defines the type of reservation for the instance.</p>

<p>The <em>labels</em> option adds a key value pair label to the server to help find resources later on. This is optional, but in this case, the label can be used to find VMs that have been added using <code class="language-plaintext highlighter-rouge">gcloud</code>. Finally the <em>service-account</em> option specifies the service account that the machine will run under.</p>

<p>We obtained this command line by using the Compute Engine Console and instead of creating it, we viewed the equivalent code as in the image below.</p>

<p><img src="/assets/2023/06/20/VM.png" alt="Setting up the VM in the Console" /></p>

<p>8. We have written a post installation script <em>postinstall.sh</em> to do the rest. The script is available for <a href="https://github.com/drchrispinnock/gcp-node-example/blob/main/postinstall.sh">download from GitHub</a> (you can find the download link next to the Raw button).</p>

<p>The Tezos blockchain currently creates a block every 6 seconds. By contrast, the Bitcoin blockchain creates around four blocks an hour. At the time of writing, it is possible to start a Bitcoin node from cold and catch up to the present day in about 2 weeks. Although it is possible to do this with Tezos on <em>mainnet</em>, it would take significantly longer given the number of blocks to process.</p>

<p>Fortunately Octez has the ability to export and import snapshots of the blockchain. Our post installation script downloads a recent snapshot of the blockchain and recovers the blockchain state from it. This can take in excess of 10 minutes particularly when recovering from a <em>mainnet</em> snapshot.</p>

<p>The <code class="language-plaintext highlighter-rouge">gcloud compute instances create</code> command has a metadata option to help provision the machine including a script to run after the VM has booted the first time. These scripts should ideally be short and to the point as they are part of the startup process. In certain circumstances if the startup process takes too long, the GCP system will detect that a virtual machine has not initiated correctly. As our snapshot download and recovery can take a long time, we will run the post installation script via SSH.</p>

<p>First upload the post installation script to the Cloud Shell and then copy it to the VM. If you are running <code class="language-plaintext highlighter-rouge">gcloud</code> on your machine, you can just copy the file directly to the VM.</p>

<p><img src="/assets/2023/06/20/UploadFile.png" alt="Upload a file" /></p>

<p>The <code class="language-plaintext highlighter-rouge">gcloud</code> command provides a convenient wrapper to <code class="language-plaintext highlighter-rouge">ssh</code> and <code class="language-plaintext highlighter-rouge">scp</code>. We can copy the file to the VM using secure shell and then run it in the same way as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcloud compute scp --zone=europe-west6-a postinstall.sh my-tezos-node:/tmp
gcloud compute ssh --zone=europe-west6-a my-tezos-node \
         --command "nohup sudo sh /tmp/postinstall.sh"
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">nohup</code> prevents the script from being terminated prematurely. Your GCP shell account will have enough privileges to run <code class="language-plaintext highlighter-rouge">sudo</code> and run the script as the root user.</p>

<p>If you have not used <code class="language-plaintext highlighter-rouge">scp</code> or <code class="language-plaintext highlighter-rouge">ssh</code> on GCP before, you will be asked about generating an SSH key. Confirm and enter a passphrase that you can remember when prompted:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>WARNING: The private SSH key file for gcloud does not exist.
WARNING: The public SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [/home/chris_pinnock/.ssh] before being able to generate SSH keys.

Do you want to continue (Y/n)?
</code></pre></div></div>

<p>9. You can see the progress as the script runs, but let’s examine what <em>postinstall.sh</em> is doing.</p>

<p>The first piece of code is just preamble, setting up variables and settings. We will be joining the <em>bakingnet</em> test network, with a <em>rolling</em> node and by the end of this segment, the network URL will be set to <em>teztnets.com/bakingnet</em> and the snapshot URL will be set to <em>https://snapshots.tzinit.org/bakingnet/rolling</em>.</p>

<p>Of course, if you want to run a node on a different network you can change the script before using it.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#!/bin/sh

# Post installer for nodes
# (c) Chris Pinnock, 2026
# Ming Vase license - if it breaks, you get to keep the pieces.
# No warranty whatsoever.

# Network - various options
#
#NET=mainnet
#NET=shadownet
NET=bakingnet

# Mode &amp; snapshot URL
#MODE=full
MODE=rolling

SNAPSHOT_URL=https://snapshots.tzinit.org/${NET}/${MODE}

NETWORKURL=${NET}
if [ "$NET" != "mainnet" ]; then
    NETWORKURL=https://teztnets.com/${NET}
fi
</code></pre></div></div>

<p>First the script updates the operating system using the standard Debian packaging tools.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Update the package repository and upgrade the OS
#
apt-get update
apt-get upgrade -y
</code></pre></div></div>

<p>We will install the packages from a Debian APT repository at <a href="https://packages.tzinit.org">packages.tzinit.org</a>. First, we install and accept the GPG key for the APT repository. Ideally you should check the fingerprint yourself - the script is trusting the integrity of the website.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Install and Accept the GPG key
# XXX - you should really make sure you trust this key
# e.g. Run gpg /etc/apt/keyrings/tzinit.gpg
# and it should have fingerprint
# 181E6294A0770AE9AF0173B21F688E1201D819B4
#
sudo apt install -y gpg curl
curl -s "https://apt.tzinit.org/keys/tzinit.asc" | \
    sudo gpg --dearmor -o /etc/apt/keyrings/tzinit.gpg
</code></pre></div></div>

<p>The next step is to add the APT repository to the system catalogue.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Add the Apt repository
echo "deb [signed-by=/etc/apt/keyrings/tzinit.gpg] https://apt.tzinit.org/debian trixie main" \
    | sudo tee /etc/apt/sources.list.d/tzinit-octez.list
sudo apt update -y
</code></pre></div></div>

<p>Then we install the packages:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Install the packages
sudo apt install -y octez-client octez-node
</code></pre></div></div>

<p>Once the packages have installed, the script sets up a basic configuration for Octez using the network URL and the history mode. The network URL is a resource that provides information about the network including servers to obtain initial blocks from.</p>

<p>We allow local remote procedure calls (RPC) on port 8732. This allows us to query the node locally. We also listen publicly on port 9732. This will allow other nodes to connect to ours (but please see the Exercises below). These connections and activity happen on the so-called Tezos Gossip network.</p>

<p>The packages run the Octez software under a dedicated user called <em>tezos</em>. Therefore we must set up the node by running the commands under the <em>tezos</em> user. We do this with <code class="language-plaintext highlighter-rouge">su</code>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Basic Configuration on the Octez node using network, history
# local RPC service and an open gossip port
#
su - tezos -c "octez-node config init --data-dir /var/tezos/node \
			--network=${NETWORKURL} \
			--history-mode=${MODE} \
			--rpc-addr='127.0.0.1:8732' \
			--net-addr='[::]:9732'"
</code></pre></div></div>

<p>Then the script downloads a snapshot and imports it. Doing this allows us to quickly catch up with the network data from a recent point. The snapshots at tzinit.org are usually no more than 4 hours old.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Download the snapshot and import it
#
wget -qq ${SNAPSHOT_URL} -O /var/tezos/snapshot
su - tezos -c "octez-node snapshot import /var/tezos/snapshot --data-dir /var/tezos/node"
rm -f /var/tezos/snapshot
</code></pre></div></div>

<p>The script then enables the Octez node service and reboots the server. When the system has rebooted, it will start Octez and synchronise with the network, obtaining any missing blocks.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Enable services for next boot
#
systemctl enable octez-node

# Shutdown and reboot to pick up any new kernels
# Octez will start on boot
#
echo "===&gt; Reboot in 1 minute"
shutdown -r +1
</code></pre></div></div>

<p>10. When the system has rebooted, log in and check that everything is working.  Below we switch to the <em>tezos</em> user and check the status with <code class="language-plaintext highlighter-rouge">octez-client bootstrapped</code>. This command will only work if the RPC was set up as above. It runs and prints status until the node considers itself bootstrapped and ready. Additionally you can look at the log file: <code class="language-plaintext highlighter-rouge">/var/log/tezos/node.log</code>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gcloud compute ssh --zone=europe-west6-a my-tezos-node
Linux my-tezos-node 5.10.0-22-cloud-amd64 #1 SMP Debian 5.10.178-3 (2023-04-22) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
chris_pinnock@my-tezos-node:~$ sudo su - tezos
tezos@my-tezos-node:~$ octez-client bootstrapped
Warning:

                 This is NOT the Tezos Mainnet.

           Do NOT use your fundraiser keys on this network.

Waiting for the node to be bootstrapped...
Current head: BLbZNKRZhrpT (timestamp: 2023-05-27T05:27:50.000-00:00, validation: 2023-05-27T18:04:01.014-00:00)
Current head: BMFsRWxTZCGq (timestamp: 2023-05-27T05:27:58.000-00:00, validation: 2023-05-27T18:04:01.049-00:00)
Current head: BL7aSqHixQSf (timestamp: 2023-05-27T05:28:06.000-00:00, validation: 2023-05-27T18:04:01.081-00:00)
Current head: BMWtU2ti85Ay (timestamp: 2023-05-27T05:28:14.000-00:00, validation: 2023-05-27T18:04:01.115-00:00)
...
...
Current head: BMYPJrU3n39d (timestamp: 2023-05-27T18:06:54.000-00:00, validation: 2023-05-27T18:07:12.389-00:00)
Current head: BMajkArZFeRh (timestamp: 2023-05-27T18:07:02.000-00:00, validation: 2023-05-27T18:07:12.423-00:00)
Current head: BLGkdx644FPs (timestamp: 2023-05-27T18:07:10.000-00:00, validation: 2023-05-27T18:07:12.459-00:00)
Node is bootstrapped.
</code></pre></div></div>

<h2 id="conclusion">Conclusion</h2>

<p>Although this article is about Tezos nodes, it was really written as an excuse for me to play with <code class="language-plaintext highlighter-rouge">gcloud</code>. As we have seen, it is easy to quickly provision VMs with software on GCP using <code class="language-plaintext highlighter-rouge">gcloud</code> and with a bit of Unix knowledge. Although I’m relatively new to GCP, I have been able to tackle far larger projects using <code class="language-plaintext highlighter-rouge">gcloud</code> in a relatively short space of time.</p>

<p>Not all activities are available via <code class="language-plaintext highlighter-rouge">gcloud</code> yet - for example, setting up the Filestore product is still not available, but it is usually possible to write programmes to talk directly to the GCP API (which is effectively what <code class="language-plaintext highlighter-rouge">gcloud</code> is doing for you). As GCP matures, I expect to see more services available via the <code class="language-plaintext highlighter-rouge">gcloud</code>.</p>

<p>Of course, for bigger projects one should use an Infrastructure as Code tool such as Terraform or Pulumi.</p>

<p>We conclude with some exercises.</p>

<h2 id="exercises">Exercises</h2>

<ol>
  <li>
    <p>Find out how to stop a VM in GCP using <code class="language-plaintext highlighter-rouge">gcloud</code>.</p>
  </li>
  <li>
    <p>Write a shell script that:</p>
  </li>
</ol>

<ul>
  <li>creates a new GCP project</li>
  <li>adds it to a billing account (optional)</li>
  <li>enables the GCP Compute Engine</li>
  <li>creates a service account</li>
  <li>provisions a VM using the service account</li>
  <li>copies the postinstall script to the VM and then runs it</li>
</ul>

<p>Hints:</p>

<ul>
  <li>If your project is called <em>tezos-project</em> and you create a service account with short name <em>serviceacct</em>, the service account will be <em>serviceacct@tezos-project.iam.gserviceaccount.com</em></li>
  <li>You will need to consider the project name and service account name in the <code class="language-plaintext highlighter-rouge">gcloud</code> command - use variables.</li>
</ul>

<ol>
  <li>
    <p>Modify the postinstall script so that the Tezos node runs on <em>mainnet</em>.</p>
  </li>
  <li>
    <p>Modify your script from 2 to set up 3 nodes - one in USA, one in Europe and one in Japan.</p>
  </li>
</ol>

<p>Hints:</p>

<ul>
  <li>Pick three zones from the GCP list</li>
  <li>Use a for loop to iterate through the zones</li>
  <li>Modify the instance name, zone and disk clause in the <code class="language-plaintext highlighter-rouge">gcloud</code> command by using the loop variable</li>
</ul>

<ol>
  <li>Although we set up our original server to allow connections on 9732 for the Tezos Gossip network, the GCP firewall will prevent the connections. How do you add a rule to allow it?</li>
</ol>

<p>(The answers are available at the <a href="https://github.com/drchrispinnock/gcp-node-example/blob/main/answers-to-exercises.md">Github site</a> for this article.)</p>

<h2 id="acknowledgements">Acknowledgements</h2>

<p>Many thanks to Fabrice Trutmann who read an early draft and made some helpful suggestions.</p>

<h2 id="footnotes">Footnotes</h2>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:2">
      <p>You may be eligible for credits if you are a new user. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:1">
      <p><code class="language-plaintext highlighter-rouge">gcloud</code> <a href="https://cloud.google.com/sdk/gcloud/reference">documentation</a> and <a href="https://cloud.google.com/sdk/docs/cheatsheet">cheat sheet</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Chris Pinnock</name></author><category term="Tezos" /><category term="Google" /><category term="Tezos" /><category term="Google" /><category term="GCP" /><summary type="html"><![CDATA[&lt;!– Abstract]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/tezos.jpg" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/tezos.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Quick Start Guide for Impatient Tezos Bakers (Updated)</title><link href="https://chrispinnock.com/tezos/quickstart/" rel="alternate" type="text/html" title="Quick Start Guide for Impatient Tezos Bakers (Updated)" /><published>2026-07-25T08:49:00+00:00</published><updated>2026-07-25T08:49:00+00:00</updated><id>https://chrispinnock.com/tezos/quick-start-guide-for-the-impatient-bakers-update</id><content type="html" xml:base="https://chrispinnock.com/tezos/quickstart/"><![CDATA[<p><img src="/assets/featuredimages/cream-baker-small.png" style="float:right;margin:10px;border-radius:8px;" /></p>

<p><em>This is an edited section from my forthcoming book “Running Tezos Infrastructure”.  No, I don’t know when I will have it finished. But I hope to have it done this year. Also, in July 2026 I updated it to use the packages at <a href="https://packages.tzinit.org">packages.tzinit.org</a>.</em></p>

<p>Many people ask me “can I become a baker on <a href="https://tezos.com">Tezos</a>, Chris?” The answer is “Yes, of course.”</p>

<p>In this article, we are going to set up a baker on a test network (ushuaianet) using a Linux system. We will set up the node and the DAL. Then we will generate a baking key and a companion key. We will get funds for the baking key from the test network’s faucet. Then we will start the baker.</p>

<p>This is to give you a high-level introduction to the concepts and software components.</p>

<p>Also note that <strong>the keys are stored on the computer’s hard disc</strong>. If your system is compromised, <strong>you may expose your keys and your funds</strong>. On mainnet you will need to protect your keys with more security.</p>

<h2 id="prepare-your-machine">Prepare your machine</h2>

<p>For this demonstration you will need a machine with a modern CPU with at least 4 cores and 16GB of RAM. For storage you will need 200GB of fast hard disc. SSD drives are best for blockchain storage. We will assume <a href="https://www.debian.org">Debian</a> Linux 13 throughout. Your user must have sudo access.</p>

<p>If you don’t have a machine, you can use a cloud service like Amazon Web Services EC2 or Google Cloud Compute Engine. On both, the standard disc volumes are fast enough for blockchain storage.</p>

<h2 id="download-and-install-octez">Download and install Octez</h2>

<p>We will install the Octez client, node, DAL node and baker packages. We do this from the official Octez package site. Before we do that, it’s prudent to check that the machine is up to date:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt update
$ sudo apt upgrade -y
</code></pre></div></div>

<p>Then make sure that <em>curl</em>, <em>wget</em> and <em>gpg</em> are installed:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt install -y curl wget gpg
</code></pre></div></div>

<p>Then accept the GPG key from the Octez packages repository:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ curl -s "https://apt.tzinit.org/keys/tzinit.asc" | \
    sudo gpg --dearmor -o /etc/apt/keyrings/tzinit.gpg
</code></pre></div></div>

<p>Add the package source list for Octez. For example, for Debian 13 (Trixie) use:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "deb [signed-by=/etc/apt/keyrings/tzinit.gpg] https://apt.tzinit.org/debian trixie main" \
    | sudo tee /etc/apt/sources.list.d/tzinit-octez.list
</code></pre></div></div>

<p>For Ubuntu 24.04 (Noble) use:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "deb [signed-by=/etc/apt/keyrings/tzinit.gpg] https://apt.tzinit.org/ubuntu noble main" \
    | sudo tee /etc/apt/sources.list.d/tzinit-octez.list
</code></pre></div></div>

<p>Update the packages catalogue.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt update
</code></pre></div></div>

<p>Install the baker, which installs the client, node and DAL node as dependencies:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt install -y octez-baker
</code></pre></div></div>

<h2 id="configure-the-node">Configure the node</h2>

<p>We are going to run the node on the ushuaianet test network. This test network is smaller than mainnet and is specifically for testing. More importantly, the coins do not have any real value and so you can safely make mistakes.</p>

<p>The software in the Octez packages runs under a user account called <em>tezos</em>. We need to use this account to configure the node. Firstly, switch to this user:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo su - tezos
</code></pre></div></div>

<p>Now we configure the node.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ octez-node config init --network=https://teztnets.com/ushuaianet \
                        --history-mode=rolling \
                        --net-addr="[::]:9732" \
                        --rpc-addr="127.0.0.1:8732"
Created /home/tezos/.tezos-node/config.json for network.
</code></pre></div></div>

<p>The command line options are:</p>

<ul>
  <li><em>network</em> - tells the node we want to run on the ushuaianet test network. The URL points to a web resource containing information about it.</li>
  <li><em>history-mode</em> - specifies the rolling history mode.</li>
  <li><em>net-addr</em> - tells the node to listen on TCP port 9732 to the Tezos gossip network.</li>
  <li><em>rpc-addr</em> - tells the node which address and port to listen on for Remote Procedure Calls (RPC). We will only listen locally on the machine.</li>
</ul>

<p>In rolling history mode the node keeps enough information to take part in the chain.</p>

<p>The node’s storage and configuration are in the directory <em>.tezos-node</em> in the <em>tezos</em> user’s home directory. Included in the <em>config.json</em> file is information about the network’s boot nodes. They have enough information to help your node join the network.</p>

<h2 id="download-a-snapshot">Download a snapshot</h2>

<p>A snapshot is a recent backup of the Tezos blockchain. We will download a snapshot from https://snapshots.tzinit.org’s snapshot server located in Europe. Then we will import it.</p>

<p>As the <em>tezos</em> user:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ wget https://snapshots.tzinit.org/ushuaianet/rolling
2024-06-12 15:02:33 (97.7 MB/s) - ‘rolling’ saved [1333975040/1333975040]

$ octez-node snapshot import rolling
Jun 12 15:02:51.584: Note: the import of a snapshot can be sped up using the '--no-check' option.
Jun 12 15:02:51.584:   Only use this option if you fully trust the snapshot source.
Jun 12 15:02:51.584: importing data from snapshot rolling:
Jun 12 15:02:51.584:   chain TEZOS_USHUAIANET_2026-04-21T14:00:00Z, block hash BKsaiQCKKyhRtF3zexct7dyzzvoKzXBoyk8jt7cvZ6hHSBUiKSk at level 6606685, timestamp 2026-03-12T11:59:56-00:00 in rolling (snapshot version 7)
Jun 12 15:02:51.584: you may consider using the --block &lt;block_hash&gt; argument to ensure that the
Jun 12 15:02:51.584:   block imported is the one you expected
Jun 12 15:02:51.585: retrieving and validating data. This can take a while, please bear with us
Copying protocols: 1/1 Done
Importing context Done
Checking context integrity Done
Storing floating blocks: 360 blocks written Done
Jun 12 15:06:15.369: successful import from file rolling
</code></pre></div></div>

<p>Exit the <em>tezos</em> account to your normal account.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ exit
</code></pre></div></div>

<h2 id="run-the-node-and-synchronise-it">Run the node and synchronise it</h2>

<p>The packages provide a convenient set of startup scripts. Enable and start the node service with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo systemctl enable octez-node
$ sudo systemctl start octez-node
</code></pre></div></div>

<p>You can check progress in the logs:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo tail -f /var/log/tezos/octez-node.log
Jun 12 15:10:15.300: the node configuration has been successfully validated.
Jun 12 15:10:15.300: read identity file
Jun 12 15:10:15.300: starting the Octez node 25.0 (187a915b)
Jun 12 15:10:38.854: disabled local peer discovery
Jun 12 15:10:38.857: p2p initialization: bootstrapping
Jun 12 15:10:39.001: p2p initialization: p2p_maintenance_started
Jun 12 15:10:39.436: block validator process started with pid 39499
Jun 12 15:10:39.928: external validation initialized
Jun 12 15:10:40.639: activate chain NetXnHfVqm9iesp
....
Jun 12 15:10:41.240: synchronisation status: synced
Jun 12 15:10:41.241: chain is bootstrapped
</code></pre></div></div>

<p>The node generates an identity key to join the network with. Then the node will synchronise with the network. It downloads the blocks from when the snapshot was taken to the current time.</p>

<p>Once the node’s identity has been generated, you can connect to the node and see the progress:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ octez-client bootstrapped
Warning:

                 This is NOT the Tezos Mainnet.

           Do NOT use your fundraiser keys on this network.

Waiting for the node to be bootstrapped...
Current head: BMFiD4AvKcMd (timestamp: 2024-06-12T13:23:46.000-00:00, validation: 2024-06-12T14:09:56.782-00:00)
Current head: BM7qgqsKSPTD (timestamp: 2024-06-12T13:23:51.000-00:00, validation: 2024-06-12T14:09:56.816-00:00)
...
Current head: BM2JfqL2DJnD (timestamp: 2024-06-12T14:09:26.000-00:00, validation: 2024-06-12T14:10:11.796-00:00)
Current head: BLqtHTHcfoYW (timestamp: 2024-06-12T14:09:31.000-00:00, validation: 2024-06-12T14:10:11.825-00:00)
Node is bootstrapped.
</code></pre></div></div>
<p>Use CTRL+C to exit if necessary.</p>

<p>We have successfully put a Tezos node on the ushuaianet test network.</p>

<p>Every time we run the <code class="language-plaintext highlighter-rouge">octez-client</code> command we usually get the warning below. I won’t include it in the output anymore in this section. You can suppress it by setting an environment variable but we will cover this later.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Warning:

                 This is NOT the Tezos Mainnet.

           Do NOT use your fundraiser keys on this network.
</code></pre></div></div>

<h2 id="set-up-a-wallet">Set up a wallet</h2>

<p>On Tezos, you need a stake to bake. You must connect a wallet to the baker process. The produced blocks are signed with the baker’s secret key held in the wallet. The baker must be able to access the key to sign the blocks.</p>

<p>We will generate a key pair (a public key and a secret key) for the purposes of baking on ushuaianet. We will not protect the key pair as any related coins do not have value on the test network. We will see later that a large part of a baker’s job is protecting keys on mainnet.</p>

<p>As the baker processes will run in the <em>tezos</em> account, we need to create the wallet there too. The wallet is stored in the <em>.tezos-client</em> directory in the <em>tezos</em> user’s home directory. Below we create a key pair and list the known addresses including the one we have created. We also create a companion key used by the DAL node. We will use BLS keys.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo su - tezos
$ octez-client gen keys bakerkey --sig bls
$ octez-client gen keys companion --sig bls
$ octez-client list known addresses
bakerkey: tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf (unencrypted sk known)
companion: tz4TJdBjeX5cnUFPUUXgiLbdEm1G7HgGceok (unencrypted sk known)
</code></pre></div></div>

<h2 id="fund-the-wallet-from-the-faucet">Fund the wallet from the faucet</h2>

<p>We need some coins for our wallet. A baker needs to have access to a stake of at least 6000tz to get baking rights. Also we will need a small amount for fees. The first thing a baker does is “self-delegate”. This tells the blockchain the baker intends to bake with the wallet. It requires a small amount of tez as a fee. For the purposes of this demonstration, we will get 7000tz from the ushuaianet faucet.</p>

<p>Of course, if we were doing this on mainnet, we would have to get real coins by other means. For example, by buying them on an exchange.</p>

<p>With your web browser, go to: <a href="https://faucet.ushuaianet.teztnets.com">https://faucet.ushuaianet.teztnets.com</a>. In the section <em>Fund any address,</em> enter the address from the previous step. Then enter 7000tz in the dialogue. Click “Request 7000tz”.</p>

<p><img src="/assets/2026/04/002-Faucet.png" alt="Getting Tez" /></p>

<p>Sometimes on the faucet site, there is a “proof-of-work challenge” that your browser must solve before the coins are sent. This prevents abuse of the faucet by slowing the requests down.</p>

<p>Now you have your coins, you can check your balance on the command line:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ octez-client get balance for bakerkey
7000 tz
</code></pre></div></div>

<h2 id="configure-the-dal-node">Configure the DAL node</h2>

<p>At the time of writing, it is not mandatory to run a DAL node, but if you don’t you will miss out on rewards. The baker uses the DAL node for attestations. Configuring and running the DAL node is easy. As we are setting the node up specifically for our baker, you should tell it the baker’s address.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo su - tezos
$ octez-dal-node config init \
  --attester-profile tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf
$ exit
</code></pre></div></div>

<p>Now start the DAL node. It will join the DAL network for ushuaianet. You can check the status of it in the file <em>/var/log/tezos/octez-dal-node.log.</em></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo systemctl enable octez-dal-node
$ sudo systemctl start octez-dal-node
$ tail -f /var/log/tezos/octez-dal-node.log
</code></pre></div></div>
<h2 id="set-up-the-baker">Set up the baker</h2>

<p>We need to edit one file as root to configure the baker. Edit <em>/etc/default/octez-baker</em> (for example with <code class="language-plaintext highlighter-rouge">vi /etc/default/octez-baker</code>) and update the relevant lines in the file to reflect these settings:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>DAL_OPTIONS="--dal-node http://127.0.0.1:10732"
LQ_VOTE="pass"
</code></pre></div></div>
<p>You can uncomment the current values and edit them, or put the two lines at the bottom of the file. They will override anything above.</p>

<p>The first line tells the baker where to find the DAL node. The second line tells the baker to vote pass for Liquidity Baking. This is fine for the purposes of getting going on a test network, but on mainnet you might want to do something else. We cover this later on.</p>

<p>By default, the baker will attempt to use all keys in the wallet. We are assuming that you just have the baker and companion key. You can adjust the <code class="language-plaintext highlighter-rouge">KEYS</code> variable if you want to configure this directly.</p>

<h2 id="declare-the-key-for-baking-and-stake">Declare the key for baking and stake</h2>

<p>Now we self-delegate to declare that we want to bake with the keys. As the <em>tezos</em> user, run the following commands:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo su - tezos
$ octez-client register key bakerkey as delegate
</code></pre></div></div>

<p>Next you need to declare the stake. We will use 6000tz.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ octez-client stake 6000 for bakerkey
</code></pre></div></div>

<p>We also need to connect the companion key with the baking key.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ octez-client set companion key for bakerkey to companion
$ exit
</code></pre></div></div>

<p>We can see the operations on the block explorer.</p>

<p><img src="/assets/2026/04/004-Delegation.png" alt="" /></p>

<p>Both commands will output a lot of information about the operations, but we will skip the detail for now.</p>

<p>Now we configure the baker server to run. As root or using <code class="language-plaintext highlighter-rouge">sudo</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo systemctl enable octez-baker
$ sudo systemctl start octez-baker
</code></pre></div></div>

<p>At the same time, the <code class="language-plaintext highlighter-rouge">systemctl</code> commands above also enable and run the accuser. This is the server that observes the network for bad behaviour such as double baking. We will talk about this later in the book.</p>

<p>You can check the log files in <em>/var/log/tezos.</em> There is a file <em>octez-baker.log</em> for the baker and one called <em>octez-accuser.log</em> for the accuser.</p>

<p>We are now ready to bake on ushuaianet. But we need to wait for 5 cycles before we will get baking rights.</p>

<p>We returned a few days later and found that we had baking rights.</p>

<p><img src="/assets/2026/04/005-Rights.png" alt="" /></p>

<p>On 12th July we started to attest and bake blocks. Here are three log entries from the server. The first is for a <em>preattestation:</em></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Jul 12 09:41:00.418: received new forge event:
Jul 12 09:41:00.418:   preattestation ready for delegate bakerkey (tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf) at level 7049219 (round 0)
Jul 12 09:41:00.421: injected preattestation ooMpTSgQvFqUrVwT5tKbH6EQDwTJcWpwWZtHBS5mGGP1H8BbcXC
Jul 12 09:41:00.421:   for bakerkey (tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf) for level 7049219,
Jul 12 09:41:00.421:   round 0
</code></pre></div></div>

<p>The second is for an <em>attestation:</em></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Jul 12 09:41:00.421: received new forge event:
Jul 12 09:41:00.421:   attestation ready for delegate bakerkey (tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf) at level 7049219 (round 0)
Jul 12 09:41:00.423: received new head BLJVDFa4YgfvWtAz4miYWznpFzxDyqqWwDtMjWrLcSCkbfQ8iMU at
Jul 12 09:41:00.423:   level 7049219, round 0
Jul 12 09:41:00.968: injected attestation onwmEzchZqa4nu47oBCYAh9942FjQUuCwi63y99BY7WdbgC5Wdw for
Jul 12 09:41:00.968:   bakerkey (tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf) for level 7049219, round
Jul 12 09:41:00.968:   0
</code></pre></div></div>

<p>Finally, a log entry for a <em>baked block.</em></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Jul 12 14:13:33.339: received new forge event:
Jul 12 14:13:33.339:   block ready for delegate: bakerkey (tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf) at level 7052131 (round: 0)
Jul 12 14:13:34.004: block BKoNkYwfgjRbdQB1tLZYVQ1AQme9oAx2ksV2h9Sk6Ja9WuVWKr3 at level 7052131,
Jul 12 14:13:34.004:   round 0 injected for bakerkey (tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf)
Jul 12 14:13:34.011: received new proposal BKoNkYwfgjRbdQB1tLZYVQ1AQme9oAx2ksV2h9Sk6Ja9WuVWKr3 at
Jul 12 14:13:34.011:   level 7052131, round 0

</code></pre></div></div>

<p>We have glossed over a lot of detail here, but there is nothing else you need to know to set up a baker on a test network. On a production setup you should do more to protect your keys.</p>]]></content><author><name>Chris Pinnock</name></author><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/cream-baker-small.png" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/cream-baker-small.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Using the Octez Packages (2026)</title><link href="https://chrispinnock.com/tezos/packages/" rel="alternate" type="text/html" title="Using the Octez Packages (2026)" /><published>2026-07-24T18:50:00+00:00</published><updated>2026-07-24T18:50:00+00:00</updated><id>https://chrispinnock.com/tezos/using-octez-pkg-refreshed</id><content type="html" xml:base="https://chrispinnock.com/tezos/packages/"><![CDATA[<p><em>This is a refresh of my <a href="/tezos/packages-orig/">article</a> from 2023 and subsequently my <a href="/tezos/packages-2025/">article</a> from 2025.</em></p>

<h1 id="octez-packages">Octez packages</h1>

<p>A few of us <a href="https://tezos.com/">Tezos</a> folk worked on a set of <a href="https://octez.tezos.com/docs">Octez</a> packages in Debian Linux and Red Hat Linux packaging formats. Octez is the reference implementation of the Tezos blockchain software. Nomadic Labs took over the packaging scripts and rewrote them. However, they have decided to stop producing packages as of v26. I use the packages regularly at home and at work. I also think they are the best way for users to install Octez. And I don’t have much to do in the evenings, so I thought I’d have a go at producing them again.</p>

<p><img src="/assets/featuredimages/packages.jpg" style="float: right;margin:20px;border-radius: 8px;" /></p>

<p>I’ve updated my original build scripts, added <code class="language-plaintext highlighter-rouge">systemctl</code> infrastructure and also tried to align the packages with the Nomadic Labs ones. There are a few subtle differences, so if you are migrating, you might find it easier to deinstall theirs and reinstall these ones. Tzinit (Tezos Foundation in disguise) is currently hosting the packages.</p>

<h2 id="the-packages">The packages</h2>

<p>There are several packages:</p>

<ul>
  <li><strong>octez-client</strong> - the client for manipulating wallets and signing items</li>
  <li><strong>octez-node</strong> - the Octez node</li>
  <li><strong>octez-dal-node</strong> - the Octez DAL node</li>
  <li><strong>octez-baker</strong> - the Octez baking daemons and VDF service</li>
  <li><strong>octez-smart-rollup-node</strong> - the Octez smart rollup daemons</li>
  <li><strong>octez-signer</strong> - the remote signer, to hold keys on a different machine from the baker or client</li>
  <li><strong>octez-zcash-params</strong> - the ZCash parameters used by the node, put into a separate package because they don’t change.</li>
</ul>

<p>Also there are two packages that I’m still working on. You are unlikely to need them:</p>

<ul>
  <li><strong>octez-evm-node</strong> - the EVM endpoint node for Etherlink</li>
  <li><strong>octez-teztale-archiver</strong> - the Teztale archiver, used to feed the Teztale explorer with data from the node.</li>
</ul>

<p>The packages with servers are set up to run under a dedicated user called <em>tezos</em>. The signer package uses a user and group called <em>tzsigner</em>.</p>

<h2 id="where-to-get-the-packages">Where to get the packages</h2>

<h3 id="apt-repositories">APT repositories</h3>

<p>If you are using Debian Linux 13 (Trixie) or Ubuntu Linux 24.04 (Noble), the best way to get them is via the APT repository. You can add the catalogue to your system as follows. Make sure that <code class="language-plaintext highlighter-rouge">gpg</code> and <code class="language-plaintext highlighter-rouge">curl</code> are installed:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt install -y gpg curl
</code></pre></div></div>

<p>Then accept the public key of the APT repository:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ curl -s "https://apt.tzinit.org/keys/tzinit.asc" | \
    sudo gpg --dearmor -o /etc/apt/keyrings/tzinit.gpg
</code></pre></div></div>

<p>You should double check that this is the real key of course. Its fingerprint is <code class="language-plaintext highlighter-rouge">181E6294A0770AE9AF0173B21F688E1201D819B4</code> and it has been signed with my PGP key <code class="language-plaintext highlighter-rouge">F38491B6ACED413179251BD874A8093596A98C52</code>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ curl -s "https://apt.tzinit.org/keys/tzinit.asc" | gpg --import
gpg: key 1F688E1201D819B4: "Tzinit Repository Key &lt;packages@tezos.foundation&gt;" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
$ gpg --list-keys
...
pub   ed25519 2026-07-13 [SC]
      181E6294A0770AE9AF0173B21F688E1201D819B4
uid           [ultimate] Tzinit Repository Key &lt;packages@tezos.foundation&gt;
</code></pre></div></div>

<p>Then add the APT repositories. For Debian 13 (Trixie):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "deb [signed-by=/etc/apt/keyrings/tzinit.gpg] https://apt.tzinit.org/debian trixie main" \
    | sudo tee /etc/apt/sources.list.d/tzinit-octez.list
</code></pre></div></div>
<p>For Ubuntu 24.04 (Noble) use:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "deb [signed-by=/etc/apt/keyrings/tzinit.gpg] https://apt.tzinit.org/ubuntu noble main" \
    | sudo tee /etc/apt/sources.list.d/tzinit-octez.list
</code></pre></div></div>

<p>Then update the catalogue:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt update
</code></pre></div></div>

<p>To install a package, simply use <code class="language-plaintext highlighter-rouge">apt</code> and the magic happens. For example:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt install -y octez-client octez-node octez-baker
</code></pre></div></div>

<p>In fact, installing <code class="language-plaintext highlighter-rouge">octez-baker</code> will install the client, node, DAL node and baker packages.</p>

<p>If you want to use development packages, instead of <code class="language-plaintext highlighter-rouge">https://apt.tzinit.org/debian</code> and <code class="language-plaintext highlighter-rouge">https://apt.tzinit.org/ubuntu</code> use <code class="language-plaintext highlighter-rouge">https://apt.tzinit.org/DEVEL/debian</code> and <code class="language-plaintext highlighter-rouge">https://apt.tzinit.org/DEVEL/ubuntu</code>. If you are running on older architecture that doesn’t support some newer CPU instructions, you can try these repositories instead: <code class="language-plaintext highlighter-rouge">https://apt.tzinit.org/BLSTPORTABLE/debian</code> and <code class="language-plaintext highlighter-rouge">https://apt.tzinit.org/BLSTPORTABLE/ubuntu</code>.</p>

<h3 id="direct-downloads-and-rpms">Direct downloads and RPMs</h3>

<p>You can directly download the packages for Debian, Ubuntu and Rocky Linux from <a href="https://packages.tzinit.org/">https://packages.tzinit.org/</a>. Each downloadable package is signed with a detached signature file, so you can verify it against the public key above.</p>

<p>To install the client package on Debian or Ubuntu, you can do either:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt install ./octez-client_25.0-1_amd64.deb
</code></pre></div></div>

<p>or</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dpkg -i octez-client_25.0-1_amd64.deb
</code></pre></div></div>

<p>On Rocky Linux, use <code class="language-plaintext highlighter-rouge">dnf</code> to install directly from a URL. You need to do a bit more first. See <a href="https://packages.tzinit.org">the Packages site</a> for instructions.</p>

<h2 id="using-the-packages">Using the packages</h2>

<p>For the below we will assume that you are running everything on the same server. We will assume that you are using Debian or Ubuntu, and the APT repository. We assume that you know a bit about Tezos.</p>

<h3 id="setting-up-a-node">Setting up a node</h3>

<p>Install the <em>octez-client</em>, <em>octez-zcash-params</em> and <em>octez-node</em> packages.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt install -y octez-client octez-zcash-params octez-node
</code></pre></div></div>

<p>The file <em>/etc/default/octez-node</em> ships with the package and is used to declare environment variables used by the node. The defaults should be good for most sites. In the file, you can change the location of the data directory. Additional command line options can be given using <code class="language-plaintext highlighter-rouge">RUNTIME_OPTS</code>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Data Directory
# An independent mount point of /var/tezos is recommended
#
DATADIR=/var/tezos/.tezos-node

# Other options to pass the node
#
RUNTIME_OPTS=""
# On a test network you might need:
#RUNTIME_OPTS="--synchronisation-threshold=0"
</code></pre></div></div>

<p>As the node will be running as <em>tezos</em>, you will need to configure it by assuming the role of the user. For example:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo su - tezos
$ octez-node config init --network=mainnet \
			--history-mode=rolling \
			--net-addr="[::]:9732" \
			--rpc-addr="127.0.0.1:8732"

</code></pre></div></div>

<p>Replace <em>mainnet</em> with the network URL of your choice. For example, for <em>shadownet</em>, use <code class="language-plaintext highlighter-rouge">https://teztnets.com/shadownet</code> or for the current protocol testnet use <code class="language-plaintext highlighter-rouge">https://teztnets.com/currentnet</code>.</p>

<p>Then as <em>tezos</em> obtain a snapshot and recover it (replacing <em>mainnet</em> with the network of your choice):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ wget https://snapshots.tzinit.org/mainnet/rolling
$ octez-node snapshot import rolling
$ exit
</code></pre></div></div>

<p>As root, you can start the node as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo systemctl enable octez-node
$ sudo systemctl start octez-node
</code></pre></div></div>

<p>The service will start immediately but it will also restart on boot. Observe the logs as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ tail -f /var/log/tezos/octez-node.log
</code></pre></div></div>

<p>If you are just wanting to run a node then congratulations - you have finished.</p>

<h3 id="setting-up-the-baking-key">Setting up the baking key</h3>

<p>If you are going to run a baker, you’ll need a baking key. Key security is very important. Here I’m going to assume that you are running on a test network, in which case you can use a key on disc safely. You should consider a remote signer if not. You can use a Ledger to hold the baking key - see much further below. However, the best keys to use for baking are tz4/BLS keys. We will need two - one for consensus and one for DAL attestations called a companion key.</p>

<p>To generate the keys use:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo su - tezos
$ octez-client gen keys baker_key --sig bls
$ octez-client gen keys companion --sig bls
</code></pre></div></div>

<p>Now fund your keys by moving funds on <em>mainnet</em> to the <em>baker_key</em> or by using a faucet on the test network (see the <a href="https://teztnets.com">Teztnets site</a>). You’ll need at least 6000tz, plus some for fees.</p>

<p>Then register your key as a delegate and stake 6000tz:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ octez-client register key baker_key as delegate
$ octez-client stake 6000 for baker_key
</code></pre></div></div>

<h3 id="setting-up-the-dal-node">Setting up the DAL node</h3>

<p>The Data Availability Layer (DAL) will become mandatory in future Tezos releases, so it’s good to get into the practice of running it now. The DAL package is independent of the other packages. You should use it if you are running a baker. Install the <em>octez-dal-node</em> packages:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt install -y octez-dal-node
</code></pre></div></div>

<p>Now find your baking key, then configure the DAL node so it knows the address of your baker key:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo su - tezos
$ octez-client list known addresses
baker_key: tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf (unencrypted sk known)
companion: tz4TJdBjeX5cnUFPUUXgiLbdEm1G7HgGceok (unencrypted sk known)
$ octez-dal-node config init --attester=tz4E9Sgyx2mRg6GmVZRGNo8dD2imaXx9zfAf
$ exit
</code></pre></div></div>

<p>If you run <code class="language-plaintext highlighter-rouge">octez-node</code> on a different machine, you can add an <code class="language-plaintext highlighter-rouge">--endpoint</code> to the configuration init. Or you can edit <em>/etc/default/octez-dal-node</em> and the <code class="language-plaintext highlighter-rouge">RUNTIME_OPTS</code> variable. You can also change the location of the DAL node’s data directory there:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Data Directory
# An independent mount point of /var/tezos is recommended
#
DATADIR=/var/tezos/.tezos-dal-node

# Other options to pass the node
#
RUNTIME_OPTS=""

# For example, if your node is elsewhere:
#RUNTIME_OPTS="--endpoint=http://mynode.local:8732"
</code></pre></div></div>

<p>As root, enable and start the DAL node:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo systemctl enable octez-dal-node
$ sudo systemctl start octez-dal-node
</code></pre></div></div>

<p>You can observe the logs in <em>/var/log/tezos/octez-dal-node.log</em>.</p>

<h3 id="setting-up-the-baker">Setting up the baker</h3>

<p>The baker package assumes that a node is already running on the same machine. This section also assumes that a DAL node is running on the same machine. Install the <em>octez-baker</em> package:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo apt install octez-baker
</code></pre></div></div>

<p>The <em>/etc/default/octez-baker</em> file must be edited before the baker will run. You can leave the <code class="language-plaintext highlighter-rouge">KEYS</code> variable empty, but then the baker will try to bake with all keys in your wallet.</p>

<p>You also need to set <code class="language-plaintext highlighter-rouge">LQ_VOTE</code>, otherwise the baker will not start. This is the liquidity baking escape hatch vote and it’s something you should decide for yourself. On a test network, you can safely vote “pass”.</p>

<p>Here I’ve changed the configuration to reflect the two keys we have and also the pass vote. I’ve adjusted the <code class="language-plaintext highlighter-rouge">DAL_OPTIONS</code> to use the DAL node on the same machine.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Data Directory
# An independent mount point of /var/tezos is recommended
#
DATADIR=/var/tezos/.tezos-node

KEYS="baker_key companion"

# To use DAL, install the DAL node package, configure and
# use localhost.
#
#DAL_OPTIONS="--without-dal"
DAL_OPTIONS="--dal-node http://localhost:10732"

# This must be set and is your decision
LQ_VOTE="pass"

# Other options to pass to the baker
#
RUNTIME_OPTS=""
</code></pre></div></div>

<p>Start the baker with <code class="language-plaintext highlighter-rouge">systemctl</code> as root:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo systemctl enable octez-baker
$ sudo systemctl start octez-baker
</code></pre></div></div>

<p>You can also start an accuser service. This will watch the network for naughty behaviour, such as double baking.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo systemctl enable octez-accuser
$ sudo systemctl start octez-accuser
</code></pre></div></div>

<p>There are log files in <em>/var/log/tezos</em>.</p>

<h3 id="running-a-vdf-service">Running a VDF service</h3>

<p>There’s little to do to configure the VDF service, other than to set up a rolling node on the same machine. There are VDF servers running on the network already, so you don’t need to run your own. But to do so, install the <em>octez-baker</em> package. Then enable the VDF service like so:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo systemctl enable octez-vdf
$ sudo systemctl start octez-vdf
</code></pre></div></div>

<h3 id="using-the-signer-package">Using the signer package</h3>

<p>The signer package is designed to be independent of the other packages and by default the program runs under the <em>tzsigner</em> user. The package only supports HTTP signing. If you want to use HTTPS or socket signing, you will need to configure the signer to start up yourself.</p>

<p>Install the signer package.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install octez-signer
</code></pre></div></div>

<p>Once installed, edit the file <code class="language-plaintext highlighter-rouge">/etc/default/octez-signer</code>. Key things to note by default:</p>

<ul>
  <li>The signer by default <strong>will sign any message it is given</strong> and this may not be suitable for your production environment. The configuration needs tuning.</li>
  <li>The configuration is set up to run an HTTP daemon but only on localhost. Setting <code class="language-plaintext highlighter-rouge">ADDRESS="0.0.0.0"</code> will open the service.</li>
  <li>The <code class="language-plaintext highlighter-rouge">HWM_CHECK</code> should be set to <code class="language-plaintext highlighter-rouge">-W</code> on a production signer supporting baking to prevent the baking key from being used to double-bake</li>
  <li>You should consider setting <code class="language-plaintext highlighter-rouge">MAGIC_BYTES</code> to prevent certain operations such as funds transfer</li>
</ul>

<p>If you are baking, once you have self-delegated the baking key a typical configuration to protect from funds transfer and double-baking is:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>MAGIC_BYTES="-M 0x11,0x12,0x13"
HWM_CHECK="-W"
</code></pre></div></div>

<p>Once set up, you can enable the daemon as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl enable octez-signer
systemctl start octez-signer
</code></pre></div></div>

<p>By default, the logs are stored in <em>/var/log/tezos/octez-signer.log</em>.</p>

<p>You can create a key in the <em>tzsigner</em> account:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo su - tzsigner
$ octez-signer gen keys alice
$ octez-signer list known addresses
alice: tz1aUmQtyXxXZoFu5jPMkJLTPA4CRDd78Yxs (unencrypted sk known)
</code></pre></div></div>

<p>On the client where you will use the key you can connect it as follows for HTTP:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ octez-client import secret key alice http://hostname-of-signer:6732/tz1aUmQtyXxXZoFu5jPMkJLTPA4CRDd78Yxs
</code></pre></div></div>

<p>To check it is working use:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ octez-client sign bytes 0x03 for alice
Signature: sigTti9DXgXDNYn7Kv8TaYRT4mmkjMQb2sbw4DbPZ48UbXChHCwEpHpQsSxZKrAwEntsboMzjmokNZwshCRnGJVV1tPPsR1Z
</code></pre></div></div>

<p>Please see the <a href="https://octez.tezos.com/docs/user/key-management.html#signer">Octez Signer Manual</a> for more details.</p>

<h3 id="using-a-ledger">Using a Ledger</h3>

<p>In an old article <a href="https://chrispinnock.com/tezos/baker/">Setting up a Tezos Baker in 5 steps</a> we set up a Ledger and bake with it. There is more detail there, including how to install the applications on the Ledger. The key thing to remember is that the <em>tezos</em> user needs access to the Ledger USB device and this is not done by default. To allow this:</p>

<p>As root, create a file called <code class="language-plaintext highlighter-rouge">20-hw1.rules</code> in the directory <code class="language-plaintext highlighter-rouge">/etc/udev/rules.d</code> containing the following lines:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># All Ledger devices
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", GROUP="tezos", OWNER="tezos", MODE="0600"

</code></pre></div></div>

<p>Reload the USB Device service with <code class="language-plaintext highlighter-rouge">sudo systemctl reload udev</code>.</p>

<p>You should be able to see the Ledger, import the keys from it and set up the Ledger to bake.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo su - tezos
$ octez-client list connected ledgers
$ octez-client import secret key my_ledger_key \
        "ledger://change-this-to-match-yours/ed25519/0h/0h"

$ octez-client setup ledger to bake for my_ledger_key
</code></pre></div></div>

<p>Unfortunately, a Ledger does not support tz4 keys for baking. But what you can do is store the master baking key on the Ledger (e.g. a tz1, 2 or 3 key) and delegate consensus and companion to two tz4 keys. If you want to use a Ledger for baking with a tz1, 2 or 3 key, it’s best to use it with <code class="language-plaintext highlighter-rouge">octez-signer</code>.</p>]]></content><author><name>Chris Pinnock</name></author><category term="Tezos" /><category term="Tezos" /><category term="Packages" /><category term="Octez" /><summary type="html"><![CDATA[This is a refresh of my article from 2023 and subsequently my article from 2025.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/packages.jpg" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/packages.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Setting up a Tezos Node in 5 steps (2026)</title><link href="https://chrispinnock.com/tezos/node/" rel="alternate" type="text/html" title="Setting up a Tezos Node in 5 steps (2026)" /><published>2026-07-23T06:00:00+00:00</published><updated>2026-07-23T06:00:00+00:00</updated><id>https://chrispinnock.com/tezos/tezosnode</id><content type="html" xml:base="https://chrispinnock.com/tezos/node/"><![CDATA[<p><em>This is an update of my 2022 article <a href="/2022/11/26/tezosnode/">Setting up a Tezos Node in 5 steps</a></em>.</p>

<p><a href="https://tezos.com">Tezos</a> is a <a href="https://en.wikipedia.org/wiki/Proof_of_stake">Proof of Stake</a> blockchain supporting <a href="https://en.wikipedia.org/wiki/Smart_contract">Smart Contracts</a> and <a href="https://www.tezosagora.org">On-chain Governance</a>. The blockchain is supported by <em>nodes</em> which exchange blockchain information and <em>bakers</em> which produce new blocks. Running a node adds to the stability of the network, but you might have a specific application for its use. If you want to bake on Tezos then you will need to run a node. Often blockchain application developers will have their own node to communicate with the network and indexers will maintain their own archive node.</p>

<p>In this short article, we will show you how to set up a Tezos node. Anyone with a modern computer running Linux can set up a node. We have only included the detail to get started. In a future article, we will show you how to set up a baker.</p>

<h2 id="1---decide-which-history-mode">1 - Decide which history mode</h2>

<p>Before starting you should determine which of the three main <em>history modes</em> you would like to run:</p>

<ul>
  <li><strong>Archive</strong> - every piece of detail from the first block to the current time, a complete copy of the blockchain;</li>
  <li><strong>Full</strong> - detail from the first block to the current time but with transactions rolled up;</li>
  <li><strong>Rolling</strong> - enough blocks to stay current with the network.</li>
</ul>

<p>It’s possible to run a baker with any of these modes. If you are writing an indexing application, you are likely to need an archive node. For most home users, a rolling node is enough.</p>

<p>As I write this an Archive node needs approximately 4.1TB of storage with a growth rate of approximately 1GB/week. A full node will fit on a system with 500GB of storage and a rolling node will fit on a system with 60GB. The disc needs to be a fast SSD drive.</p>

<p>We will assume that you are using PC hardware running Debian 13 (Trixie). It’s possible to run on a Raspberry Pi. For best results make sure you have a fast SSD drive, 4 CPU cores and 16GB of RAM. This will allow you to run a baker and DAL node later as well. An AWS or GCP compute instance with SSD-backed storage is suitable. We’ll also assume that you have root access.</p>

<h2 id="2---install-the-software">2 - Install the software</h2>

<p>The reference implementation of the Tezos Blockchain software is called
<a href="https://octez.tezos.com">Octez</a>. Tzinit provides a software repository for Debian and Ubuntu Linux. You can also find these packages for download at <a href="https://packages.tzinit.org">packages.tzinit.org</a>. For Debian 13 (Trixie) you can use the APT package manager to install the software.</p>

<p>Make sure that your system is up to date with <code class="language-plaintext highlighter-rouge">apt update &amp;&amp; apt upgrade</code> then follow the instructions at
<a href="https://packages.tzinit.org">the packages site</a> to set up the APT repository and install the software.</p>

<p>Import the GPG key for the repository. This is used to verify the authenticity of the packages.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -s "https://apt.tzinit.org/keys/tzinit.asc" | \
    sudo gpg --dearmor -o /etc/apt/keyrings/tzinit.gpg
</code></pre></div></div>

<p>Normally you would trust the key from the repository maintainer, but you can verify it yourself using GPG. We won’t go into the detail of this here. I have signed the GPG key using my personal key and you can verify this if you are worried about the authenticity of the key. The key’s fingerprint is <code class="language-plaintext highlighter-rouge">181E 6294 A077 0AE9 AF01 73B2 1F68 8E12 01D8 19B4</code>.</p>

<p>Set up the APT repository.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "deb [signed-by=/etc/apt/keyrings/tzinit.gpg] https://apt.tzinit.org/debian trixie main" \
    | sudo tee /etc/apt/sources.list.d/tzinit-octez.list
</code></pre></div></div>

<p>Then install the client and node software:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt update
sudo apt install -y octez-client octez-node
</code></pre></div></div>

<p>Any missing dependencies will be automatically installed by the package manager.</p>

<h2 id="3---configuring-the-node">3 - Configuring the node</h2>

<p>Our package has a configuration file to help set it up stored at <code class="language-plaintext highlighter-rouge">/etc/default/octez-node</code>, but you should not need to edit it. By default we have assumed that the software will run as user <em>tezos</em> and group <em>tezos</em> in a directory called <em>/var/tezos/.tezos-node</em>. Similarly, we will log output into <em>/var/log/tezos</em>. You can change the details in the configuration file to suit your needs.</p>

<p>The directory <em>/var/tezos</em> will need to be a large partition capable of storing the
blockchain. The package installation automatically adds a <em>tezos</em> user and group. It also creates the directory <em>/var/tezos/.tezos-node</em> for the node data. But you can move this to a different location if you prefer.</p>

<p>Assume the role of <em>tezos</em> and initialise the node. We have used sensible defaults for a <em>rolling</em> node on the production blockchain (called <em>mainnet</em>). The node will listen on port 9732 to exchange information on the Tezos gossip network and offer an RPC service to local users on port 8732. By running an RPC service, we will be able to connect to the node locally.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo su - tezos
octez-node config init --network=mainnet \
			--history-mode=rolling \
			--net-addr="[::]:9732" \
			--rpc-addr="127.0.0.1:8732"
</code></pre></div></div>

<p>You can change the settings above to suit your needs. For example, you might want to allow the RPC service on your local network so that you can connect your Tezos wallet to a node you maintain.</p>

<p>If you are running on a NATed network and you will run more than one node, then you should use a different port for each node for –net-addr. The network records the node’s public IP address and port, so using the same port for multiple nodes causes conflicts.</p>

<h2 id="4---obtaining-a-snapshot-or-archive">4 - Obtaining a snapshot or archive</h2>

<p>If you were to start the node now, it would start to download the blockchain
from the very first block. On a test network, this will be quick, but on
<em>mainnet</em> it will be very slow and will take weeks. For a head-start, we fetch a snapshot
and import it. A snapshot is a backup of the blockchain data. Do these operations using the <em>tezos</em> user.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo su - tezos
cd $HOME
wget -O snapfile https://snapshots.tzinit.org/mainnet/rolling
octez-node snapshot import snapfile
rm snapfile
</code></pre></div></div>

<p>For a full node, you will need to use a <a href="https://snapshots.tzinit.org/mainnet/full.html">full snapshot</a>. For an archive node, you will need to use a <a href="https://snapshots.tzinit.org/mainnet/archive.html">compressed archive node data directory</a>. You can also reconstruct an archive node from a full node, but this can take a long time.</p>

<!-- There are several snapshot providers in the community including:
| Provider                                         | Rolling | Full | Archive | HTTPS | GCS copy |
|--------------------------------------------------|---------|------|---------|-------|----------|
| [Lambs on Acid](https://lambsonacid.nl/)	       | Yes     | Yes  | No      | Yes   | No       |
| [Tzinit](https://snapshots.tzinit.org/)          | Yes     | Yes  | Yes     | Yes   | Yes      |
-->

<h2 id="5---starting-the-node">5 - Starting the node</h2>

<p>As root or using sudo, start the node using <em>systemctl</em>. The enable command will ensure that the node starts on boot.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable octez-node
sudo systemctl start octez-node
</code></pre></div></div>

<p>You can now view the progress of the node in the log file. It will sync with the network and fill the gap from the point that the snapshot was taken to the current block. Then you will have a working Tezos node.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tail -f /var/log/tezos/octez-node.log
</code></pre></div></div>

<p>You can also monitor the progress of the sync with the network using:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>octez-client bootstrapped
</code></pre></div></div>

<h2 id="more-information">More information</h2>

<p>I have only scratched the surface of the available options here. Please see <a href="https://octez.tezos.com/docs/introduction/howtoget.html">How to get Tezos</a> and <a href="https://octez.tezos.com/docs/introduction/howtorun.html">Getting Started with Tezos</a> for other installation options and information on building from source.</p>]]></content><author><name>Chris Pinnock</name></author><category term="Tezos" /><category term="Tezos" /><summary type="html"><![CDATA[This is an update of my 2022 article Setting up a Tezos Node in 5 steps.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/tezos.jpg" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/tezos.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to set up an Etherlink Rollup Node (2026)</title><link href="https://chrispinnock.com/tezos/smartrollupnode/" rel="alternate" type="text/html" title="How to set up an Etherlink Rollup Node (2026)" /><published>2026-07-16T17:50:00+00:00</published><updated>2026-07-16T17:50:00+00:00</updated><id>https://chrispinnock.com/tezos/how-to-setup-an-etherlink-rollup-node</id><content type="html" xml:base="https://chrispinnock.com/tezos/smartrollupnode/"><![CDATA[<p><em>This is an update of my <a href="/2024/03/01/how-to-setup-an-etherlink-rollup-node.html">article from March 1st, 2024</a>.</em></p>

<p>Some time ago, <a href="https://twitter.com/_lthms_">Thomas</a> and I wrote a <a href="https://chrispinnock.com/tezos/smartrollup/">how-to on getting started with smart rollups</a>. We showed how to set up a rollup using the test
“echo kernel” and then ran the smart rollup operator to process it.</p>

<p>In this post, we (in this case, the <a href="https://en.wikipedia.org/wiki/Nosism">royal we</a>) will show you how to run a smart rollup node on the <a href="https://etherlink.com">Etherlink</a> rollup. We will show you how to do it on <em>shadownet</em>, but of course you can do it on <em>mainnet</em> too.</p>

<p>This is a really a quick-start guide to help you to use the <a href="https://packages.tzinit.org/">Octez packages</a>. We won’t go into the details too much, but we’ll cover the basics.</p>

<center><img src="/assets/2026/07/Architecture.png" style="float:right;margin:20px;border-radius: 8px;" /></center>

<h2 id="etherlink---in-brief">Etherlink - in brief</h2>

<p><a href="https://www.etherlink.com">Etherlink</a> is an <a href="https://ethereum.org/">Ethereum</a> Virtual Machine (EVM) compatible rollup on the <a href="https://tezos.com">Tezos</a> network. It will, later this year, morph into Tezos X and be able to run both Michelson and EVM contracts. We will assume that you know enough about Etherlink to want to run a smart rollup node.</p>

<p>It’s possible just to <em>observe</em> the rollup and simply store the data on the local disc. Or you can run a full <em>operator</em> and push the rollup state onto the main blockchain. To run as a full operator, you will need a 10000tz security bond and some funds to cover the transaction costs.</p>

<p>Additionally there are server programs to provide the EVM compatibility layer and run a full sequencer. These sit above the smart rollup. We will not cover them in this article.</p>

<p>On the <em>shadownet</em> test network, the <a href="https://shadownet.tzkt.io/sr19fMYrr5C4qqvQqQrDSjtP31GcrWjodzvg/">Etherlink test rollup</a> was deployed on 28th August 2025, replacing a previous test rollup. The <a href="https://tzkt.io/sr1Ghq66tYK9y3r8CC1Tf8i8m5nxh8nTvZEf/">production version of Etherlink</a> has run on <em>mainnet</em> since Q2 2024.</p>

<table>
  <thead>
    <tr>
      <th>Network</th>
      <th>Smart rollup address</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><em>shadownet</em></td>
      <td>sr19fMYrr5C4qqvQqQrDSjtP31GcrWjodzvg</td>
    </tr>
    <tr>
      <td><em>mainnet</em></td>
      <td>sr1Ghq66tYK9y3r8CC1Tf8i8m5nxh8nTvZEf</td>
    </tr>
  </tbody>
</table>

<p>For more information, please refer to the <a href="https://www.etherlink.com">Etherlink</a> website, follow <a href="https://twitter.com/etherlink">@etherlink</a> on <a href="https://x.com">X</a> or join the <a href="https://discord.com/invite/etherlink">Etherlink Discord</a>.</p>

<h2 id="assumptions">Assumptions</h2>

<p>To make life easy, I’m going to assume that we will run all services on the same machine. If you decide to use different machines, you will need to adjust the configuration. We will run a layer 1 node and the smart rollup node.</p>

<p>I’m going to use 500GB of disc and 32GB RAM. You might be able to get away with less. On <em>mainnet</em>, you will need more. I use cloud services for my infrastructure and the default disc is usually fast enough. If you are using hardware, I would recommend a fast SSD drive for performance.</p>

<p>We will install <a href="https://octez.tezos.com/docs/">Octez</a> (the Tezos reference implementation) using the <a href="https://packages.tzinit.org/">Tzinit packages</a>. We will assume that the target operating system is <a href="https://www.debian.org">Debian</a> Linux 13. You can find packages for other versions too. Also you can build the Octez software from scratch. And of course you can use it on a Mac.</p>

<p>We will join the test Etherlink rollup on <em>shadownet</em>. The instructions are very similar for <em>mainnet</em> and we will cover these at the end.</p>

<h2 id="setting-up-a-layer-1-node-on-tezos">Setting up a layer 1 node on Tezos</h2>

<p>All communications of the smart rollup occur on the Tezos layer 1 network. We will need a layer 1 node on the relevant Tezos network for the smart rollup node to work. We will use a full:50 node because we need more information than a full node to support the smart rollup operations.</p>

<p>We wrote an <a href="https://chrispinnock.com/tezos/node/">article on setting up a node</a> but let’s recap:</p>

<p>1. Make sure you have <code class="language-plaintext highlighter-rouge">gpg</code>, <code class="language-plaintext highlighter-rouge">curl</code> and <code class="language-plaintext highlighter-rouge">lz4</code> installed. Then install the GPG key used to verify the authenticity of the packages:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install -y gpg curl lz4
curl -s "https://apt.tzinit.org/keys/tzinit.asc" | \
    sudo gpg --dearmor -o /etc/apt/keyrings/tzinit.gpg
</code></pre></div></div>

<p>The key’s fingerprint is <code class="language-plaintext highlighter-rouge">181E 6294 A077 0AE9 AF01 73B2 1F68 8E12 01D8 19B4</code>.</p>

<p>2. Set up the APT repository.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "deb [signed-by=/etc/apt/keyrings/tzinit.gpg] https://apt.tzinit.org/debian trixie main" \
    | sudo tee /etc/apt/sources.list.d/tzinit-octez.list
</code></pre></div></div>

<p>3. Then install the Octez client and node software:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt update
sudo apt install -y octez-client octez-node
</code></pre></div></div>

<p>4. Configure the node as a full node on <em>shadownet</em>. You will need to adjust the RPC settings if you will run the smart rollup software on a different machine. The packages use the <em>tezos</em> user.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo su - tezos
octez-node config init \
	--network=https://teztnets.com/shadownet \
	--history-mode=full:50 \
	--net-addr="[::]:9732" \
	--rpc-addr="127.0.0.1:8732" \
			--data-dir /var/tezos/.tezos-node

</code></pre></div></div>

<p>5. Still as the tezos user, download a full:50 archive and decompress it:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd /var/tezos/.tezos-node
wget -O - https://snapshots.tzinit.org/shadownet/full50.tar.lz4 | \
	lz4cat | tar xf -
exit
</code></pre></div></div>

<p>6. Run the node and synchronise with the network:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable octez-node
sudo systemctl start octez-node
</code></pre></div></div>

<p>Once the node has generated its identity, you can check the synchronisation process:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>octez-client bootstrapped
</code></pre></div></div>

<p>Or you can check the logs in <em>/var/log/tezos/octez-node.log</em>.</p>

<h2 id="installing-the-smart-rollup-software">Installing the smart rollup software</h2>

<p>The smart rollup node is released independently from the main Octez node software, but the Tzinit packages provide the correct version. To install it, run:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install octez-smart-rollup-node
</code></pre></div></div>

<h2 id="joining-the-rollup-as-an-observer">Joining the rollup as an observer</h2>

<p>We need to configure smart rollup node. Then we need to seed it with a recent snapshot of data. It is possible to synchronise the node from the beginning of the rollup. This might need an archive layer 1 node. We will use a snapshot for simplicity.</p>

<p>We also need to make sure the node has the complete set of WASM preimages. On the main chain, the rollup has a computer program (called the <em>kernel</em>) but it is too small to contain the full Etherlink logic. Fortunately we can do this from a pre-images endpoint.</p>

<p>1. Configure the smart rollup daemon to run as an observer as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo su - tezos
octez-smart-rollup-node init observer \
  config for sr19fMYrr5C4qqvQqQrDSjtP31GcrWjodzvg \
  with operators --history-mode full \
	--data-dir /var/tezos/.tezos-smart-rollup-node \
	--pre-images-endpoint "https://snapshots.tzinit.org/etherlink-shadownet/wasm_2_0_0"
exit
</code></pre></div></div>

<p>The history mode option tells the node to work in full mode which is enough to reconstruct state. An alternative setting is “archive”, which stores everything. The last option allows the smart rollup node to update its preimage directory automatically.</p>

<p>2. Import an Etherlink snapshot for the rollup. <a href="https://snapshots.tzinit.org">Tezos Foundation provide these</a>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo su - tezos
wget https://snapshots.tzinit.org/etherlink-shadownet/eth-shadownet.full
octez-smart-rollup-node snapshot import eth-shadownet.full \
	--data-dir /var/tezos/.tezos-smart-rollup-node
rm eth-shadownet.full
exit
</code></pre></div></div>

<p>3. Set up the smart rollup node to run:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable octez-smartrollup
sudo systemctl start octez-smartrollup
</code></pre></div></div>

<p>You can view progress in <em>/var/log/tezos/octez-smart-rollup-node.log.</em> You will see entries like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Mar 01 20:04:48.820: Finished processing layer 1 head
Mar 01 20:04:48.820:   BKp4cCn63pkT3LSapEejAJ4GWw9BzbdroYvVJTvKgGJYcJSXxda at level 5583497 in
Mar 01 20:04:48.820:   172ms
Mar 01 20:04:48.820: Processing head BM6u6soDh6rosTWJkUFydLRJV9aMQ3rgNbT9dHdRP6EHuYWe4KS at level
Mar 01 20:04:48.820:   5583498
Mar 01 20:04:48.821: Fetching 254 messages from block
Mar 01 20:04:48.821:   BM6u6soDh6rosTWJkUFydLRJV9aMQ3rgNbT9dHdRP6EHuYWe4KS at level 5583498
</code></pre></div></div>

<p>Congratulations - you are receiving data from the Etherlink rollup.</p>

<h2 id="joining-the-rollup-as-an-operator">Joining the rollup as an operator</h2>

<p>The process to join the rollup as an operator is very similar. But to be an operator, you must stake a 10000tz bond. Also you will need some tz to perform operations. As we are demonstrating this on <em>shadownet</em>, we will generate the keys on the server and fund them from the <a href="https://faucet.shadownet.teztnets.com">test faucet</a>.</p>

<p>We will create a key for the operator bond and a key for batching operations. In practice, you will only need the batching key if you are receiving operations from an EVM compatibility node. But we include it here for completeness.</p>

<p>1. If you have previously set up a smart rollup node, stop it and remove the configuration file. If you are changing networks, remove the existing data directory.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl stop octez-smart-rollup-node
sudo rm -rf /var/tezos/.tezos-smart-rollup-node/config.json
</code></pre></div></div>

<p>2. Generate the keys and get the public key hashes:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo su - tezos
octez-client gen keys operator_key
octez-client gen keys batcher_key
octez-client list known addresses
exit
</code></pre></div></div>

<p>3. Go to the <a href="https://faucet.shadownet.teztnets.com">faucet</a> and obtain 12000tz for the <em>operator_key</em> key. This is enough for the bond 10000tz and some spare for fees. Then obtain 1000tz for the <em>batcher_key</em> key. Use the public key hashes from the previous step.</p>

<p>4. Configure the smart rollup node:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo su - tezos
octez-smart-rollup-node init operator \
    config for sr19fMYrr5C4qqvQqQrDSjtP31GcrWjodzvg \
    with operators \
		operating:operator_key \
		cementing:operator_key \
		batching:batcher_key \
		executing_outbox:operator_key \
	--history-mode full \
	--data-dir /var/tezos/.tezos-smart-rollup-node \
	--rpc-addr 0.0.0.0 \
	--pre-images-endpoint "https://snapshots.tzinit.org/etherlink-shadownet/wasm_2_0_0"
exit
</code></pre></div></div>

<p>Note that we have set up the node to listen for Remote Procedure Calls (RPC) on the Internet. You should consider protecting the port (8932) with a firewall. Rollup applications use the RPC port. An example of this for Etherlink is the EVM node <em>octez-evm-node</em> which we will not cover here.</p>

<p>5. If you haven’t set up an observer before, you’ll need to import a snapshot. Follow the observer procedure from point 2. Import the snapshot and get the WASM file. Then enable and run the smart rollup node.</p>

<p>Congratulations - you have a working operator node.</p>

<h2 id="doing-this-on-mainnet">Doing this on mainnet</h2>

<p>The process for joining the Etherlink rollup on <em>mainnet</em> will be similar. When setting up the Tezos L1 node, configure it with <code class="language-plaintext highlighter-rouge">--network=mainnet</code>. Then use the resources in the table below. The Etherlink <em>mainnet</em> resources will be available shortly after launch.</p>

<table>
  <thead>
    <tr>
      <th>Item</th>
      <th>Value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><em>mainnet</em> L1 full:50</td>
      <td><a href="https://snapshots.tzinit.org/mainnet/full50.tar.lz4">https://snapshots.tzinit.org/mainnet/full50.tar.lz4</a></td>
    </tr>
    <tr>
      <td>smart rollup address</td>
      <td>sr1Ghq66tYK9y3r8CC1Tf8i8m5nxh8nTvZEf</td>
    </tr>
    <tr>
      <td>Pre-image endpoint</td>
      <td>https://snapshots.tzinit.org/etherlink-mainnet/wasm_2_0_0</td>
    </tr>
    <tr>
      <td>Etherlink snapshot</td>
      <td><a href="https://snapshots.tzinit.org/etherlink-mainnet/eth-mainnet.archive">https://snapshots.tzinit.org/etherlink-mainnet/eth-mainnet.archive</a></td>
    </tr>
  </tbody>
</table>

<p>Of course, on <em>mainnet</em>, the tz on the operator and batcher keys have a real value. You should consider keeping the keys behind a remote signer when running an operator. Also be careful when configuring the smart rollup node as you will be locking a 10000tz bond. You do so at your own risk.</p>]]></content><author><name>Chris Pinnock</name></author><summary type="html"><![CDATA[This is an update of my article from March 1st, 2024.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/CA4293_Etherlink_Social%20Avatar-300.png" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/CA4293_Etherlink_Social%20Avatar-300.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Signal Vox 11</title><link href="https://chrispinnock.com/2026/07/16/signalvox.html" rel="alternate" type="text/html" title="Signal Vox 11" /><published>2026-07-16T05:50:00+00:00</published><updated>2026-07-16T05:50:00+00:00</updated><id>https://chrispinnock.com/2026/07/16/signalvox</id><content type="html" xml:base="https://chrispinnock.com/2026/07/16/signalvox.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/UQccrK_D5fU?si=Bdib-3qfVU_HsPZK" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>🪓 Hackers aren’t waiting for permission to use AI. Neither should we.</p>

<p>🎙️i I sat down with Kirsty Kelly, David Edwards, Mark Westgate, Greg Collins and Vin Marc Maguire to dig into how AI is rewriting the rules of cybersecurity, software development — and what it means for the future of the profession itself.</p>]]></content><author><name>Chris Pinnock</name></author><summary type="html"><![CDATA[Signal Vox with Vin]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/signalvox_logo_sq.jpg" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/signalvox_logo_sq.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Leanpub catchup</title><link href="https://chrispinnock.com/2026/07/14/leanpub-video.html" rel="alternate" type="text/html" title="Leanpub catchup" /><published>2026-07-14T21:00:00+00:00</published><updated>2026-07-14T21:00:00+00:00</updated><id>https://chrispinnock.com/2026/07/14/leanpub-video</id><content type="html" xml:base="https://chrispinnock.com/2026/07/14/leanpub-video.html"><![CDATA[<p>Last week I met with Len Epp from the <a href="https://leanpub.com">Leanpub</a> project. We spoke about my new book <a href="https://chrispinnock.com/3essays/">Three Essays on NetBSD</a>. We also spoke about Leanpub’s system of book production.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/_AtoCTme0dw?si=6bWISA0E0o5XQxTA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>]]></content><author><name>Chris Pinnock</name></author><summary type="html"><![CDATA[Last week I met with Len Epp from the Leanpub project. We spoke about my new book Three Essays on NetBSD. We also spoke about Leanpub’s system of book production.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/netbsd.png" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/netbsd.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Signal Vox 8</title><link href="https://chrispinnock.com/2026/07/09/signalvox.html" rel="alternate" type="text/html" title="Signal Vox 8" /><published>2026-07-09T09:50:00+00:00</published><updated>2026-07-09T09:50:00+00:00</updated><id>https://chrispinnock.com/2026/07/09/signalvox</id><content type="html" xml:base="https://chrispinnock.com/2026/07/09/signalvox.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/c6cIrAIKbO8?si=RfEn3RUensrx2Nsm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>🪓 An axe doesn’t care if it builds a house or breaks down a door. Neither does AI.</p>

<p>🎙️ I joined Bob Sampson, Steve Gillham, Greg Collins and Vin Marc Maguire
to talk AI, cybersecurity and what happens when the tech evolves faster than the people securing it.</p>

<p>👉 Let’s make better axes!</p>]]></content><author><name>Chris Pinnock</name></author><summary type="html"><![CDATA[Signal Vox with Vin]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/signalvox_logo_sq.jpg" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/signalvox_logo_sq.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Running Octez at boot on Macs</title><link href="https://chrispinnock.com/2026/07/03/launchctl.html" rel="alternate" type="text/html" title="Running Octez at boot on Macs" /><published>2026-07-03T13:20:00+00:00</published><updated>2026-07-03T13:20:00+00:00</updated><id>https://chrispinnock.com/2026/07/03/launchctl</id><content type="html" xml:base="https://chrispinnock.com/2026/07/03/launchctl.html"><![CDATA[<p><img src="/assets/featuredimages/macusers.jpg" style="float:right;margin:30px;" /></p>

<p><a href="https://octez.tezos.com">Octez</a> is the software that runs the <a href="https://tezos.com">Tezos</a> blockchain. It includes the command-line wallet, the node, the DAL node and the baker, amongst other things.</p>

<p>You can currently install Octez on a Mac using Homebrew, but there are plans to deprecate this method. You can build Octez from source and once you’ve done that, you need a reliable way to start and stop the services on boot.</p>

<p>On the Mac, <code class="language-plaintext highlighter-rouge">launchd</code> is used to start and stop services. It can be configured with <code class="language-plaintext highlighter-rouge">launchctl</code>. There are two main types of <code class="language-plaintext highlighter-rouge">launchd</code> service - Launch Daemons and Launch Agents. Launch Daemons are started on boot by the operating system. Launch Agents are started on login for specific users.</p>

<p>We give examples of the Launch Daemon property list configuration files (<em>plists</em>) for the node, DAL node, baker and accuser. These are written in XML.</p>

<p>The plists assume that there is a <em>tezos</em> user on the system with home directory <em>/Users/tezos</em>. You can create this with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo dseditgroup -o create tezos
sudo sysadminctl -addUser tezos -fullName Tezos
sudo dseditgroup -o edit -a tezos -t user tezos
</code></pre></div></div>

<p>We will need a log directory as well:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /Users/tezos/logs
sudo chown -R tezos:tezos /Users/tezos
</code></pre></div></div>

<p>You’ll need to configure each service and if you are baking, set up the keys. This needs to be done as the <em>tezos</em> user. For example to configure the node:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo su - tezos
octez-node config init --history=rolling --network=mainnet
exit
</code></pre></div></div>

<p>They also assume that the Octez binaries are installed in <em>/usr/local/bin</em>. You can copy them there, or change the paths in the plists as appropriate.</p>

<p>We will use the <code class="language-plaintext highlighter-rouge">bootstrap</code> command to start the service and make sure it runs at boot. We will use the <code class="language-plaintext highlighter-rouge">bootout</code> command to stop the service and stop the automatic running at boot.</p>

<p>You can adapt these plists to make Launch Agent plists that run under your own user account. Instead of the services starting on boot, they will start on login. We will show you how to do this for the node.</p>

<h3 id="octez-node">octez-node</h3>

<p>As root, save the file below as <em>/Library/LaunchDaemons/com.tezos.octez-node.service.plist</em>. The command line arguments need to be split across lines in the XML - for example, examine the <code class="language-plaintext highlighter-rouge">ProgramArguments</code> section below. The syntax to run the node <code class="language-plaintext highlighter-rouge">octez-node run --data-dir /Users/tezos/.tezos-node</code> is split into four strings.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
  &lt;key&gt;Label&lt;/key&gt;
  &lt;string&gt;com.tezos.octez-node.service&lt;/string&gt;
  &lt;key&gt;ProgramArguments&lt;/key&gt;
  &lt;array&gt;
    &lt;string&gt;/usr/local/bin/octez-node&lt;/string&gt;
    &lt;string&gt;run&lt;/string&gt;
    &lt;string&gt;--data-dir&lt;/string&gt;
    &lt;string&gt;/Users/tezos/.tezos-node&lt;/string&gt;
  &lt;/array&gt;

    &lt;key&gt;UserName&lt;/key&gt;
    &lt;string&gt;tezos&lt;/string&gt;
    &lt;key&gt;GroupName&lt;/key&gt;
    &lt;string&gt;tezos&lt;/string&gt;
  &lt;key&gt;KeepAlive&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;RunAtLoad&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;StandardErrorPath&lt;/key&gt;
  &lt;string&gt;/Users/tezos/logs/octez-node.start.log&lt;/string&gt;
  &lt;key&gt;StandardOutPath&lt;/key&gt;
  &lt;string&gt;/Users/tezos/logs/octez-node.start.log&lt;/string&gt;
  &lt;key&gt;WorkingDirectory&lt;/key&gt;
  &lt;string&gt;/Users/tezos&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</code></pre></div></div>

<p>Make sure that it has the correct ownership.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo chown root:wheel /Library/LaunchDaemons/com.tezos.octez-node.service.plist
sudo chmod 644 /Library/LaunchDaemons/com.tezos.octez-node.service.plist
</code></pre></div></div>

<p>Once the node has been configured, you can start it with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo launchctl bootstrap system /Library/LaunchDaemons/com.tezos.octez-node.service.plist
</code></pre></div></div>

<p>The daemon will launch on boot (as <code class="language-plaintext highlighter-rouge">RunAtLoad</code> is set). If you want to use your Mac as a server, you’ll need FileVault disk encryption turned off which has security implications. If you don’t do this, the Mac won’t be able to start unattended.</p>

<p>To stop the node and also stop it from running at boot use:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo launchctl bootout system /Library/LaunchDaemons/com.tezos.octez-node.service.plist
</code></pre></div></div>

<p>It’s also possible to run the service under your own user as a Launch Agent. Note that they will only start automatically when you log in interactively, but this might be the behaviour you want. For <code class="language-plaintext highlighter-rouge">octez-node</code>, you can save this plist as <em>~/Library/LaunchAgents/com.tezos.octez-node.service.plist</em>. Make sure you change the path to <code class="language-plaintext highlighter-rouge">octez-node</code> and replace <em>/Users/chris</em> with your home directory.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
  &lt;key&gt;Label&lt;/key&gt;
  &lt;string&gt;com.tezos.octez-node.service&lt;/string&gt;
  &lt;key&gt;ProgramArguments&lt;/key&gt;
  &lt;array&gt;
    &lt;string&gt;/Users/chris/bin/octez-node&lt;/string&gt;
    &lt;string&gt;run&lt;/string&gt;
  &lt;/array&gt;
  &lt;key&gt;KeepAlive&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;RunAtLoad&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;StandardErrorPath&lt;/key&gt;
  &lt;string&gt;/Users/chris/Library/Logs/octez-node.start.log&lt;/string&gt;
  &lt;key&gt;StandardOutPath&lt;/key&gt;
  &lt;string&gt;/Users/chris/Library/Logs/octez-node.start.log&lt;/string&gt;
  &lt;key&gt;WorkingDirectory&lt;/key&gt;
  &lt;string&gt;/Users/chris&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</code></pre></div></div>

<p>Then to start the service, find your user ID and run <code class="language-plaintext highlighter-rouge">launchctl</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ id -u
501
$ launchctl bootstrap gui/501 ~/Library/LaunchAgents/com.tezos.octez-node.service.plist
</code></pre></div></div>

<h3 id="octez-dal-node">octez-dal-node</h3>

<p>As root, save the file below as <em>/Library/LaunchDaemons/com.tezos.octez-dal-node.service.plist</em>. Make sure it is owned by root and wheel as per the node above.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
  &lt;key&gt;Label&lt;/key&gt;
  &lt;string&gt;com.tezos.octez-dal-node.service&lt;/string&gt;
  &lt;key&gt;ProgramArguments&lt;/key&gt;
  &lt;array&gt;
    &lt;string&gt;/usr/local/bin/octez-dal-node&lt;/string&gt;
    &lt;string&gt;run&lt;/string&gt;
    &lt;string&gt;--data-dir&lt;/string&gt;
    &lt;string&gt;/Users/tezos/.tezos-dal-node&lt;/string&gt;

  &lt;/array&gt;

    &lt;key&gt;UserName&lt;/key&gt;
    &lt;string&gt;tezos&lt;/string&gt;
    &lt;key&gt;GroupName&lt;/key&gt;
    &lt;string&gt;tezos&lt;/string&gt;
  &lt;key&gt;KeepAlive&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;RunAtLoad&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;StandardErrorPath&lt;/key&gt;
  &lt;string&gt;/Users/tezos/logs/octez-dal-node.start.log&lt;/string&gt;
  &lt;key&gt;StandardOutPath&lt;/key&gt;
  &lt;string&gt;/Users/tezos/logs/octez-dal-node.start.log&lt;/string&gt;
  &lt;key&gt;WorkingDirectory&lt;/key&gt;
  &lt;string&gt;/Users/tezos&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</code></pre></div></div>

<p>If you are running a DAL node on a different machine to your baker, you may also need these program arguments (and firewall protection):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    &lt;string&gt;--rpc-addr&lt;/string&gt;
    &lt;string&gt;0.0.0.0:10732&lt;/string&gt;
</code></pre></div></div>

<p>Once the DAL node is configured, you can start the service with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo launchctl bootstrap system /Library/LaunchDaemons/com.tezos.octez-dal-node.service.plist
</code></pre></div></div>

<p>You can stop the service with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo launchctl bootout system /Library/LaunchDaemons/com.tezos.octez-dal-node.service.plist
</code></pre></div></div>

<h3 id="octez-baker">octez-baker</h3>

<p>As root, save the file below as <em>/Library/LaunchDaemons/com.tezos.octez-baker.service.plist</em>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
  &lt;key&gt;Label&lt;/key&gt;
  &lt;string&gt;com.tezos.octez-baker.service&lt;/string&gt;
  &lt;key&gt;ProgramArguments&lt;/key&gt;
  &lt;array&gt;
    &lt;string&gt;/usr/local/bin/octez-baker&lt;/string&gt;
    &lt;string&gt;run&lt;/string&gt;
    &lt;string&gt;with&lt;/string&gt;
    &lt;string&gt;local&lt;/string&gt;
    &lt;string&gt;node&lt;/string&gt;
    &lt;string&gt;/Users/tezos/.tezos-node&lt;/string&gt;
    &lt;string&gt;--liquidity-baking-toggle-vote&lt;/string&gt;
    &lt;string&gt;SETME&lt;/string&gt;
    &lt;string&gt;--dal-node&lt;/string&gt;
    &lt;string&gt;http://localhost:10732&lt;/string&gt;
  &lt;/array&gt;

    &lt;key&gt;UserName&lt;/key&gt;
    &lt;string&gt;tezos&lt;/string&gt;
    &lt;key&gt;GroupName&lt;/key&gt;
    &lt;string&gt;tezos&lt;/string&gt;
  &lt;key&gt;KeepAlive&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;RunAtLoad&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;StandardErrorPath&lt;/key&gt;
  &lt;string&gt;/Users/tezos/logs/octez-baker.start.log&lt;/string&gt;
  &lt;key&gt;StandardOutPath&lt;/key&gt;
  &lt;string&gt;/Users/tezos/logs/octez-baker.start.log&lt;/string&gt;
  &lt;key&gt;WorkingDirectory&lt;/key&gt;
  &lt;string&gt;/Users/tezos&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</code></pre></div></div>

<p>Change <em>SETME</em> to the appropriate liquidity baking vote. Also, check that the DAL node configuration is correct for your setup. This setup will attempt to bake with all the keys it can find in the wallet. If you have a baking key from another system, be very careful otherwise you will double bake.</p>

<p>You can start the service with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo launchctl bootstrap system /Library/LaunchDaemons/com.tezos.octez-baker.service.plist
</code></pre></div></div>

<p>You can stop the service with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo launchctl bootout system /Library/LaunchDaemons/com.tezos.octez-baker.service.plist
</code></pre></div></div>

<h3 id="octez-accuser">octez-accuser</h3>

<p>As root, save the file below as <em>/Library/LaunchDaemons/com.tezos.octez-accuser.service.plist</em>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
  &lt;key&gt;Label&lt;/key&gt;
  &lt;string&gt;com.tezos.octez-accuser.service&lt;/string&gt;
  &lt;key&gt;ProgramArguments&lt;/key&gt;
  &lt;array&gt;
    &lt;string&gt;/usr/local/bin/octez-accuser&lt;/string&gt;
    &lt;string&gt;run&lt;/string&gt;
  &lt;/array&gt;

    &lt;key&gt;UserName&lt;/key&gt;
    &lt;string&gt;tezos&lt;/string&gt;
    &lt;key&gt;GroupName&lt;/key&gt;
    &lt;string&gt;tezos&lt;/string&gt;
  &lt;key&gt;KeepAlive&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;RunAtLoad&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;StandardErrorPath&lt;/key&gt;
  &lt;string&gt;/Users/tezos/logs/octez-accuser.start.log&lt;/string&gt;
  &lt;key&gt;StandardOutPath&lt;/key&gt;
  &lt;string&gt;/Users/tezos/logs/octez-accuser.start.log&lt;/string&gt;
  &lt;key&gt;WorkingDirectory&lt;/key&gt;
  &lt;string&gt;/Users/tezos&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</code></pre></div></div>

<p>You can start the service with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo launchctl bootstrap system /Library/LaunchDaemons/com.tezos.octez-accuser.service.plist
</code></pre></div></div>

<p>You can stop the service with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo launchctl bootout system /Library/LaunchDaemons/com.tezos.octez-accuser.service.plist
</code></pre></div></div>]]></content><author><name>Chris Pinnock</name></author><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chrispinnock.com/assets/featuredimages/macusers.jpg" /><media:content medium="image" url="https://chrispinnock.com/assets/featuredimages/macusers.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>